Re: ndsolve & compile
- To: mathgroup at smc.vnet.net
- Subject: [mg64932] Re: ndsolve & compile
- From: Christopher Klausmeier <klausme1 at msu.edu>
- Date: Wed, 8 Mar 2006 00:59:45 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Rob -- Thanks for the help. The vector form of the equations does speed things up nicely on these uncoupled equations. What I really want to do is solve coupled equations (like a spatially-discretized version of a reaction-diffusion model), which I haven't had as much luck with. In this case, the vector form you suggested does horribly compared to the naive form with n[x]'[t]s in it. Any suggestions? [I know Mathematica can do PDE's directly, but the real problem I have in mind contains integrals over the spatial variable, so I thought it would be best to discretize in space manually.] In[2]:= tmax=100; r=1; k=2; kp=1; c=1; m=0.1; d=0.001; xmax=256; dmat =NDSolve`FiniteDifferenceDerivative[2, Range[0,1,1.0/xmax], DifferenceOrder\[Rule]2,PeriodicInterpolation\[Rule]True]@ DifferentiationMatrix[]; eqns=Flatten[Table[{ n[x]'[t]\[Equal] r*n[x][t]*(1-n[x][t]/k)-c*n[x][t]*p[x][t]/(n[x][t]+kp)+ d*(dmat[[Mod[x-1,xmax,1],x]]*n[Mod[x-1,xmax,1]][t]+ dmat[[x,x]]*n[x][t]+ dmat[[Mod[x+1,xmax,1],x]]*n[Mod[x+1,xmax,1]][t]), p[x]'[t]\[Equal] c*n[x][t]*p[x][t]/(n[x][t]+kp)-m*p[x][t]+ d*(dmat[[Mod[x-1,xmax,1],x]]*p[Mod[x-1,xmax,1]][t]+ dmat[[x,x]]*p[x][t]+ dmat[[Mod[x+1,xmax,1],x]]*p[Mod[x+1,xmax,1]][t]) },{x,1,xmax}]]; ics=Flatten[ Table[{n[x][0]\[Equal]If[0.4*xmax<x<0.6*xmax,1,0], p[x][0]\[Equal]0.3},{x,1,xmax}]]; unks=Flatten[Table[{n[x],p[x]},{x,1,xmax}]]; First[Timing[ NDSolve[Flatten[Join[eqns,ics]],unks,{t,0,tmax},MaxSteps\[Rule] Infinity] ]] Out[14]= 13.3953 Second In[15]:= First[Timing[ NDSolve[{n'[t]\[Equal]r*n[t]*(1-n[t]/k)-c*n[t]*p[t]/(n[t]+kp) +d*dmat.n[t], p'[t]\[Equal]c*n[t]*p[t]/(n[t]+kp)-m*p[t]+d*dmat.p[t], n[0]\[Equal]Table[If[0.4*xmax<x<0.6*xmax,1,0],{x,1,xmax}], p[0]\[Equal]Table[0.3,{x,1,xmax}]},{n,p},{t,0,tmax}, MaxSteps\[Rule]Infinity] ]] Out[15]= 65.7573 Second When diffusion is turned off (d=0), the first method takes 4.5 seconds but the second takes only 1.2 seconds, so I'd like to harness that speed if possible. thanks again -- Chris -- Christopher Klausmeier Kellogg Biological Station Michigan State University Hickory Corners MI 49060 Web: http://www.kbs.msu.edu/Faculty/Klausmeier/Index.htm Email: klausme1 at msu.edu Phone: (269) 671-4987