Considering the following physical situation:
and writing the following code:
m := 1.52
g := 9.81
us := 0.15
uk := 0.10
k := 2.12
xi := 4.00
vi := 0.00
tmax := 10
P := m g
Fs := us P
Fk := uk P
Fe[t_] := -k x[t]
sol = NDSolve[{
Fe[t] - Sign[x'[t]] Fk == m x''[t],
x[0] == xi,
x'[0] == vi},
x, {t, 0, tmax}];
Plot[Evaluate[{
Sign[x'[t]] Fs,
Fe[t],
x[t]} /. sol],
{t, 0, tmax},
AxesLabel -> {"t", "fct[t]"},
PlotLegends -> {"-Fs", "Fe", "x"}]
you get the following graph:
which shows that oscillations are over for $t \approx 8\,s$ causes kinematic friction.
On the other hand, putting us = 0.40 you get this other graph:
which shows that oscillations are over for $t \approx 3\,s$ causes static friction.
Question: is it possible to automate all this by making the x(t) graph plot until the motion stops?
Answer
This is a perfect use case for WhenEvent:
sol = NDSolve[
{
Fe[t] - Sign[x'[t]] Fk == m x''[t],
x[0] == xi,
x'[0] == vi,
WhenEvent[x'[t] == 0 && Fs > Abs[k x[t]], tmax = t; "StopIntegration"]
}
, x, {t, 0, Infinity}]
Note that this automatically sets tmax, so you don't need to specify anything before. The only thing to note is that you can't replace k x[t] with Fe[t], since WithEvent doesn't see the x[t] in that case. You could write (note the Evaluate wrapped around the condition)
WhenEvent[Evaluate[x'[t] == 0 && Fs > Abs[Fe[t]]], tmax = t; "StopIntegration"]
if you really want to write Fe[t].
For us=0.15:
For us=0.4:





Comments
Post a Comment