Система из трех материальных точек
действием гравитационных сил (для введенного момента времени t программа должна
распечатать координаты всех тел в пространстве).
В принципе тут нужно решать задачу трех тел, но там дифуры, а я в них еще не шарю, ибо 2 курс только.
Подскажите хотя бы словесный алгоритм, а то я вообще ничего по этой теме надумать не могу...
задача трёх тел считается не разрешимой в аналитическом виде .
Можно попытаться выполнить эту задачу с использованием приближённых вычислений - с помощью итерационного алгоритма.
Положим, на вход программы поступают данные:
- массы точек;
- пространственные координаты каждой точки (x, y, z);
- начальные скорости точек, заданные проекциями на оси координат - (vx, vy, vz).
Ускорение каждой точки можно вычислить на основе этих трёх групп величин, рассчитав для каждой точки векторы гравитационных ускорений, создаваемых двумя другими точками, и сложив эти векторы. В итоге для каждой точки получаем вектор ускорения (ax, ay, az).
Цикл итераций
Начало итерации
Имеем координаты точек, проекции векторов скоростей и ускорений точек.
Берём некоторый достаточно малый интервал времени - dt. Считаем, что на протяжении этого интервала ускорения точек остаются неизменными, соответственно можно вычислить положение и скорость точки на конец интервала:
Код:
x1 = x + vx * dt + ax * dt ^ 2 / 2
y1 = y + vy * dt + ay * dt ^ 2 / 2
z1 = z + vz * dt + az * dt ^ 2 / 2
vx1 = vx + ax * t
vy1 = vy + ay * t
vz1 = vz + az * t
y1 = y + vy * dt + ay * dt ^ 2 / 2
z1 = z + vz * dt + az * dt ^ 2 / 2
vx1 = vx + ax * t
vy1 = vy + ay * t
vz1 = vz + az * t
Конец итерации.
Повторяем эти итерации нужное количество раз, и таким образом программно моделируем перемещение точек. Количество итераций можно жёстко задать в программе; либо запрашивать от пользователя информацию о том, когда прекратить вычисление итераций - например, в начале работы попросить задать требуемое количество итераций, или после каждого N-го количества итераций запрашивать продолжать ли вычисления дальше, или ещё как-то.
Стоит отметить, что принятое допущение о неизменности ускорения является неверным, т.к. в ходе движения точек меняются расстояния между ними, и положение точек относительно друг друга. Можно сделать расчёты более точными, если попытаться учесть изменение ускорений в течение шага итерации. Как именно это сделать - затрудняюсь сказать, но наверно нужно ввести дополнительные переменные - производные ускорений точек, вычисленные на основе координат точек и скоростей точек. Для этого уже потребуется сделать некоторые математические выкладки (возможно понадобятся и дифуры) и в итоге получить более точные формулы для расчёта координат / скоростей / ускорений на конец итерации. Или может в учебниках или ещё где-то эти формулы уже есть в готовом виде. И затем программно реализовать вычисление этих формул в итерационном алгоритме.
Также следует учесть, что для временного шага итерации лучше не брать какое-то фиксированное значение, а вычислять шаг итерации динамически на основе параметров точек (координат скоростей ускорений). Шаг итерации нужно каждый раз выбирать так, чтобы принятое допущение о неизменности ускорения обеспечивалось с некоторой нужной точностью, иначе алгоритм будет давать серьёзные искажения.