调用np.linalg.solve()报LinAlgError: Singular matrix错误如何解决
奇异方阵线性方程组的替代求解方案
np.linalg.solve 仅支持满秩非奇异方阵的精确求解,奇异方阵不存在唯一的逆矩阵,因此会触发报错,你可以根据业务需求选择以下几种替代方案:
1. 求最小二乘解(最常用)
如果可以接受残差最小的近似解,直接用numpy内置的最小二乘函数即可:
z_k1, residuals, rank, s = np.linalg.lstsq(M, w_k, rcond=None)
- 返回的第一个值就是使得
||M @ z_k1 - w_k||最小的解,兼容奇异矩阵、非方阵场景 - 当方程组存在多组解时,默认返回2范数最小的解
2. 用伪逆矩阵直接求解
奇异矩阵可以计算摩尔-彭罗斯伪逆来替代逆矩阵做求解,最终结果和最小二乘解等价:
M_pinv = np.linalg.pinv(M) z_k1 = M_pinv @ w_k
如果你的场景需要频繁对同一个M做多次求解,提前计算好伪逆复用的效率会更高。
3. 求方程组通解
当方程组M z = w_k是相容方程组(也就是w_k在M的列空间内)时会存在无穷多组解,你可以按以下逻辑构造所有可行解:
- 先用上面的最小二乘或伪逆方法得到一个特解
- 计算M的零空间所有基向量,通解 = 特解 + 零空间基向量的任意线性组合
注意:如果方程组是不相容的(w_k不在M的列空间),不存在精确解,只能用最小二乘方案求近似解。
内容的提问来源于stack exchange,提问作者TIANMIN Wu
相关产品推荐
相关产品推荐

