You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:57:03