Sympy调用dsolve_system求解线性ODE时积分未计算、传初值报错问题
问题原因
这个问题是Sympy旧版本中dsolve_system接口的已知逻辑缺陷导致的:旧版本的求解器在处理可直接积分的常微分方程/方程组时,不会自动计算积分表达式的结果,只会返回未求值的Integral对象。当你传入初始条件时,求解器需要代入具体的t值计算积分常数,未求值的Integral对象无法被识别为合法代数元素,就会抛出NotAlgebraic错误。
解决方法
- 方案1:手动对求解结果执行积分计算
不需要修改原有求解逻辑,拿到dsolve_system的返回结果后,对每个等式调用doit()方法即可完成积分求值,适合无初始条件的求解场景:
运行后t = symbols("t") x, y = symbols("x y", cls=Function) a = dsolve_system([ Eq(y(t).diff(t), 1), Eq(x(t).diff(t), 1), ]) # 手动计算积分 processed_a = [[eq.doit() for eq in group] for group in a]processed_a的输出就是你预期的[[Eq(x(t), C1 + t), Eq(y(t), C2 + t)]]。 - 方案2:先求解后代入初始条件
带初始条件的场景可以先完成无约束求解和积分计算,再手动代入初始条件求解常数:
最终得到的结果为t = symbols("t") x, y = symbols("x y", cls=Function) C1, C2 = symbols("C1 C2") # 先求解无约束方程组 a = dsolve_system([ Eq(y(t).diff(t), 1), Eq(x(t).diff(t), 1), ]) x_eq, y_eq = [eq.doit() for eq in a[0]] # 代入初始条件求常数 const_res = solve([x_eq.rhs.subs(t,0) - 1, y_eq.rhs.subs(t,0) - 2], [C1, C2]) # 得到最终解 x_res = x_eq.subs(const_res) y_res = y_eq.subs(const_res)Eq(x(t), t + 1)、Eq(y(t), t + 2),符合预期。 - 方案3:升级Sympy版本
该问题在Sympy 1.10及以上版本已经被修复,升级后直接运行你原本的代码即可得到正确结果,不会抛出错误。
内容的提问来源于stack exchange,提问作者SCLeo
相关产品推荐
相关产品推荐

