/* 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);
}