Sympy求解终端速度微分方程绘图异常,求问题排查
问题分析与修正
1. 微分方程符号错误
你给出的原始方程是 m(dv/dt) = -mg - kv,但代码中写成了 Eq(mass*v(t).diff(t), mass*g - k*v(t)),符号逻辑与实际物理场景不符。针对跳伞下落的场景:重力向下为正方向,阻力向上与速度方向相反,正确的微分方程应为 m(dv/dt) = mg - kv——原方程符号会导致速度最终趋近负值,完全不符合下落的预期结果。
2. 初始条件代入方式错误
你用 solution.subs([(v(t),0),(t,0)]) 代入 t=0时v=0 的写法有误,应该先代入 t=0 再指定 v(0)=0,更简洁可靠的方式是直接在 dsolve 中用 ics 参数指定初始条件。
3. 常数解索引错误
solve(particularSolution, C1) 返回的解列表中,有效常数的索引应为 0 而非 1,取 const[1] 会代入错误的常数,导致最终解偏离预期。
4. 导入语句错误
import matplotlib as plt 写法错误,正确导入应为 import matplotlib.pyplot as plt(SymPy的plot函数可独立使用,但后续自定义绘图样式时需修正该语句)。
修正后的完整代码
from sympy import * import matplotlib.pyplot as plt # 定义符号,添加positive=True确保物理量为正,简化化简结果 mass, g, k, t = symbols('mass g k t', real=True, positive=True) v = symbols('v', cls=Function) # 符合下落场景的微分方程 equation = Eq(mass*v(t).diff(t), mass*g - k*v(t)) print("微分方程:", equation) # 直接指定初始条件v(0)=0求解 solution = dsolve(equation, v(t), ics={v(0): 0}) print("含初始条件的解:", solution) # 化简最终特解 final_solution = solution.rhs.expand().simplify() print("最终特解:", final_solution) # 代入参数:m=100kg,g=127008km/h²,k=63504 subs_params = {g: 127008, mass: 100, k: 63504} # 绘制0-1小时内的速度曲线 plot(final_solution.subs(subs_params), (t, 0, 1), xlabel='时间(h)', ylabel='速度(km/h)', title='跳伞者下落速度变化') plt.show()
关键验证
修正后的代码会输出从0开始递增、最终趋近200km/h的速度曲线,完全符合跳伞者下落的物理规律。
内容的提问来源于stack exchange,提问作者Tommy Sanger
相关产品推荐
相关产品推荐

