/* Variablendeklaration */
...
var M; // dyn. Maßstab
var l, l0 = 0.1; // Federlänge, Ruhefederlänge
var s, s_, v, v_; // Objektkoordinaten
...
var d; // Däpfungskonstante
var omega0; // Resonanzfrequenz
function setup()
{
...
}
function draw()
{
...
//*************************************** Berechnung der Bewegung ***************************************
if (START)
{
v = v0; // Startbed. setzen
v_ = v0;
s = s0;
s_ = s0;
...
}
else
{
if (innerArg == 0) // analytische Lösung
{ // aperiodischer Grenzfall
s = s0*exp(-d*t)*(1 + d*t);
}
else
{
if (innerArg > 0)
{ // Kriechfall
arg = sqrt(innerArg);
s = s0*exp(-d*t)*(d*(exp(arg*t) - exp(-arg*t))/arg + (exp(arg*t) + exp(-arg*t)))/2;
}
else
{ // Schwingfall
arg = sqrt(-innerArg);
s = s0*exp(-d*t)*(d*sin(arg*t)/arg + cos(arg*t));
}
s_ = s_ + v_*dt; // numerische Lösung
v_ = v_ - (2*d*v_ + sq(omega0)*s_)*dt; // Berechnung v s-Komp.
t = t + dt; // Zeit incrementieren
}
}
//****************************************** Darstellung ************************************************
// Hier wird in Metern gerechnet!
stroke(0);
fill(200,200,255);
ellipse(kXi((s + l0)*M), kYi(0), diameter*M, diameter*M); // analytische L.
fill(255,200,200);
line(kXi(l0*M), kYi(0.01*M), kXi(l0*M), kYi(-0.01*M)); // l0-Markierung
strokeWeight(3);
line(kXi(0), kYi(0.01*M), kXi(0), kYi(-0.01*M)); // Federbefestigung
strokeWeight(1);
Spr.drawSpring(0, 0, l0 + s_ - 0.5*diameter, 0); // Feder
ellipse(kXi((s_ + l0)*M), kYi(0), diameter*M, diameter*M); // numerische L.
}