NDSolve: avoiding negative values?
- To: mathgroup at smc.vnet.net
- Subject: [mg45162] NDSolve: avoiding negative values?
- From: Maano Aunapuu <maano.aunapuu at eg.umu.se>
- Date: Fri, 19 Dec 2003 06:57:29 -0500 (EST)
- Reply-to: maano.aunapuu at eg.umu.se
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
I'm a biologist who tries to use Mathematica to model population
fluctuations. When trying a set of differential equations that are
supposed to work properly I get the problems with keeping the system
persistent or avoiding equations taking negative values (which in a
biological population is absurdity).
------------------------------------
(*Defining the system*)
sol := NDSolve[{V'[t] == U[t] (1 - V[t]/Kv[t]) - (A V[t] H[t])/(V[t]
+\[Alpha] M[t] + B),
M'[t] == u[t] M[t] (1 - M[t]/Km) - (\[Alpha] A M[t] H[t])/(V[t]
+\[Alpha] M[t] + B),
H'[t] == R H[t] (A (V[t] + \[Alpha] M[t])/(V[t] + \[Alpha] M[t]
+B) - G[t]),
V[0] == 1000,
M[0] == 1000,
H[0] == 2},
{V, M, H}, {t, 0, 10000}, MaxSteps -> 10000]
(*Defining the constant parameters*)
A = 15;
\[Alpha] = 0.5;
B = 70;
Km = 1000;
R = 10.7/A;
(*As I want to simulate seasons with winter during 0=<t<10 and with
summer 10<t<12
I define a parameter m that will have only values 0 - 12*)
m[t_] := (t - 12*IntegerPart[t/12]);
(*Now I define the parameters whose values depend on t (via m) *)
U[t_] := 0 /; m[t] \[LessEqual] 10;
U[t_] := 10000/2 /; m[t] > 10;
u[t_] := 0 /; m[t] \[LessEqual] 10;
u[t_] := 12/2 /; m[t] > 10;
G[t_] := 0.63*A /; m[t] \[LessEqual] 10;
G[t_] := 0.44*A /; m[t] > 10;
Kv[t_] := 100 /; m[t] \[LessEqual] 10;
Kv[t_] := 1000 /; m[t] > 10;
(*And now I wish to see how the system behaves, so I plot it)
sol1 = sol; Plot[{V[t] /. sol1, M[ t] /. sol1, H[t] /. sol1}, {t, 0,
19}, PlotRange -> All, PlotPoints -> 200, PlotStyle -> {Hue[0.3],
Hue[0.6], Hue[0.0]}];
-----------------------------
And now the problems:
1)
I get the error message:
step size is effectively zero; singularity or stiff system suspected.
What does it mean exactly?
I guess the reason for the message is due H[t] taking negative values,
and therefore the two other variables V[t]&M[t] shooting into infinity.
As this is a biological system, the negative values are absurd. The
lowest realistic value should be zero. Is it possible somehow to tell to
Mathematica it? Or to set some boundaries? So this is my main question
-how to prohibit the variables reaching negative values?
When I play around with StartingStepSize and decrease it, I get rid of
the error message. But the results depend and differ very much depending
on its value. If StartingStepSize-> 1/20 then H[t]->0, and
V[t]=M[t]=1000 whereas in case of StartingStepSize-> 1/40 H[t]->0,
V[t]=0.00004, M[t]=0.22. Why do these results differ so much?
2)
If I change the initial conditions to MaxSteps -> 10000,
StartingStepSize -> 1/20, Method -> {"FixedStep", Method ->
"LinearlyImplicitModifiedMidpoint"} then I get the system to be
persistent, even if all the variables now and then reach negative
values. And I guess therefore I can not relay on the results.
thanks a lot for any help
Maano
=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=
Maano Aunapuu
MSc, PhD student
Animal Ecology
Dept. of Ecology and Environmental Science
Umeå University
SE -901 87 Umeå, SWEDEN
e-mail: maano.aunapuu at eg.umu.se
http://www.eg.umu.se/sve/personal/maano_aunapuu.htm
http://www.norrmejerier.se/plupp/
=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=¤=
- Follow-Ups:
- Re: NDSolve: avoiding negative values?
- From: Selwyn Hollis <sh2.7183@misspelled.erthlink.net>
- Re: NDSolve: avoiding negative values?