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])
...
我正在尝试实施 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])
...