"Пифагорейская задача трех тел" - для сравнения нужно несколько точек из точного решения.

примечание: если вы проголосуете (или даже если вы этого не сделаете), не забудьте прокрутить вниз и увидеть также отличный ответ - он прекрасен!

Пифагорейская задача трех тел , также известная как проблема Буррау, является частным случаем общей задачи трех тел, где три тела имеют массы 3, 4 и 5, а начальные условия таковы, что они начинаются в состоянии покоя, в вершины прямоугольного треугольника 3-4-5.

Я вставил несколько скриншотов из документов , связанных здесь .

Подробнее можно посмотреть и прочитать в этом посте

И посмотрите это видео - похоже, что время, отображаемое по сюжету в видео, 40 × время в газете.

Первоначально предполагалось, что это может иметь какое-то особое значение, но, похоже, это не так. Однако это представляет большую проблему для численных интеграторов, поскольку приводит к нескольким очень близким (~ 10 4 ) проходит между парами, и многие распространенные интеграторы не реагируют достаточно быстро, уменьшая размер шага, чтобы поддерживать числовую точность.

Это то, что произошло со мной при использовании стандартного интегратора ODE по умолчанию в SciPy.

Есть несколько трюков, которые можно попробовать в SciPy, и, конечно же, в других интеграторах, доступных в python, и на самом деле я могу просто реализовать некоторые методы Рунге-Кутты более высокого порядка и написать свой собственный сверхбдительный обработчик размера шага . Это не обязательно должно быть быстро, потому что довольно скоро один из трех выбрасывается, а два других возвращаются к вращению двух тел. Это довольно часто встречается в ситуациях с тремя телами, в компьютерах и в тройных звездных системах, которые недостаточно иерархичны.

Что мне нужно сейчас , так это сравнить результаты с правильным численным решением - таблицей с выбором некоторых точных координат в зависимости от времени. Сравнение с YouTube не так точно, и нет никаких гарантий, что они верны!

Кто-нибудь знает, где я могу найти такие номера ?

примечание: комментарий указывает, что я должен быть осторожен со словом «правильно». Я ищу результаты, используя решатель ODE, который хорошо работает с жесткими уравнениями ( см . т знак равно 70 .

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

Если вы хотите предложить улучшение Python, вы можете оставить ответ или комментарий на мой вопрос в stackoverflow.

Неправильный ответ

def deriv(X, t):

    Y[:6] = X[6:]

    r34, r35, r45 = X[2:4]-X[0:2], X[4:6]-X[0:2], X[4:6]-X[2:4]
    thing34 = ((r34**2).sum())**-1.5
    thing35 = ((r35**2).sum())**-1.5
    thing45 = ((r45**2).sum())**-1.5

    Y[6:8]   =  r34*thing34*m4 + r35*thing35*m5
    Y[8:10]  =  r45*thing45*m5 - r34*thing34*m3
    Y[10:12] = -r35*thing35*m3 - r45*thing45*m4

    return Y


import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint as ODEint

# Pythagorean Three Body Problem
# This script WILL NOT solve it yet, just for illustration of the problem

m3, m4, m5 = 3.0, 4.0, 5.0

x0 = [1.0, 3.0] + [-2.0, -1.0] + [1.0, -1.0]
v0 = [0.0, 0.0] + [ 0.0,  0.0] + [0.0,  0.0] 
X0 = np.array(x0 + v0)

t = np.linspace(0, 60,  50001)

Y = np.zeros_like(X0)

tol  = 1E-9 # with default method higher precision causes failure
hmax = 1E-04
answer, info = ODEint(deriv, X0, t, rtol=tol, atol=tol,
                      hmax=hmax, full_output=True)

xy3, xy4, xy5 = answer.T[:6].reshape(3,2,-1)
paths         = [xy3, xy4, xy5]

plt.figure()
plt.subplot(2, 1, 1)
for x, y in paths:
    plt.plot(x, y)
for x, y in paths:
    plt.plot(x[:1], y[:1], 'ok')
plt.xlim(-6, 6)
plt.ylim(-4, 4)
plt.title("This result is WRONG!", fontsize=16)
plt.subplot(4,1,3)
for x, y in paths:
    plt.plot(t, x)
plt.ylim(-6, 4)
plt.subplot(4,1,4)
for x, y in paths:
    plt.plot(t, y)
plt.ylim(-6, 4)
plt.show()

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Если я полностью не ошибаюсь, любое моделирование с тремя телами с близкими подходами будет хаотичным, то есть чувствительно зависящим от начальных условий. Вы будете во власти не только квантования времени, но и числовых артефактов с плавающей запятой; в конечной/дискретной системе нет «правильного ответа» для сравнения.
@RussellBorogove Спасибо, я добавлю кое-что о слове «c» ( правильно ). это правда, что хаотические системы очень чувствительны к начальным условиям, а численные артефакты ограничивают точность, но это не означает, что проблема является стохастической или недетерминированной. Два программиста с двумя разными библиотеками на двух разных компьютерах, использующие двойную точность (8 байт), должны быть в состоянии решить эту задачу с точностью, скажем, до шести цифр - с точностью до ( т > 60 ) где м знак равно 3 объект выбрасывается. Здесь нет принципа неопределенности или квантования времени, просто решение серии из 4 ОДУ.
Операции с плавающей запятой на стандартных процессорах могут давать разные результаты для таких операций, как сложение трех чисел в разном порядке. Эффекты округления могут давать разные результаты для (3 шага дельта-t = 2) по сравнению с (2 шага дельта-t = 3). Как только вы получите расхождение, расхождение начнет усиливаться.
@ вот так. Я начинаю с 16-значных чисел, надеясь на точность около 6 цифр в конце ( т знак равно 70 ). Сейчас я tolпоставил большой 10 10 потому что процедура по умолчанию не может справиться с проблемой. См. этот вопрос для получения дополнительных примеров - в частности , проблема D5 . Конечно, разные компьютеры могут давать ответы, которые могут немного отличаться, а ошибки округления могут привести к гораздо большим ошибкам в такой задаче (хаотичной).
@RussellBorogove Я ищу решение, в котором кто-то использовал «числовой избыток» (много шагов, удобный метод, возможно, четырехкратную точность), чтобы получить хороший ответ, с которым я могу сравнить.
Ааа, хорошо, они не расходятся очень далеко, прежде чем это станет проблемой двух тел. Я все еще предполагаю, что, например, период бинарного компонента может немного отличаться, если вы выберете другой размер шага, поэтому точный позиционный результат будет другим через долгое время, даже если характер орбиты будет таким же.

Ответы (1)

Я только что запустил его, и мой выглядит почти так же, как в газете.

См. некоторые координаты внизу.

0-10 10-20 20-30 30-40 40-50 50-60 60-70

Вот некоторые координаты {x,y} в моменты времени в левом столбце:

0.      {1.,3.}                 {-2.,-1.}               {1.,-1.}
5.      {2.46917,-1.22782}      {-2.2782,-0.20545}      {0.34106,0.901049}
10.     {0.77848,0.141392}      {-2.02509,0.0972194}    {1.15299,-0.162611}
15.     {1.41845,0.686214}      {-2.00654,0.0599408}    {0.754159,-0.459681}
20.     {3.00429,0.511925}      {-1.38863,-0.470476}    {-0.691674,0.0692257}
25.     {2.2699,-0.0832}        {-2.63692,-0.426417}    {0.747596,0.391054}
30.     {0.85634,2.28709}       {-0.877984,-0.865964}   {0.188583,-0.679485}
35.     {0.0273748,0.895529}    {0.942553,-1.60223}     {-0.770468,0.744467}
40.     {-0.622004,1.85832}     {0.173545,-2.36841}     {0.234367,0.779737}
45.     {-0.657058,2.53557}     {1.61355,-1.23947}      {-0.896608,-0.529771}
50.     {-2.70146,-3.79723}     {1.50595,0.960811}      {0.416122,1.50969}
55.     {-2.75171,-4.29907}     {1.72673,0.97731}       {0.269648,1.7976}
60.     {0.743681,1.93961}      {0.263967,-0.731477}    {-0.657382,-0.578586}
65.     {4.05348,11.7131}       {-1.0722,-3.92197}      {-1.57432,-3.8903}
70.     {6.93108,20.2566}       {-1.99418,-6.87252}     {-2.5633,-6.65594}

Это все с точностью до 30 цифр. При проверке конечной полной энергии и полного углового момента по сравнению с начальными условиями с 30 рабочими цифрами результаты хороши до 10 цифр. С 50 рабочими цифрами результаты хороши до 20 цифр. С машинной точностью (около 15 рабочих знаков) результаты хороши до пяти-шести знаков, что все еще довольно хорошо, учитывая близкие подходы.

Вау красивый! У меня было ощущение, что вы справились :) Как насчет таблицы чисел 17x6 - 3 пары (x, y) для t = 0, 5, 10... 70 - неравномерный временной интервал в порядке. Кроме того, может быть, быстрая проверка того, что ваше решение кажется устойчивым к изменениям любых параметров допуска, которые у вас могут быть. Это не "доказательство точности", но для меня этого достаточно. Спасибо большое!!
Я запустил его с более высокой рабочей точностью (30 знаков после запятой) и получил те же результаты.
Математика, да? Мне интересно, вы использовали настройки по умолчанию или какие-то пользовательские?
Да. Цвета сюжета должны быть беспроигрышными. Я использовал NDSolveс InterpolationOrder -> All, WorkingPrecision -> 30, MaxSteps -> 10^5.
Проверка сохраняющихся количеств — отличная идея и отличный способ дополнительно указать качество решения. Мой предыдущий вопрос не был очень популярен, но в одном комментарии рекомендовался «симплектический интегратор», чтобы избежать «утечки» энергии. Похоже, вы использовали один здесь.
Есть SymplecticPartitionedRungeKuttaвариант, но я им не пользовался. Я использовал методы по умолчанию, которые выбирают предиктор-корректор и метод обратной дифференциации в зависимости от жесткости. Тогда окончательная полная энергия действительно является хорошей мерой качества результата, поскольку в методе интегрирования нет ничего явного, кроме уравнений движения, что гарантировало бы его сохранение.