Модель Солнечной системы на vpython
Есть такая библиотека - 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}$$
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
Также, я сделал видео работы данного скрипта, по-моему, получилось неплохо: