Модель Солнечной системы на vpython | Блог python программиста
Изображение гика

Блог питониста

Модель Солнечной системы на vpython

12 ноября 2018 г.

Есть такая библиотека - vpython, с помощью нее можно создавать различные анимации и рисовать 3d объекты. Интересно было бы смоделировать хотя бы очень простую версию Солнечной системы. У меня не получилось сделать это самому, поэтому я нанял человека на upwork, чтобы он помог мне. Код в данном посте не мой, а этого человека, я лишь немного изменил его.

Сначала установим vpython:

pip3 install vpython

Попробуем нарисовать сферу:

1from vpython import sphere
2
3sphere()

Теперь, если все работает, начнем с того, что зададимся константами, нужными для дальнейших вычислений:

 1from vpython import sphere, vector, color, rotate
 2import math
 3
 4# Константы
 5G = 6.667e-11  # гравитационная постоянная, м^3 кг^-1 с^-2
 6MS = 1.9885e30  # масса Солнца, кг
 7ME = 5.97e24  # масса Земли, кг
 8MM = 7.348e22  # масса Луны, кг
 9RSE = 1.496e11  # среднее расстояние от Солнца до Земли, метры
10REM = 384.4e6  # расстояние от Земли до Луны

Далее вычислим гравитационные силы между Солнцем и Землей и между Землей и Луной по формуле:

$$F=G\frac{m1\cdot m2}{R^2}$$

Сила_гравитации.jpg

1# Гравитационная сила между Солнцем и Землей, Н
2F_SE = G*MS*ME/(RSE*RSE)
3# Гравитационная сила между Землей и Луной, Н
4F_EM = G*ME*MM/(REM*REM)

Далее вычисляем угловые скорости и обычные по формулам

$$\omega=\sqrt{\frac{F}{m\cdot r}}$$

$$v=\omega\cdot r$$

1# Угловая скорость Луны
2wm = math.sqrt(F_EM/(MM*REM))
3# Угловая скорость Земли
4we = math.sqrt(F_SE/(ME*RSE))

Далее рисуем сами сферы, которые будут представлять Солнце, Землю и Луну, конечно размеры не в масштабе для наглядности:

1v = vector(0.5, 0, 0)
2E = sphere(pos=vector(3, 0, 0), color=color.blue, radius=.25, make_trail=True)
3M = sphere(pos=E.pos+v, color=color.white, radius=0.08, make_trail=True)
4S = sphere(pos=vector(0, 0, 0), color=color.yellow, radius=1)

Потом, используя полярные координаты, обновляем позиции тел при каждом шаге:

 1# Будем использовать полярные координаты
 2# Шаг
 3dt = 10
 4# углы поворота за один шаг:
 5theta_earth = we*dt
 6theta_moon = wm*dt
 7while dt <= 86400*365:
 8    # Земля и Луна поворачиваются вокруг оси z (0,0,1)
 9    Earth.pos = rotate(Earth.pos, angle=theta_earth, axis=vector(0, 0, 1))
10    v = rotate(v, angle=theta_moon, axis=vector(0, 0, 1))
11    Moon.pos = Earth.pos + v
12    dt += 10

Итого получилось:

 1from vpython import sphere, vector, color, rotate
 2import math
 3
 4# Константы
 5G = 6.667e-11  # гравитационная постоянная, м^3 кг^-1 с^-2
 6MS = 1.9885e30  # масса Солнца, кг
 7ME = 5.97e24  # масса Земли, кг
 8MM = 7.348e22  # масса Луны, кг
 9RSE = 1.496e11  # среднее расстояние от Солнца до Земли, метры
10REM = 384.4e6  # расстояние от Земли до Луны
11# Гравитационная сила между Солнцем и Землей. Н
12F_SE = G*MS*ME/(RSE*RSE)
13# Гравитационная сила между Землей и Луной, Н
14F_EM = G*ME*MM/(REM*REM)
15# Угловая скорость Луны
16wm = math.sqrt(F_EM/(MM*REM))
17# Угловая скорость Земли
18we = math.sqrt(F_SE/(ME*RSE))
19
20v = vector(0.5, 0, 0)
21Earth = sphere(
22    pos=vector(3, 0, 0), color=color.blue, radius=.25, make_trail=True)
23Moon = sphere(pos=Earth.pos+v, color=color.white, radius=0.08, make_trail=True)
24Sun = sphere(pos=vector(0, 0, 0), color=color.yellow, radius=1)
25
26# Будем использовать полярные координаты
27# Шаг
28dt = 10
29# углы поворота за один шаг:
30theta_earth = we*dt
31theta_moon = wm*dt
32while dt <= 86400*365:
33    # Земля и Луна поворачиваются вокруг оси z (0,0,1)
34    Earth.pos = rotate(Earth.pos, angle=theta_earth, axis=vector(0, 0, 1))
35    v = rotate(v, angle=theta_moon, axis=vector(0, 0, 1))
36    Moon.pos = Earth.pos + v
37    dt += 10

Также, я сделал видео работы данного скрипта, по-моему, получилось неплохо:

Метки

физика python
Если вам понравился пост, можете поделиться им в соцсетях: