使用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李>
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。