问题描述
我正在尝试实施 4 阶 Runge-Kutta 方法。 我得到一个类型错误:在 k1、k2、k3、k4 的计算中,'不能将序列乘以'numpy.float64' 类型的非整数。有人知道解决方法吗?
def rk4(f,Y0,t0,tf,n):
t = np.linspace(t0,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
解决方法
您没有从函数 f
返回一个 numpy 数组。列表只能与整数“相乘”,并通过列表的副本产生重复,而不是您期望的向量乘法。
您可以通过将返回值包装在 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])
...