【发布时间】:2018-09-25 21:45:28
【问题描述】:
正如标题所说,如何找到矩阵的零空间 即方程 ax=0 的非平凡解。
我尝试使用 np.linalg.solve(a,b),它可以求解方程 ax=b。因此,将b 设置为与矩阵a 具有相同维度的零数组,我只能得到简单 解决方案,即x=0。
【问题讨论】:
正如标题所说,如何找到矩阵的零空间 即方程 ax=0 的非平凡解。
我尝试使用 np.linalg.solve(a,b),它可以求解方程 ax=b。因此,将b 设置为与矩阵a 具有相同维度的零数组,我只能得到简单 解决方案,即x=0。
【问题讨论】:
你可以对角化你的矩阵:
eigen_vects, eigen_vals = np.linalg.eig(a)
然后你只需要选择对应于 0 个特征值的特征向量(可能考虑到数值精度)。
例子:
np.linalg.eig(np.ones((3,3)))
(array([ -2.22044605e-16, 3.00000000e+00, 0.00000000e+00]),
array([[-0.81649658, 0.57735027, 0. ],
[ 0.40824829, 0.57735027, -0.70710678],
[ 0.40824829, 0.57735027, 0.70710678]]))
这里的第一个和第三个向量是您的重要解决方案。
【讨论】:
import numpy as np
from numpy.linalg import svd
def nullspace(A, atol=1e-13, rtol=0):
A = np.atleast_2d(A)
u, s, vh = svd(A)
tol = max(atol, rtol * s[0])
nnz = (s >= tol).sum()
ns = vh[nnz:].conj().T
return ns
计算A 的零空间的近似基。
这个函数使用的算法是基于A的奇异值分解。
参数:
A: 数组
A 最多应该是二维的。长度为 k 的一维数组将被视为形状为 (1, k) 的二维数组
atol:浮动
零奇异值的绝对容差。小于atol 的奇异值被认为是零。
rtol:浮动
相对容差。小于 rtol*smax 的奇异值被认为是零,其中 smax 是最大的奇异值。
如果atol 和rtol 都是正数,则组合容差是两者中的最大值;那就是:
tol = max(atol, rtol * smax)
小于tol 的奇异值被认为是零。
返回值:
ns: 数组
如果A 是一个形状为(m, k) 的数组,那么ns 将是一个形状为(k, n) 的数组,其中n 是A 的零空间的估计维度。 ns 的列是空空间的基础; numpy.dot(A, ns) 中的每个元素都将近似为零。
【讨论】: