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