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

如何使用Python的numpy库求解矩阵的零空间?

求解矩阵零空间的非平凡解方法

嘿,我懂你的困扰——用np.linalg.solve(a, np.zeros_like(a[:,0]))确实只能得到全零的平凡解,这是因为np.linalg.solve的设计目标是求解可逆方阵的线性方程组,而零空间存在非平凡解的前提是矩阵a的秩小于列数(也就是矩阵不可逆),这时候solve就没法给出你想要的非平凡解了。

下面给你两种靠谱的解决方法:

方法一:直接使用np.linalg.null_space(推荐,NumPy 1.19+可用)

NumPy从1.19版本开始提供了专门计算零空间的函数np.linalg.null_space,它会直接返回零空间的一组基向量,所有非平凡解都是这些基向量的线性组合(系数不全为0即可)。

举个代码示例:

import numpy as np

# 构造一个秩不足的矩阵(比如3x3矩阵,秩为2,零空间维度为1)
a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 获取零空间的基向量
null_basis = np.linalg.null_space(a)
print("零空间的基向量:")
print(null_basis)

# 生成一个非平凡解(比如用系数2乘以基向量)
non_trivial_sol = 2 * null_basis[:, 0]
print("\n一个非平凡解:")
print(non_trivial_sol)

# 验证:a乘以这个解应该接近零向量
print("\n验证a@non_trivial_sol:")
print(a @ non_trivial_sol)

方法二:用SVD分解兼容旧版本NumPy

如果你的NumPy版本低于1.19,可以通过奇异值分解(SVD)来手动计算零空间。SVD分解中,奇异值接近0对应的右奇异向量就是零空间的基。

代码示例:

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 对矩阵做SVD分解
U, s, Vh = np.linalg.svd(a)

# 设置一个阈值,用来判断奇异值是否为0(因为浮点数计算有误差,不能直接等于0)
threshold = 1e-10
# 找到奇异值小于阈值的索引
null_indices = np.where(s < threshold)[0]

# 对应的Vh的行转置后就是零空间的基向量
null_basis_svd = Vh[null_indices, :].T
print("SVD方法得到的零空间基向量:")
print(null_basis_svd)

# 生成非平凡解
non_trivial_sol_svd = -3 * null_basis_svd[:, 0]
print("\n一个非平凡解:")
print(non_trivial_sol_svd)

简单总结一下:零空间的所有解都是基向量的线性组合,只要你给的系数不全为0,得到的就是满足a@x=0的非平凡解啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:34