Falsche Berechnung bei schiefem Wurf (Java)?
Hallo!
Ich habe eine Frage zu einem Java-Programm, welches den Flug einen Kanonenkugel berechnen soll. Geschwindigkeit und Winkel α darf sich der Nutzer selbst aussuchen (v muss zwischen 300 und 900 km/h liegen, und α zwischen 1 und 90°). Luftwiderstand, etc. spielen keine Rolle
Allerdings funktioniert die Berechnung des Fluges nicht ganz richtig. Es wird entweder ausgegeben, dass die Flugweite Not a Number ist oder die Flugweite ist komplett falsch. Bei einem Winkel von z.B. 90° wird auch richtig ausgegeben, dass man quasi 0 in x Richtung geschossen hat, was ja stimmt.
Hier der wichtige Teil (Berechnungen):
do {
// Neuer X und Y Wert
x = x + (speed * Math.cos(angle));
y = y + (speed * Math.sin(angle)) - (9.81 / 2);
// Neue Geschwindigkeit
speed = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
// Neuer Winkel
angle = Math.atan(y / x);
} while (y >= 0);
Hoffe es kann jemand helfen
4 Antworten
ömm, ich hab zwar vom Programmieren keine Ahnung, aber...
Rechnest Du die Geschwindigkeit von km/h auf m/s um? (÷3,6!) Ansonsten können die Werte nicht stimmen!
Dazu sind auch die Formeln für den schiefen Wurf etwas komplexer, als es mir hier scheint! Die Zerlegung in die x und y-Komponente ist nur der 1. Schritt!
Für mehr Infos, schau mal zB hier: https://www.leifiphysik.de/mechanik/waagerechter-und-schraeger-wurf
Wo steht hier die Zeit?
x = x + (speed * Math.cos(angle));
y = y + (speed * Math.sin(angle)) - (9.81 / 2);
Und wenn Du Dich schon mit einer Schrittweite Δt in der Zeit bewegen willst, dann müsstest Du die Änderung der Koordinaten auch über die Ableitungen ausrechnen. Das würde ich nicht machen. Ich würde y(x) berechnen aus der Formel:
Wobei h0 die Abschusshöhe ist und α der Abschusswinkel (gegen die Horizontale).
Falls es Dich interessiert, hier die Herleitung obiger Gleichung:
Zusätzliche Anmerkung: Was soll
speed = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
bedeuten? Die Wurzel aus den Quadraten zweier Koordinaten kann keine Geschwindigkeit sein.
... Das ändert nichts daran, dass Δx und Δy dann aus (dx/dt)*Δt aus den Ableitungen (nach der Zeit "t") der Koordinatenfunktionen x(t) und y(t) zu berechnen wären.
das erscheint mir etwas wirr:
x und y sind die Koordinaten? Warum soll die neue Geschwindigkeit dann auf deine Art von x und y abhängen?
Der Winkel ist doch der Winkel der Geschwindigkeit, nicht des räumlichen Punks gegen den Ursprung im Koordinatensystem.
Richtiger wäre (wen du die Differentialgleichung numerisch lösen möchtest):
vx=v*cos(α)
vy=v*sin(α)
und dann die Schleife mit
vy = vy -g*Δt
x = x + vx*Δt
y = y +vy*Δt
Dazu darf aber die Schrittweite Δt nicht zu groß sein, denn du machst ja durch die Diskretisierung einen Fehler, der sich akkumuliert. Du hast ein Verfahren Finite-Differenzen erster Ordnung, es gibt aber viel bessere, numerisch stabilere Verfahren (siehe Runge Kutta)
Hier habe ich mit der obigen (ganz einfachen) Methode gerechnet:
Anfangsgeschwindigkeiten: vx=vy=10 m/s , Δt=10ms:
Man sieht, dass die numerische Lösung mit fortschreitendetrer Zeit natürlich immer ungenauer wird. Die orange Linie ist die exakte Kurve, die blaue die numerische Integration nach obiger Methode.
Warum verwendest du nicht einfach die fertige Gleichung für den schiefen Wurf?
Hey,
probiers mal mit
angle = Math.atan2(y / x);
da sie den richtigen Winkel auch für negative x-Werte liefert und somit die Flugbahn korrekt berechnet.
Hey, danke für die Antwort
Leider kann ich mit atan2 keine Division in der Klammer machen, und wenn ich es mit , trenne, steigt der y wert immer weiter.
Die Formeln
x = x + (speed * Math.cos(angle));
y = y + (speed * Math.sin(angle)) - (9.81 / 2);
sind wahrscheinlich aber auch falsch, weil nach einer Sekunde eine Kugel nicht so weit fliegen kann, wie ausgegeben wird. Aber ich weiß nicht, was ich an der Formel ändern müsste
Die Zeit bei der Berechnung ist 1s deswegen habe ich sie weggekürzt, das Programm macht die Berechnung dann so lange bis y <= 0 ist