问题是 Python Numpy 库是否可以在可能的情况下使用反向代入来解决 Ax=b,即如果 A 是下三角形?数值线性代数包可以做到这一点吗?我认为 Numpy 会检测到三角形状态并使用正确的方法,但是 Google 搜索会返回诸如 scipy.linalg.lu_solve 或 scipy.linalg.cho_solve 之类的内容,我假设当我们知道我们有三角形时会使用它们矩阵?
提前致谢,
问题是 Python Numpy 库是否可以在可能的情况下使用反向代入来解决 Ax=b,即如果 A 是下三角形?数值线性代数包可以做到这一点吗?我认为 Numpy 会检测到三角形状态并使用正确的方法,但是 Google 搜索会返回诸如 scipy.linalg.lu_solve 或 scipy.linalg.cho_solve 之类的内容,我假设当我们知道我们有三角形时会使用它们矩阵?
提前致谢,
查看密集矩阵的nympy.linalg.solve的信息,似乎他们正在调用LAPACK 子例程 gesv,它执行矩阵的 LU 分解(不检查矩阵是否已经是下三角形)然后求解系统。所以答案是否定的。
否则,这是有道理的。如果您没有一种简单(便宜)的方法来验证您的矩阵是否为三角形(下或上),那么检查这些东西可能会非常昂贵。
如果你知道你的矩阵是下三角矩阵,最好用solve_triangular在 scipy 中求解,而矩阵仍然是密集的方阵(所以你要付出很多努力)。
不,numpy.linalg.solve方法使用 LAPACK 的 DGESV,它是一个通用的线性方程求解器驱动程序。如果您知道您的矩阵是三角形的,您应该使用专门用于该矩阵结构的驱动程序。
scipy.linalg.solve做了类似的事情。
如果您使用反斜杠运算符,MATLAB 会检测求解中的三角形;请参阅此页面以获取伪代码。
我需要这个可以解决的计算
在哪里
所以我们需要这是的线性解. 基于前两个答案,我使用了(第一个香草解决方案)
import numpy.linalg as lin
Sigma = np.array([[10., 2.],[2., 5.]])
y = np.array([[1.],[2.]])
print np.dot(np.dot(y.T,lin.inv(Sigma)),y)
现在用solve_triangular
import scipy.linalg as slin
L = lin.cholesky(Sigma)
x = slin.solve_triangular(L,y,lower=True)
print np.dot(x.T,x)
两者都给出 0.804。