Re: Help with NDSolve

• To: mathgroup at christensen.cybernetics.net
• Subject: [mg1541] Re: Help with NDSolve
• From: rknapp (Robert Knapp)
• Date: Sat, 24 Jun 1995 02:37:25 -0400
• Organization: The Santa Fe Institute

```In article <3s86l4\$och at news0.cybernetics.net> imm at cs.umd.edu (Ibrahim Matta) writes:

> I am trying to solve a differential equation
>   NN'[t] = lambda ( 1 - B[t] ) - mu NN[t]
> where B[t] is a fixed point of a function of NN[t] and B[t].
>
> The program below does not, however, terminate.
> It works if we use Nest instead of FixedPoint, but
> we need FixedPoint for the stopping criteria.
> I suspect that with FixedPoint Mathematica can not
> symbolically get the differential equations.
> Is there a way around this or it can't be done with
> Mathematica ?
>
> Any help is very much appreciated.
>
> Best regards,
> Ibrahim
>
> =============================================
>
> T = 20
> lambda = 0.8
> mu = 1.0
> K = 2
>
> Clear[NN]
> Clear[B]
>
>
> B[b_] := (NN[t] / (1 - b))^K / K! /
>                         (1 + Sum[(NN[t] / (1 - b))^ii / ii!, {ii, K}])
>
>
>
>
>  sol = NDSolve[{NN'[t] ==
>         lambda (1 - FixedPoint[B, 0.1, SameTest->(Abs[#1 - #2] < 10.^-4 &)])
>         - mu NN[t], NN[0] == 0},
>                 NN, {t, T}]
>
> Plot[Evaluate[NN[t] /. sol], {t, 0, T}]
>
> =============================================

Your problem here is that NDSolve evaluates the equation before solving the equations.  You will find that if you simply evaluate

{NN'[t] ==
lambda (1 - FixedPoint[B, 0.1, SameTest->(Abs[#1 - #2] < 10.^-4 &)])
- mu NN[t], NN[0] == 0}

by itself, the FixedPoint does not terminate because the condition is
never met with a symbolic N[t].

The solution (generally a good one in any case like this where
non-numeric evaluation is dangerous) is to prevent symbolic
evaluation.  Here is a fix:

define a new function:

FixPointB[val_?NumberQ] :=
FixedPoint[B[val], 0.1, SameTest->(Abs[#1 - #2] < 10.^-4 &)]

this tests the argument "val" to be sure that it is a number before
attempting FixedPoint.  Using this function and your other
definitions, the call to NDSolve:

In[17]:=
sol = NDSolve[{NN'[t] ==
lambda (1 - FixPointB[NN[t]])
- mu NN[t], NN[0] == 0},
NN, {t, T}]
Out[17]=
{{NN -> InterpolatingFunction[{0., 20.}, <>]}}

works as it should.

Rob Knapp
WRI

```

• Prev by Date: Implicit surface plotting
• Next by Date: Re: counting number of rules in rule base
• Previous by thread: Re: counting number of rules in rule base
• Next by thread: Help with NDSolve