Matplotlib: анимация орбиты Земли вокруг Солнца - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь создать анимацию орбиты Земли вокруг Солнца.

Код прекрасно работает без введения функции анимации matplotlib и отображает путь Земли вокруг Солнца, но при попытке его анимировать код становится грязным и приводит к выводу ошибок, я искал примеры, но не нашел ни одного, который бы работал для меня.

import numpy as np
import matplotlib.pyplot as plt

# Storing Coordinate Data
x_11list = []
x_12list = []

x_21list = []
x_22list = []

# Constants
G = 6.67408e-11 # m^3 kg^-1 s^-2
t = 0.0 # s
dt = 0.01*24*60*60 # s

# Sun Parameters
# mass
m_1 = 1.989e30 # kg
# position
x_11 = 0
x_12 = 0
x_13 = 0

# velocity
v_11 = 0
v_12 = 0
v_13 = 0

# Earth Parameters
# mass
m_2 = 5.972e24 # kg
# position
x_21 = 1.5e11 # m
x_22 = 0
x_23 = 0

# velocity
v_21 = 0
v_22 = 30000 # m/s
v_23 = 0

while t < 377*24*60*60:

    # Distance
    r_12 = np.sqrt((x_21-x_11)**2 + (x_22-x_12)**2 + (v_23-v_13)**2) # m

    # Newton's Second Law of Motion
    # Force 12
    Fx_11 = (G*m_1*m_2*(x_21-x_11))/r_12**3
    Fx_12 = (G*m_1*m_2*(x_22-x_12))/r_12**3
    Fx_13 = (G*m_1*m_2*(x_23-x_13))/r_12**3

    # Force 21
    Fx_21 = -(G*m_1*m_2*(x_21-x_11))/r_12**3
    Fx_22 = -(G*m_1*m_2*(x_22-x_12))/r_12**3
    Fx_23 = -(G*m_1*m_2*(x_23-x_13))/r_12**3

    # Euler Method
    # Sun
    v_11 += (Fx_11*dt)/m_1
    v_12 += (Fx_12*dt)/m_1
    v_13 += (Fx_13*dt)/m_1

    x_11 += v_11*dt
    x_12 += v_12*dt
    x_13 += v_13*dt

    # Earth
    v_21 += (Fx_21*dt)/m_2
    v_22 += (Fx_22*dt)/m_2
    v_23 += (Fx_23*dt)/m_2

    x_21 += v_21*dt
    x_22 += v_22*dt
    x_23 += v_23*dt

    t += dt

    x_11list.append(x_11)
    x_12list.append(x_12)

    x_21list.append(x_21)
    x_22list.append(x_22)

# Vizualisation
plt.figure(figsize=(10,10))
plt.plot(x_11list, x_12list, linewidth=2.0, label="Sun", color="darkorange")
plt.plot(x_21list, x_22list, linewidth=2.0, label="Earth", color="royalblue")
plt.xlabel(r"$x(m)$")
plt.ylabel(r"$y(m)$")
plt.title("Numerical Simulation of Newton's Law of Universal Gravitation")
plt.legend()
plt.grid(True)
plt.show()

Выход:

enter image description here Если возможно, я ожидаю получить анимацию с минимальным изменением исходного кода.

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете с целлулоидом , но одной ценой является вычислительная неэффективность.

В начале импортируйте целлулоид и сконструируйте камеру.

from celluloid import Camera
fig = plt.figure(figsize=(10, 10))
camera = Camera(fig)
plt.xlabel(r"$x(m)$")
plt.ylabel(r"$y(m)$")
plt.title("Numerical Simulation of Newton's Law of Universal Gravitation")

Просто делайте точечные диаграммыв нижней части цикла for и снимков «snap».

plt.scatter(x_11, x_12, s=300, color='darkorange')
plt.scatter(x_21, x_22, s=200, color='royalblue')
camera.snap()

После завершения цикла for сохраните анимацию.

camera.animate().save('orbit.mp4')

Обратите внимание, что вы, вероятно, захотите увеличитьdt в противном случае это займет много времени.Я оставлю это в качестве упражнения, чтобы добавить легенды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...