I am attempting to change the sign of a constant when a certain condition is met during a numerical integration. Here is the code:
μk = 0.3; g = 9.81; R = 1; ti = 0; m = 0.3;
EOM = -μk (R θ'[t]^2 + g Sin[θ[t]]) +
g Cos[θ[t]] == R θ''[t];
IC1 = θ'[0] == 0; IC2 = θ[0] == 0;
sol = NDSolve[{EOM, IC1, IC2,
WhenEvent[θ'[t] == 0, {μk = -μk; tf = t;
"RestartIntegration"}]}, θ[t], {t, ti, ∞}];
θ = θ[t] /. sol;
θd = D[θ[t] /. sol, t];
Plot[{θ, θd}, {t, ti, tf}]
The problem lies in the fact that it is not dissipating as it should. θ
should start to approach Pi/2
. Instead it oscillates on to Infinity
.
Note: I discovered that I cannot simply use Sign[θ'[t]]
since the value is crossing zero. A zero value is undesirable in my case.
Here is an image of the system being modeled.
Answer
The code has three issues. First, μk
cannot be changed during the computation unless it is designated by DiscreteVariables
. Second, the list of actions to be taken by WhenEvent
needs to be separated by commas, not semicolons. Third, the upper limit of integration cannot be infinity. With these changes, the code becomes
g = 9.81; R = 1; ti = 0; m = 0.3;
EOM = -μk [t] (R θ'[t]^2 + g Sin[θ[t]]) + g Cos[θ[t]] == R θ''[t];
IC1 = θ'[0] == 0; IC2 = θ[0] == 0;
sol = NDSolve[{EOM, IC1, IC2, μk [0] == 0.3,
WhenEvent[θ'[t] == 0, {μk[t] -> -μk[t], tf = t, "RestartIntegration"}]},
{θ[t], θ'[t], μk[t]}, {t, ti, 10}, DiscreteVariables -> μk];
tmax = Flatten[θ[t] /. sol /. t -> "Domain"] // Last;
Plot[Evaluate[{θ[t], θ'[t], μk[t]} /. sol], {t, ti, tmax}, ImageSize -> Large]
Note that the computation terminates with a NDSolve::ndsz
error. Basically, the computation has become unstable. Method -> "StiffnessSwitching"
does not help. Incidentally, "RestartIntegration"
has no substantive effect in this computation and can be omitted.
Improved Solution
Based on additional information provided by the OP in comments below and in the question itself, a better approach is
g = 981/100; R = 1; ti = 0; m = 3/10; μ = 3/10;
EOM = -μ Sign[θ'[t]] (R θ'[t]^2 + g Sin[θ[t]]) + g Cos[θ[t]] == R θ''[t];
IC1 = θ'[0] == 0; IC2 = θ[0] == 0;
sol = NDSolve[{EOM, IC1, IC2}, {θ[t], θ'[t]}, {t, ti, 10}, WorkingPrecision -> 30];
Plot[Evaluate[{θ[t], θ'[t], μ Sign[θ'[t]]} /. sol], {t, ti, tmax}, ImageSize -> Large]
The two solutions are identical until θ'[t] == 0
at t == 2.062520756856687159564857914
. In the earlier computation, WhenEvent
causes μk
to reverse sign, even though θ'[t]
does not, thereby introducing negative friction. I have tried numerous WhenEvent
options, as well as WorkingPrecision
as high as 60
to resolve this issue, but without success. In conclusion, only the second solution is credible physically.
Comments
Post a Comment