Re: Memory problem using NDSolve in For Loop
- To: mathgroup at smc.vnet.net
- Subject: [mg83363] Re: Memory problem using NDSolve in For Loop
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Sun, 18 Nov 2007 04:51:12 -0500 (EST)
- References: <fhmhrn$atl$1@smc.vnet.net>
DBK wrote:
> I am running a number of simulations (sim) with different initial
> conditions (ic). The code I have written runs fine until I increase
> the number of simulations. In my "For" loop below, I thought that
> previous solutions (sol[sim]) were being cleared but this obviously is
> not happening. How do I clear sol and reduce my memory usage? Sorry if
> this is pretty basic stuff.
>
> For[sim = 1, sim < 2500, sim = sim + 1,
> sol[sim] =
> NDSolve[{equations, a[0] == 10, b[0] == .45, c[0] == .30,
> d[0] == .40, e[0] == ic[[sim, 1]], f[0] == ic[[sim, 2]]}, {a, b,
> c, d, e, f}, {t, 0, time}, MaxSteps -> Infinity,
> WorkingPrecision -> 5, MaxStepSize -> 0.10];
> AppendTo[outlist, {ic[[sim, 1]], ic[[sim, 2]], e[time] /. sol[sim],
> f[time] /. sol[sim]}]];
>
Never use For[] for simple looping in Mathematica. Use Do[] instead.
Instead of
For[sim = 1, sim < 2500, sim = sim + 1,
...]
use
Do[ ... , {sim, 1, 2499}]
or simply
Do[ ... , {sim, 2499}]
Whenever you need to collect the results into a list, use Table[]
instead of Do[].
This is a direct transformation of your program:
Table[
With[{sol =
NDSolve[{equations, a[0] == 10, b[0] == .45, c[0] == .30,
d[0] == .40, e[0] == ic[[sim, 1]], f[0] == ic[[sim, 2]]}, {a, b,
c, d, e, f}, {t, 0, time}, MaxSteps -> Infinity,
WorkingPrecision -> 5, MaxStepSize -> 0.10]},
{ic[[sim, 1]], ic[[sim, 2]], e[time] /. sol, f[time] /. sol}],
{sim, 2500}]
With[] is used to create local constants ('sol' in this case), but it
not strictly necessary here since you could just use
{ic[[sim, 1]], ic[[sim, 2]], e[time], f[time]} /. NDsolve[...]
instead of
sol = NDSolve[ ... ]
{ic[[sim, 1]], ic[[sim, 2]], e[time] /. sol, f[time] /. sol}
It can probably be made even more compact, but I cannot tell without
knowing the exact structure of 'ic'. You could try something like the
following (untested):
({#1, #2, e[time], f[time]} /.
NDSolve[{equations, a[0] == 10, b[0] == .45, c[0] == .30,
d[0] == .40, e[0] == #1, f[0] == #2}, {a, b, c, d, e, f}, {t, 0,
time}, MaxSteps -> Infinity, WorkingPrecision -> 5,
MaxStepSize -> 0.10]) & @@@ ic
Szabolcs