我专注于特殊情况,其中A
是n×d矩阵(其中k A
完成为方阵的矢量?
答案 0 :(得分:3)
正如您所提到的,np.linalg.solve需要一个完整的等级矩阵。
对于所有其他线性情况,如果您对min||Ax-b||^2.
感兴趣(可能是),则可以使用np.linalg.lstsq。
通过计算最小化欧几里德2范数的向量x来求解方程a x = b || b - a x || ^ 2。
等式可能低于,良好或超定(即,a的线性独立行的数量可以小于,等于或大于其线性数量独立专栏)。如果a是正方形且满秩,则x(但对于舍入误差)是等式的“精确”解。
(我的粗体注释)
原始np.linalg.solve
的文档中也提到了这一点:
必须是正方形且满秩,即所有行(或等效地,列)必须是线性独立的;如果其中任何一个不成立,则使用lstsq作为系统/方程的最小二乘最佳“解”。
答案 1 :(得分:0)
如果您的方程式少于未知数(假设您打算键入n< d),那么您并不期望有一个独特的解决方案。您可以使用奇异值分解来获得解。
你可以使用for循环和放大器在Python中很容易地实现这最后一点。如果陈述 - 繁重的是分解本身。 Press et al的优秀Numerical Recipes涵盖了第2章中的线性代数(C here和here中免费提供的数字食谱版本)。他们对SVD进行了很好的介绍,解释了SVD的理论以及如何转化为算法(主要关注如何<强>使用 SVD的结果)。它们提供的SVD对象具有比numpy.linalg.svd更多的功能,但如上所述,核心功能是实际的分解,并且执行诸如获取零空间基向量之类的东西只是围绕for循环和if在U,S上运行的语句,和V。