4

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.

xzczd
  • 65,995
  • 9
  • 163
  • 468
Artem Zefirov
  • 361
  • 1
  • 11

1 Answers1

6

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}}]}]

Mathematica graphics

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

Mathematica graphics

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

Mathematica graphics

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
xzczd
  • 65,995
  • 9
  • 163
  • 468