使用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
相关产品推荐
相关产品推荐

