       NDSolve is not deterministic in its solutions??

• To: mathgroup at smc.vnet.net
• Subject: [mg129321] NDSolve is not deterministic in its solutions??
• From: JBB <barandiaran.juan at gmail.com>
• Date: Wed, 2 Jan 2013 21:15:47 -0500 (EST)
• Delivered-to: l-mathgroup@mail-archive0.wolfram.com
• Delivered-to: l-mathgroup@wolfram.com
• Delivered-to: mathgroup-newout@smc.vnet.net
• Delivered-to: mathgroup-newsend@smc.vnet.net

```I have a NDSolve in Mathematica 8 .0.1 in which I want to extract (with Sow) the maximums and minimums and also stop the integration when the maxima of the oscillation is under a threshold.
Both conditions require \[Alpha]'[t]==0.

The issue I find is that if I execute the same line of code several times, sometimes it records the last maxima and sometimes it doesn't.

Is there a way to avoid this non deterministic behaviour in NDSolve?
I solved it checking later if the last maxima is in the list and if it is not, adding it in another line of code, but this doesn't look a "nice" solution.

Here is the code:

Module[{interp, tmaxTemp, surf},
surf = 0.162;
Label[repeatChangingSurface]; (*If NDSolve has errors returns here \
and tries again with a slightly different surface *)
tmaxTemp =
1000;(* Define a long enough time of integration to ensure \
convergence *)
interp =
FlattenAt[ (*Eliminate unneccesary nestings in the list result *)
Reap[Quiet@
NDSolve[{1.1089 \[Alpha]''[t] + 1.2936 Sin[\[Alpha][t]] +
210*surf*
(0.33 Sin[\[Alpha][t]] + (
0.33^2 Cos[\[Alpha][t]] Sin[\[Alpha][t]])/Sqrt[
1 - 0.33^2 Sin[\[Alpha][t]]^2]) *
UnitStep[Sin[\[Alpha][t] + Pi*UnitStep[-\[Alpha]'[t]]]] ==
0, \[Alpha] == -Pi/3, \[Alpha]' == 0}, \[Alpha], {t, 0,
tmaxTemp},
Method -> {"EventLocator",
"Event" -> {\[Alpha]'[t], \[Alpha]'[t]},
"EventCondition" -> {True, (Abs[\[Alpha][t]] < 0.01)},
"EventAction" :> {Sow[{t, \[Alpha][t], surf}],
Throw[tmaxTemp = t, "StopIntegration"]}}]], {{1}, {2}}];

If[tmaxTemp == interp[][][][][][],(*
If tmaxTemp is the same as the last value of the interp function,
the NDSolve has finished succesfully*)
interp,
surf = surf*1.0001;
Goto[repeatChangingSurface];] (* Else there was an error in NDSolve \
and we try with a sligthly different surface *)
]

Notice that if you repeat the execution several times the list of maxima changes.

Sometimes you get this result:
{{\[Alpha] -> \!\(\*
TagBox[
RowBox[{"InterpolatingFunction", "[",
RowBox[{
RowBox[{"{",
RowBox[{"{",
RowBox[{"0.`", ",", "7.578028259624528`"}], "}"}], "}"}], ",", "\<\"<>\"\>"}],
"]"}],
False,
Editable->False]\)}, {{1.97478, 0.283895, 0.162}, {3.84739, -0.0799267,
0.162}, {5.71299, 0.0225631, 0.162}, {7.57803, -0.00637085, 0.162}}}

and sometime this other:
{{\[Alpha]->InterpolatingFunction[{{0.,7.57803}},<>]},{{1.97478,0.283895,0.162},{3.84739,-0.0799267,0.162},{5.71299,0.0225631,0.162}}}

```

• Prev by Date: Sorry for the empty message. Here is the problem with DiscreteMarkovProcess...
• Next by Date: Re: PolynomialQuotient slow
• Previous by thread: Sorry for the empty message. Here is the problem with DiscreteMarkovProcess...
• Next by thread: Re: PolynomialQuotient slow