Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python odeint函数中的数值问题取决于初始值_Python_Numpy_Scipy_Differential Equations_Odeint - Fatal编程技术网

Python odeint函数中的数值问题取决于初始值

Python odeint函数中的数值问题取决于初始值,python,numpy,scipy,differential-equations,odeint,Python,Numpy,Scipy,Differential Equations,Odeint,我试着调试我的代码(它解决了耦合ODE)。我发现,odeint函数具有特定的小数限制,因为这个问题(可能是),我的图在不同的初始条件下是不同的 问题在第20行:x=np.linspace(-30.,-50,5) 问题在第25行:state0=[gi,Li,60.] 当初始条件为x(-30)和状态0(60)时,代码正常工作: 但当我更改初始条件x(-25)和状态0(50)时,代码不起作用: 我在Fortran中解决了相同的代码,它适用于两个限制。 有人能建议如何解决这个问题吗 import n

我试着调试我的代码(它解决了耦合ODE)。我发现,odeint函数具有特定的小数限制,因为这个问题(可能是),我的图在不同的初始条件下是不同的

问题在第20行:
x=np.linspace(-30.,-50,5)

问题在第25行:
state0=[gi,Li,60.]

当初始条件为x(-30)和状态0(60)时,代码正常工作:

但当我更改初始条件x(-25)和状态0(50)时,代码不起作用:

我在Fortran中解决了相同的代码,它适用于两个限制。 有人能建议如何解决这个问题吗

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as si
#function for solving differential equations:
def func1(state, x):
    g = state[0]
    L = state[1]
    u = state[2]
    phi1 = 1.645
    phi2 = 2.* 1.202
    N =  (-2.*g/(6.*np.pi + 5.*g))*(18./(1. - 2.*L) + 5.*np.log(1.- 2.*L) - phi1 + 6. )
    B = (-(2. - N)*L) - ((g/np.pi)* (5.*np.log(1.-2.*L) - phi2 + (5.*N/4.)))
    udx = -2.*(1.- ( (3.* 0.5* L)/(3.* 0.330))) #5.1
    gdx = (udx) * (2. + N)*g #5.1a
    Ldx = (udx) *( B)  #5.1b
    print gdx, Ldx, udx
    return gdx, Ldx, udx
gt = 10.**(-60)
Lt = (1.202*gt)/np.pi
x = np.linspace(-30., -50., 500) #initial conditions
for i in np.arange(len(x)):
    gi= np.float64(gt * np.exp(-4.*x[i]))
    Li = np.float64(Lt * np.cosh(4.*x[i]))
    break   
state0 = [gi,Li,60.] #initial conditions
G= si.odeint(func1, state0, x)
a = np.transpose(G) # a[0]=g; a[1]=lambda (L); a[2]=u 
plt.plot(a[1],a[0])
plt.title('RGIII Tragectory')
plt.xlabel('L ---->')
plt.ylabel('g ----->')
plt.show()

实际上,
odeint
解算器正在与这个ODE系统进行斗争。显然,这首颂歌描述的运动在时间上是非常不均匀的。修复方法是告诉解算器使用更严格的错误控制:

G = si.odeint(func1, state0, x, rtol=1e-10)
这将生成两组参数的螺旋图


通常,当
odeint
行为异常时,首先要做的是请求其:

infodict中有很多信息,但是粗略地看一下
info['hu']
(以及导致您出现问题的设置)就会发现使用了荒谬的时间步长值;这就好像解算器决定这个解决方案不会去任何地方,并且在一个时间步中覆盖了请求的时间间隔;画一个小线段

G, info = si.odeint(func1, state0, x, full_output=True)