Sympy nonlinsolve求解非线性方程组返回错误结果排查
二元方程组求解:Sympy结果与纸笔计算不符的问题
我通过纸笔计算得到二元方程组的正确解为t_m=5,t_e=15,但使用Sympy的nonlinsolve求解时,返回结果是t_m=(5, 15), t_e=(25, 55)。将Sympy的解代入Desmos验证后发现不满足方程,而我的解符合预期。需确认是Sympy的问题还是推导错误。
问题背景
该方程组对应一段速度曲线:从初始速度v_s先减速到v_m(v_m < v_s),再加速到末速度v_e,总位移不超过d_e,目标是求解总时间t_e。
所用Sympy代码
# Ramp down then up. import sympy as sp a, v_s, v_e, t_m, t_e, d_e = sp.symbols("a, v_s, v_e, t_m, t_e, d_e") v_s = 15 v_e = 20 a = 1 d_e = 212.5 v_m = v_s - t_m * a Eq1 = v_m + a * (t_e - t_m) - v_e Eq2 = t_e * v_m + (v_s - v_m) * t_m / 2 + (v_e - v_m) * (t_e - t_m) / 2 - d_e sp.nonlinsolve([Eq1, Eq2], [t_m, t_e])
问题根源:位移方程推导错误
Sympy的求解结果是你输入的方程组的数学正确解,但你的位移方程(Eq2)不符合物理模型,导致解不符合预期。
正确的位移计算应分为两段:
- 减速阶段(时间
t_m):位移为平均速度乘以时间,即(v_s + v_m)/2 * t_m - 加速阶段(时间
t_e - t_m):位移为(v_m + v_e)/2 * (t_e - t_m)
总位移是两段之和,而你写的Eq2中t_e * v_m属于错误项,这部分完全偏离了物理位移的计算逻辑。
修正后的代码
将Eq2替换为正确的位移公式:
Eq2 = (v_s + v_m)/2 * t_m + (v_m + v_e)/2 * (t_e - t_m) - d_e
运行修正后的代码,nonlinsolve会返回正确解{(5, 15)},与纸笔计算结果一致。
另外,Sympy给出的(15, 25)解代入你原来的错误方程是成立的,但不符合你的物理场景(此时v_m = 15 -15*1=0,仅满足错误的数学等式,而非真实的位移模型)。
内容的提问来源于stack exchange,提问作者BenMcLean981
相关产品推荐
相关产品推荐

