T
THuNd3rCr4cKer
Gast
Hallo zusammen,
im Rahmen einer Schularbeit schreibe ich aktuell ein Programm, welches Wurfvorgänge mit Luftwiderstand berechnen (und grafisch darstellen soll). Nun stehe ich vor dem Problem, dass mir für relativ extreme Werte (z.B. Abwurfwinkel 89.9° oder sehr geringe Massen) das Geschoss wieder nach links abhaut, was ja nun theoretisch nicht möglich sein dürfte. Meine Frage: Warum?
Hier der zugehörige Code (Ja, ich weiß dürfte wohl kaum ressourcensparend oder besonders schön sein):
Ich hoffe die Variablen sind weitgehend selbsterklärend.
Hier der zugehörige Wikipediaartikel für die nötige Mathematik: Ballistische Kurve bei Wiki
Mein Verdacht liegt da, dass ich an einer Stelle für die richtige Berechnung die alten und die neuen Werte durcheinander hau, oder aber, dass der Zeitschritt für extreme Werte zu groß ist und deshalb gewisse 0-Punkte überschritten werden an die eigentlich nur Annäherung stattfindet.
Möglicherweise treten auch noch weitere Fehler bei der Berechnung auf, bei so augenscheinlichen Verfehlungen hab ich mir das Nachrechnen erstmal erspart...
im Rahmen einer Schularbeit schreibe ich aktuell ein Programm, welches Wurfvorgänge mit Luftwiderstand berechnen (und grafisch darstellen soll). Nun stehe ich vor dem Problem, dass mir für relativ extreme Werte (z.B. Abwurfwinkel 89.9° oder sehr geringe Massen) das Geschoss wieder nach links abhaut, was ja nun theoretisch nicht möglich sein dürfte. Meine Frage: Warum?
Hier der zugehörige Code (Ja, ich weiß dürfte wohl kaum ressourcensparend oder besonders schön sein):
Code:
public void neuBerechnen(int i, int anzTschritte, int tAbstand)
{
boolean maxErreicht = false;
vAlt = v0;
alphaAlt = alpha0 * (Math.PI / 180);
xAlt = 0.0;
yAlt = y0;
aX = 0.0;
aY = ay0;
vXalt = vAlt * Math.cos(alphaAlt);
vYalt = vAlt * Math.sin(alphaAlt);
alphaNeu = alphaAlt;
try
{
do
{
t = anzTschritte*dt;
tabErgebnisse[i][0] = (double)Math.round(t*1000)/1000;
tabErgebnisse[i][1] = (double)Math.round(xAlt*1000)/1000;
tabErgebnisse[i][2] = (double)Math.round(yAlt*1000)/1000;
tabErgebnisse[i][3] = (double)Math.round(vXalt*1000)/1000;
tabErgebnisse[i][4] = (double)Math.round(vYalt*1000)/1000;
tabErgebnisse[i][5] = (double)Math.round(aX*1000)/1000;
tabErgebnisse[i][6] = (double)Math.round(aY*1000)/1000;
Fwind = (0.5 * (p/100000) * cw * flaecheA * ((vXalt*vXalt) + (vYalt*vYalt))) / 10000;
aX = (-1 * Math.cos(alphaNeu)) * (Fwind / m);
aY = ay0 - (Math.sin(alphaNeu) * (Fwind / m));
alphaNeu = Math.atan(vXalt / vYalt);
vXneu = vXalt + (aX * dt);
vYneu = vYalt + (aY * dt);
xNeu = xAlt + (vXneu * dt);
yNeu = yAlt + (vYneu * dt);
if (maxErreicht == false)
{
if(vXalt / Math.cos(alphaAlt) > vXneu / Math.cos(alphaNeu))
{
vMax = vXalt;
maxErreicht = true;
}
}
xAlt = xNeu;
yAlt = yNeu;
vXalt = vXneu;
vYalt = vYneu;
if (yNeu < 0)
{
break;
}
anzTschritte++;
if ((anzTschritte % tAbstand) != 0 && i != 0)
{
continue;
}
i++;
if ( i >= tabLaenge)
{
throw new Exception();
}
}while(true);
}catch(Exception kleinerMachen)
{
for ( int loeschen = 0; loeschen < tabLaenge; loeschen++)
{
tabErgebnisse[loeschen][0] = "";
tabErgebnisse[loeschen][1] = "";
tabErgebnisse[loeschen][2] = "";
tabErgebnisse[loeschen][3] = "";
tabErgebnisse[loeschen][4] = "";
tabErgebnisse[loeschen][5] = "";
tabErgebnisse[loeschen][6] = "";
}
i = 0;
tAbstand++;
anzTschritte = 0;
neuBerechnen(i, anzTschritte, tAbstand);
}
tMax = t;
}
Ich hoffe die Variablen sind weitgehend selbsterklärend.
Hier der zugehörige Wikipediaartikel für die nötige Mathematik: Ballistische Kurve bei Wiki
Mein Verdacht liegt da, dass ich an einer Stelle für die richtige Berechnung die alten und die neuen Werte durcheinander hau, oder aber, dass der Zeitschritt für extreme Werte zu groß ist und deshalb gewisse 0-Punkte überschritten werden an die eigentlich nur Annäherung stattfindet.
Möglicherweise treten auch noch weitere Fehler bei der Berechnung auf, bei so augenscheinlichen Verfehlungen hab ich mir das Nachrechnen erstmal erspart...