Untitled
unknown
plain_text
3 years ago
7.2 kB
7
Indexable
import matplotlib.animation as animation
import math
import matplotlib.pyplot as plt
import numpy as np
def conditions_initiales_planetes(planete):
periode = dictionnaire_planetes[planete]['periode']
x0 = dictionnaire_planetes[planete]['périhélie']
y0 = 0
vx0 = 0
vy0 = math.sqrt((G * masse_soleil * (1 + dictionnaire_planetes[planete]['excentricite'])) /
((dictionnaire_planetes[planete]['longueur_demi_axe']) *
(1 - dictionnaire_planetes[planete]['excentricite'])))
return x0, y0, vx0, vy0, periode
def methode_euler(planete):
x, y, v_x, v_y, periode = conditions_initiales_planetes(planete)
delta_t = periode / nb_valeur
liste_x = [x]
liste_y = [y]
liste_v_x = [v_x]
liste_v_y = [v_y]
liste_a_x = []
liste_a_y = []
for i in range(8 * nb_valeur):
r = math.sqrt(x ** 2 + y ** 2)
a = -G * masse_soleil / r ** 3
a_x = a * x
a_y = a * y
liste_a_x.append(a_x)
liste_a_y.append(a_y)
x = x + v_x * delta_t
y = y + v_y * delta_t
liste_x.append(x)
liste_y.append(y)
v_x = v_x + a_x * delta_t
v_y = v_y + a_y * delta_t
liste_v_x.append(v_x)
liste_v_y.append(v_y)
return liste_x, liste_y, liste_v_x, liste_v_y
def methode_euler_asymetrique(planete):
x, y, v_x, v_y, periode = conditions_initiales_planetes(planete)
delta_t = periode / nb_valeur
liste_x = [x]
liste_y = [y]
liste_v_x = [v_x]
liste_v_y = [v_y]
liste_a_x = []
liste_a_y = []
liste_t = []
for i in range(8*nb_valeur):
r = math.sqrt(x ** 2 + y ** 2)
a = -G * masse_soleil / r ** 3
x = x + v_x * delta_t
y = y + v_y * delta_t
liste_x.append(x)
liste_y.append(y)
a_x = a * x
a_y = a * y
liste_a_x.append(a_x)
liste_a_y.append(a_y)
v_x = v_x + a_x * delta_t
v_y = v_y + a_y * delta_t
liste_v_x.append(v_x)
liste_v_y.append(v_y)
liste_t.append(i*delta_t)
return liste_x, liste_y, liste_v_x, liste_v_y, liste_t, delta_t
def moyenne_d_une_liste(liste):
somme_elmt = 0
for elmt in liste:
somme_elmt += elmt
moyenne_liste = somme_elmt / len(liste)
return moyenne_liste
def verifivation_conservation_energetique(liste_x, liste_y, liste_vx, liste_vy):
liste_energie_potentielle = []
liste_energie_cinetique = []
liste_energie_totale = []
for i in range(nb_valeur):
energie_potentielle = (-G * masse_soleil * dictionnaire_planetes['Terre']['masse']) / \
abs(math.sqrt(liste_x[i] ** 2 + liste_y[i] ** 2))
liste_energie_potentielle.append(energie_potentielle)
energie_cinetique = 1 / 2 * dictionnaire_planetes['Terre']['masse'] * \
abs(math.sqrt(liste_vx[i] ** 2 + liste_vy[i] ** 2)) ** 2
liste_energie_cinetique.append(energie_cinetique)
energie_totale = energie_cinetique + energie_potentielle
liste_energie_totale.append(energie_totale)
moyenne_liste_energie_totale = moyenne_d_une_liste(liste_energie_totale)
liste_energie_totale_veref = liste_energie_totale
for i in range(len(liste_energie_totale_veref)):
liste_energie_totale_veref[i] = abs(liste_energie_totale[i] / moyenne_liste_energie_totale - 1)
conservation = True
for elmt in liste_energie_totale_veref:
if elmt > 0.001:
conservation = False
if conservation is False:
print("L'energie n'est pas conservée")
else:
print("L'energie est conservée")
return liste_energie_potentielle, liste_energie_cinetique, liste_energie_totale
def construction_soleil():
rayon_soleil = 696342000
x = []
y = []
for i in range(nb_valeur):
x.append(rayon_soleil * math.cos(i * 2 * math.pi / nb_valeur))
y.append(rayon_soleil * math.sin(i * 2 * math.pi / nb_valeur))
plt.fill(x, y, color='orange')
plt.show()
return x, y
dictionnaire_planetes = {'Terre': {"masse": 5.972e24, 'périhélie': 147098291000, 'excentricite': 0.0167,
'longueur_demi_axe': 149598023000, 'periode': 365.25 * 24 * 60 ** 2},
'Venus': {"masse": 4.867e24, 'périhélie': 107476170000, 'excentricite': 0.007,
'longueur_demi_axe': 108209500000, 'periode': 224.7 * 24 * 60 ** 2},
'Mercure': {"masse": 3.285e23, 'périhélie': 46001009000, 'excentricite': 0.21,
'longueur_demi_axe': 57909050000, 'periode': 88.0 * 24 * 60 ** 2},
'Mars': {"masse": 6.4185e23, 'périhélie': 206655000000, 'excentricite': 0.09339,
'longueur_demi_axe': 227944000000, 'periode': 686.9 * 24 * 60 ** 2},
'Jupiter': {"masse": 1.898e27, 'périhélie': 740680000000, 'excentricite': 0.048,
'longueur_demi_axe': 778340000000, 'periode': 4332 * 24 * 60 ** 2},
'Saturne': {"masse": 5.684e26, 'périhélie': 1349800000000, 'excentricite': 0.0539,
'longueur_demi_axe': 1426700000000, 'periode': 10754 * 24 * 60 ** 2},
'Neptune': {"masse": 1.024e26, 'périhélie': 4459800000000, 'excentricite': 0.00859,
'longueur_demi_axe': 4498400000000, 'periode': 60216 * 24 * 60 ** 2},
'Uranus': {"masse": 8.681e25, 'périhélie': 2735000000000, 'excentricite': 0.0047,
'longueur_demi_axe': 2870700000000, 'periode': 30698 * 24 * 60 ** 2}
}
G = 6.67408e-11
masse_soleil = 1.989e30
nb_valeur = 400
# Conditions initiales :
liste_xT, liste_yT, liste_vxT, liste_vyT, liste_tT, delta_tT = methode_euler_asymetrique('Terre')
liste_xV, liste_yV, liste_vxV, liste_vyV, liste_tV, delta_tV = methode_euler_asymetrique('Venus')
liste_xM, liste_yM, liste_vxM, liste_vyM, liste_tM, delta_tM = methode_euler_asymetrique('Mercure')
plt.plot(liste_xM, liste_yM, color='grey')
plt.plot(liste_xT, liste_yT, color='blue')
plt.plot(liste_xV, liste_yV, color='brown')
#plt.plot(liste_xMa, liste_yMa, color='orange')
#plt.plot(liste_xJ, liste_yJ, color='red')
#plt.plot(liste_xU, liste_yU, color='green')
#plt.plot(liste_xS, liste_yS, color='purple')
#plt.plot(liste_xN, liste_yN, color='black')
construction_soleil()
Et = verifivation_conservation_energetique(liste_xT, liste_yT, liste_vxT, liste_vyT)
print(Et)
#animation
N=400
fig=plt.figure()
line,=plt.plot([liste_xT[0]],[0],marker="o")
plt.xlim(0,liste_xT[8*N])
plt.ylim(0,liste_yT[8*N])
def animate(i):
x=liste_xT[i]
y=liste_yT[i]
line.set_data([x],[y])
return line,
ani = animation.FuncAnimation(fig, animate, frames=N, interval=20, blit=True, repeat=False)
plt.show()Editor is loading...