如何使用numpy在Python中找到矩阵的空间?

时间:2018-04-16 08:10:56

标签: python numpy

正如标题所说,我怎样才能找到矩阵的零空间 即等式的非平凡解决方案ax = 0。

我尝试使用np.linalg.solve(a,b),它解决了方程式ax = b。因此,将b设置为与矩阵a具有相同尺寸的零数组相同,我只得到琐碎的解决方案,即x = 0.

2 个答案:

答案 0 :(得分:1)

来自SciPy Cookbook

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是最大的奇异值。

如果atolrtol都是正值,则组合容差是两者中的最大值;那就是:

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]]))

这里的第一和第三个向量是你非常重要的解决方案。