/* Variablendeklaration */ var Ball; // fallendes Objekt ... var M; // dyn. Maßstab var y_ana, y_num; // y in kartesische Koord. var vy_ana, vy_num; // Geschwindigkeiten in y-Richtung var v0y = 10; // vertikale Startgeschwindigkeit in m/s var v0y_ana, y0_ana; // Hilfsgrößen var vInf; // Endgeschwindigkeit var mtor; // Reibungs-Masse-Verhältnis var tau; // Zeitkonstante var dir; // Richtungsinformation ... function setup() { ... } function draw() { ... fill('#aa0000') ellipse(kXi(0), kYi(y_ana*M), d*M); // Ball analytische Lösung fill('#ffff00') ellipse(kXi(10*M), kYi(y_num*M), d*M); // Ball numerische Lösung fill('#228811'); rect(0, 0.95*height, width, 0.1*height); // Grund stroke(0); if (START) { //******************************* Initialisierung *************************************** ... h0 = Ball.inCircle(0, h0)[2]; // Ball zur initialen Höheneinstellung y0_ana = h0; // Init. Ort y_num = h0; y_ana = h0; v0y = V0.moveArrow(0, y, 0, v0y)[2]; v0y_ana = v0y; vy_num = v0y; // Init. Startgeschwindigkeit vy_ana = v0y; if (v0y_ana >= 0) dir = 1; else dir = -1; mtor = RToM.yValue()[1]; vInf = -sqrt(g*mtor); // Endgeschwindigkeit tau = -vInf/g; // Zeitkonstante ... } else { //************************ Berechnung der Bewegung ***************************************** // analytische Lösung (rot) if (dir == 1) { // Bewegungsprofil II vy_ana = vInf*tan(atan(v0y_ana/vInf) + t/tau); y_ana = y0_ana - vInf*tau*log((cos(t/tau) - (v0y_ana/vInf)*sin(t/tau))); if (vy_ana < 0) // Bewegungsmodus feststellen { dir = -1; // Richtungswechsel v0y_ana = vy_ana; // Parameterübergabe und Vorbereitung für den Fall y0_ana = y_ana; t = 0; // neue Zeit } } else { // Bewegungsprofil I vy_ana = vInf*tanh(arctanh(v0y_ana/vInf) + t/tau); y_ana = y0_ana + vInf*tau*log(((vInf + v0y_ana)*exp(t/tau) + (vInf - v0y_ana)*exp(-t/tau))/(2*vInf)); } // numerische Lösung (gelb) vy_num = vy_num - (g + vy_num*abs(vy_num)/mtor)*dt; // numerische Lösung (gelb) y_num = y_num + vy_num*dt; if(endProgram(y_ana <= d/2 || y_num <= d/2)) { h = h0; // Starthöhe wieder herstellen dt = 0; } else { t = t + dt; } } } function tanh(x) { return((exp(x)-exp(-x))/(exp(x)+exp(-x))); } function arctanh(x) { return (log((1+x)/(1-x))/2); }