примечание: если вы проголосуете (или даже если вы этого не сделаете), не забудьте прокрутить вниз и увидеть также отличный ответ - он прекрасен!
Пифагорейская задача трех тел , также известная как проблема Буррау, является частным случаем общей задачи трех тел, где три тела имеют массы 3, 4 и 5, а начальные условия таковы, что они начинаются в состоянии покоя, в вершины прямоугольного треугольника 3-4-5.
Я вставил несколько скриншотов из документов , связанных здесь .
Подробнее можно посмотреть и прочитать в этом посте
И посмотрите это видео - похоже, что время, отображаемое по сюжету в видео, время в газете.
Первоначально предполагалось, что это может иметь какое-то особое значение, но, похоже, это не так. Однако это представляет большую проблему для численных интеграторов, поскольку приводит к нескольким очень близким (~ ) проходит между парами, и многие распространенные интеграторы не реагируют достаточно быстро, уменьшая размер шага, чтобы поддерживать числовую точность.
Это то, что произошло со мной при использовании стандартного интегратора ODE по умолчанию в SciPy.
Есть несколько трюков, которые можно попробовать в SciPy, и, конечно же, в других интеграторах, доступных в python, и на самом деле я могу просто реализовать некоторые методы Рунге-Кутты более высокого порядка и написать свой собственный сверхбдительный обработчик размера шага . Это не обязательно должно быть быстро, потому что довольно скоро один из трех выбрасывается, а два других возвращаются к вращению двух тел. Это довольно часто встречается в ситуациях с тремя телами, в компьютерах и в тройных звездных системах, которые недостаточно иерархичны.
Что мне нужно сейчас , так это сравнить результаты с правильным численным решением - таблицей с выбором некоторых точных координат в зависимости от времени. Сравнение с YouTube не так точно, и нет никаких гарантий, что они верны!
Кто-нибудь знает, где я могу найти такие номера ?
примечание: комментарий указывает, что я должен быть осторожен со словом «правильно». Я ищу результаты, используя решатель ODE, который хорошо работает с жесткими уравнениями ( см . .
Вот пример вывода и скрипт. Это не правильно. Вы можете найти хорошие решения, представленные на 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()
Я только что запустил его, и мой выглядит почти так же, как в газете.
См. некоторые координаты внизу.
Вот некоторые координаты {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 рабочих знаков) результаты хороши до пяти-шести знаков, что все еще довольно хорошо, учитывая близкие подходы.
NDSolve
с InterpolationOrder -> All, WorkingPrecision -> 30, MaxSteps -> 10^5
.SymplecticPartitionedRungeKutta
вариант, но я им не пользовался. Я использовал методы по умолчанию, которые выбирают предиктор-корректор и метод обратной дифференциации в зависимости от жесткости. Тогда окончательная полная энергия действительно является хорошей мерой качества результата, поскольку в методе интегрирования нет ничего явного, кроме уравнений движения, что гарантировало бы его сохранение.
Рассел Борогов
ооо
Рассел Борогов
ооо
tol
поставил большойооо
Рассел Борогов