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
相关产品推荐
相关产品推荐

