Programm "Schiefer Wurf"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
L.cux
User
Beiträge: 2
Registriert: Mittwoch 22. Juli 2015, 17:12

Moin Moin liebe Python-Fans,

ich habe folgendes Problem, wo ich hoffe das ihr mir helfen könnt.
Ich arbeite gerade an einem Programm, welches einen Ballwurf berechnen und auch animieren soll(Flugbahn).
Ich habe zwar ein Programm geschrieben, welches die maximale Wurfweite und die maximale Wurfhöhe berechnet. Allerdings brauche ich ja eine Liste mit allen x bzw. y Werten, um die Flugbahn animieren zu können.
Ich hoffe ihr könnt mir weiterhelfen.

MFG

Hier ist der bisherige Quellcode:

Code: Alles auswählen

from math import *
g = 9.81
v0_kmh = int(raw_input("Bitte geben Sie die Anfangsgeschwindigkeit ein: " ))
v0_ms = v0_kmh*1000/3600
v0_ms2 = v0_ms*v0_ms
print v0_ms
y0 = int(raw_input("Bitte geben Sie eine Anfangshoehe ein: " ))
print y0
theta = 70
theta_rad = theta * pi/180
t = v0_ms*sin(theta_rad/g)
print t
t2 = t*t
y_max = y0 + v0_ms * sin(theta_rad) * t - ((g * t2)/2.0)#maximale Wurfhoehe
print y_max
x_max = (v0_ms2 * sin(2*theta_rad))/g #maximale Wurfweite
print x_max
Zuletzt geändert von Anonymous am Donnerstag 23. Juli 2015, 00:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Hier findest Du 6 Zeilen Code, die eine Parabel zeichnen:
http://www.magben.de/?h1=python&h2=parabel

Bild
a fool with a tool is still a fool, www.magben.de, YouTube
L.cux
User
Beiträge: 2
Registriert: Mittwoch 22. Juli 2015, 17:12

Erstmal danke für die Antwort. =)
Hat alles gut geklappt.
Jetzt kommt mein nächstes Problem. Ich würde diese Flugbahn des Balles gerne animieren, habe jedoch keine Ahnung wie.
Würde mich über jede Hilfe freuen.

MFG

Anbei der neue Quellcode:

from math import *
from matplotlib.pyplot import *
import numpy as np


x = np.linspace(0, 100, 10)
g = 9.81
v0_kmh = float(raw_input("Bitte geben Sie die Anfangsgeschwindigkeit in KM/H zwischen 0 und 120 KM/H ein: " ))
if v0_kmh > 120:
v0_kmh = 120
print "Die Geschwindigkeit ist groesser als 120 KM/H"
if v0_kmh < 0:
v0_kmh = 0
print "Die Gschwindigkeit ist kleiner als 0 KM/H"

v0_ms = v0_kmh*1000/3600
print "Geschwindigkeit = ",v0_kmh," km/h = ",v0_ms," m/s"
v0_ms2 = v0_ms*v0_ms
print v0_ms
y0 = float(raw_input("Bitte geben Sie eine Abwufshoehe zwischen 0 und 30 in Metern ein: " ))
if y0 > 30:
y0 = 30
print "Die Abwurfshoehe ist groesser als 30 Meter"
if y0 < 0:
y0 = 0
print "Die Abwurfshoehe ist kleiner als 30 Meter"

print "Abwurfshoehe = ",y0," Meter "


theta = float(raw_input("Bitte geben Sie einen Abwurfwinkel zwischen 20 und 80 Grad ein: "))
if theta > 80:
theta = 80
print "Der Abwurfwinkel ist groesser als 80 Grad"
if theta < 20:
theta = 20
print "Der Abwurfwinkel ist kleiner als 20 Grad"

print "Abwurfwinkel = ",theta," Grad "
theta_rad = theta * pi/180
t = v0_ms*sin(theta_rad/g)
t2 = t*t

y_max = ( y0 + v0_ms * sin(theta_rad) * t - ((g * t2)/2.0))#maximale Wurfhoehe
print "Die maximale Wurfhoehe betraegt = ",y_max," Meter"


x_max =((v0_ms2 * sin(2*theta_rad))/g) #maximale Wurfweite
print "Die maximale Wurfweite betraegt = ",x_max," Meter"
y_grav = (y0+x*tan(theta_rad)-g/(2*(v0_ms*cos(theta_rad))**2)*x**2)

def animate():
(y0+x*tan(theta_rad)-g/(2*(v0_ms*cos(theta_rad))**2)*x**2)

plot(x,y_grav,'r')
xlabel('x in m')
ylabel('y in m')
title('Schraeger Wurf mit Gravitation')
ylim(0,100,10)


show()
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

L.cux hat geschrieben:Ich würde diese Flugbahn des Balles gerne animieren, habe jedoch keine Ahnung wie.
Hier findest Du die Animationsbeispiele von Matplotlib:
http://matplotlib.org/1.4.2/examples/an ... index.html
z.B. das Doppelpendel, der eigentliche Animationscode ist nicht so wild:
http://matplotlib.org/1.4.2/examples/an ... mated.html

Und probier doch mal den Knopf "Code" über dem Editor und den Knopf "Vorschau" unter dem Editor.
a fool with a tool is still a fool, www.magben.de, YouTube
Showtime3004
User
Beiträge: 3
Registriert: Dienstag 4. August 2015, 15:00

Wir müssen im Moment ein ähnliches Programm schreiben. Das Programm an sich ist fertig wir bekommen nur die Animation nicht vernünftig zum laufen. Kann sich das vielleicht mal jemand angucken ?

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
fig, ax = plt.subplots()
fig = plt.figure()

#Eingabe der Werte

#y = float(raw_input("Bitte geben sie eine Abwurfhoehe, die größer als 0m ist, an: "))
#m = float(raw_input("Bitte geben sie eine Masse des Wurfkoerpes in kg an: "))
#a = float(raw_input("Bitte geben sie einen Abwurfwinkel zwischen 0° und 90° an: "))
#v = float(raw_input("Bitte geben sie eine Abwurfgeschwindigkeit in m/s an: "))

#Beispielwerte
y = 50
m = 0.5
a = 30
v = 100

print "\nIhre Werte:\nAbwurfhoehe = " , y ,"m"
print "Masse =" , m , "kg"
print "Abwurfwinkel = " , a , "°"
print "Abwurfgeschwindigkeit = " , v , "m/s"

#Berechnung Gesamtflugdauer
g = float(9.81)
t = v * np.sin(a * np.pi/180) / g
#print "\n=> Gesamtflugdauer = " , t , "s"

#Berechnung Maximale Höhe h
h = 0.5*g*t**2+y

#Berechnung Maximale Wurfweite w
w = (v*np.cos(a * np.pi/180) * (v * np.sin(a * np.pi/180)+ np.sqrt(v**2 * np.sin(a * np.pi/180)**2 + 2*g*y)))/g
print "\n=> Maximale Wurfweite =" , round(w,2) , "m"
print "=> Maximale Wurfhoehe =" , round(h,2) , "m"

def Wurfbahn(x):
return (-(g/(2*v**2*np.cos(a * np.pi/180)**2))*x**2)+(np.tan(a * np.pi/180)*x+y)

#Darstellung der Funktion
x = np.arange(0.0,1000,1)
ax.plot(x,Wurfbahn(x),'r--')
ax.plot(w,0,'bo')
#ax.plot(w/2,h,'bo') #Hochpunkt

#Animation

#Skalierung der Achsen
ax.set_ylim(0, h + (0.1*h))
ax.set_xlim(0, w + (0.1*w))

#Achsenbeschriftung
ax.set_title('Schiefer Wurf')
ax.set_xlabel('Wurfweite [m]')
ax.set_ylabel('Wurfhoehe [m]')

plt.show()


Danke schonmal vorher

Showtime

PS: Die Frage ist eigentlich wie wir es hinbekommen das er bei der Grafik nicht alle Punkte gleichzeitig setzt sondern einen nach dem anderen damit es sich halt "bewegt"
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Zeile 44: ersetze

Code: Alles auswählen

ax.plot(x,Wurfbahn(x),'r--')
mit

Code: Alles auswählen

line = ax.plot(x[:1],Wurfbahn(x[:1]),'r--')[0]
Zeile 48: folgendes einfügen

Code: Alles auswählen

#Animation
def animate(i):
    line.set_xdata(x[:i])  
    line.set_ydata(Wurfbahn(x[:i]))  
    return line,
ani = ani.FuncAnimation(fig, animate, np.arange(1, 1000), interval=25)
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

MagBen hat geschrieben:Hier findest Du 6 Zeilen Code, die eine Parabel zeichnen:
http://www.magben.de/?h1=python&h2=parabel
Ohne Sternchen-Importe wäre es noch schöner!

Was kommt von numpy und was von matplotlib ?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

jens hat geschrieben:Ohne Sternchen-Importe wäre es noch schöner!
Mit Sternchen ist die Ähnlichkeit zu Matlab größer.
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@jens: das habe ich MagBen schon vor über einem Jahr empfohlen. Er ist aber beratungsresistent. numpy überschreibt mit einem *-Import etliche Built-Ins, wie sum, max, min, abs, die so mit Sicherheit jedes zweite größere Modul unwartbar macht.
Showtime3004
User
Beiträge: 3
Registriert: Dienstag 4. August 2015, 15:00

Danke für die schnelle Hilfe, das Programm läuft jetzt und tut was es soll, die Animation läuft auch super.

Was ich noch nicht ganz verstanden habe ist was denn die Änderung von

"ax.plot(x,Wurfbahn(x),'r--')" zu "line = ax.plot(x[:1],Wurfbahn(x[:1]),'r--')[0]" genau macht.

Gruß Showtime

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 1 12:10:51 2015

@author: XXX
"""

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
fig, ax = plt.subplots()


#Eingabe der Werte
y = float(raw_input("Bitte geben sie eine Abwurfhoehe die groeßer als 0m ist an: "))
m = float(raw_input("Bitte geben sie eine Masse des Wurfkoerpes in kg an: "))
a = float(raw_input("Bitte geben sie einen Abwurfwinkel zwischen 0 und 90 Grad an: "))
v = float(raw_input("Bitte geben sie eine Abwurfgeschwindigkeit in m/s an: "))

#TESTWERTE
#y = 20
#m = 0.5
#a = 45
#v = 100

#Ausgabe der eingegebenen Werte
print "\nIhre Werte:\nAbwurfhoehe = " , y ,"m"
print "Masse =" , m , "kg"
print "Abwurfwinkel = " , a , "grad"
print "Abwurfgeschwindigkeit = " , v , "m/s"

#Berechnung Gesamtflugdauer
g = float(9.81)
t = v * np.sin(a * np.pi/180) / g
#print "\n=> Gesamtflugdauer = " , t , "s"

#Berechnung Maximale Hoehe h
h = 0.5*g*t**2+y
print "\n=> Maximale Wurfhoehe =" , round(h,2) , "m"

#Berechnung Maximale Wurfweite w
w = (v*np.cos(a * np.pi/180) * (v * np.sin(a * np.pi/180)+ np.sqrt(v**2 * np.sin(a * np.pi/180)**2 + 2*g*y)))/g
print "=> Maximale Wurfweite =" , round(w,2) , "m"

#Wurfbahn Funktion
def Wurfbahn(x):
return (-(g/(2*v**2*np.cos(a * np.pi/180)**2))*x**2)+(np.tan(a * np.pi/180)*x+y)

#Darstellung der Funktion
x = np.arange(0,w+w,w/100)
line = ax.plot(x[:1],Wurfbahn(x[:1]),'r--')[0] #Wurfbahn
ax.plot(w,0,'bo') #Aufprallpunkt

#Animation
def animate(i):
line.set_xdata(x[:i])
line.set_ydata(Wurfbahn(x[:i]))
return line,
ani = ani.FuncAnimation(fig, animate, np.arange(1, 150), interval=25, repeat=True)

#Skalierung der Achsen
ax.set_ylim(0, h + (0.1*h))
ax.set_xlim(0, w + (0.1*w))

#Achsenbeschriftung
ax.set_title('Schiefer Wurf')
ax.set_xlabel('Wurfweite [m]')
ax.set_ylabel('Wurfhoehe [m]')

plt.show()
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@Showtime3004: Kannst du bitten den Code Button hier im Forum nutzten! :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Showtime3004 hat geschrieben:Was ich noch nicht ganz verstanden habe ist was denn die Änderung von
"ax.plot(x,Wurfbahn(x),'r--')" zu "line = ax.plot(x[:1],Wurfbahn(x[:1]),'r--')[0]" genau macht.
In der Funktion animate(i) wird das line-Objekt des Plots mit neuen Daten versorgt. Dieses line-Objekt wird von ax.plot(...) zurückgegeben. Ein Plot kann mehrere Kurven enthalten, deshalb gibt ax.plot(...) eine Liste von line-Objekten zurück. In diesem Fall ist es aber nur ein line-Objekt, das hole ich mit [0] aus der Liste. Damit beim 1.Plot nicht gleich die ganze Bahn geplottet wird, sondern nur der Anfang, wird der zu plottende Array-Bereich mit x[:1] eingegrenzt, in der slice-Syntax bedeuted x[:1] alle x-Werte bis zum 1.Element. In der Funktion animate(i) werden dann Stück für Stück immer mehr x-Werte genommen, x[:i] sind alle x-Werte bis zum i.Element.

Über dem Editor in dem Du Deinen Forumsbeitrag erstellst, da gibt es ein paar Formatierungsknöpfe, der wichtigste ist der "Code" Knopf. Unter dem Editor gibt's auch Knöpfe, neben dem "Absenden" Knopf gibt's den sehr nützlichen "Vorschau" Knopf.
a fool with a tool is still a fool, www.magben.de, YouTube
Showtime3004
User
Beiträge: 3
Registriert: Dienstag 4. August 2015, 15:00

Alles klar, danke für die schnelle Hilfe. Ich habe den Code jetzt nochmal überarbeitet, dass hier keine ungültigen Werte eingegeben werden können.
Der Code ist zwar nicht sonderlich schön geworden aber tut was er soll :D

Gruß Showtime

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
fig, ax = plt.subplots()

#Eingabe der Werte
while True:
    y = str(raw_input("Bitte geben sie eine Abwurfhoehe die groeßer als 0m ist an: "))
    try:
        y = float(y)
        if(y>0):
            break
        else:
            print "Falsche Eingabe"
            continue
    except:
        print "Falsche Eingabe"
while True:
    m = str(raw_input("Bitte geben sie eine Masse des Wurfkoerpes in kg an: "))
    try:
        m = float(m)
        break
    except:
        print "Falsche Eingabe"
        continue
    
while True:     
    a = str(raw_input("Bitte geben sie einen Abwurfwinkel zwischen 0 und 90 Grad an: "))
    try:
        a = float(a)
        if(0<a<90):
            break
        else:
            print "Falsche Eingabe"
            continue
    except:
        print "Falsche Eingabe"
        
while True:
    v = str(raw_input("Bitte geben sie eine Abwurfgeschwindigkeit in m/s an: "))
    try:
        v = float(v)
        break
    except:
        print "Falsche Eingabe"
        continue
    
#TESTWERTE
#y = 20
#m = 0.5
#a = 45
#v = 100

#Ausgabe der eingegebenen Werte
print "\nIhre Werte:\nAbwurfhoehe = " , y ,"m"
print "Masse =" , m , "kg"
print "Abwurfwinkel = " , a , "grad"
print "Abwurfgeschwindigkeit = " , v , "m/s"

#Berechnung Gesamtflugdauer
g = float(9.81)
t = v * np.sin(a * np.pi/180) / g
#print "\n=> Gesamtflugdauer = " , t , "s"

#Berechnung Maximale Hoehe h
h = 0.5*g*t**2+y
print "\n=> Maximale Wurfhoehe =" , round(h,2) , "m"

#Berechnung Maximale Wurfweite w
w = (v*np.cos(a * np.pi/180) * (v * np.sin(a * np.pi/180)+ np.sqrt(v**2 * np.sin(a * np.pi/180)**2 + 2*g*y)))/g
print "=> Maximale Wurfweite =" , round(w,2) , "m"

#Wurfbahn Funktion
def Wurfbahn(x):
    return (-(g/(2*v**2*np.cos(a * np.pi/180)**2))*x**2)+(np.tan(a * np.pi/180)*x+y)

#Darstellung der Funktion
x = np.arange(0,w+w,w/100)
line = ax.plot(x[:1],Wurfbahn(x[:1]),'r--')[0] #Wurfbahn
ax.plot(w,0,'bo') #Aufprallpunkt

#Animation
def animate(i):
    line.set_xdata(x[:i])  
    line.set_ydata(Wurfbahn(x[:i]))  
    return line,
ani = ani.FuncAnimation(fig, animate, np.arange(1, 150), interval=25, repeat=True)

#Skalierung der Achsen
ax.set_ylim(0, h + (0.1*h))
ax.set_xlim(0, w + (0.1*w))
ax.grid()

#Achsenbeschriftung
ax.set_title('Schiefer Wurf')
ax.set_xlabel('Wurfweite [m]')
ax.set_ylabel('Wurfhoehe [m]')

#Wertausgabe im Bild
textstr = 'Wurfweite=%.2fm\nWurfhoehe=%.2fm'%(w,h)
props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)
ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', bbox=props)

plt.show()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Showtime3004: beim Input der Werte machst Du 4 mal quasi das selbe. Das schreit nach einer Funktion. if ist keine Funktion, was sollen also diese Klammern? Nackte excepts fangen Dir jeden Fehler (auch manche Programmierfehler) ab. Die einzig erwartete Exception ist hier aber ein ValueError. Auf oberster Ebene sollte kein ausführbarer Code sein. Pack alles was keine imports oder Funktions-Definitionen sind in eine eigene Funktion (üblicherweise main genannt) und rufe sie über folgendes Idiom am Ende Deines Skriptes auf:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Das float( ) in Zeile 61 ist überflüssig, 9.81 ist ein float und braucht nicht erst konvertiert zu werden.

Ohne die vielen "np.pi/180" würde das ganze hübscher aussehen. Bezüglich GRAD und RAD habe ich in meinen Anwendungen die einfache Regel:
  • GRAD nur im IO
  • Winkel werden in Variablen nur in RAD gespeichert
Du könntest nach Zeile 31 die Variable a von GRAD nach RAD umrechnen.

Fast die Hälfte Deines Codes brauchst Du zum Einlesen von 4 Zahlen. War das eine Vorgabe? Wenn Dein Skript nur von Dir ausgeführt wird, dann könntest Du diesen Teil auch einfach weglassen und als Benutzerschnittstelle die Zeilen 49 bis 52 für jeden Programmlauf editieren.

@Sirius3: Du schreibst gerne im Imperativ.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten