You need to enable JavaScript to run this app. solve_ivp求解自由落体ODE报*后参数需可迭代TypeError如何修复
优惠活动
大模型
产品
解决方案
定价
更多

solve_ivp求解自由落体ODE报*后参数需可迭代TypeError如何修复

报错原因与修复方案

报错核心是solve_ivp的参数使用不符合规范,共三处错误:

  • 参数顺序错误:solve_ivp 标准调用顺序为 solve_ivp(微分函数, 时间区间, 初始状态值, 其他可选参数),你的代码中将初始值v0和时间区间t_span的位置写反了。
  • args参数格式错误:args要求传入可迭代对象(如元组、列表),即使只有一个传参也要封装为单元素元组,你直接传入了float类型的k,触发了拆包报错。
  • 微分函数、终止条件函数的参数逻辑错误:solve_ivp要求传入的微分函数参数顺序必须是(时间t, 状态向量y, *args),你写的f(v, t0, k)把状态向量和时间的顺序写反了;同时终止条件函数错误引用了全局初始值v0,会导致计算一开始就触发终止。

修正后完整代码

import numpy as np
import scipy.integrate as spi
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp


m = 63974.  # 质量 单位kg
k = 12.  # 阻力系数
g = 9.81  # 重力加速度

# 初始状态定义,4个变量分别为[x, y, vx, vy]
v0 = np.zeros(4)
v0[1] = 1668. 
v0[3] = 98. 

# 调整微分函数参数顺序,t在前,状态向量在后
def f(t, v, k):
    u, udot = v[:2], v[2:]
    udotdot = (-k / m) * np.power(udot,2) 
    udotdot[1] -= g
    return np.r_[udot, udotdot]

def stop_condition(t, v):
    # 当y坐标为0时终止计算
    return v[1]

stop_condition.terminal = True
stop_condition.direction = -1
t_span = (0,40)

# 调整参数顺序,args封装为单元素元组
sol = solve_ivp(f, t_span, v0, args=(k,), events=stop_condition)

print(sol.t_events)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 12:06:02