Skip to main content

differential equations - Strange DAE solution


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

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

Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

mathematical optimization - Minimizing using indices, error: Part::pkspec1: The expression cannot be used as a part specification

I want to use Minimize where the variables to minimize are indices pointing into an array. Here a MWE that hopefully shows what my problem is. vars = u@# & /@ Range[3]; cons = Flatten@ { Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; Minimize[{Total@((vec1[[#]] - vec2[[u[#]]])^2 & /@ Range[1, 3]), cons}, vars, Integers] The error I get: Part::pkspec1: The expression u[1] cannot be used as a part specification. >> Answer Ok, it seems that one can get around Mathematica trying to evaluate vec2[[u[1]]] too early by using the function Indexed[vec2,u[1]] . The working MWE would then look like the following: vars = u@# & /@ Range[3]; cons = Flatten@{ Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; NMinimize[ {Total@((vec1[[#]] - Indexed[vec2, u[#]])^2 & /@ R...

What is and isn't a valid variable specification for Manipulate?

I have an expression whose terms have arguments (representing subscripts), like this: myExpr = A[0] + V[1,T] I would like to put it inside a Manipulate to see its value as I move around the parameters. (The goal is eventually to plot it wrt one of the variables inside.) However, Mathematica complains when I set V[1,T] as a manipulated variable: Manipulate[Evaluate[myExpr], {A[0], 0, 1}, {V[1, T], 0, 1}] (*Manipulate::vsform: Manipulate argument {V[1,T],0,1} does not have the correct form for a variable specification. >> *) As a workaround, if I get rid of the symbol T inside the argument, it works fine: Manipulate[ Evaluate[myExpr /. T -> 15], {A[0], 0, 1}, {V[1, 15], 0, 1}] Why this behavior? Can anyone point me to the documentation that says what counts as a valid variable? And is there a way to get Manpiulate to accept an expression with a symbolic argument as a variable? Investigations I've done so far: I tried using variableQ from this answer , but it says V[1...