Python求解5个常微分方程时出现invalid index to scalar variable报错如何解决
报错原因及修复方案
核心错误1:ode函数内变量名冲突覆盖数组
- 你定义的
ode函数入参是存储5个状态量的数组x,但后续写了x = x[2],直接把数组类型的x覆盖成了单个浮点标量,后续执行y = x[3]、a = x[4]时,相当于对标量做索引,直接触发你遇到的invalid index to scalar variable报错。 - 修复方式:把状态量里的横坐标x换个名字,比如用
pos_x代替,避免和入参数组重名。
核心错误2:结果提取时重复覆盖结果数组
- 你调用
odeint得到的结果是二维数组x,但执行x = x[:,2]时又把二维数组覆盖成了一维数组,后续y = x[:,3]、a = x[:,4]同样会触发索引错误。 - 修复方式:用不同的变量名存储提取出来的坐标值,不要和原结果数组重名。
修复后完整代码
from scipy.integrate import odeint import numpy as np import matplotlib.pyplot as plt def ode(state, t): vx = state[0] vy = state[1] pos_x = state[2] pos_y = state[3] a = state[4] dvxdt = -0.2*(np.cos(a))/(pos_x**2 + pos_y**2) dvydt = -0.2*(np.sin(a))/(pos_x**2 + pos_y**2) dxdt = vx dydt = vy dadt = (pos_x*vy - pos_y*vx)*((np.cos(a))**2)/(pos_x**2) return [dvxdt, dvydt, dxdt, dydt, dadt] x0 = [-1.7, 1, 5, 2, 0.5] t = np.linspace(0,15,1000) res = odeint(ode, x0, t) vx = res[:,0] vy = res[:,1] pos_x = res[:,2] pos_y = res[:,3] a = res[:,4] plt.semilogy(pos_x, pos_y) plt.show()
额外注意事项
当前dadt的计算式分母为pos_x**2,如果计算过程中pos_x趋近于0会触发除零报错,后续可以根据你的物理模型加边界判断避免该问题。
内容的提问来源于stack exchange,提问作者Alborz NAJAFI
相关产品推荐
相关产品推荐

