使用python求解非方矩阵a的Ax=b

使用python求解非方矩阵a的Ax=b,python,numpy,matrix,Python,Numpy,Matrix,我关注的是一种特殊情况,A是一个nxd矩阵(其中k

我关注的是一种特殊情况,
A
是一个nxd矩阵(其中knumpy提供的工具,但是它们只适用于方阵。我有一种方法,用一些线性无关的向量填充矩阵,将其“平方”,然后求解,但我不知道如何选择这些向量,使它们与基向量线性无关,另外,我认为这不是唯一的方法,我缺少一些可以使这更容易的方法。
真的有比我提到的更简单的方法吗?如果不是,我该如何选择那些将
A
变成方阵的向量呢?

如果你的方程少于未知数(假设你想键入n
  • 首先,使用求奇异值分解,它由三个矩阵U S V^T组成。然后你可以从V[diag(1/s_j)]U^T得到A的伪逆,这给了你一个解
  • 您的最终解决方案将是您找到的一个解决方案,加上A的零空间基向量的线性组合
  • 为了找到A的零空间基向量,从矩阵V中提取对应于零矩阵s中奇异值s_j(或低于某个“小”阈值)的列j
在Python中,使用for循环和if语句可以很容易地实现最后一点,最重要的是分解本身。Press等人的优秀著作涵盖了第2章中的线性代数(C和C语言中的数字公式的免费版本)。他们对SVD进行了精彩的介绍,解释了SVD的理论以及如何将其转化为算法(主要关注如何使用SVD的结果)。它们提供了一个SVD对象,它的功能比前面提到的要多,但核心功能是实际的分解,而获取nullspace基向量等操作只是为了循环和在U、S和V上运行的if语句。正如你提到的,需要一个满秩平方矩阵

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

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

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

(我用粗体标注)

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

a必须是正方形且为满秩,即所有行(或等效列)必须是线性独立的;如果其中一个不正确,则使用lstsq获得系统/方程的最小二乘最佳“解”


np.linalg.solve
?仅适用于方阵:这对您没有帮助吗
A_-pinv=np.linalg.pinv(A)
x=np.dot(A_-pinv,B)你能澄清一下伪逆是如何给我一个解决方案的吗?另外,我匆忙忘记了提到A的行是正交的。另外,如果我有无限多的解,我如何才能找到满足给定约束的解(如果有的话)。你可以使用a的伪逆找到一个解,就像你使用a的逆:X=伪逆(a)*B一样。如果a已经是行正交的,那么算法会更容易,但是你必须修改SVD算法本身。SVD算法可能相当复杂,因此最好坚持使用Numpy实现并牺牲任何潜在的节省。关于第二个问题,SVD可以告诉你矩阵是否奇异(如果所有奇异值都为零,那么你的矩阵就是奇异的&你有无限多的解)。但它肯定不能解决在约束条件下求解线性系统的问题-你可能想要在包中包含一些东西。你能不能发布一个小例子,让我们把它变得更具体一点?如果我想要解决方案满足给定的不等式,比如所有系数都应该为正?gota,那么你需要约束优化方法,它们更复杂。由于不再有封闭形式的解,所有这些都是迭代的。scipy.optimize有一些候选项,具体取决于任务。在var下界的情况下:optimize.nnls(密集、小)或自定义的optimize.minimize(method='L-BFGS-B')和bounds。