Астрозадача №4: 

Решение

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
from timeit import default_timer as timer

start1 = timer()
# Решение задачи многих тел
# Определяем переменную величину
seconds_in_year = 365 * 24 * 60 * 60
seconds_in_day = 60*60*24*7
years = 61
t = np.arange(0, years*seconds_in_year, seconds_in_day)

# Определяем функцию для системы диф. уравнений
def move_func(s, t):
    (x1, v_x1, y1, v_y1,
     x2, v_x2, y2, v_y2) = s

    # Динамика первого тела под влиянием второго и третьего
    dxdt1 = v_x1
    dv_xdt1 = (- G * m2 * (x1 - x2) / ((x1 - x2)**2 + (y1 - y2)**2)**1.5)
    dydt1 = v_y1
    dv_ydt1 = (- G * m2 * (y1 - y2) / ((x1 - x2)**2 + (y1 - y2)**2)**1.5)

    # Динамика второго тела под влиянием первого и третьего
    dxdt2 = v_x2
    dv_xdt2 = (- G * m1 * (x2 - x1) / ((x2 - x1)**2 + (y2 - y1)**2)**1.5)
    dydt2 = v_y2
    dv_ydt2 = (- G * m1 * (y2 - y1) / ((x2 - x1)**2 + (y2 - y1)**2)**1.5)

    return (dxdt1, dv_xdt1, dydt1, dv_ydt1,
            dxdt2, dv_xdt2, dydt2, dv_ydt2)

# Определяем начальные значения и параметры, входящие в систему диф. уравнений
G = 6.67 * 10**(-11)
Msun = 1.989*10**30
ae = 149.6*10**9
e = 0.343

x10 = 1.628*ae*(1+e)
v_x10 = 0
y10 = 0
v_y10 = 1307.03

x20 = -1.929*ae*(1+e)
v_x20 = 0
y20 = 0
v_y20 = -1548.89


s0 = (x10, v_x10, y10, v_y10,
      x20, v_x20, y20, v_y20)

m1 = 0.032*Msun
m2 = 0.027*Msun

# Решаем систему диф. уравнений
sol = odeint(move_func, s0, t)

# Строим решение в виде графика и анимируем
fig = plt.figure()
plt.style.use(['dark_background'])
fig = plt.figure(figsize=(12,12))

Q = 1.929*ae*(1+e)
x_stars = np.random.uniform(-1.3*Q, 1.3*Q, 600)
y_stars = np.random.uniform(-1.3*Q, 1.3*Q, 600)
plt.plot(x_stars/(149*10**9),y_stars/(149*10**9), 'o', ms=0.1,color= 'white')

bodys = []

for i in range(0, len(t), 10):
    body1, = plt.plot(sol[:i, 0]/(149*10**9), sol[:i, 2]/(149*10**9), '-', color='#ff6200',alpha = 0.2)
    body1_line, = plt.plot(sol[i, 0]/(149*10**9), sol[i, 2]/(149*10**9), 'o', color='#ff6200', ms = 10)

    body2, = plt.plot(sol[:i, 4]/(149*10**9), sol[:i, 6]/(149*10**9), '-', color='#ff5700',alpha = 0.2)
    body2_line, = plt.plot(sol[i, 4]/(149*10**9), sol[i, 6]/(149*10**9), 'o', color='#ff5700', ms= 12)
    
    bodys.append([body1, body1_line, body2, body2_line])

ani = ArtistAnimation(fig, bodys, interval=1)

plt.xlabel('a.e.')
plt.ylabel('a.e.')
plt.axis('equal')
# ani.save('Luhman_16.gif')
duration1 = timer() - start1
print('Время выполнения =',duration1)