Runge Kutta 4 实施

Runge Kutta 4 Implementation

我正在尝试实施 4 阶龙格库塔方法。 我得到一个类型错误:'不能在 k1、k2、k3、k4 的计算中将序列乘以 'numpy.float64' 类型的非整数。有人知道解决方法吗?

def rk4(f, Y0, t0, tf, n):
    t = np.linspace(t0, tf, n+1)
    Y = np.array([Y0]*(n+1))
    h = t[1]-t[0]
    for i in range(n):
        k1 = h * f(Y[i], t[i])
        k2 = h * f(Y[i]+0.5*k1, t[i]+0.5*h)
        k3 = h * f(Y[i]+0.5*k2, t[i]+0.5*h)
        k4 = h * f(Y[i]+k3, t[i]+h)
        Y[i+1]  = Y[i] + (k1+2*(k2+k3)+k4)/6.0

    return Y, t

您没有 return 函数 f 中的 numpy 数组。一个列表只能“乘以”一个整数,并通过列表的副本产生重复,而不是你所期望的向量乘法。

您可以直接在那个函数中解决这个问题,方法是将 return 值包装在一个 numpy 数组中,或者提供一个包装器

def rk4(f, Y0, t0, tf, n):
    func = lambda Y,t: np.array(f(Y,t))
    ...
    for i in range(n):
        k1 = h * func(Y[i], t[i])
        ...