繁体   English   中英

LU分解的必要性(以numpy为例)

[英]The necessity of LU decomposition (using numpy as an example)

我试图了解使用numpy和scipy库进行LU分解的必要性。 据我了解,我们要求解Ax = b,首先将A分解为两个三角矩阵L和U,然后通过求解Ly = b然后Ux = y求解LUx = b。 通过求解三角矩阵,与高斯消除相比,我们可以减少时间。

所以,我在python中使用numpy和scipy厌倦了这个想法。

我首先使用玩具示例构造A和b:

A = np.array([[2, 1, 0, 5], [1, 2, 1, 2], [0, 1, 2, 4], [1, 3, 6, 4.5]])
b = np.array([9, 10, -2, 3])

然后首先在np.solve中解决这个玩具示例

%timeit np.linalg.solve(A, b )

现在的时间是

每个循环9.76 µs±782 ns(平均±标准偏差,共运行7次,每个循环100000个)

然后我使用分解来解决这个系统:

lu, piv = linalg.lu_factor(A)
%timeit linalg.lu_solve((lu, piv), b)

我看到的输出是

每个循环18.8 µs±213 ns(平均±标准偏差,共运行7次,每个循环100000个)

,与np.solve相比,它是安静的。

所以,我的问题是,为什么np.solve比linalg.lu_factor更快? 我的猜测是numpy.solve不使用高斯消除法来求解方程式吗? 这里的结果有点混乱。

编辑

现在,我使用更大的矩阵进行实验(10000 x 10000)。

结果是这样的:对于np.linalg.solve

8.64 s ± 180 ms per loop (mean ± std. dev. of 7 runs, 1 loop each);

对于scipy.linalg.lu_solve

121 ms ± 3.79 ms per loop (mean ± std. dev. of 7 runs, 10 loops each).

对于lu_solve,我只计算求解时间,不计算分解部分。 现在更快了!

这是部分答案,因为我对您的房屋有异议。

您写道:“ LU解应该比高斯消除更快。” 您似乎误解了LU分解的目的。 如果只解决一个这样的问题( Ax=b ,其中给出矩阵A和向量b ),LU反压缩的速度不会比高斯消除快。 确实,分解的算法与消除算法非常相似,而且速度并不快。

当给定矩阵A并要为多个不同的给定向量b求解方程Ax=b时,LU分解的优点就来了。 高斯消除需要从头开始,并且每个解决方案将花费相同的时间。 在LU分解中,您可以存储第一次计算所得的矩阵LU ,这大大加快了使用不同矢量b的后续方程的求解。

您可以在C的数字食谱中有关LU分解及其应用的部分中了解有关此内容的更多信息。

查看numpy.linalg.solve 它在“注释”部分中表示“使用LAPACK例程_gesv计算解决方案”。 (下划线是对应于数据类型的字符的占位符。例如, dgesv使用双精度。)

dgesv文档说明它使用LU分解。 因此,您或多或少地复制了计算,但是您在Python中执行了更多步骤,因此您的代码速度较慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM