Изображение гика

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

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

12 ноября 2018 г.

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

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

pip3 install vpython

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

1 from vpython import sphere
2 
3 sphere()

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

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

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

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

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

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

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

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

$$v=\omega\cdot r$$

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

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

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

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

 1 # Будем использовать полярные координаты
 2 # Шаг
 3 dt = 10
 4 # углы поворота за один шаг:
 5 theta_earth = we*dt
 6 theta_moon = wm*dt
 7 while 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

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

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