正如标题所说,我怎样才能找到矩阵的零空间 即等式的非平凡解决方案ax = 0。
我尝试使用np.linalg.solve(a,b)
,它解决了方程式ax = b。因此,将b
设置为与矩阵a
具有相同尺寸的零数组相同,我只得到琐碎的解决方案,即x = 0.
答案 0 :(得分:1)
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
:ndarray
A
最多应为2-D。具有长度k的1-D阵列将被视为具有形状(1,k)的2-D
atol
:float
零奇异值的绝对容差。小于atol
的奇异值被认为是零。
rtol
:float
相对容忍度。小于rtol * smax的奇异值被认为是零,其中smax是最大的奇异值。
如果atol
和rtol
都是正值,则组合容差是两者中的最大值;那就是:
tol = max(atol, rtol * smax)
小于tol
的奇异值被认为是零。
返回值:
ns
:ndarray
如果A
是一个具有形状(m,k)的数组,那么ns
将是一个形状为(k,n)的数组,其中n是{{0}的零空间的估计维数1}}。 A
的列是nullspace的基础; numpy.dot(A,ns)中的每个元素都将近似为零。
答案 1 :(得分: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]]))
这里的第一和第三个向量是你非常重要的解决方案。