Re: NDSolve and differential equation system
- To: mathgroup at smc.vnet.net
- Subject: [mg54074] Re: NDSolve and differential equation system
- From: Maxim <ab_def at prontomail.com>
- Date: Thu, 10 Feb 2005 02:46:04 -0500 (EST)
- References: <cu1vjh$ltj$1@smc.vnet.net> <cud7nd$307$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On Wed, 9 Feb 2005 14:46:05 +0000 (UTC), Christian Moosmann <some@Adress>
wrote:
> Hi again
>
> Thanks for your suggestions, using Erf[] instead of UnitStep[] gains a
> factor of about 2, so this is a step to the right direction.
>
>
> > You can a) use the wonderful advanced interface of NDSolve[]
> > to use a constant step size
>
> Sadly the IDA method does not support fixed step sizes. And - correct me
> if I am wrong - only the IDA method can solve differential algebraic
> equations.
>
> > However, if Ainv.K1 and Ainv.K2 commute
>
> Thanks for your effort here, but sadly they don't :-(
>
>
>
>
> Thanks again very much for your suggestions. Do you have some more? ;-)
>
> Christian
>
Here's another suggestion: 1) rewrite the equations as a scalar system; 2)
define v[t] as v[t_?NumericQ]:=...; 3) include the corner points t=1/5 and
t=9/20 in the iterator of NDSolve; 4) decrease PrecisionGoal; 5) set
SolveDelayed to False.
In[1]:=
SeedRandom[1]
Dim = 80;
K1 = Table[Random[], {Dim}, {Dim}];
K2 = Table[Random[], {Dim}, {Dim}];
Ainv = Inverse[Table[Random[], {Dim}, {Dim}]];
B = Table[Random[], {Dim}];
v[t_?NumericQ] := UnitStep[t - 2/10]*4*(t - 2/10) -
UnitStep[t - 45/100]*4*(t - 45/100);
Lsol = Module[
{Lf = Array[x, {Dim}], x},
x = Evaluate[Through[Lf[#]]]&;
NDSolve[Thread /@
{x'[t] + Ainv.(K1 + v[t]*K2).x[t] == B,
x[0] == Table[0, {Dim}]},
Lf, {t, 0, 1/5, 9/20, 1},
PrecisionGoal -> 6]
]; // Timing
Out[1]=
{75.625 Second, Null}
In[2]:=
MaxMemoryUsed[]
Out[2]=
394147368
In principle Dim=100 is possible too, the memory requirements will be
below 2Gb. It is interesting that if we compare the performance of NDSolve
with the definition for v[t] given as v[t_]=... and with the same
definition where UnitStep is replaced with (Sqrt[#^2]/# + 1)/2&, then
CPU/memory usage will be much higher in the second case. This suggests
that the preprocessing of the equations may be the bottleneck here, not
necessarily related to piecewise functions, hence the idea to use
v[t_?NumericQ].
A rather strange issue is that repeated evaluations of the same NDSolve
command take more and more time:
In[3]:=
Table[
Module[
{Lf = Array[x, {Dim}], x},
x = Evaluate[Through[Lf[#]]]&;
NDSolve[Thread /@
{x'[t] + Ainv.(K1 + v[t]*K2).x[t] == B,
x[0] == Table[0, {Dim}]},
Lf, {t, 0, 1/5, 9/20, 1},
PrecisionGoal -> 6]
]; // Timing,
{3}][[All, 1]]
Out[3]=
{118.125 Second, 129.968 Second, 145.344 Second}
This may be a problem with internal NDSolve code or something related to
memory management; no swapping is taking place but we can't be sure about
garbage collection.
Maxim Rytin
m.r at inbox.ru