Моделируем вселенную: небесная механика наглядно



Давайте представим, что нам нужно запустить футбольный мяч на орбиту Земли. Никакие ракеты не нужны! Хватит горы, высотой 100 километров и недюжинной силы. Но насколько сильно нужно пнуть мяч, чтобы он никогда больше не вернулся на Землю? Как отправить мяч в путешествие к звёздам, имея только грубую силу и знание небесной механики?

Сегодня в программе:

  • Бесконечные возможности одной формулы
  • Как взять энергию у Юпитера
  • Откуда у планет берутся кольца
  • Как математика помогла открыть Нептун

Благо, мы живём в век компьютерных технологий. Нам не нужно забираться на высокую гору и пинать мяч со всей силы, всё можно смоделировать! Давайте приступим.

Одна формула


Та самая, известная с уроков физики и астрономии:



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

Я написал программу, в которой можно расставлять шарики, взаимодействующие друг с другом силами гравитации, при этом у каждого шарика есть своя масса, скорость и координаты. Для наглядности шарики оставляют за собой след.

Давайте поставим большой и массивный голубой шар(Землю) и маленький красный мячик недалеко от него. Запускаем симуляцию:



Он упал!

Для выхода на орбиту нужна скорость, чтобы шарик падал и все время промахивался мимо Земли. Но КАКАЯ скорость? И снова школьные знания приходят на помощь:

Минимальная скорость, необходимая для выхода на орбиту Земли называется первой космической скоростью.

Для Земли она равна 7.91 км/с. А для симуляции её можно легко вычислить:



Разгоняем мячик и смотрим результат:



Полёт нормальный!

Шарик описывает окружность с Землёй в центре. Что будет, если придать ему чуть больше скорости? Сейчас проверим:



Теперь форма орбиты эллиптическая, можно выделить 2 очень важные точки — апогей и перигей.

Апогей — это точка, в которой мячик максимально удалён от Земли.

Перигей — наоборот, самая близкая к Земле точка.

При увеличении начальной скорости перигей не меняется, а вот апогей становится всё дальше, и в конце концов имеет бесконечное расстояние до Земли. Тут мы вплотную приблизились к понятию второй космической скорости. Это скорость, которую надо придать шарику, чтобы он преодолел гравитацию Земли и улетел бороздить просторы вселенной. Для земли она равна 11.2 км/с.

Интересный фокус: если мы умножим первую космическую скорость на √2, то получим вторую космическую.

Умножили. Запустили. Получили:



Он улетел безвозвратно! Кстати, теперь он имеет параболическую орбиту. А если запустить шарик ещё сильнее, получим гиперболу. Интересно получается, везде нас преследует математика.

При этом формула остаётся всё той же. Окружность превращается в эллипс, эллипс в параболу, а парабола в гиперболу из-за вытягивания орбиты(увеличения эксцентриситета).

Как взять энергию у Юпитера?


Давайте расширим нашу модель, добавим Солнце, заставим Землю крутиться вокруг него.



Представим, что мячу нужно придать такую скорость, чтобы он улетел за пределы Солнечной системы — третью космическую скорость. В реальном мире она равна 16.7 км/с. К сожалению, эта скорость слишком большая, боюсь, нам не хватит сил…

Постойте! А что, если забрать немного скорости у какого-нибудь массивного тела, например, Юпитера. Мы можем подлететь к чему-то очень массивному и совершить гравитационный манёвр. При пролёте мимо Юпитера силы гравитации взаимно притягивают мячик и газовый гигант, но масса мячика настолько мала, что почти никак не влияет на движение Юпитера, а сам Юпитер разгоняет пролетающее мимо тело до высоких скоростей.

Меньше слов — больше дела:



Момент гравитационного манёвра — шарик подлетел к Юпитеру.



Ура! Мы получили скорость, достаточную для выхода из Солнечной системы, при этом ничего не потратили. Правда, Юпитер стал двигаться чуть медленнее, но мы этого точно не заметим.

Все космические аппараты, запущенные человеком за пределы солнечной системы («Вояджеры» 1 и 2, «Пионеры» 10 и 11, «Новые горизонты») использовали именно такой способ для ускорения.

Увеличиваем масштаб!


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

Поставим случайную генерацию шариков и зададим им случайное направление и скорость. Пусть их будет, допустим, 100 штук.



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



И через некоторое время получается большое тело, состоящее из 99 шариков и один-единственный шарик, обращающийся вокруг него:



При другом запуске получилось следующее:



Два массивных тела, обращающихся вокруг общего центра масс. Если представить, что эти два объекта — звёзды, то мы получили двойную звезду. Интересно, что примерно половина звёзд в нашей галактике — двойные. Если бы у нашего Солнца была звезда — компаньон, то в небе мы могли бы наблюдать такую картину:



Откуда у планет берутся кольца?


Основная причина появления колец — это разрушение спутников, подлетевших слишком близко к планете, а точнее, пересёкших предел Роша. В таком случае приливные силы, вызываемые гравитацией планеты, становятся больше сил, удерживающих спутник целым, и он разрывается на много частей, оставляя после себя кольцо, которое опоясывает планету. Давайте смоделируем эту ситуацию:



Спутник чуть дальше предела Роша, он вращается вокруг планеты по стабильной круговой орбите. Но что будет, если сгенерировать его чуть-чуть ближе к планете?



Спутник разлетелся на множество маленьких частей, которые образовали кольца вокруг планеты. Так же и в реальном мире. Тритон (спутник Нептуна) постепенно приближается к планете, и через 2 миллиарда лет будет разорван, а у Нептуна появятся кольца больше, чем у Сатурна.

Как открыли Нептун и при чём здесь математика?


Раз уж зашла речь о Нептуне, давайте поговорим о его открытии. «Планета, открытая на кончике пера» имеет массу, а значит, действует на объекты вокруг. Астрономы 19 века заметили изменения в орбите Урана, его орбита отличалась от расчётной, видимо, что-то влияло на него. Орбита Урана имела возмущения:



Это утрированная модель показывает, как неизвестное тело за Ураном влияло на его орбиту. Астрономам оставалось только вычислить положение тайной планеты и посмотреть в телескоп. Действительно, планета Нептун оказалась именно там, где её и предсказывали!



Заключение


Конечно, эта симуляция не обобщает все законы и явления, происходящие в космосе, например, здесь не учитывается теория относительности Эйнштейна, так как скорость частиц далека от скорости света. Но есть ещё много интересных вещей, которые можно реализовать в этой симуляции. Попробуйте сами! Понадобится только Python3 и библиотека Pygame.

Исходный код
#Траектория частицы
Track = True

#длина траектории
Track_time = 5

#Гравитационная постоянная
G = 5

#Сила магнитного взаимодействия(одинаковые цвета -
#притягиваются, разные - отталкиваются)
MagnConst = 0

#Количество частиц
count = 100

#Начальная скорость частиц
kv = 6

#Случайная генерация частиц
RANDOM = True

#Радиус случайных частиц
r = 3

#Ширина и высота окна
WIN_WIDTH, WIN_HEIGHT = 900, 650


'''всё, что дальше, лучше не менять'''

#Закон для гравитационного взаимодействия
zg = 2

#Закон для магнитного взаимодействия
zm = 2

#Коэф. трения, чем он больше - тем меньше трение
k = 40

#Отталкивание частиц
antiG = 0.1

max_speed = 3

ResDist = 1

#Притяжение вниз
EarthG = 0

#Отражение частиц от стенок
Mirror = True

import pygame
from math import hypot, ceil, sqrt
from random import randint, random


def custom_pos():
    '''Здесь вы можете написать своё расположение планет'''
    '''не забудьте установить RANDOM = FALSE'''
    B.append(Ball(200, 300, YELLOW, r = 10, mass = 200, vx = 0.151))    #x, y, col, r, vx, vy, mass
    B.append(Ball(200, 50, GREEN, r = 6, mass = 10, vx = -(200 * G / 250)**0.5))
    

class Ball:
    def __init__(self, x, y, col, r = 4, vx = 0, vy = 0, mass = 4):
        self.x = x
        self.y = y
        self.r = r
        self.col = col
        self.vx = vx
        self.vy = vy
        self.mass = mass
        
    def move(self, Walls, WIN_WIDTH, WIN_HEIGHT, ofs_x, ofs_y):
        if Walls:
            x = self.x - ofs_x
            y = self.y - ofs_y
            if x <= 0 and self.vx < 0:
                if Mirror:
                    self.vx = -self.vx
                else:
                    self.x += WIN_WIDTH
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            if x >= WIN_WIDTH and self.vx > 0:
                if Mirror:
                    self.vx = -self.vx
                else:
                    self.x -= WIN_WIDTH
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            if y <= 0 and self.vy < 0:
                if Mirror:
                    self.vy = -self.vy
                else:
                    self.y += WIN_HEIGHT
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            if y >= WIN_HEIGHT and self.vy > 0:
                if Mirror:
                    self.vy = -self.vy
                else:
                    self.y -= WIN_HEIGHT
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            
        self.x += self.vx
        self.y += self.vy

        
    def force(self, ind, selfind):
        ox = B[ind].x
        oy = B[ind].y
        m = B[ind].mass
        if m < 0.01 and self.mass < 0.01:
            return 0
        r = B[ind].r
        vx = B[ind].vx
        vy = B[ind].vy
        dist = hypot(self.x - ox, self.y - oy)
        min_dist = (self.r + B[ind].r) * ResDist
        f = 0
        m_relative = self.mass / B[ind].mass
        if dist <= min_dist:
            newVx = (vx * m + self.vx * self.mass) / (m + self.mass)
            newVy = (vy * m + self.vy * self.mass) / (m + self.mass)
            self.vx = (newVx + k * self.vx) / (k + 1)
            B[ind].vx = (newVx + k * B[ind].vx) / (k + 1)
            self.vy = (newVy + k * self.vy) / (k + 1)
            B[ind].vy = (newVy + k * B[ind].vy) / (k + 1)
            f -= antiG * min(abs(min_dist - dist), min(m, self.mass) * 3)
        else:
            f += min(self.mass * B[ind].mass * G  / (dist ** zg), G / 10)
            mf = MagnConst * self.mass / (dist ** zm)
            if B[ind].col == B[selfind].col:
                mf = - mf
            f += mf
        fx = f * ((ox - self.x) / dist)
        fy = f * ((oy - self.y) / dist)
        ax = fx / self.mass
        ay = fy / self.mass
        self.vx += ax
        self.vy += ay + EarthG
        B[ind].vx -= ax * m_relative
        B[ind].vy -= ay * m_relative - EarthG

    @staticmethod
    def v_norm(vx, vy):
        v = hypot(vx, vy)
        if v > max_speed:
            vx = max_speed * (vx / v)
            vy = max_speed * (vy / v)
        return vx, vy


class Point:
    def __init__(self, x, y, col, r = 0, max_age = Track_time):
        self.age = 0
        self.x = x
        self.y = y
        self.col = col
        self.r = r
        self.max_age = max_age
    def vis(self, ofs_x, ofs_y):
        pygame.draw.circle(sc, self.col, (round(self.x - ofs_x),
                                          round(self.y - ofs_y)), self.r, 0)
        self.age += 1
        if self.age > self.max_age:
            T.remove(self)
        
def rand(count, WIN_WIDTH, WIN_HEIGHT):
    global kv
    B = []
    for i in range(count):
        m = r ** 2
        x = randint(0, WIN_WIDTH) + random()
        y = randint(0, WIN_HEIGHT) + random()
        vx = kv * randint(-100, 100) / 100
        vy = kv * randint(-100, 100) / 100
        col = Colors[randint(0, len(Colors) - 1)]
        B.append(Ball(x, y, col, r = r, vx = vx, vy = vy, mass = m))
    return B

def createBall(col, x, y, r = r, m = r):
    m = r
    B.append(Ball(x, y, col))

def get_offset(B):
    sum_x, sum_y = 0, 0
    m = 0
    for i in range(len(B)):
        sum_x += B[i].x * B[i].mass
        sum_y += B[i].y * B[i].mass
        m += B[i].mass
    if len(B) == 0:
        return 0, 0
    return sum_x / m, sum_y / m

def visBalls(B):
    for i in range(len(B)):
        pygame.draw.circle(sc, B[i].col, (round(B[i].x - ofs_x),
                                          round(B[i].y - ofs_y)), B[i].r, 0)
        T.append(Point(B[i].x, B[i].y, B[i].col))
        
FPS = 60
darkblue = (0, 2, 25)
ORANGE = (255, 200, 150)
RED = (255, 150, 150)
GREEN = (150, 255, 150)
BLUE = (150, 150, 255)
YELLOW = (255, 255, 0)
Colors = [RED, BLUE]#, GREEN]#, ORANGE]                       
pygame.init() 
clock = pygame.time.Clock()
sc = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
sc.fill(darkblue)

maxF = 0.3
minv = 0.01
Walls = True
Collisions = True
Same = True
Check = False
tt = []

B = []
if RANDOM:
    B = rand(count, WIN_WIDTH, WIN_HEIGHT)
else:
    custom_pos()
    
Pause = False
delay = 0

if Track:
    T = []
for z in range(100000):
    sc = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
    sc.fill(darkblue)
    ofs_x, ofs_y = get_offset(B)
    ofs_x -= WIN_WIDTH // 2
    ofs_y -= WIN_HEIGHT // 2
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            pygame.quit()
            quit()
        if i.type == pygame.KEYDOWN:
            if i.key == pygame.K_SPACE:
                Pause = not Pause
            elif i.key == pygame.K_w:
                WIN_HEIGHT += 10
                WIN_WIDTH += 10
            elif i.key == pygame.K_s:
                WIN_HEIGHT -= 10
                WIN_WIDTH -= 10
                
    pressed = pygame.mouse.get_pressed()
    pos = pygame.mouse.get_pos()
    x = pos[0]
    y = pos[1]
    if pressed[0] and delay < 0:
        delay = 20
        createBall(RED, x + ofs_x, y + ofs_y)
    if pressed[2] and delay < 0:
        delay = 20
        createBall(BLUE, x + ofs_x, y + ofs_y )
    delay -= 1
    
    if not Pause:
        for i in range(len(B)):
            for j in range(i + 1, len(B)):
                B[i].force(j, i)
        for i in range(len(B)):
            B[i].move(Walls, WIN_WIDTH, WIN_HEIGHT, ofs_x, ofs_y)
    for i in range(len(T)):
        try:
            T[i].vis(ofs_x, ofs_y)
        except IndexError:
            pass
    visBalls(B)
    
    pygame.display.update()
    clock.tick(FPS)


Надеюсь, эта статья оказалась познавательной для вас. Спасибо за внимание!
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 42

    +3
    Все хорошо, только вместе с картинками интересней было бы видеть пошаговые примеры кода, который это делает.
      +2

      Ещё интереснее было бы увидеть всё же анимации.

        +1
        Спасибо за комментарий! Учту в следующих работах.
        –2
        Раз вы так хорошо разбираетесь в небесной механике, не могли бы вы добавить в простейшую модель вращения 2х тел одинаковой массы вокруг общего центра ненулевую скорость распространения гравитационного возмущения. Т.е. когда одна из масс m1 уже пролетела по своей круговой траектории некоторое расстояние, другая масса m2 все еще «ощущает», что m1 находится где-то на своей траектории в предыдущем положении. Ведь так работает запаздывание возмущения? Если так, то должна появляться сила ускоряющая вращение этих 2х масс. И притягивающиеся массы должны со временем оттолкнуться друг от друга. Ну чем, не темная энергия, с отрицательной массой и действием на огромных расстояниях.
          0
          ненулевую скорость распространения гравитационного возмущения

          А ее тут вроде за нулевую и не принимают, а за мгновенную а не 300000 км/с, и для простой модели это нормально.
          другая масса m2 все еще «ощущает», что m1 находится где-то на своей траектории в предыдущем положении

          Долго «ощущает»… очень долго…
          И притягивающиеся массы должны со временем оттолкнуться друг от друга.

          И из чего сие следует?
            0

            Если я ещё правильно понимаю русский язык, скорость не может быть «мгновенной».


            «Долго ощущает»
            Ощущает действительно долго — бесконечно долго. Пока частица существует, она ощущает притяжение других тел.
            Я так понимаю, вы неудачно попытались съязвить о малом времени распространения сигнала от одной частицы к другой.
            Ну и что? Вы пытаетесь аргументировать отсутствие эффекта его слабым проявлением?


            Кстати, бывает и «долго»: 100тыс св.лет — диаметр млечного пути.


            Поднятый выше вопрос о том, как релятивистские эффекты меняют классическую небесную механику не является тривиальным, и если у вас есть что сказать по теме — милости просим.

              0
              Если я ещё правильно понимаю русский язык, скорость не может быть «мгновенной».
              Мгновенная скорость (in English — instantaneous velocity) — скорость в данный момент времени в данной точке траектории. В любой точке криволинейной траектории она направлена по касательной к траектории в этой точке.
              Обычно под скоростью понимают именно мгновенную скорость, т. е. скорость в определенный момент времени. См. школьные учебники физики.
              Для знатоков русского языка, ещё бывает средняя скорость (average velocity).

            0
            Автор тут рассматривает не небесную механику как таковую, а скорее некоторые упрошенные примеры для иллюстрации
            +3
            >> Интересно получается, везде нас преследует математика.

            Кто бы мог подумать!
              +2
              Если кольца Сатурна это раздробленные спутники, бывшие очень крупными, то это отличный способ покопать бывшее ядро планеты. Туда должны были упасть тяжелые элементы, прекрасное месторождение тяжелого металла обогащенного гравитацией.
                0
                Хватит горы, высотой 100 километров и недюжинной силы. Но насколько сильно нужно пнуть мяч, чтобы он никогда больше не вернулся на Землю? Как отправить мяч в путешествие к звёздам, имея только грубую силу и знание небесной механики?

                Тема сабжа осталась не раскрытой, с какой силой нужно пнуть мяч (ну или сколько нужно приложить энергии к мячу весом 1 кг, отправив в полет под углом 45° к горизонту), чтобы тот вышел на орбиту Земли?
                p.s. я не настоящий сварщик, а точнее совсем не сварщик, пришел только к подсчету потенциальной энергии мяча на минимально возможной орбите вокруг Земли (гугл выдал высоту в 160 км, это конечно же, пренебрегая сопротивлением воздуха), поэтому свои выкладки выложить не рискну, но вопрос заинтересовал :)
                  +7
                  Правильный ответ, пренебрегая атмосферой — мяч одним импульсом вывести на орбиту невозможно. Он либо прилетит обратно на землю, либо покинет орбиту. Для того, чтобы мяч остался на орбите, в апогее ему надо придать еще один импульс, который поднимет перигей выше поверхности земли. А так — любая замкнутая орбита приведет вас в ту же точку через виток с тем же вектором скорости, то есть, ваш мяч должен был бы в какой-то момент выпрыгнуть из горы под углом 45°, если убрать гору, Землю, и все остальное, что ему помешает это сделать.
                    0
                    Вы абсолютно правы, пытался оценить порядок величины энергии, необходимой для того, чтобы мяч покинул орбиту, и совершенно не учел того, что не получится так просто зафиксировать мяч на орбите.
                      0
                      пренебрегая атмосферой

                      Под 45 градусов действительно не получится, а паралельно поверхности Земли — почему бы и нет.
                      +2

                      Подозреваю, автор считал минимальной орбитой те самые 100км.
                      Пнуть мяч на 8км/с и не порвать — уметь надо.

                        0
                        7,91- это 1 косм на уровне поверхности Земли. С высотой она будет меньше, хотя и не сильно
                        +2
                        Мяч одним импульсом вывести на орбиту не получится. Я смоделировал предлагаемую вами ситуацию:



                        Мяч или падает обратно (если скорость меньше второй космической), или улетает безвозвратно (если больше). Но мяч можно вывести на орбиту, дав ему еще один импульс в точке, обведённой красным.
                          0
                          Получится:

                          image

                        +1
                        Прошу прощения, но:
                        Минимальная скорость, необходимая для выхода на орбиту Земли называется первой комической скоростью.
                        Уж больно бросилось в глаза.
                          0

                          Похоже, вы пишете с десктопа, а тут есть Ctrl+Enter для опечаток.

                            0
                            Спасибо! Не знал о такой функции.
                            0
                            Спасибо! Забавная ошибка. Исправил.
                              0
                              Если строго судить, там ошибка не в буквах, а в смысле. Первая космическая — это не скорость выведения, а скорость удержания на орбите. То есть чтобы вывести (даже если мгновенно) нужно увеличить потенциальную энергию тела (поднять), после чего придать телу скорость удержания на этой высоте.
                              Подобную ошибку часто встречаю — если по этой логике (первая космическая убывает с высотой), чем выше поднимать тело, тем это меньше требует затрат. А в реальности, имеем линейный рост потенциальной энергии и и нелинейный по кинетической — чем выше, чем меньшую скорость надо придать телу, но прирост потенциальной энергии больше выигрыша в кинетической.

                              Это очень легко проследить, если не брать готовую формулу для скорости, а вывести ее самому из закона сохранения полной мех. энергии (дважды — какую скорость придать телу в «перегее» на поверхности, чтоб в апогее достичь нужной высоты и насколько увеличить скорость в апогее, чтоб ускорить ее до круговой этой высоты)
                              0
                              Вторая попытка.
                              Раз вы так хорошо разбираетесь в небесной механике, не могли бы вы добавить в простейшую модель вращения 2х тел одинаковой массы вокруг общего центра немгновенную скорость распространения гравитационного возмущения.
                              Т.е. когда одна из масс m1 уже пролетела по своей круговой траектории из точки P1 в точку P2 (выберем время, которое как раз необходимо для распространения гравитационного возмущения от m1 до m2), другая масса m2 тоже переместившаяся немного вперед взаимодействует с гравитационным возмущение от m1, которая находилась ранее в точке траектории P1. Но сейчас сама m1 в точке P2. Ведь так работает запаздывание возмущения? Если так, то должна появляться сила ускоряющая вращение m2, за счет того, что вектор притяжения будет направлен не точно перпендиклярно вектору скорости m2, а на точку P1, т.е. немного вперед. Со временем система должна ускоряться и потом разлететься, при взаимодействии с другими случайно встретившимися массами. Ну чем, не темная материя, с отрицательной массой, с действием на огромных расстояниях и с взамодействием с отсутствующими объектами (m2 взаимодействует с m1 которая уже не находится в точке P1).
                                0
                                Взаимодействие на огромных расстояниях и релятивистские эффекты — это те вещи, которые заслуживают отдельного рассмотрения. Интересно было бы расширить симуляцию и добавить «Эйнштейновские» законы, это бы очень сильно изменило наблюдаемые явления. Что касается системы из двух тел: для получения хотя бы малейшей силы отталкивания скорость их движения должна быть огромной, что подвергнет систему большому количеству других сил, например, испускание гравитационных волн, которое наоборот «забирает» энергию у системы. Во всяком случае это очень интересно было бы наблюдать.
                                Спасибо за комментарий!
                                0
                                Когда в наших школах на уроках физики или астрономии детям показывают презентацию с GIF-кой из четырёх кадров, где Земля скачет вокруг Солнца — это называет внедрение современных технологий в образовательный процесс. Ведь могли бы и по истлевшим от времени таблицам учиться, сорванцы. Уверена, если бы хоть что-то ученики разбирали на подобных моделях, да ещё и с таким доступным объяснением — заинтересованных в учёбе и науке ребят было бы в разы больше
                                  0
                                  Помню, еще в школе, на бейсике или паскале писал подобную симуляцию. Но сделал дурацкую ошибку — разложил вектор притяжения по осям х и у и считал каждую компоненту раздельно. В некоторые моменты естественно эти компоненты оказывались нулевые, а сила притяжения бесконечной. Долго не мог понять, почему меня планеты выписывали странные кренделя, а иногда программа вылетала с «division by zero»
                                    0
                                    Поделитесь, как вообще можно в вычислениях на компьютере вектор не разбивать на компоненты? В коде автора данного поста, конечно, тоже вектора представляются парами чисел — проекциями на оси x и y.
                                      0
                                      я не помню подробностей, но что-то вроде того:
                                      вектор R разделял на компоненты по X и Y
                                      и считал F по формулам тоже раздельно Fx = G * m1 * m2 / x^2 и Fy = G * m1 * m2 / y^2
                                      Расстояние R может быть большим, но если планеты оказываются на одной оси, т.е. их координаты Y или X очень близки, то и соответствующая компонента F стремилась к бесконечности.
                                    0
                                    Вращение планет вокруг Солнца и добавление в систему малого тела — одни из первых моих шагов в программировании, 20+ лет назад )))
                                    То был чистый Паскаль, а из библиотек — только графика; пожалуй, первая в моей жизни графика.
                                      0
                                      Уточните, пожалуйста, какую численную схему вы использовали? Она сохраняет импульс и энергию?
                                        0

                                        Сохраняется масса и направление скорости всей системы. Из этого вытекает, что импульс и энергия тоже сохраняются.

                                          0
                                          Я вас не понял. Что такое направление скорости всей системы?
                                            0
                                            Вектор средней скорости всех частиц.
                                        0
                                        C небольшой модификацией кода можно поиграться приближенным молекулярным взаимодейстием черз потенциал Леннарда Джонса или похожий
                                        OPENCl у меня давал ~50 кратное ускорение относитльно CPU

                                        если притяжение брать 1/RR
                                        а отталкивание 1/R^12 то получится гравитация с автоматичеким слипанием
                                        только в блитжнейц зоне нужно сильно дробить шаг

                                          0
                                          Спасибо большое! Сейчас же попробую применить.
                                          0


                                          Уже сто лет хотел сделать такую штуку и всё ноги не доходили.


                                          А теперь предложения:


                                          • 01egarh, не хотите выложить код на github.com?
                                          • И интерфейсик бы к этому всему, чтобы можно было рулить параметрами Вселенной в реальном времени :) Еще в молодости баловался с Interactive Physics (с бесплатной версией, которая работала полчаса и не давала сохранять) — там можно было задавать кучу физических параметров для объектов, накидать контролов на поле и рулить физикой в процессе.
                                          • Классно было бы еще как-то показывать вращение точки и продумать сохранение момента импульса, чтобы в сумме с контролами (см. предыдущий пункт) можно было изображать нейтронную звезду.
                                            +1
                                            Думаю, будет хорошей идеей выложить на Гитхаб, если там разберусь что к чему.
                                            А изменение параметров будет несложно добавить, поработаю над этим.
                                            Над вращением я думал, но не получилось качественно придавать частицам вращение, и с его визуализацией тоже беда.
                                              0

                                              Вращение можно показать стрелкой от тела в направлении вращения, например.
                                              Просто стрелка/линия вращается вместе с телом в одинаковом направлении

                                            0

                                            01egarh, я чего-то не понимаю.
                                            А именно, как с помощью первой формулы вычислить vx/vy для планеты, вращающейся вокруг Солнца. Пока что имею что-то подобное на:


                                            def planet(sun, orb, color, r = 6, m = 15):
                                                vx = -(orb * G / (orb * 1.25)) ** 0.5
                                                return Ball(sun.x, sun.y - orb, color, r = r, mass = m, vx = vx)

                                            , где orb — высота орбиты (круговой) над Солнцем.

                                              0
                                              def planet(sun, orb, color, r = 6, m = 15):
                                                  vx = (sun.mass * G / orb) ** 0.5
                                                  return Ball(sun.x, sun.y - orb, color, r = r, mass = m, vx = vx)
                                              

                                              При этом масса планеты должна быть значительно меньше массы звезды.
                                                0

                                                Спасибо! Подразумевал под m массу планеты.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое