Falsche Berechnung bei schiefem Wurf (Java)?

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:

Bild zum Beitrag

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.

 - (Physik, Java, Softwareentwicklung)
butterbrooot 
Fragesteller
 16.03.2024, 13:41

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

0
evtldocha  16.03.2024, 13:47
@butterbrooot

... 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.

0

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.

Bild zum Beitrag

Warum verwendest du nicht einfach die fertige Gleichung für den schiefen Wurf?

 - (Physik, Java, Softwareentwicklung)

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.

Woher ich das weiß:Hobby – Selbst beigebracht
butterbrooot 
Fragesteller
 16.03.2024, 12:19

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

1