使用 python 为非方阵 A 求解 Ax =b

Ron*_*man 4 python numpy matrix

我专注于特殊情况,其中Aanxd 矩阵(其中 k < d)表示 R^d 的子空间的正交基,而 b 已知在子空间内。我想过使用随 提供的工具numpy,但它们只适用于方阵。我有一种方法是用一些线性无关的向量填充矩阵来“平方”它然后求解,但我无法弄清楚如何选择这些向量,以便它们与基向量线性无关,而且我认为它是不是唯一的方法,我错过了一些可以使这更容易的东西。确实有比我提到的更简单的方法吗?如果不是,我该如何选择那些可以完成A为方阵的向量?

sas*_*cha 7

正如您所提到的,np.linalg.solve需要一个满秩方阵。

对于所有其他线性情况,如果您对min||Ax-b||^2.(您可能感兴趣)感兴趣,可以使用np.linalg.lstsq

通过计算最小化欧几里得 2-范数的向量 x 来求解方程 ax = b || b - ax ||^2。

方程可以是欠,良好,或过度确定(即,的线性独立的行的数目可以是小于,等于或大于它的数量线性独立的列的更大)。如果 a 是平方且满秩,则 x(但对于舍入误差)是方程的“精确”解。

(我加粗注释)

原始文档中也提到了这一点np.linalg.solve

a 必须是平方和满秩,即所有行(或等效的列)必须线性无关;如果任一不正确,请使用 lstsq 作为系统/方程的最小二乘最佳“解”。


cha*_*id1 4

如果您的方程少于未知数(假设您打算输入 n < d),则您不会期望有唯一的解决方案。您可以使用奇异值分解获得解。

  • 首先使用numpy.linalg.svd查找由三个矩阵 USV^T 组成的 SVD。然后你可以从 V [ diag(1/s_j) ] U^T 得到 A 的伪逆,这给你一个解决方案。
  • 您的最终解决方案将是您找到的一个解决方案,加上 A 的零空间基向量的线性组合。
  • 要找到 A 的零空间基向量,请从矩阵 V 中提取与矩阵 S 中零(或低于某个“小”阈值)的奇异值 s_j 相对应的列 j。

您可以使用 for 循环和 if 语句在 Python 中非常轻松地实现最后一点 - 繁重的工作是分解本身。Press 等人的优秀《数值食谱》在第 2 章中介绍了线性代数(这里这里是 C 语言数值食谱的免费版本)。他们对 SVD 进行了精彩的演示,解释了 SVD 的理论以及如何将其转化为算法(主要关注如何使用SVD的结果)。他们提供了一个比numpy.linalg.svd有更多功能的 SVD 对象,但正如前面提到的,核心功能是实际的分解,而获取零空间基向量之类的事情只是围绕 for 循环和在 U、S 上运行的 if 语句进行修饰,和V。