MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: When ploting a differential equation, sigularities cause big ugly vertical lines on the graph - how can I get rid of them? By some magic mathematica incantaion?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg25182] Re: When ploting a differential equation, sigularities cause big ugly vertical lines on the graph - how can I get rid of them? By some magic mathematica incantaion?
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Tue, 12 Sep 2000 21:24:25 -0400 (EDT)
  • References: <8pklfd$m91@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Ed,

Using Split we can write a function that operates on Graphics objects  and
splits lines at points where the absolute slope gets big,

In[7]:=
 DeleteVerticals[gr_Graphics, slopeMax_] :=
 gr /. Line[lst_] :>
      Map[Line,
   Split[lst, Abs[Divide @@ Reverse[#1 - #2]] < slopeMax &],
        1];

I apply  this to your problem:

sol = Table[
    NDSolve[{y'[t] == y[t] - y[t]^2/12 - 4, y[0] == i}, y, {t, 0, 8}], {i,
4,
      20, 4}]

gr = Plot[Evaluate[y[t] /. sol], {t, 0, 8}, AspectRatio -> 1,
    PlotRange -> {0, 20},
    FrameLabel -> {"Fish Population - Fixed Harvesting",
        y'[t] == y[t] - y[t]^2/12 - 4}, Frame -> True, ImageSize -> 300]


Show[DeleteVerticals[gr, 1000]]


We can also use the perceived slope

In[6]:=
 DeleteVerticals2[gr_Graphics, slopeMax_] :=
 gr /. Line[lst_] :>
      Module[{xmin, xmax, ymin, ymax, ar, scl},
        (*get the plot range and the aspect ratio used*)
        {{{xmin, xmax}, {ymin, ymax}}, ar} =
          Last /@ AbsoluteOptions[gr, {PlotRange, AspectRatio}];
        (*
          multiplying by scl converts a slope in user coordinates to the \
slope as seen - see note below*)
        scl =    ar (xmax - xmin)/(ymax - ymin);
        Map[Line,
   Split[lst, Abs[Divide @@ Reverse[#1 - #2]] scl < slopeMax &],
          1]];

--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

"Ed" <ejh at idcomm.com> wrote in message news:8pklfd$m91 at smc.vnet.net...
> Howdy All!
>
> When ploting a differential equation, sigularities cause big ugly
> vertical lines on the graph.
>
> For example if I am graphing a family of solutions curves, each of
> which decreases exponentially, at least some of them will be treated
> as signularities by mathematica, and the place where they become too
> funky for mathematica, there is an ugly vertical line.
>
> I would like to plot a function only within a certain range, and when
> it leaves that range I would like mathematica to stop computing the
> function.
>
> Alternatively I could use any possible advice on how to turn off these
> vertical lines. Here's an example function with these singularities:
>
> In[2]:=
> Table[NDSolve[{y'[t] == y[t]-y[t]^2/12-4, y[0] == i}, y, {t,
> 0,8}],{i,4,20,4}]
>
> NDSolve::"ndsz":
>     "At \!\(t\) == \!\(3.62756604743090482`\), step size is
> effectively zero; \
> singularity suspected."
> NDSolve::"ndsz":
>     "At \!\(t\) == \!\(7.25517865610478196`\), step size is
> effectively zero; \
> singularity suspected."
> Out[2]=
> {{{y\[Rule]InterpolatingFunction[{{0.,3.62757}},"<>"]}},{{
>       y\[Rule]InterpolatingFunction[{{0.,7.25518}},"<>"]}},{{
>       y\[Rule]InterpolatingFunction[{{0.,8.}},"<>"]}},{{
>       y\[Rule]InterpolatingFunction[{{0.,8.}},"<>"]}},{{
>       y\[Rule]InterpolatingFunction[{{0.,8.}},"<>"]}}}
>
>
> Here's the plotting command I am using:
>
> In[3]:=
> Plot[Evaluate[ y[t] /. %2], {t, 0,
> 8},AspectRatio->1,PlotRange->{0,20},
>   FrameLabel->{"Fish Population - Fixed Harvesting",
>       y'[t] == y[t]-y[t]^2/12-4}, Frame->True,ImageSize->300]
> InterpolatingFunction::"dmval":
>     "Input value \!\({3.65410229958301835`}\) lies outside the range
> of data \
> in the interpolating function. Extrapolation will be used."
> InterpolatingFunction::"dmval":
>     "Input value \!\({3.63388315790337124`}\) lies outside the range
> of data \
> in the interpolating function. Extrapolation will be used."
> InterpolatingFunction::"dmval":
>     "Input value \!\({3.62853932022043901`}\) lies outside the range
> of data \
> in the interpolating function. Extrapolation will be used."
> General::"stop":
>     "Further output of \!\(InterpolatingFunction :: \"dmval\"\) will
> be \
> suppressed during this calculation."
>
>
>
>




  • Prev by Date: Re: Random spherical troubles
  • Next by Date: RE: Random spherical troubles
  • Previous by thread: Re: When ploting a differential equation, sigularities cause big ugly vertical lines on the graph - how can I get rid of them? By some magic mathematica incantaion?
  • Next by thread: Amazing backgrounds