【问题标题】:How to find the Null Space of a matrix in Python using numpy?如何使用 numpy 在 Python 中找到矩阵的零空间?
【发布时间】:2018-09-25 21:45:28
【问题描述】:

正如标题所说,如何找到矩阵的零空间 即方程 ax=0 的非平凡解。

我尝试使用 np.linalg.solve(a,b),它可以求解方程 ax=b。因此,将b 设置为与矩阵a 具有相同维度的零数组,我只能得到简单 解决方案,即x=0。

【问题讨论】:

标签: python numpy


【解决方案1】:

你可以对角化你的矩阵:

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

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

【讨论】:

    【解决方案2】:

    来自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: 数组

    A 最多应该是二维的。长度为 k 的一维数组将被视为形状为 (1, k) 的二维数组

    atol:浮动

    零奇异值的绝对容差。小于atol 的奇异值被认为是零。

    rtol:浮动

    相对容差。小于 rtol*smax 的奇异值被认为是零,其中 smax 是最大的奇异值。

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

    tol = max(atol, rtol * smax)
    

    小于tol 的奇异值被认为是零。

    返回值

    ns: 数组

    如果A 是一个形状为(m, k) 的数组,那么ns 将是一个形状为(k, n) 的数组,其中n 是A 的零空间的估计维度。 ns 的列是空空间的基础; numpy.dot(A, ns) 中的每个元素都将近似为零。

    【讨论】:

    • 这就是我要找的。​​span>
    猜你喜欢
    • 2011-08-18
    • 2018-08-23
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2017-08-09
    • 2011-02-28
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多