Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2013

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

Search the Archive

Re: Real time progress of NDSolve

  • To: mathgroup at smc.vnet.net
  • Subject: [mg129711] Re: Real time progress of NDSolve
  • From: Alexei Boulbitch <Alexei.Boulbitch at iee.lu>
  • Date: Wed, 6 Feb 2013 05:51:59 -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

Hi all,
Lately I'd been trying to solve some very complicated ODEs (they arise from modifications of General Relativity), but there were two problems:
1) NDSolve would take several (15+) minutes to solve them,
2) Many times it would actually fail as the system is very stiff.
Trying to understand what was going on and also having a real time estimate of the progress of NDSolve, I came up with the following code that actually helped me address the issues mentioned above:

data = {{0, 1}};
k = 0;
ProgressIndicator[Dynamic[k], {0, 30}]
Dynamic[ListPlot[data, Frame -> True,
  PlotRange -> {{0, 31}, {0, 1.2}}]]
NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 0, 30},
  StepMonitor :> (Pause[.02]; Set[k, x]; AppendTo[data, {x, y[x]}])];

The ProgressIndicator provides the real time estimate of the progress and the Dynamic+ListPlot show where NDSolve has a certain "difficulty" (notice the "hiccup" in this example at x~12). The ODE used is of course very simple and not the one I used in practice.

In any case, this is not groundbreaking or anything, but it helped me and I thing it's quite cool, so I decided to share it.

Cheers

Hi,
That's a nice example. I just would like to note that with advent of M9 there is a possibility to use also Gauges for the same purpose as the indicator. Makes the same, but looks less boring. Evaluate this:

Clear[x, y, data, k];
data = {{0, 1}};
k = 0;
HorizontalGauge[Dynamic[k], {0, 30}]
Dynamic[BulletGauge[k, 20, {0, 30}]]
Dynamic[ListPlot[data, Frame -> True,
  PlotRange -> {{0, 31}, {0, 1.2}}]]
NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 0, 30},
  StepMonitor :> (Pause[.02]; Set[k, x]; AppendTo[data, {x, y[x]}])];

Have fun, Alexei

Alexei BOULBITCH, Dr., habil.
IEE S.A.
ZAE Weiergewan,
11, rue Edmond Reuter,
L-5326 Contern, LUXEMBOURG

Office phone :  +352-2454-2566
Office fax:       +352-2454-3566
mobile phone:  +49 151 52 40 66 44

e-mail: alexei.boulbitch at iee.lu







  • Prev by Date: Re: Using hyperlinks to move to computations and back to text
  • Next by Date: Re: Mathematica and Lisp
  • Previous by thread: Real time progress of NDSolve
  • Next by thread: Re: Real time progress of NDSolve