numpy 用python求解非方阵A的Ax =B

olmpazwi  于 2023-01-17  发布在  Python
关注(0)|答案(4)|浏览(219)

我主要讨论A是n x d矩阵的特殊情况(其中k〈d)表示R^d的子空间的正交基,并且已知b在该子空间内。我想到使用numpy提供的工具,然而,它们只适用于方阵。我有一种方法,用一些线性独立的向量填充矩阵来“平方”然后求解,但我不知道如何选择这些向量,使它们与基向量线性无关,而且我认为这不是唯一的方法,我缺少一些可以使这更容易的东西。是否真的有比我提到的更简单的方法?如果没有,我到底该如何选择那些向量来使A完备化为一个方阵呢?

lf3rwulv

lf3rwulv1#

如前所述,np.linalg.solve需要一个满秩方阵。
对于所有其他线性情况,如果您对min||Ax-b||^2.感兴趣(您可能会感兴趣),可以使用np.linalg.lstsq.
通过计算使欧氏2范数最小化的向量x来求解方程a x = B||B - a x||^2。
方程可以是欠定的、良定的或超定的(即,a的线性独立行的数目可以小于、等于或大于其线性独立列的数目)。如果a是平方的且满秩的,则x(不考虑舍入误差)是方程的“精确”解。
(bold本人注解)
原始np.linalg.solve的文档中也提到了这一点:
a必须是正方形的并且是满秩的,即所有行(或者等价地,列)必须是线性无关的;如果其中一个不为真,则使用lstsq作为系统/方程的最小二乘最佳“解”。

zsbz8rwp

zsbz8rwp2#

如果方程的个数少于未知数(假设您要键入n〈d),则不需要唯一的解。您可以使用奇异值分解来获得解。

  • 首先用numpy.linalg.svd求出由三个矩阵U S V^T组成的奇异值分解,然后由V [ diag(1/s_j)] U^T得到A的伪逆矩阵,这就给出了一个解。
  • 你的最终解将是你找到的一个解,加上A的零空间基向量的线性组合。
  • 为了找到A的零空间基向量,从矩阵V中提取列j,列j对应于来自矩阵S的为零(或低于某个“小”阈值)的奇异值s_j。

在Python中,使用for循环和if语句可以很容易地实现最后一点--最重要的是分解本身。(C herehere中的数值食谱的免费版本)。他们对SVD有很好的介绍,解释了SVD的理论以及如何将其转化为算法(主要关注如何使用SVD的结果)它们提供了一个比numpy.linalg.svd功能更多的SVD对象,但正如前面提到的,核心功能是实际的分解,而像获得零空间基向量这样的事情只是在为循环和if语句操作U、S和V做修饰。

igetnqfo

igetnqfo3#

可以用途:

  1. np.linalg.lstsq(x, y)
  2. np.linalg.pinv(X) @ y
  3. LinearRegression().fit(X, y)
    其中1和2来自numpy,3来自sklearn.linear_model。
    顺便说一句,您需要在1和2中连接1(使用np.ones_like)来表示公式y = ax + b的偏差
yws3nbqq

yws3nbqq4#

除了上面提到的Numpy资源,我还想添加SymPy中的Solveset模块,特别是linsolve
解M个变量的N个线性方程组既支持欠定系统又支持超定系统。解的可能数目为零、一或无穷大。零解会引发ValueError,而无穷大解则以给定符号的形式参数化表示。对于唯一解,将返回有序元组的FiniteSet
他们接着提供了示例,并描述了输入Ax = b所支持的格式。就我个人而言,我已经成功地将这个模块集成到我的Python项目中,所以我想将它添加到对话中。

相关问题