I have a system, consisting of one differential equation and one algebraic equation
req = (1 - xD)/τD - δxD xD ν;
ν = νmax (2/(1 + Exp[(-2 (u - u0))/kv]) - 1);
eqh = u == Istim + gE ν (xD - 0.5);
τD = 2; δxD = 0.01; νmax = 100; u0 = 150; kv = 20; \
Istim = 126; gE = 5;
eqs1 = xD'[t] == (req /. {xD -> xD[t], u -> u[t]});
eqs2 = eqh /. {xD -> xD[t], u -> u[t]}
ics = xD[0] == 0.99;
I try to solve it with the next command:
eqsol = NDSolve[{eqs1, eqs2, ics}, {xD[t], u[t]}, {t, 0, 1}];
Then I want to make sure that this is correct solution, so I plot both variable xD[t] and u[t] and expect to find them on the curve defined by implicit equation from the system.
ParametricPlot[Evaluate[{u[t], xD[t]} /. eqsol], {t, 0, 1},
PlotRange -> Full]
I also can plot that curve by expressing the variable xD[t] as a function of the variable u: xD=xD(u).
xDimp = Solve[eqh, xD];
Plot[Evaluate[xD /. xDimp], {u, u0, 300}]
But I found that these curves don't coincide with each other. I suspect that the integration was executed wrong, but no errors were displayed during the integration. By observing the apt derivative I investigated that the function u(t) can be explicitly found from the implicit equation only for xD>0.54. This solution satisfies me. Due to this constraint I set the initial value as xD=0.99. But shall I define this constraint explicitly? Or else I don't know where the error can be.
Answer
Your equation set actually has 3 solutions. Just enlarge the domain of definition of Plot
a bit:
curve = Plot[Evaluate[xD /. xDimp], {u, -300, 400},
Epilog -> {Dashed, Line[{{-300, 0.99}, {400, 0.99}}]}]
Clearly there're three possible values of u
that satisfys the i.c. xD==0.99
. What's found by NDSolve
automatically is the leftmost one:
solplot1 = ParametricPlot[Evaluate[{u[t], xD[t]} /. eqsol], {t, 0, 1}, PlotStyle -> Red];
curve~Show~solplot1
Why does NDSolve
find the leftmost one only? The answer is hidden in the obscure tutorial tutorial/NDSolveDAE#1966826857
. In short, since the i.c. for u
isn't explicitly given in the code, NDSolve
will try to determine it from an initial guess u[0] == 1
, which converges to the leftmost solution in this case.
To make NDSolve
converge to other solutions, we need to use other initial guesses:
eqsol2 = NDSolve[{eqs1, eqs2, ics}, {xD[t], u[t]}, {t, -1, 1/2},
Method -> {"DAEInitialization" -> {"Collocation",
"DefaultStartingValue" -> #}}][[1]] & /@ {-120, 150, 400}
solplot2 = ParametricPlot[Evaluate[{u[t], xD[t]} /. eqsol2], {t, -1, 1/2},
PlotStyle -> {Green, Orange, Red}];
curve~Show~solplot2
If you don't want to play with those options, explicitly giving i.c. of u
to NDSolve
is OK, of course:
ustart = u /. FindRoot[eqh /. xD -> 0.99, {u, #}] & /@ {0, 160, 300}
(* {-119., 152.142, 371.} *)
eqsol3 = NDSolve[{eqs1, eqs2, ics, u[0] == #}, {xD[t], u[t]}, {t, -1, 1/2}][[1]] & /@
ustart
Comments
Post a Comment