MathGroup Archive 2006

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

Search the Archive

Re: NDSolve useless?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg63909] Re: NDSolve useless?
  • From: rknapp at wolfram.com
  • Date: Sat, 21 Jan 2006 01:51:12 -0500 (EST)
  • References: <dqd9oi$mc5$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

The problem here is that you are comparing apples and oranges.

ode45 requires that you set up a function that returns the right hand
side of the ODEs in first order normal form, which I assume is what you used to
make comparisons.

You have the option to do this in Mathematica (though it is not required),
and as I show below, there is very little speed difference between NDSolve
and ode45 with this specification.

The reason Mathematica is so much slower for the problem specification you
have set up is that you have created a large symbolic expression that
Mathematica is required to process and optimize.  We have made 
improvements so that this processing will be faster in the next release
of Mathematica, but even so, it is still much faster, particularly in
a problem of this type, to just specify the right hand sides of the equations:

Define:

NV = 128;
tf = 1.0;
delta = 0.1;
a = 0.01;
x0=Table[n/NV+a Sin[2p n/NV],{n,1,NV}];
y0=Table[-a Sin[2p n/NV],{n,1,NV}];

(* This gives the right hand side of the equations *)
cf = Compile[{{x, _Real,
      1}, {y, _Real, 1}},  Module[{difx, dify, deno,NV = Length[x]},
        Transpose[Table[
            difx = 2.*Pi*(x[[n]] - x);
            dify = 2.*Pi*(y[[n]] -y);
            deno = 2.*NV*(Cosh[dify] - Cos[difx]  +delta^2);
            {Total[-Sinh[dify]/deno], Total[Sin[difx]/deno]},
            {n, 1,NV}]]
        ]];


(* Using this prevents evaluation except during the solution process *)
g[{x_?VectorQ, y_?VectorQ}] := cf[x, y];

then, I get

In[10]:=
Timing[sol=First[NDSolve[{xy'[t]  == g[xy[t]],xy[0] == {x0,
y0}},xy,{t,0,tf}]]]

Out[10]=
{2.984 Second,{xy->InterpolatingFunction[{{0.,1.}},<>]}}

the reason that this is slower than your time for ode45 is that the
default tolerances
for Mathematica are set more stringently.  Essentially the some
tolerance settings
as for ode45 can be achieved with

In[11]:=
Timing[sol=First[NDSolve[{xy'[t]  == g[xy[t]],xy[0] == {x0, y0}},xy,
        {t,0,tf}, PrecisionGoal->3, AccuracyGoal->6]]]

Out[11]=
{1.39 Second,{xy->InterpolatingFunction[{{0.,1.}},<>]}}

which is quite comparable in time.


  • Prev by Date: Re: A quick question regarding expectation rules
  • Next by Date: Re: A quick question regarding expectation rules
  • Previous by thread: Re: NDSolve useless?
  • Next by thread: Re: Re: NDSolve useless?