Python Lorenz系统的Runge-Kutta常数发散?
我试图用四阶龙格-库塔方法来解决这个问题,其中Python Lorenz系统的Runge-Kutta常数发散?,python,numerical-methods,runge-kutta,lorenz-system,Python,Numerical Methods,Runge Kutta,Lorenz System,我试图用四阶龙格-库塔方法来解决这个问题,其中 dx/dt=a*(y-x) dy/dt=x(b-z)-y dx/dt=x*y-c*z 因为这个系统不依赖于时间的明确性,所以在迭代中可能忽略这一部分,所以我只需要 dX=F(x,y,z) 结果应该是Lorenz atractors,但是我的代码在第五次迭代时会出现分歧,这是因为我在kconstants中创建的contants会出现分歧,但是我检查了一下,我非常确定runge kutta的实现不会出错。。。(至少我认为) 编辑: 找到了一个类似的,
dx/dt=a*(y-x)
dy/dt=x(b-z)-y
dx/dt=x*y-c*z
因为这个系统不依赖于时间的明确性,所以在迭代中可能忽略这一部分,所以我只需要
dX=F(x,y,z)
结果应该是Lorenz atractors,但是我的代码在第五次迭代时会出现分歧,这是因为我在kconstants
中创建的contants会出现分歧,但是我检查了一下,我非常确定runge kutta的实现不会出错。。。(至少我认为)
编辑:
找到了一个类似的,但无法理解我做错了什么的计算初始值不同吗?你选择的那些有意义吗?也就是说,他们是身体上的吗?根据以往使用rk的经验,如果选择愚蠢的起始参数,有时会得到非常混乱的结果。在计算
k1
、k2
和k3
时,会额外调用f(x0)
。将功能kcontants
更改为
def kcontants(f,h,x0):
k0=h*f(x0)
k1=h*f(x0 + k0/2)
k2=h*f(x0 + k1/2)
k3=h*f(x0 + k2)
#note returned K is a matrix
return np.array([k0,k1,k2,k3])
Python 2还是Python 3?在Python2中,
8/3
是2
,1/6
是0
。我在Python3中,所以这应该是正确的。为什么要将k
的计算与新状态的计算分开?如果您正在计算密集输出,但您没有存储它们,这是有意义的。同样,在时间==0
,func(x0)
应替换为x0
。或者更好,初始化result[0]=x0
并在time=1
def kcontants(f,h,x0):
k0=h*f(x0)
k1=h*f(x0 + k0/2)
k2=h*f(x0 + k1/2)
k3=h*f(x0 + k2)
#note returned K is a matrix
return np.array([k0,k1,k2,k3])