следующий шаг в тестировании решателя ОДУ для пифагорейской задачи трех тел

Я столкнулся с трудностями, пытаясь интегрировать Задачу Пифагора о трех телах с помощью scipy.odeint. После небольшого осмотра и поиска в Интернете я нашел следующее в этой очень интересной интеграции обсуждение/руководство:

"После обсуждения масштабирования единиц измерения в следующем разделе в следующих разделах описано множество различных алгоритмов интегрирования. Автор рекомендует после написания собственной программы интегрирования в соответствии с одним из этих алгоритмов начать упражнения по интегрированию с рисунка «восьмерка», так как ее легко интегрировать из-за ее стабильности и того факта, что близких столкновений вообще не происходит. После этого вы можете попытаться решить задачу Пифагора. Задача Пифагора трудно интегрируется. A необходимо использовать очень точный интегратор, способный справиться с многочисленными близкими столкновениями."

Итак, мой основной вопрос: есть ли другие библиотеки ODE для Python, на которые я мог бы обратить внимание, в соответствии с приведенным выше предложением? В качестве альтернативы, может ли кто-нибудь помочь мне понять, как уговорить odeint работать здесь? scipy.odeint всегда «просто работал» прямо из коробки всякий раз, когда я его использовал, поэтому на этот раз я был удивлен.

В этом видео и в этом видео

примечание: заголовок не является опечаткой - бот блокирует слово "проблема" в заголовке.

Я собираюсь опубликовать свою первую попытку реализации ниже. Буду рад комментариям, как лучше написать. Регулируя tol (а иногда и интервал в t, что странно, потому что это интерполяция, а не фактические временные шаги для scipy.odeint). Как только я смог создать правильно выглядящий сюжет (вы можете увидеть их повсюду на интернет), но не помню как.

Неверный ответ

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()

person uhoh    schedule 14.01.2016    source источник
comment
Для долговременной стабильности решений вам, вероятно, понадобится симплектический интегратор. Явные и большинство неявных методов РК дают утечку энергии. -- Также сравните решения, которые незначительно различаются в начальных условиях, чтобы почувствовать увеличение локальных ошибок.   -  person Lutz Lehmann    schedule 16.01.2016
comment
Это очень полезные предложения @LutzL! Решение этих конкретных начальных значений довольно быстро распадается на двоичное (m=4, m=5) и m=3 само по себе, но очень близкие подходы, вероятно, снижают точность. Анализ чувствительности является отличным предложением. Спасибо!   -  person uhoh    schedule 16.01.2016


Ответы (1)


Из вашего вопроса не ясно, что именно не так с вашим текущим подходом.

Но, предполагая, что суть вашего вопроса просто: «Есть ли другие библиотеки ODE для Python, на которые я мог бы обратить внимание, в соответствии с предложением выше?», Тогда вы можете попробовать другие варианты, доступные в scipy.integrate.ode. Я бы попробовал методы lsoda, dopri5 и dop853.

person Michael Anderson    schedule 15.01.2016
comment
ОК, я постараюсь обновить/уточнить/отшлифовать вопрос через несколько часов, а также попробовать те... вкратце, я получаю разные результаты (даже до того, как он остановится), сильно зависящие от tol, и, похоже, никогда не смогу получить стабильный результат, который выглядит так, как должен (см. ссылки - особенно видео). Это не совсем неожиданно, но для пример здесь со мной такого никогда не случалось. - person uhoh; 15.01.2016
comment
Это увлекательно, но займет несколько дней, а не часов. для меня, чтобы собрать все это вместе. - person uhoh; 16.01.2016
comment
Время от времени все еще работаю над этим - этот ответ дает числовые результаты от более профессионального решателя ODE для таких проблем, поэтому Я могу вернуться и более подробно посмотреть, что происходит не так. - person uhoh; 22.05.2016