You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sympy linsolve求解超定方程组返回空输出问题排查

问题分析与解决方案

你的代码没有语法错误,但选择的求解工具linsolve不适合处理当前的超定符号线性方程组,导致返回空集。

核心原因

sympy.linsolve主要针对方程数与变量数匹配的线性方程组,或能明确判定相容性的数值型超定方程组。对于带符号参数(b4-b9)的超定线性方程组,它无法自动推导相容条件并返回符号解,因此返回空集。

解决方法

改用sympy.solve——这是更通用的符号方程组求解函数,支持超定线性/非线性方程组的求解,能返回用b4-b9表示的符号解。

修改后的代码:

from sympy import symbols, solve, Eq, sqrt

b4, b5, b6, b7, b8, b9 = symbols('b4,b5,b6,b7,b8,b9')
a4,a5,a6,a7 = symbols('a4,a5,a6,a7',real=True)

eq4 = Eq(b4, a5 + a6/4 + a7/4)
eq5 = Eq(b5, a4 + a6/4 + a7/4)
eq6 = Eq(b6, a7 + a4/4 + a5/4)
eq7 = Eq(b7, a6 + a4/4 + a5/4)
eq8 = Eq(b8, 3*(a4 + a5 + a6 + a7)/4)
eq9 = Eq(b9, sqrt(3)/4*(a4 + a5 - a6 - a7))

eqs = (eq4,eq5,eq6,eq7,eq8,eq9)
# 改用solve,指定返回字典形式的解
sol = solve(eqs, (a4,a5,a6,a7), dict=True)
display(sol)

解的形式示例

运行后会得到类似如下的简化符号解:

[
    {
        a4: (2*b8)/3 + (2*b9)/sqrt(3) - b4 + b5,
        a5: (2*b8)/3 + (2*b9)/sqrt(3) + b4 - b5,
        a6: (2*b8)/3 - (2*b9)/sqrt(3) - b6 + b7,
        a7: (2*b8)/3 - (2*b9)/sqrt(3) + b6 - b7
    }
]

额外验证:方程组相容性

如果想确认方程组是否有解,可以用linear_eq_to_matrix转换为矩阵形式,检查系数矩阵与增广矩阵的秩是否相等:

from sympy import linear_eq_to_matrix
A, b = linear_eq_to_matrix(eqs, [a4,a5,a6,a7])
print("系数矩阵秩:", A.rank())
print("增广矩阵秩:", A.row_join(b).rank())

两者秩相等,说明方程组是相容的,存在解。

内容的提问来源于stack exchange,提问作者guinomo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:25