DSolve has reached the maximum number of calculations

I reached the maximum number of calculations when using DSolve to calculate differential equations, which makes it impossible to fully solve. How can I expand the number of calculations of DSolve?

Here is my code:

system = {vi q[t] == l iL'[t] + vC[t], 
   vC'[t] == iL[t]/c - vC[t]/(r c), vC[0] == 0, iL[0] == 0};
control = {q[0] == 1, 
   WhenEvent[Mod[t, \[Tau]] == (2/3) \[Tau], q[t] -> 0], 
   WhenEvent[Mod[t, \[Tau]] == 0, q[t] -> 1]};
pars = {vi -> 24, r -> 22, l -> 2 10^-2, 
   c -> 1 10^-4, \[Tau] -> 2.5 10^-5};
sol = DSolve[{system, control} /. pars, {vC, iL, q}, {t, 0, .2}, 
   DiscreteVariables -> q];
a = Evaluate[iL[t] /. sol];
b = Evaluate[vC[t] /. sol];
Plot[a, {t, 0, 0.2}, AxesLabel -> {"s", "il[t]/A"}, 
 PlotLegends -> {"LinearlyImplicitEuler"}, PlotStyle -> {Red}, 
 PlotRange -> All]
Plot[b, {t, 0, 0.2}, AxesLabel -> {"s", "vc[t]/V"}, 
 PlotLegends -> {"LinearlyImplicitEuler"}, PlotStyle -> {Blue}, 
 PlotRange -> All]

Have you tried NDSolve instead of Solve?

Because I want to obtain an exact solution, I am using DSolve instead of NDSolve.

With this kind of thinking, we have many thousands of pages of analytical solutions. Do you really need an analytical solution?

After calculations by DSolve, conclusions can be drawn ,solution looks off than numeric one ,maybe a bug in DSolve.

Even for parameter:

\[Tau] -> 2.5 10^-5

DSolve probably give you not correct solution.See attached file.

Regards M.I

Diff equation.nb (477 KB)

In this case I would try Piecewise instead of WhenEvent:

\[Tau] = 1/9;
pwQ[t_] = PiecewiseExpand[Boole[0 <= Mod[t, \[Tau]] < (2/3)*\[Tau]],
   0 <= t <= 3 \[Tau]];
spSystem = {vi  pwQ[t] == l  iL'[t] + vC[t],
   vC'[t] == iL[t]/c - vC[t]/(r  c),
   vC[0] == 0, iL[0] == 0};
pwSol = DSolve[system2, {vC, iL},
    {t, 0, 2/10}] // Simplify;
Simplify[spSystem /. pwSol[[1]] /.
  {{t -> 1/100}, {t -> 1/9 - 1/27 + 1/30}, {t -> 1/9 + 1/27}}]

When I expanded the t-value range of the function pwQ[t_] and ran the program, the system prompted “PienewiseExpand cannot convert Floor [4000. \ t] to Pienewise form because the required number of segmented cases to search exceeds the internal limit of $MaxPienewiseCases=100”.

Can I try changing the size of the internal limit $MaxPierceCases?

program code:

\[Tau] = 2.5 10^-4;
pwQ[t_] = 
  PiecewiseExpand[Boole[0 <= Mod[t, \[Tau]] < (2/3)*\[Tau]], 
   0 <= t <= 3/100];
pars = {vi -> 24, r -> 22, l -> 2 10^-2, c -> 1 10^-4};
spSystem = {vi pwQ[t] == l iL'[t] + vC[t], 
   vC'[t] == iL[t]/c - vC[t]/(r c), vC[0] == 0, iL[0] == 0};
pwSol = DSolve[spSystem /. pars, {vC, iL}, {t, 0, 2/100}] // 
   Simplify;
a = Evaluate[iL[t] /. pwSol];
b = Evaluate[vC[t] /. pwSol];
Plot[a, {t, 0, 0.02}, AxesLabel -> {"s", "il[t]/A"}, 
 PlotLegends -> {"LinearlyImplicitEuler"}, PlotStyle -> {Red}, 
 PlotRange -> All]
Plot[b, {t, 0, 0.02}, AxesLabel -> {"s", "vc[t]/V"}, 
 PlotLegends -> {"LinearlyImplicitEuler"}, PlotStyle -> {Blue}, 
 PlotRange -> All]

I didn’t know about $MaxPienewiseCases. You can try increasing it Do you know in advance how many intervals you need? For a full analytical solution I would use exact numbers:

\[Tau] = 25/10 10^-4;

Yes, I found the help document for

$MaxPickewiseCases

and directly set $MaxPickewiseCases=(the range you want). The link to the help document isenter link description here

But my code doesn’t produce any results…

\[Tau] = 25/10 10^-4;
pwQ[t_] = 
  PiecewiseExpand[Boole[0 <= Mod[t, \[Tau]] < (2/3)*\[Tau]], 
   0 <= t <= 3/100];
$MaxPiecewiseCases = 200;
pars = {vi -> 24, r -> 22, l -> 2 10^-2, c -> 1 10^-4};
spSystem = {vi pwQ[t] == l iL'[t] + vC[t], 
   vC'[t] == iL[t]/c - vC[t]/(r c), vC[0] == 0, iL[0] == 0};
pwSol = DSolve[spSystem /. pars, {vC, iL}, {t, 0, 2/100}] // 
   Simplify;
a = Evaluate[iL[t] /. pwSol];
b = Evaluate[vC[t] /. pwSol];
Plot[a, {t, 0, 0.02}, AxesLabel -> {"s", "il[t]/A"}, 
 PlotLegends -> {"LinearlyImplicitEuler"}, PlotStyle -> {Red}, 
 PlotRange -> All]
Plot[b, {t, 0, 0.02}, AxesLabel -> {"s", "vc[t]/V"}, 
 PlotLegends -> {"LinearlyImplicitEuler"}, PlotStyle -> {Blue}, 
 PlotRange -> All]