Bonjour,
j'ai programmé un simulateur d'orbite qui permet d'afficher l'orbite d'un satellite autour d'un astre quelconque (constante de l'astre dans le programme). Ce simulateur prend en compte les frottements atmosphériques (uniquement dans le cas d'une trajectoire autour de la Terre). Le simulateur marche bien. Seulement, dans le cas d'une trajectoire qui rentre dans l'atmosphère, j'aimerais pouvoir afficher le maximum de décélération (noté amax ligne 100) ressenti par le satellite sphérique (masse et diamètre en constante). Or amax, faisant appel à un tableau numpy et un à une fonction auxiliaire, il m'est impossible d'utiliser la fonction max() pour extraire amax. Comment faire svp ?
Le code:
Code:from scipy.integrate import odeint import numpy as np from matplotlib import pyplot as plt from math import pi from math import sqrt from math import exp t = np.linspace(0, 50000, 200000) G = 6.6743e-11 M = 5.9737e24 R = 6371 A = 120 Cx = 0.5 S = pi*4 masse = 4000 def density(altitude): if altitude <= 11000: rho = 1.225 * (1-(0.0065*altitude)/288.15)**4.5 elif altitude <= 12000: rho = -(6e-5)*altitude+1 elif altitude <= 14000: rho = -(4.5e-5)*altitude+0.81 elif altitude <= 16000: rho = -(3.5e-5)*altitude+0.68 elif altitude <= 20000: rho = -(1.65e-5)*altitude+0.38 elif altitude <= 50000: rho = 0.14388 * 1.225 * exp(-altitude/16800)-0.004 elif altitude <= 120000: rho = 0.0001388 * 1.225 * exp(-altitude/30300) else: rho = 0 return rho def F(f, t): [r, rp, theta] = f altitude = r - R*1000 rho = density(altitude) thetap = C /(r**2) drag = -0.5 * Cx * rho * (thetap*r)**2 * S return [rp, r*thetap**2 - G*M/(r**2) + (drag/masse), thetap] n = input("\n" + "Vitesse orthoradiale initiale en m/s: ") p = input("\n" + "Vitesse radiale initiale en m/s: ") m = input("\n" + "Altitude initiale par rapport à la surface en km: ") r0 = float(m)*1000 + float(R)*1000 thetap0 = float(n) / r0 C = thetap0 * (r0 ** 2) f0 = [r0, p, 0] f = odeint(F, f0, t) r = f[:, 0] theta = f[:, 2] # ============================================================================= # # ============================================================================= Rm = R*1000 r[r<Rm] = None thetap = C /(r**2) vmax = round((max(thetap*r)), 2) VMI®®®n = round((min(thetap*r)), 2) x = (r * np.cos(theta + pi/2))/1000 y = (r * np.sin(theta + pi/2))/1000 circle1 = plt.Circle((0, 0), R+A , color='b') circle2 = plt.Circle((0, 0), R , color='sienna') fig, ax = plt.subplots() ax.set_aspect(1) ax.add_artist(circle1) ax.add_artist(circle2) plt.plot(x, y, "steelblue") plt.axis("equal") plt.show() apo = round(((max(r)/1000)-R), 2) peri = round(((min(r)/1000)-R), 2) d = ((apo+peri+2*R)/2)*1000 P = sqrt((4*(pi**2)*(d**3))/(G*M)) k = round((P/60), 2) if np.any(r < (R+A)*1000): print("\n" + """Votre orbite pénètre l'atmosphère !""" + "\n" + "\n" + "Décélération maximale = " + str(amax) + " g") else: print("\n" + "Apogée: " + "Altitude = " + str(apo) + " km, " + "Vitesse = " + str(VMI®®®n) + " m/s ") print("\n" + "Périgée: " + "Altitude = " + str(peri) + " km, " + "Vitesse = " + str(vmax) + " m/s ") print("\n" + "Période de révolution = " + str(k) + " min" + " (" + str(round((k/1440),2)) + " j" + ")" )
-----