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?
1032511718
(James James)
March 11, 2024, 10:29am
3
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]