1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
import tkinter
from tkinter import*
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
# constantes
G= 6.67428*10**(-20) #km3.kg-1.s-2
Mt= 5.972*10**24 #kg, masse Terre
Rt= 6500 #km, rayon Terrre
d= 20000 #km, distance orbitale basse terrestre (h sat)
xl= 385000 #km, abscisse Lune # MODIF 380000
yl= 0 #km, ordonnée Lune
Ml= 7.36*10**22 #kg, masse Lune
Rl= 1750 #km, rayon Lune
# compteur de temps
t=0#en s
tmax= 1800000 #en s
dt= 1 #pas de temps en s
lt=[] #liste avec valeurs prises par t
#Satellite
v0=np.sqrt(G*Mt/d) #vitesse initiale nécessaire à une orbite initiale circulaire
T= 2*np.pi*np.sqrt(d/(G*Mt))*d # période avec Kepler
print("Vitesse initiale (orbite circulaire)", v0)
print("Periode initiale (orbite circulaire)", T)
#coord x
x=0 #en km
vx = v0 #en km.s-1
ax= 0 #en km.s-2
lx=[] #liste pour les abscisses du sat
#coord y
y=d #en km
vy = 0 #en km.s-1, vitesse orthoradiale
ay= 0 #en km.s-2
ly =[] #liste pour les ordonnées du sat
dTS= np.sqrt(x**2 + y**2) #distance Terre-sat
dLS= np.sqrt((x-xl)**2 + (y-yl)**2) #distance Lune-sat
ldTS=[]
ldLS=[]
frein = True
acceleration_value = 1.695
# on ajoute un compteur pour vérifier la fréquence et diminuer les listes
compteur_enregistrement = 0
while (t<tmax) and (dTS>Rt) and (dLS>Rl) : #le code tourne jusqu'à tmax et s'arrête si on touche la Terre ou la Lune
t=t+dt
compteur_enregistrement += 1
#mise à jour des distances
dTS= np.sqrt(x**2 + y**2)
dLS= np.sqrt((x-xl)**2+(y-yl)**2)
ax= -G*Mt*x/dTS**3 - G*Ml*(x-xl)/dLS**3 # accelération = force de gravitation
vx= vx+ ax*dt
x= x+ vx*dt #x(t+dt) = x(t) +vx(t)*dt
ay= -G*Mt*y/dTS**3 - G*Ml*(y-yl)/dLS**3 # accelération = force de gravitation
if 3/4*T< t < 3/4*T +dt : #quand le sat arrive à gauche il décolle (à environ 3/4T)
ay= ay+ acceleration_value #là on change les valeurs de l'accélération pour sortir de l'orbite
#aerofreinage
if (-1<y<1) and (x>xl) and (t>T) and (frein==True):
xmax=x-xl
Mt=0
vx=0
vy= vy+0.1
frein=False
if (-1<y<1) and (x<xl) and (t>T) and ((xl-x)>xmax):
frein=True
vy= vy+ ay*dt
y= y+ vy*dt
#remplissage des listes
# Enregistrement des positions seulement tous les 10 itérations
if compteur_enregistrement == 20:
lx.append(x)
ly.append(y)
compteur_enregistrement = 0 # Réinitialiser le compteur
ldTS.append(dTS)
ldLS.append(dLS)
lt.append(t)
#création graphique
# bornes du graphique
xmax = 500000
xmin = -100000
ymax = 300000
ymin = -300000
# Création de la fonction qui dessine le graphique
def draw_graph():
# Fermer les figures précédentes sinon ca plante
plt.close()
# Création de la figure et des axes
fig, ax = plt.subplots(figsize=(5, 5), dpi=200)
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
ax.set_aspect('equal') # permet de faire que l'échelle des x et des z soient les mêmes
# Ajout des lignes pointillées horizontales et verticales
ax.plot([0, 0], [ymin, ymax], linestyle=':', linewidth=1, color='green')
ax.plot([xmin, xmax], [0, 0], linestyle=':', linewidth=1, color='green')
# Ajout de cercles pour la Terre et la Lune
Terre = plt.Circle((0, 0), 6500, color='blue')
Lune = plt.Circle((385000, 0), 1737, color='red')
ax.add_artist(Terre)
ax.add_artist(Lune)
# Ajout de la trajectoire du satellite (lx et ly sont à définir)
ax.plot(lx, ly)
# Affichage du graphique
canvas = FigureCanvasTkAgg(fig, master=cadre_graphique)
canvas.draw()
canvas.get_tk_widget().pack()
def acceleration(value):
global acceleration_value
acceleration_value = value
draw_graph()
# Régle le rappel pour surveiller les changements sur l'échelle
fenetre.after(1000, lambda: acceleration(value))
# Création de la fenêtre principale
fenetre = tkinter.Tk()
fenetre.title("Trajectoire Satellite")
# Création d'un cadre pour les widgets principaux
cadre_echelle = Frame (fenetre, width = 520, height = 50, bg='lightyellow')
cadre_echelle.pack()
cadre_graphique = Frame(fenetre, width=520, height=230, bg='white')
cadre_graphique.pack()
# Création du sélecteur échelle
echelle = Scale(cadre_echelle, from_=1.600, to=1.800, command=lambda value: acceleration(value), \
orient=HORIZONTAL, length=480, width=30, resolution=0.0005, label="valeur d'accélération : ", \
showvalue=1, tickinterval=0.05, sliderlength=20)
echelle.set(acceleration_value)
echelle.pack()
tkinter.mainloop() |
Partager