Как рассчитать непрерывный эффект гравитационного притяжения между моделируемыми планетами - PullRequest
1 голос
/ 23 октября 2011

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

Я планирую смоделировать их натяжение друг на друга, рассматривая каждую планету как проекцию своего собственного "гравитационного вектораполе «.На каждом временном шаге я собираюсь добавить векторы, выведенные из каждого отдельного уравнения векторного поля каждой планеты (V = -xj + (-yj) или некоторого подобного ему обозначения), за исключением того, которое выполняется в вычислении, и использовать положение затронутых планет.в качестве входа в уравнения.

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

В дополнение к тому, что Блендер пишет об использовании уравнений Ньютона, вам нужно подумать о том, как вы будете интегрироваться по своему «полю ускорения» (как вы это называете в комментарии к его ответу).

Самый простойспособ заключается в использовании метод Эйлера .Проблема в том, что он быстро расходится, но он имеет преимущество в том, что его легко кодировать и он достаточно быстр.

Если вы ищете лучшую точность и готовы пожертвовать некоторой производительностью, один из Методы Рунге-Кутты (вероятно, RK4) обычно были бы хорошим выбором.Я предупреждаю вас, что если ваше «поле ускорения» является динамическим (то есть оно меняется со временем ... возможно, в результате движения планет по своим орбитам), RK4 станет проблемой.

Обновление (на основе комментария / вопроса ниже):

Если вы хотите рассчитать вектор силы F i (t * 1021)* n ) в какой-то момент времени t n , примененный к конкретному объекту i , затем вам необходимо вычислить силу, вносимую всеми другими объектами в вашей симуляции, используяуравнение Блендер ссылки.То есть для каждого объекта, i , вы выясните, как все другие объекты вытягивают (применяют силу), и эти векторы при суммировании будут вектором совокупной силы, примененным к i .Алгоритмически это выглядит примерно так:

for each object <i>i</i>
    <b>F</b><sub><i>i</i></sub>(t<sub>n</sub>) = 0
    for each object <i>j</i> &ne; <i>i</i>
        <b>F</b><sub><i>i</i></sub>(t<sub>n</sub>) = <b>F</b><sub><i>i</i></sub>(t<sub>n</sub>) + G * m<sub><i>i</i></sub> * m<sub><i>j</i></sub> / |<b>p</b><sub><i>i</i></sub>(t<sub>n</sub>)-<b>p</b><sub><i>j</i></sub>(t<sub>n</sub>)|<sup>2</sup>

Где p i (t n ) и p j (t n ) - положения объектов i и j в момент времени t n соответственно и ||является стандартным евклидовым ( l 2 ) нормальным ... т.е. евклидовым расстоянием между двумя объектами.Кроме того, G - это гравитационная постоянная .

Метод Эйлера разбивает симуляцию на дискретные интервалы времени.Он просматривает текущее состояние и, в случае вашего примера, рассматривает все силы, приложенные в совокупности ко всем объектам в вашей имитации, а затем применяет эти силы как постоянные в течение периода временного интервала.При использовании

<b>a</b><sub><i>i</i></sub>(t<sub>n</sub>) = <b>F</b><sub><i>i</i></sub>(t<sub>n</sub>)/m<sub><i>i</i></sub>

( a i (t n ) = вектор ускорения в момент времени t n применяется к объекту i , F i (t n ) - вектор силыприменяется к объекту i в момент времени t n , а m i - масса объекта i ),вектор силы (и, следовательно, вектор ускорения) поддерживается постоянным в течение продолжительности временного интервала.В вашем случае, если у вас действительно есть другой метод вычисления ускорения, вам не нужно вычислять силу, а вместо этого можно напрямую вычислять ускорение.В любом случае, когда ускорение поддерживается постоянным, положение в момент времени t n + 1 , p (t n + 1 ) и скорость в момент времениt n + 1 , v (t n + 1 ) объекта будет иметь вид:

<b>p</b><sub><i>i</i></sub>(t<sub>n+1</sub>) = 0.5*<b>a</b><sub><i>i</i></sub>(t<sub>n</sub>)*(t<sub>n+1</sub>-t<sub>n</sub>)<sup>2</sup> + <b>v</b><sub><i>i</i></sub>(t<sub>n</sub>)*(t<sub>n+1</sub>-t<sub>n</sub>)+<b>p</b><sub><i>i</i></sub>(t<sub>n</sub>)
<b>v</b><sub><i>i</i></sub>(t<sub>n+1</sub>) = <b>a</b><sub><i>i</i></sub>(t<sub>n+1</sub>)*(t<sub>n+1</sub>-t<sub>n</sub>) + <b>v</b><sub><i>i</i></sub>(t<sub>n</sub>)

Метод RK4 подгоняет драйвер вашей системы к полиному 2-й степени, который лучше приближает его поведение.Подробности на сайте Википедии, на который я ссылался выше, и есть ряд других ресурсов, которые вы можете найти в Интернете.Основная идея заключается в том, что вместо выбора одного значения силы для конкретного временного среза вы вычисляете четыре вектора силы в определенное время, а затем подгоняете вектор силы к полиному 2-й степени.Это хорошо, если ваши векторы силовых полей не меняются между временными срезами.Если вы используете гравитацию для получения векторного поля, а объекты, являющиеся источниками гравитации, перемещаются, то вам необходимо вычислить их положения в каждом из четырех подинтервалов, чтобы вычислить векторы силы.Это можно сделать, но ваша производительность будет немного хуже, чем при использовании метода Эйлера.С положительной стороны, вы получаете более точное движение объектов относительно друг друга.Таким образом, это сложная задача в том смысле, что она требует больших вычислительных ресурсов, и немного затруднительно определить, где все объекты должны находиться для ваших четырех выборок в течение отрезка времени вашей итерации.

1 голос
/ 23 октября 2011

В работе с компьютерами нет понятия «непрерывный», поэтому вам придется аппроксимировать непрерывность с очень небольшими интервалами времени.

Как говорится, почему вы используете векторное поле? Что не так с Ньютоном?

enter image description here

enter image description here

И сумма сил на объекте равна приведенной выше формуле. Приравнивай их и решай для a

Так что вам нужно будет просто перебрать все объекты один за другим и найти на них ускорение.

...