Re: System of DE's
- To: mathgroup at smc.vnet.net
- Subject: [mg48230] Re: System of DE's
- From: sean_incali at yahoo.com (sean kim)
- Date: Wed, 19 May 2004 02:42:05 -0400 (EDT)
- References: <c83t0e$mar$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
if you have Scott herod's NDelaySolve code then below works. <<NDelaySolve.m vars = {x[t], y[t], z[t]}; k1 = 0.0001; k2 = 0.1; k3 = 0.0001; n = 2000; f1 = -k1 x[t] y[t] - k3 x[t] z[t]; f2 = -k2 y[t] + k1 x[t] y[t] + k3 x[t] z[t]; f3 = k2 (y[t] - y[t - 14]); inits = {x[t] == n - 10, y[t] == 10, z[t] == 0}; eqns = {x'[t] == f1, y'[t] == f2, z'[t] == f3}; sol = NDelaySolve[ eqns, inits, {t, 0, 200}]; Plot[Evaluate[{x[t], y[t], z[t]} /. sol], {t, 0, 200}, PlotRange -> All]; below is his code. I made a package loadable in Mathematica 5.0 using his codes. copy from "BeginPackage" to "EndPackage" at the end then paste intot anotebook and asave as a package format. then put it into C:\Program Files\Wolfram Research\Mathematica\5.0\AddOns\Applications folder then <<NDelaySolve.m can call it. sean --------------- BeginPackage[ "NDelaySolve`"] NDelaySolve::usage = "sol = NDelaySolve[ {x'[t] == - x[t] y[t - 1] + y[t - 6], y'[t] == x[t] y[t - 1] - y[t], z'[t] == y[t - 1] - y[t - 6]}, {x[t] == 20.0, y[t] == 0.1, z[t] == 1.0}, {t, 0, 20.0}]; \n \n Plot[Evaluate[{x[t], y[t], z[t]} /. sol], {t, 0, 20}, PlotRange -> All]; \n \n NDelayDSolve[eqns, initcond, {t,tmin,tmax}]\n \n Notice that this mimics the syntax of NDSolve but initial values (which may be functions of t) are included in the dependent variable specification section (the second argument). \n Also note that the above example has two delay times, t0 = 1 and t1 = 10. \n Scott A. Herod\n Applied Mathematics\n University of Colorado, Boulder\n Scott.Herod at Colorado.EDU " Begin["`Private`"] Options[NDelaySolve] = {Verbose -> False}; NDelaySolve[eqnConst_, initsConst_, indinterval_, opts___] := Module[{ error = "Something is wrong", ind = indinterval[[1]], start = indinterval[[2]], stop = indinterval[[3]], eqn = Flatten[{eqnConst}], inits = Flatten[{initsConst}], tau, deps, numdeps, dtymes, delayedfs, numb, numbdelay, delaynum, onedelay, forcedterms, sol, functs, witchlist, g, numiters, subs, senteqn, i, j, k1, k2}, deps = Map[Part[#, 1] &, inits]; numdeps = Length[deps]; printQ = Verbose /. {opts} /. Options[NDelaySolve]; If[printQ, Print["eqn = ", eqn]]; If[printQ, Print["inits = ", inits]]; If[printQ, Print["interval = " , indinterval]]; If[printQ, Print["ind = " , ind]]; If[printQ, Print["start = " , start]]; If[printQ, Print["stop = " , stop]]; If[printQ, Print["deps = ", deps]]; dtymes = Map[ (ind - #) &, Union[Flatten[ delayedfs = Map[Cases[#, _Plus, Infinity] &, Map[Cases[eqn, #, Infinity] &, deps /. ind -> Plus[__]]] ]]]; If[printQ, Print["dtymes = ", dtymes]]; dtymes = Sort[ Map[If[MemberQ[{Integer, Rational, Real}, Head[#]], #, If[Head[(numb = N[#])] === Real, numb, error]] &, dtymes]]; If[printQ, Print["dtymes = ", dtymes]]; If[MemberQ[dtymes, error], Return[error]]; If[(tau = dtymes[[1]]) <= 0, Return[error]]; onedelay = ((numbdelay = Length[dtymes]) == 1); delayedfs = Map[Union, delayedfs]; If[printQ, Print["delayedfs = ", delayedfs]]; forcedterms = Table[Table[ deps[[i]] /. ind -> delayedfs[[i, j]], {j, 1, Length[delayedfs[[i]]]}], {i, 1, Length[delayedfs]}]; If[printQ, Print["forcedterms = ", forcedterms]]; delayedfs = N[delayedfs]; delaynum = Map[Length, delayedfs]; funcs = Map[Apply[Rule, #] &, inits]; If[printQ, Print["funcs = ", funcs]]; witchlist = Table[Which[Evaluate[ind <= start, deps[[i]] /. funcs[[i]]] ], {i, 1, numdeps}]; g = Map[Function[Evaluate[ind], #] &, witchlist]; numiters = Ceiling[(stop - start)/tau]; For[j = 1, j <= numiters, j++, jt = N[start + j*tau]; If[printQ, Print["jt = ", jt]]; sub = Flatten[ Table[ Table[ forcedterms[[k2, k1]] -> g[[k2]][delayedfs[[k2, k1]]], {k1, 1, delaynum[[k2]]}], {k2, 1, Length[delaynum]}]]; ics = Table[(deps[[i]] /. ind -> jt - tau) == g[[i]][jt - tau], {i, 1, Length[deps]}]; senteqn = Union[eqn /. sub, ics]; If[printQ, Print["senteqn ", j, " = ", senteqn]]; sol = Flatten[ NDSolve[senteqn, deps, {ind, jt - tau, jt}, opts]]; If[onedelay, witchlist = Table[Join[witchlist[[i]], Apply[Which, {ind <= jt, deps[[i]] /. sol}]], {i, 1, numdeps}]; g = Map[Function[Evaluate[ind], #] &, Table[Apply[Which, {ind <= jt, deps[[i]] /. sol}], {i, 1, numdeps}]], g = Map[Function[Evaluate[ind], #] &, Table[Join[g[[i, 2]], Apply[Which, {ind <= jt, deps[[i]] /. sol}]], {i, 1, numdeps}]] ] ]; If[onedelay, g = Map[Function[Evaluate[ind], #] &, witchlist]]; {Thread[ Rule[deps, Through[g[ind]]]]} ]; End[] EndPackage[]