下一步的ODE求解器测试" Pythagorean 3-Body Proxblem"

时间:2016-01-14 12:25:34

标签: python scipy ode

我在尝试使用scipy.odeint整合毕达哥拉斯三体问题时遇到了困难。经过一些检查和网络搜索后,我在这个非常有趣的集成discussion/tutorial中找到了以下内容:

  

" 在下一节讨论了单位缩放之后,下面几节将介绍许多不同的集成算法。作者建议,在根据这些算法之一编写自己的集成程序后,开始使用数字“八”进行集成练习,因为由于其稳定性和事实很容易集成,因此不会发生密切相遇所有。 之后,你可能会尝试解决毕达哥拉斯问题。毕达哥拉斯问题很难整合。必须使用一个非常精确的积分器,它能够应对众多的近距离接触"

所以我的主要问题是:是否有其他我可以看到的python ODE库,与上面的建议一致?或者,有人可以帮助我了解如何诱使odeint在这里工作吗? scipy.odeint始终"刚刚工作"只要我使用它就开箱即用,所以这次我很惊讶。

video和此video

中有漂亮的模拟结果

注意:标题不是拼写错误 - 有一个机器人阻止了这个词"问题"在标题中。

我将在下面发布我的第一次尝试实施。我欢迎评论如何更好地写它。通过调整tol(有时候t中的间距很奇怪,因为这是插值,而不是scipy.odeint的实际时间步长)。一旦我能够制作一个看起来正确的情节(你可以在internet上看到它们),但我不记得如何。

Wrong Answer

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

1 个答案:

答案 0 :(得分:1)

您的问题并不清楚您当前的方法究竟出了什么问题。

但是,假设你的问题的胆量只是:"我是否可以按照上面的建议来看待其他python ODE库?"然后你可以尝试其他可用的选项在scipy.integrate.ode。我尝试使用lsodadopri5dop853方法。