我尝试使用四阶龙格库塔法求解Lorenz system,其中
dx/dt=a*(y-x)
dy/dt=x(b-z)-y
dx/dt=x*y-c*z
因为这个系统不依赖于时间,在迭代中可能忽略这部分,所以我只得到dX=F(x,y,z)
def func(x0):
a=10
b=38.63
c=8/3
fx=a*(x0[1]-x0[0])
fy=x0[0]*(b-x0[2])-x0[1]
fz=x0[0]*x0[1]-c*x0[2]
return np.array([fx,fy,fz])
def kcontants(f,h,x0):
k0=h*f(x0)
k1=h*f(f(x0)+k0/2)
k2=h*f(f(x0)+k1/2)
k3=h*f(f(x0)+k2)
#note returned K is a matrix
return np.array([k0,k1,k2,k3])
x0=np.array([-8,8,27])
h=0.001
t=np.arange(0,50,h)
result=np.zeros([len(t),3])
for time in range(len(t)):
if time==0:
k=kcontants(func,h,x0)
result[time]=func(x0)+(1/6)*(k[0]+2*k[1]+2*k[2]+k[3])
else:
k=kcontants(func,h,result[time-1])
result[time]=result[time-1]+(1/6)*(k[0]+2*k[1]+2*k[2]+k[3])
结果应该是洛伦兹吸引子,但是我的代码在第五次迭代时发散了,这是因为我在kconstants
中创建的常数发散了,但是我检查了一下,我很确定龙格库塔实现没有错...(至少我认为)
编辑:
找到了一个类似的post,但不知道我做错了什么
3条答案
按热度按时间y0u0uwnf1#
在
k1
、k2
和k3
的计算中,您有一个额外的f(x0)
调用。将函数kcontants
更改为n6lpvg4x2#
你是否考虑过不同的初始值来进行计算?你选择的初始值是否合理?也就是说,它们是物理的吗?从以往的经验来看,如果你选择了愚蠢的初始参数,你有时会得到非常混乱的结果。
9jyewag03#
晚安。这是我用scipyedo集成器scipy.integrate.odeint做的版本。
在第二部分中,我模拟了两个Lorenz系统,以验证系统对初始条件的敏感依赖性,在第二个系统中,我在x(t0),y(t0)和z(t0)的初始条件上加上了一定量的eps = 1 e-3。
希望我能帮上忙,再见:)。