# Having trouble using WhenEvent with NDSolve

First of all, this is my first time on this forum. Please be patient with me because if I make some mistakes in this post. I'm not used to doing this!

I'm trying to modify a parameter during NDSolve iterations. I tried to follow advice given in the following exchanges:

But none of it seems to fit my problem. Perhaps I'm doing something wrong.

Here is my problem:

I'm currently trying to create a model with the following differential equations:

dEc = p1*Ec[t]*(1 - (Ec[t]/Emax)) - d1*Ec[t] - i1*Ic[t]*Ec[t];
dIc = i1*Ic[t]*Ec[t] - u1*Ic[t];
dVp = ist*b1*u1*Ic[t] - c1*Vp[t];


The parameters are defined as following:

parameters =
{Emax ->  10000, p1 ->  0.6, d1 ->  0.003, u1 ->  0.33, c1 ->  10,
b1 ->  6000, i1 ->  0.0000002, ist ->  0.0001};


Then, I'm doing the following NDSolve:

dynamicsmodel =
NDSolve[
Evaluate[
{Ec'[t] == dEc, Ic'[t] == dIc, Vp'[t] == dVp,
Ec == 10000, Ic == 0, Vp == 10}] /. parameters,
{Ec[t], Ic[t], Vp[t]},
{t, 0, 300}]


It seems to work perfectly. But I would like to add an event listener that would change the ist parameter when t >= 200. To do so, I tried with the following code:

dynamicsmodel =
NDSolve[
Evaluate[
{Ec'[t] == dEc, Ic'[t] == dIc, Vp'[t] == dVp,
Ec == 10000, Ic == 0, Vp == 10}] /. parameters,
WhenEvent[t >= 200, parameters[] = ist -> 0.01],
{Ec[t], Ic[t], Vp[t]},
{t, 0, 300}]


But it doesn't seem to work! I get the following error:

To avoid possible ambiguity, the arguments of the dependent variable in WhenEvent[t >= 200, parameters[] = ist -> 0.01] should literally match the independent variables."

I may have misplaced the WhenEvent. I tried to put it inside of the Evaluate expression, but that produces errors.

Please note that I simplified the code to make it more readable. I hope I didn't introduce errors.

• Welcome to Mathematica.SE, Jerobou! I suggest the following: 1) As you receive help, try to give it too, by answering questions in your area of expertise. 2) Take the tour and check the faqs! 3) When you see good questions and answers, vote them up by clicking the gray triangles, because the credibility of the system is based on the reputation gained by users sharing their knowledge. Also, please remember to accept the answer, if any, that solves your problem, by clicking the checkmark sign! – Chris K Mar 11 '19 at 19:49
• Out of curiosity, what does the model represent? – Chris K Mar 11 '19 at 19:49
• A (for this example) very simplified intra-host evolution of viruses after a renal transplant ("ist" represents the modulation of immunosuppression). I'm using a already-existing model as a basis. onlinelibrary.wiley.com/doi/full/10.1111/… – Jerobou Mar 11 '19 at 20:00
• Thanks, I always like seeing more biological models here! – Chris K Mar 11 '19 at 20:06

I believe you need to take ist out of parameters and make it a DiscreteVariable in the NDSolve. This seems to work:

dEc := p1*Ec[t]*(1 - (Ec[t]/Emax)) - d1*Ec[t] - i1*Ic[t]*Ec[t];
dIc := i1*Ic[t]*Ec[t] - u1*Ic[t];
dVp := ist[t]*b1*u1*Ic[t] - c1*Vp[t];

parameters = {Emax -> 10000, p1 -> 0.6, d1 -> 0.003, u1 -> 0.33, c1 -> 10, b1 -> 6000, i1 -> 0.0000002};

dynamicsmodel = NDSolve[{
Ec'[t] == dEc, Ic'[t] == dIc, Vp'[t] == dVp,
Ec == 10000, Ic == 0, Vp == 10, ist == 0.0001,
WhenEvent[t == 200, ist[t] -> 0.01]} /. parameters,
{Ec, Ic, Vp, ist}, {t, 0, 300}, DiscreteVariables -> {ist}][];

GraphicsGrid[{{
Plot[Evaluate[Ec[t] /. dynamicsmodel], {t, 0, 300}, PlotRange -> All, PlotLabel -> Ec],
Plot[Evaluate[Ic[t] /. dynamicsmodel], {t, 0, 300}, PlotRange -> All, PlotLabel -> Ic]},
{Plot[Evaluate[Vp[t] /. dynamicsmodel], {t, 0, 300}, PlotRange -> All, PlotLabel -> Vp],
Plot[Evaluate[ist[t] /. dynamicsmodel], {t, 0, 300}, PlotRange -> All, PlotLabel -> ist]
}}, ImageSize -> 600] Kind of underwhelming though -- maybe different parameters would be more interesting!

As a side note, I like to omit the [t] in the list of dependent variables.

• Perfect. This is working perfectly. Thanks a lot ! You're right, maybe I should play with another parameter! Thanks again! – Jerobou Mar 11 '19 at 19:56