
当不等式经简化后不含目标变量(如 `x`)时,`sympy.solve()` 无法构造关于该变量的解集,故返回空列表 `[]`,而非直观的 `true` 或 `false`;这是其设计逻辑所致,并非错误。
在使用 SymPy 求解不等式时,solve() 表现出高度依赖表达式结构与符号存在性的行为。它并非直接判定命题真假,而是尝试“求出使不等式成立的变量取值范围”。一旦目标变量在不等式化简后完全消失,函数便失去求解对象,从而返回空列表 []。
例如:
from sympy import symbols, solve
x = symbols('x')
# ✅ 含 x:正常返回区间解
print(solve(x**2 > 4, x)) # ((-oo < x) & (x < -2)) | ((2 < x) & (x < oo))
# ✅ 恒假(含 x,但无解)→ 返回 False
print(solve(x**2 > x**2 + 4, x)) # False
# ✅ 恒真(含 x,且对所有 x 成立)→ 返回 True
print(solve(x**2 >= x**2, x)) # True
# ❌ 无 x:x - x 化简为 0,不等式退化为纯布尔常量
print(solve(x - x > 0, x)) # [] → 实际等价于 solve(False, x)
print(solve(x - x >= 0, x)) # [] → 实际等价于 solve(True, x)关键在于:x - x 在传入 solve 前即被自动简化为 0(SymPy 的默认预处理行为),因此 x - x > 0 等价于 0 > 0(即 False),而 x - x >= 0 等价于 0 >= 0(即 True)。此时原不等式中已不再含有符号 x —— solve 的任务是“解关于 x 的不等式”,但输入中已无 x 可解,故返回 []。
⚠️ 注意:这与 solve(x**2 >= x**2, x) 返回 True 形成对比——后者虽恒真,但 x 显式存在于左右两侧,SymPy 能识别其对任意 x 成立;而 x - x >= 0 经简化后 x 完全消失,触发了“无变量可解”的分支逻辑。
正确应对方式:若需统一处理恒真/恒假情形,建议先用 simplify() 或 refine() 预判,或改用 solveset()(更现代、语义更清晰):
from sympy import solveset, S # solveset 明确区分解集类型,对无变量情形更鲁棒 print(solveset(x - x > 0, x, domain=S.Reals)) # EmptySet print(solveset(x - x >= 0, x, domain=S.Reals)) # Reals
solveset 将恒假返回 EmptySet,恒真(在实数域)返回 Reals,语义准确且避免歧义。因此,在新项目中推荐优先使用 solveset 替代 solve 处理不等式,尤其涉及边界或恒定逻辑时。








