3
$\begingroup$

If I have a system of differential equations, I solve it and save the result in Sol:

Clear[a, b, S0, I0];

a = .0015; b = .9; S0 = 1000; I0 = 10; tmax = 20;

t0 = 0;

Sol = NDSolve[{S'[t] == -a*II[t]*S[t], 
   II'[t] == a*II[t]*S[t] - b*II[t], S[0] == S0, II[0] == I0}, {S[t], 
   II[t]}, {t, 0, tmax}]

For II[t], the graph is correct, which demonstrates that the result is also correct. enter image description here

Then, I want to plot the graph of $\int_{t0}^{t} II[t] dt$. The domain of the graph should be [-10, 60].

Plot[NIntegrate[Evaluate[II[t] /. Sol], {t, t0, tmax}], {t, 0, tmax}, 
 AspectRatio -> .5, AxesLabel -> {"t", "I(t)"}, PlotRange -> All, 
 AxesOrigin -> {0, 0}]

The graph looks like this. enter image description here

It is obviously wrong.

I was wondering what the problem is here, and how I should perform the integration.

$\endgroup$
8
  • 3
    $\begingroup$ What does "the graph seems to be wrong" mean. It doesn't display the behavior you expect? It doesn't plot anything? It spits out some errors? Please be more specific. Also (and this might be the problem), the syntax for your NDSolve is wrong. Please look up the correct syntax in the documentation for NDSolve to make that work. Also, you need to specify all numerical parameters. What are the values of a, b, etc.? $\endgroup$
    – march
    Mar 20, 2023 at 21:13
  • $\begingroup$ Thanks for getting back! I edited my question. Hopefully, it clears up some confusion. The problem here doesn't seem to be with NDSolve, since I get the correct graphs for S[t] and R[t], etc. I think the problem lies in the syntax of integration. $\endgroup$
    – yixjia
    Mar 20, 2023 at 22:00
  • $\begingroup$ Without your full (working!) code, we can't test out what's going wrong. I appreciate the update for how the graph is wrong, but working NDSolve code with the values for the parameters is necessary so that we can run the code on our own copies of Mathematica and tinker with it to figure out a solution to your problem. $\endgroup$
    – march
    Mar 20, 2023 at 22:15
  • $\begingroup$ That said: does this work? Plot[NIntegrate[Evaluate[II[tp] /. Sol], {tp, t0, t}], {t, 0, tmax}, AspectRatio -> .5, AxesLabel -> {"t", "I(t)"}, PlotRange -> All, AxesOrigin -> {0, 0}] $\endgroup$
    – march
    Mar 20, 2023 at 22:16
  • 1
    $\begingroup$ Try ListLinePlot[Head@Integrate[II[t] /. First@Sol, t], AspectRatio -> .5, AxesLabel -> {"t", "I(t)"}, PlotRange -> All, AxesOrigin -> {0, 0}] $\endgroup$
    – Michael E2
    Mar 21, 2023 at 3:22

3 Answers 3

3
$\begingroup$

In this bit of code:

NIntegrate[Evaluate[II[t] /. Sol], {t, t0, tmax}]

you really want to integrate to t, not to tmax, because otherwise it's just a number. To do this, we instead use the code

Integrate[II[t] /. Sol /. t -> tp, {tp, t0, t}]

which is equivalent to $\int_{t_0}^{t}II(t_p)dt_p$ (note that the integration variable is different than the $t$ in the limits!). Because Sols is defined as II[t] -> stuff, we need to replace II[t] first, but then replace t with tp in order to do the integration (this is not strictly necessary, because Integrate scopes its integration variable, but nevermind, and anyway it's a good idea to make the Mathematica code reflect the mathematics).

(Note: I replaced NIntegrate with Integrate because InterpolatingFuntions can be integrated symbolically, since they're just made of polynomials under the hood. This isn't necessary, but it can be a nice trick elsewhere.)

With those changes, we get the following:

Clear[a, b, S0, I0];
a = .0015; b = .9; S0 = 1000; I0 = 10; tmax = 20;
t0 = 0;
Sol = NDSolve[{S'[t] == -a*II[t]*S[t], II'[t] == a*II[t]*S[t] - b*II[t], S[0] == S0, II[0] == I0},
              {S[t], II[t]}, {t, 0, tmax}];

Plot[
  Evaluate@Integrate[II[t] /. Sol /. t -> tp // Evaluate, {tp, 0, t}],
  {t, 0, tmax},
  AspectRatio -> .5,
  AxesLabel -> {"t", "I(t)"}, 
  PlotRange -> All,
  AxesOrigin -> {0, 0}
 ]

yielding

enter image description here

$\endgroup$
2
  • $\begingroup$ I truly appreciate the specific explanation, and I now understand that it should be {tp, t0, t} instead of {t, t0, tmax}. However, I think that the graph should not have the same shape as the original one, and it should keep increasing instead of decreasing, since it accumulates the former values. In my opinion, it should resemble more of a logistic curve. The value of II[t] decreases after t = 7, so the slope of the integration should decrease instead of the value. $\endgroup$
    – yixjia
    Mar 20, 2023 at 23:17
  • 1
    $\begingroup$ @yixjia You're right! A simple matter of getting the order of evaluation wrong. I've fixed the issue with an Evaluate. $\endgroup$
    – march
    Mar 21, 2023 at 3:12
3
$\begingroup$
Clear["Global`*"];

a = 15/10000; b = 9/10; S0 = 1000; I0 = 10; tmax = 20;

t0 = 0;

Sol = NDSolve[{S'[t] == -a*II[t]*S[t], 
     II'[t] == a*II[t]*S[t] - b*II[t], S[0] == S0, 
     II[0] == I0}, {S[t], II[t]}, {t, t0, tmax}][[1]];

Plot[II[t] /. Sol, {t, t0, tmax}]

enter image description here

intII[tv_?NumericQ] := NIntegrate[II[t] /. Sol, {t, t0, tv}]

Plot[intII[t], {t, 0, tmax},
 AspectRatio -> .5,
 AxesLabel -> {"t", "I(t)"},
 PlotRange -> All,
 AxesOrigin -> {0, 0}]

enter image description here

$\endgroup$
3
$\begingroup$

I would just include the integral into your ODE, because then you avoid using numerical integration for each point of the plot. Specifically, if int[t] is your function, then int'[t] == II[t], and the initial condition is int[0] == 0. So, use:

Sol = NDSolveValue[
    {
    (* your original equations *)
    S'[t] == -a II[t] S[t],
    II'[t] == a II[t] S[t] - b II[t],
    S[0] == S0,
    II[0] == I0,

    (* equations for integral *)
    int'[t] == II[t],
    int[0] == 0
    },
    {S, II, int},
    {t, 0, tmax}
];

Then, the third element is the integral:

ListLinePlot @ Sol[[3]]

enter image description here

$\endgroup$
1
  • $\begingroup$ Definitely the more elegant way to do it! $\endgroup$ Mar 21, 2023 at 17:42

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.