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."
>
>
>
>