Bonjour,
Nous avons eu en classe un TP dans lequel nous devions réaliser le calcul de vol d’une fusée en phase de montée en Python. On nous a donnée le système différentiel suivant :
⎩⎪⎪⎨⎪⎪⎧dtdvdtdmdtdz=mDu−g−k0exp(−a0z)×mv2=−D=v
Avec les données suivantes :
- D=4 kg.s−1, le débit massique des gaz
- a0=8.103 m
- g=9.81 m.s−2
- k0=0.1 N.m−2s2,
- u=2.10³ m.s−1
- v, la vitesse, initialement à 0 m.s−1
- m la masse initialement à 400 kg et à 80 kg à la fin de la combustion
- z l’altitude, initialement à 0 m
Je souhaiterais également réaliser la phase de descente de la fusée, il faut donc modifier notre système différentiel (notamment supprimer la poussée). J’ai réalisé le code suivant :
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import math
D = 4
g = 9.81
a0 = 8e3
k0 = 0.1
u = 2e3
# Y[0] => vitesse : v
# Y[1] => masse : m
# Y[2] => altitude : z
def subdivise(a, b, N):
return [a + k * ((b - a) / (N - 1)) for k in range(N)]
def compute_dv(Y, t):
if Y[1] > 80: # Si la masse est supérieure à 80
dv = ((D * u) / Y[1]) - g - k0 * math.exp(-(Y[2] / a0)) * (Y[0] ** 2 / Y[1])
dm = -D
dz = Y[0]
else:
dv = -g - k0 * math.exp(-(Y[2] / a0)) * (Y[0] ** 2 / Y[1])
dm = 0
dz = Y[0]
if Y[2] < 0: # Si l'altitude est inférieure à 0
dv = 0
dz = 0
dm = 0
return dv, dm, dz
if __name__ == "__main__":
times = subdivise(0, 300, 250)
Y0 = (0, 400, 0)
Ye = odeint(compute_dv, Y0, times)
velocity = [y[0] for y in Ye]
weight = [y[1] for y in Ye]
altitude = [y[2] for y in Ye]
plt.subplot(2, 2, 1)
plt.plot(times, velocity, label="vitesse")
plt.legend()
plt.subplot(2, 2, 2)
plt.plot(times, weight, label="masse")
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(times, altitude, label="altitude")
plt.legend()
plt.show()
Ce qui me donne les courbes suivantes :
On peut voir que la vitesse donne n’importe quoi et je n’arrive pas à savoir pourquoi. Auriez-vous une idée ?
Merci pour votre aide !
+0
-0