Skip to main content

differential equations - Harmonic oscillator with damping attrition


Considering the following physical situation:


enter image description here


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:


enter image description here


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:



enter image description here


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:


Solution for us=0.15



For us=0.4:


Solution for is=0.4


Comments