problème à trois corps
This commit is contained in:
parent
091ddefdc9
commit
664393aaea
1 changed files with 91 additions and 0 deletions
91
examples/trois_corps.py
Normal file
91
examples/trois_corps.py
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
import sys
|
||||
import os
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
import legrandchien as lgc
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.animation as animation
|
||||
import numpy as np
|
||||
|
||||
x1 = lgc.Var()
|
||||
y1 = lgc.Var()
|
||||
x2 = lgc.Var()
|
||||
y2 = lgc.Var()
|
||||
x3 = lgc.Var()
|
||||
y3 = lgc.Var()
|
||||
|
||||
m1 = lgc.Const(1)
|
||||
m2 = lgc.Const(1)
|
||||
m3 = lgc.Const(1)
|
||||
G = 1
|
||||
|
||||
T = 0.5 * m1 * (x1.diff()**2 + y1.diff()**2)
|
||||
T += 0.5 * m2 * (x2.diff()**2 + y2.diff()**2)
|
||||
T += 0.5 * m3 * (x3.diff()**2 + y3.diff()**2)
|
||||
|
||||
r12 = ((x1 - x2)**2 + (y1 - y2)**2)**0.5
|
||||
r13 = ((x1 - x3)**2 + (y1 - y3)**2)**0.5
|
||||
r23 = ((x2 - x3)**2 + (y2 - y3)**2)**0.5
|
||||
|
||||
V = -G * m1 * m2 / r12
|
||||
V += -G * m1 * m3 / r13
|
||||
V += -G * m2 * m3 / r23
|
||||
|
||||
L = T - V
|
||||
|
||||
init = {
|
||||
x1: [1, -0.5],
|
||||
y1: [1, 0.5],
|
||||
x2: [-1, -0.25],
|
||||
y2: [-0.5, 0.5],
|
||||
x3: [0, 0.5],
|
||||
y3: [0, -1],
|
||||
}
|
||||
|
||||
dt = 0.01
|
||||
data = L.solve(init, 10, dt)
|
||||
|
||||
# Extraire les positions
|
||||
times = sorted(data.keys())
|
||||
positions = [data[t] for t in times]
|
||||
|
||||
x1_positions = [p["x1"] for p in positions]
|
||||
y1_positions = [p["y1"] for p in positions]
|
||||
x2_positions = [p["x2"] for p in positions]
|
||||
y2_positions = [p["y2"] for p in positions]
|
||||
x3_positions = [p["x3"] for p in positions]
|
||||
y3_positions = [p["y3"] for p in positions]
|
||||
|
||||
fps = 25
|
||||
frame_skip = max(1, int(1 / (fps * dt)))
|
||||
|
||||
display_indices = list(range(0, len(x1_positions), frame_skip))
|
||||
x1_display = [x1_positions[i] for i in display_indices]
|
||||
y1_display = [y1_positions[i] for i in display_indices]
|
||||
x2_display = [x2_positions[i] for i in display_indices]
|
||||
y2_display = [y2_positions[i] for i in display_indices]
|
||||
x3_display = [x3_positions[i] for i in display_indices]
|
||||
y3_display = [y3_positions[i] for i in display_indices]
|
||||
|
||||
# Créer la figure
|
||||
fig, ax = plt.subplots(figsize=(8, 8))
|
||||
ax.set_xlim(-3, 3)
|
||||
ax.set_ylim(-3, 3)
|
||||
ax.set_xlabel("X")
|
||||
ax.set_ylabel("Y")
|
||||
ax.grid(True)
|
||||
|
||||
point1, = ax.plot([], [], 'o', markersize=10, label='Corps 1')
|
||||
point2, = ax.plot([], [], 'o', markersize=10, label='Corps 2')
|
||||
point3, = ax.plot([], [], 'o', markersize=10, label='Corps 3')
|
||||
|
||||
def animate(frame):
|
||||
point1.set_data([x1_display[frame]], [y1_display[frame]])
|
||||
point2.set_data([x2_display[frame]], [y2_display[frame]])
|
||||
point3.set_data([x3_display[frame]], [y3_display[frame]])
|
||||
return point1, point2, point3
|
||||
|
||||
ax.legend()
|
||||
anim = animation.FuncAnimation(fig, animate, frames=len(x1_display), interval=1000//fps, blit=True, repeat=True)
|
||||
|
||||
plt.show()
|
||||
Loading…
Reference in a new issue