/* 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. }