2016-04-26 3 views
1

Ich habe gerade angefangen, Python zu lernen, und mein Lehrer bittet mich, die Flugbahn der Modellrakete zu simulieren, die den Schub des Motors kennt.Wie könnte ich scipy Bibliothek verwenden, um die Entfernung zu erhalten?

Ich habe bereits die Geschwindigkeit und die Beschleunigung der Rakete mit Odeint-Funktion. Allerdings weiß ich nicht, wie man die Geschwindigkeit und die Zeit benutzt.

Ich muss schon die Entfernung berechnen, die die Rakete zurückgelegt hat, da die Geschwindigkeit durch die Odeint-Funktion gelöst wird.

hier ist der Code, den ich schrieb, die Geschwindigkeit zu bekommen:

def getforce(t): 
    if 0<=t<0.15: 
     F = 40*t 
    elif 0.15<=t<0.7: 
     F = -9.09*t+7.36 
    elif 0.7<=t<1.25: 
     F = 1 
    elif 1.25<=t<1.65: 
     F = 7.5*t-8.375 
    elif 1.65<=t<1.8:   
     F = -26.6*t+48 
    else: 
     F = 0 
    return F 

def getspeed(x,t): 
    Ft = getforce(t) 
    y0,y1 = x 
    dy0 = y1 
    dy1 = (Ft-0.0001277422*y1**2*np.sign(y1)-0.174)/0.0177 
    return dy0,dy1 

t = np.linspace(0,10,100) 
sol = si.odeint(getspeed,(0,0),t) 
plt.plot(t,sol[:,0]) 
plt.show() 
+0

Sie könnten einfach die Entfernung von der Geschwindigkeit integrieren. v (t) = dx/dt. Um numerisch den ersten naiven (und gut genug für dieses relativ glatte Problem) Ansatz zu integrieren, ist es, bei Null zu beginnen und dann bei jedem Schritt v * deltat hinzuzufügen. – roadrunner66

+0

Vielen Dank für Ihre Antwort. Ich wusste, dass ich die Entfernung von der Geschwindigkeit integrieren sollte, aber ich weiß nicht, wie ich die Geschwindigkeit (die ein numpliges Array ist) verwenden sollte, um eine andere Funktion einzunehmen. Könnten Sie den Code nach Möglichkeit ausarbeiten oder aufschreiben? –

+0

Es gibt keine Notwendigkeit, ich denke, ich habe es schon. Vielen Dank! –

Antwort

0

Unter der Annahme, dass alles andere richtig ist, integrieren Sie nur die Geschwindigkeit von Hand.

(Der Grund, warum ich die allgemeine Korrektheit nicht leicht überprüfen kann, ist, dass Sie einen unorthodoxen (gegebenen) Ausdruck in der Geschwindigkeit verwenden, anstatt die gestörte Gleichung zu lösen, die den Massenverlust F = ma -> enthält d (m * v)/dt = dm/dt * v + m * dv/dt.)

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.integrate as si 
%matplotlib inline 

def getforce(t): 
    if 0<=t<0.15: 
     F = 40*t 
    elif 0.15<=t<0.7: 
     F = -9.09*t+7.36 
    elif 0.7<=t<1.25: 
     F = 1 
    elif 1.25<=t<1.65: 
     F = 7.5*t-8.375 
    elif 1.65<=t<1.8:   
     F = -26.6*t+48 
    else: 
     F = 0 
    return F 

def getspeed(x,t): 
    Ft = getforce(t) 
    y0,y1 = x 
    dy0 = y1 
    dy1 = (Ft-0.0001277422*y1**2*np.sign(y1)-0.174)/0.0177 
    return dy0,dy1 

t = np.linspace(0,10,100) 
sol = si.odeint(getspeed,(0,0),t) 
v=sol[:,0] 

x=0 
xs=[] 
dt=t[1]-t[0] # use linspace with 101 to get the sample distance you'd normally expect 
for i in range(len(v)): 
    x=x+v[i]*dt 
    xs.append(x) 
plt.subplot(121) 
plt.plot(t,v) 
plt.subplot(122) 
plt.plot(t,xs) 
plt.show() 

enter image description here

ich nicht verwenden numpy oder Lambda-Ausdrücke zu integrieren, damit es leicht lesbar und weil die Ausführungsgeschwindigkeit für diesen Fall unerheblich ist.

+0

Oh vielen Dank !! Ich dachte, ich müsste die scipy-Funktion wieder verwenden, um die Distanz zu erhalten, aber ich denke, dass dieser Ansatz leichter zu verstehen ist. Danke noch einmal! –

+0

Selbst wenn Sie höhere Funktionen von scipy oder numpy verwenden, sollte man im numerischen Rechnen immer mit einer anderen Zahl vergleichen, die Sie leicht berechnen können, sei es ein Sonderfall in einer Umschlagsrechnung oder Ihr eigener Code. – roadrunner66

Verwandte Themen