# Manipulate and parameters in NDSolve

I'm trying to use Manipulate to change some parameters in these differential equations, as follows:

 sol[\[Alpha]_, \[Beta]_] :=
sol[\[Alpha], \[Beta]] =
NDSolve[{D[S[t], t] + \[Alpha]*S[t]*Inf[t] == 0,
D[Inf[t], t] + \[Beta]*Inf[t] - \[Alpha]*S[t]*Inf[t] == 0,
D[R[t], t] - \[Beta]*Inf[t] == 0, S == 0.88, Inf == 0.11,
R == 0}, {S[t], Inf[t], R[t]}, {t, 0, 60}];

Manipulate[
Plot[{S[t] /. sol[\[Alpha], \[Beta]], R[t] /. sol[\[Alpha], \[Beta]],
Inf[t] /. sol[\[Alpha], \[Beta]]}, {t, 0, 40},
PlotLegends -> {"Sanos", "Recuperados", "Infectados"},
PlotStyle -> {Blue, Green, Red}, PlotStyle -> Thick,
GridLines -> Automatic, AxesLabel -> {"Días", "Población"},
AxesStyle -> Directive[Black, 12]], {\[Alpha], 0.1, 0.9}, {\[Beta],
0.1, 0.9}]


But I get the following errors: ReplaceAll::reps: {NDSolve[{!(*SubscriptBox[([PartialD]), (0)](S))+0.1 Inf S==0,!(*SubscriptBox[([PartialD]), (0)](Inf))+0.1 Inf-0.1 Inf S==0,!(*SubscriptBox[([PartialD]), (0)](R))-0.1 Inf==0,S==0.88,Inf==0.11,R==0},{S,Inf,R},{0,0,60}]} is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing.

General::ivar: 0. is not a valid variable.

General::ivar: 0. is not a valid variable.

General::ivar: 0. is not a valid variable.

General::stop: Further output of General::ivar will be suppressed during this calculation.

NDSolve::dsvar: 0. cannot be used as a variable.

ReplaceAll::reps: {NDSolve[<<1>>]} is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing.

ReplaceAll::reps: {NDSolve[{\!$$\*SubscriptBox[\(\[PartialD]$$, $$0$$]$$S$$\)+0.1 Inf S==0,\!$$\*SubscriptBox[\(\[PartialD]$$, $$0$$]$$Inf$$\)+0.1 Inf-0.1 Inf S==0,\!$$\*SubscriptBox[\(\[PartialD]$$, $$0$$]$$R$$\)-0.1 Inf==0,S==0.88,Inf==0.11,R==0},{S,Inf,R},{0,0,60}]} is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing.

General::stop: Further output of ReplaceAll::reps will be suppressed during this calculation.

NDSolve::dsvar: 0. cannot be used as a variable.

NDSolve::dsvar: 0. cannot be used as a variable.


General::stop: Further output of NDSolve::dsvar will be suppressed during this calculation.

## 3 Answers

another option

Manipulate[

Module[{t, S, Inf, R},
{S, Inf, R} = NDSolveValue[{
D[S[t], t] + α*S[t]*Inf[t] == 0,
D[Inf[t], t] + β*Inf[t] - α*S[t]*Inf[t] == 0,
D[R[t], t] - β*Inf[t] == 0,
S   == 0.88,
Inf == 0.11,
R   == 0},
{S, Inf, R},{t, 0, 60}];

Plot[{S[t], Inf[t], R[t]}, {t, 0, 40},
PlotLegends -> {"Sanos", "Recuperados", "Infectados"},
PlotStyle -> {Blue, Green, Red},
PlotStyle -> Thick,
GridLines -> Automatic,
AxesLabel -> {"Días", "Población"},
AxesStyle -> Directive[Black, 12]
]
],

{α, 0.1, 0.9},
{β, 0.1, 0.9},

TrackedSymbols :> {α, β}
] • Great! it works perfectly. Thank you very much! – Santiago G. May 3 '20 at 19:00

Try

Manipulate[
sol[a_,b_]:={S[t],Inf[t],R[t]}/.NDSolve[{D[S[t],t]+a*S[t]*Inf[t]==0,
D[Inf[t],t]+b*Inf[t]-a*S[t]*Inf[t]==0,D[R[t],t]-b*Inf[t]==0,S==0.88,
Inf==0.11,R==0},{S[t],Inf[t],R[t]},{t,0,60}][];
s=sol[a,b];Plot[s,{t,0,60}],{a,0.1,0.9},{b,0.1,0.9}]


and then undo each of those changes from your original code, one at a time, and see how many of those break things. Then try to study the documentation to try to understand why.

You can use ParametricNDSolveValue to create a parametric function and use it inside Manipulate:

ClearAll[pndsv]

pndsv = ParametricNDSolveValue[{D[S[t], t] + α*S[t]*Inf[t] == 0,
D[Inf[t], t] + β*Inf[t] - α*S[t]*Inf[t] == 0,
D[R[t], t] - β*Inf[t] == 0,
S == 0.88, Inf == 0.11,  R == 0},
{S, Inf, R}, {t, 0, 60}, {α, β}];

Manipulate[Plot[Evaluate @ Through @ pndsv[α, β] @ t, {t, 0, 40},
PlotLegends -> {"Sanos", "Recuperados", "Infectados"},
PlotStyle -> {Blue, Green, Red}, PlotStyle -> Thick,
GridLines -> Automatic, AxesLabel -> {"Días", "Población"},
AxesStyle -> Directive[Black, 12]],
{α, 0.1, 0.9}, {β, 0.1, 0.9}] 