【问题标题】:Runge Kutta constants diverging for Lorenz system?洛伦兹系统的龙格库塔常数发散?
【发布时间】:2019-09-16 23:26:43
【问题描述】:

我正在尝试使用 4 阶 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)

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

结果应该是 Lorenz 牵引器,但是我的代码在第五次迭代前后出现了分歧,这是因为我在 kconstants 中创建的内容确实如此,但是我检查了并且我很确定 runge kutta 的实现没有错...(至少我认为)

编辑:

找到一个类似的post,但不知道我做错了什么

【问题讨论】:

  • Python 2 还是 Python 3?在 Python 2 中,8/321/60
  • 我在 python 3 中,所以应该没问题
  • 为什么要把k的计算和新状态的计算分开呢?如果您正在计算密集输出,但您没有存储它们,这将是有意义的。

标签: python numerical-methods runge-kutta lorenz-system


【解决方案1】:

您是否在计算中查看过不同的初始值?你选择的那些有意义吗? IE。他们是物理的吗?根据过去使用 rk 的经验,如果您选择愚蠢的起始参数,有时会得到非常混乱的结果。

【讨论】:

    【解决方案2】:

    在计算k1k2k3 时,您有一个额外的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])
    

    【讨论】:

    • 同理,time==0func(x0) 应替换为x0。或者更好的是,初始化 result[0]=x0 并在 time=1 开始循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多