I am solving the following ODE in Mathematica using NDSolve:


where $k_s$ and $k_e$ are constants. The code I am using to solve the ODE is

s0 = NDSolve[{a'[t] == -ksc*a[t]^3 - kec*ccat*a[t]^2, a[0] == 2.5}, 
a, {t, 0, 2000}];

However, I have noticed that I get different results depending on when I end my time range. Specifically, I am solving


for t.

If my time range goes to 2000, I get $t=4334.91$, but if my time range goes to 20,000, I get $t=17,705$. Any idea why this is occurring and which of the two is the correct result?

Edit: I've attached the code used to find t and parameter values.

NSolve[2.5/Evaluate[a[t] /. s0] == 500, t]

$k_s=0.2$ and $k_e=0.00825$

  • $\begingroup$ I'll assume a[t] in your code stands for $C_A$. How do you solve $500=2.5/C_A(t)$? If your maximum $t=2000$ in NDSolve, anything further would be extrapolation. $\endgroup$
    – Chris K
    Commented Apr 27, 2017 at 18:49
  • $\begingroup$ @ChrisK You assumption is correct. Sorry if I was not clear, but in the first case it goes to 2000, but in the second case I've changed the code to $t_{\text{end}}=20,000$. $\endgroup$
    – Tunk
    Commented Apr 27, 2017 at 18:51
  • $\begingroup$ Thanks. How do you solve $500=2.5/C_A(t)$? Do you work on the InterpolatingFunction after the NDSolve or use a WhenEvent? Have you tried plotting the solution to see which answer is correct? $\endgroup$
    – Chris K
    Commented Apr 27, 2017 at 18:55
  • $\begingroup$ @ChrisK I've attached the code I'm using to solve for t. In regards to using a plot to determine which is the correct value, the plot also shows that the solution changes depending on the time scale. $\endgroup$
    – Tunk
    Commented Apr 27, 2017 at 18:58
  • $\begingroup$ Hard to say for sure without knowing the parameter values, but I'm pretty sure that the real answer occurs at $t=17705$ and the other one is based on extrapolation of your InterpolatingFunction outside the range it was defined on. $\endgroup$
    – Chris K
    Commented Apr 27, 2017 at 19:01

1 Answer 1


When you solve the differential equations to tmax=2000, the only way s0 can go beyond that time is by extrapolation, which easily goes wild. Look at this, where the valid solution is green and the extrapolated one is red:

ksc = 0.2;
kec = 0.00825;
ccat = 1;
tmax = 2000;
s0 = NDSolve[{a'[t] == -ksc*a[t]^3 - kec*ccat*a[t]^2, a[0] == 2.5}, a, {t, 0, tmax}];
  Plot[Evaluate[{500, 2.5/a[t] /. s0}], {t, 0, 2000}, PlotStyle -> {Blue, Green}],
  Plot[Evaluate[{500, 2.5/a[t] /. s0}], {t, 2000, 20000}, PlotStyle -> {Blue, Red}],
  PlotRange -> {{0, 20000}, {0, 600}}

Mathematica graphics

Here we actually solve the differential equations for tmax=20000, which means no extrapolation is used:

tmax = 20000;
s0 = NDSolve[{a'[t] == -ksc*a[t]^3 - kec*ccat*a[t]^2, a[0] == 2.5}, a, {t, 0, tmax}];
Plot[Evaluate[{500, 2.5/a[t] /. s0}], {t, 0, tmax}, PlotRange -> All, PlotStyle -> {Blue, Green}]

Mathematica graphics

Clearly the real answer is around $t=17700$.

  • $\begingroup$ Thanks a ton! Completely makes sense now. $\endgroup$
    – Tunk
    Commented Apr 27, 2017 at 19:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.