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

使用Sympy求解含零的符号线性方程组时linsolve返回空集如何处理?

Sympy线性方程组符号求解空集问题解决方法

核心原因

你构造的线性方程组展开后为:

  • $b_0 = a_0$
  • $b_0 + b_1 = a_1$
  • $b_1 = 0$
  • $0 = 0$

将第一、三个式子代入第二个可推导出隐含约束 $a_0 = a_1$,Sympy的linsolve默认将a_0、a_1视为独立的已知符号参数,因此判定系统整体无解返回空集。

调整方案

方案1:将关联参数加入求解列表

直接把存在约束关联的a_1加入待求解变量列表,Sympy会自动推导参数约束和变量解:

import sympy as sp
a0,a1,b0,b1 = sp.symbols("a_0 a_1 b_0 b_1")
A = sp.Matrix([[1,0],[1,1],[0,1],[0,0]])
b = sp.Matrix([a0,a1,sp.S.Zero,sp.S.Zero])

sol = sp.solve(A*sp.Matrix([b0,b1]) - b, [b0,b1,a1], dict=True)
print(sol)
# 输出:[{b_0: a_0, b_1: 0, a_1: a_0}]

方案2:先提取相容约束再求解

先对增广矩阵做行最简形化简,提取参数相容约束后再求解目标变量:

# 构造增广矩阵
aug = A.row_join(b)
# 行最简形化简
rref_mat, pivot_cols = aug.rref()

# 提取参数约束
constraints = []
for row in rref_mat.tolist():
    # 筛选b0、b1系数全为0的行,对应参数约束
    if all([coeff == 0 for coeff in row[:2]]):
        const_expr = row[2] * a0 + row[3] * a1
        if const_expr != 0:
            constraints.append(sp.Eq(const_expr, 0))
# 加入约束后求解
sol = sp.solve([A*sp.Matrix([b0,b1]) - b] + constraints, [b0,b1], dict=True)
print(sol)
# 输出:[{b_0: a_0, b_1: 0}]

方案3:直接求解最小二乘解

如果你需要忽略不相容约束得到残差最小的有效解,可以直接求解左乘转置后的正规方程组:

sol = sp.linsolve((A.T @ A, A.T @ b), [b0,b1])
print(sol)
# 输出:{(a_0, 0)},对应b0=a0、b1=0的预期解

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:00