numpy.linalg.solve 可以在可能的情况下使用反向替换吗?

计算科学 线性代数 麻木的 scipy
2021-12-13 23:23:54

问题是 Python Numpy 库是否可以在可能的情况下使用反向代入来解决 Ax=b,即如果 A 是下三角形?数值线性代数包可以做到这一点吗?我认为 Numpy 会检测到三角形状态并使用正确的方法,但是 Google 搜索会返回诸如 scipy.linalg.lu_solve 或 scipy.linalg.cho_solve 之类的内容,我假设当我们知道我们有三角形时会使用它们矩阵?

提前致谢,

3个回答

查看密集矩阵的nympy.linalg.solve的信息,似乎他们正在调用LAPACK 子例程 gesv,它执行矩阵的 LU 分解(不检查矩阵是否已经是下三角形)然后求解系统。所以答案是否定的。

否则,这是有道理的。如果您没有一种简单(便宜)的方法来验证您的矩阵是否为三角形(下或上),那么检查这些东西可能会非常昂贵。

如果你知道你的矩阵是下三角矩阵,最好用solve_triangular在 scipy 中求解,而矩阵仍然是密集的方阵(所以你要付出很多努力)。

不,numpy.linalg.solve方法使用 LAPACK 的 DGESV,它是一个通用的线性方程求解器驱动程序。如果您知道您的矩阵是三角形的,您应该使用专门用于该矩阵结构的驱动程序。

scipy.linalg.solve做了类似的事情。

如果您使用反斜杠运算符,MATLAB 会检测求解中的三角形;请参阅此页面以获取伪代码。

我需要这个yTΣ1y可以解决的计算

yTΣ1y=yTLTL1y

在哪里

Σ=LLT

=(yTLT)L1y

=(L1y)TL1y

=|L1y|2

所以我们需要L1y这是的线性解Lx=y. 基于前两个答案,我使用了(第一个香草解决方案)

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。