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

使用Scipy odeint求解二阶ODE时遇TypeError错误求助

错误原因分析
  • 参数顺序不匹配:使用odeint的tfirst=True时,要求微分方程函数的参数顺序是(自变量, 状态向量),但你定义的dSdx(S, x)把状态向量放在了自变量前面。当tfirst=True生效,odeint会先传入自变量的单个浮点数作为第一个参数S,导致x, v = S试图解包浮点数,触发TypeError。
  • 未定义变量遗漏:代码中k、c1、m(调用m.radians)都未赋值,即使解决参数问题也会报NameError。
解决方法
  1. 修正函数参数顺序:要么把dSdx的参数改为(自变量, 状态向量)并保留tfirst=True,要么移除tfirst=True保持原参数顺序(odeint默认参数顺序是(状态向量, 自变量))。
  2. 补全未定义变量:给k、c1赋值,导入math模块(因为用到了radians方法)。
修正后的代码示例
import numpy as np
from scipy.integrate import odeint
import math as m

# 补全未定义的常数(值根据实际需求修改)
c1 = 1
k = 5
c2 = 2 
c3 = 3 
c4 = 4

# 方案1:使用默认参数顺序(移除tfirst=True)
def dSdx(S, x):
    x_state, v = S  # 重命名状态变量x避免和自变量x混淆
    return [
        v,
        k - c1*v - c2*x_state - c3*np.sin(m.radians(x_state)) + c4*np.cos(m.radians(x_state))
    ]

x_0 = 0
v_0 = 0
S_0 = (x_0, v_0)

t = np.linspace(0, 0.3, 100)
sol = odeint(dSdx, y0=S_0, t=t)

# 方案2:使用tfirst=True,修正参数顺序
# def dSdx(x, S):
#     x_state, v = S
#     return [
#         v,
#         k - c1*v - c2*x_state - c3*np.sin(m.radians(x_state)) + c4*np.cos(m.radians(x_state))
#     ]
# sol = odeint(dSdx, y0=S_0, t=t, tfirst=True)
额外提示
  • 注意区分自变量(代码中的t)和状态变量里的x,建议重命名状态变量的x为x_state,避免变量名冲突导致逻辑混淆。
  • 运行前确认所有常数值符合你的实际ODE定义。

内容的提问来源于stack exchange,提问作者Ignacio Bursa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:40:57