首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LU分解的必要性(以numpy为例)

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

Stack Overflow用户
提问于 2018-04-07 15:48:34
回答 2查看 1.6K关注 0票数 0

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

所以,我在蟒蛇中厌倦了这个想法,用的是numpy和scipy。

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

代码语言:javascript
复制
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中解决这个玩具示例

代码语言:javascript
复制
%timeit np.linalg.solve(A, b )

时间是

每环9.76s±782 ns (平均±std )。dev.7次运行中,每一次循环100000次)

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

代码语言:javascript
复制
lu, piv = linalg.lu_factor(A)
%timeit linalg.lu_solve((lu, piv), b)

我看到输出是

18.8±213 ns /环(平均±std )。dev.7次运行中,每一次循环100000次)

,与np.solve相比,这是比较安静的慢。

所以,我的问题是,为什么np.solve比linalg.lu_factor更快?我猜numpy.solve没有用高斯消去来解方程吗?和这里的结果有点混淆。

编辑

现在,我用一个更大的矩阵来做实验(10000 X 10000)。

结果如下:对于np.linalg.solve

代码语言:javascript
复制
8.64 s ± 180 ms per loop (mean ± std. dev. of 7 runs, 1 loop each);

对于scipy.linalg.lu_solve

代码语言:javascript
复制
121 ms ± 3.79 ms per loop (mean ± std. dev. of 7 runs, 10 loops each).

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

EN

回答 2

Stack Overflow用户

发布于 2018-04-07 16:01:44

这是一个部分的答案,因为我质疑你的一个前提。

你写到"LU解决应该比高斯消除更快“。你似乎误解了LU分解的目的。如果你只解决一个这样的问题(给出矩阵Ax=b和向量b ),LU分解不会比高斯消去更快。事实上,分解的算法非常类似于消除,而且也不会更快。

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

您可以在C中关于LU分解及其应用的数值计算部分中更多地阅读这方面的内容。

票数 4
EN

Stack Overflow用户

发布于 2018-04-07 16:04:46

查看numpy.linalg.solve的docstring。它在"Notes“部分中说,”解决方案是使用LAPACK例程_gesv计算的“。(下划线是对应于数据类型的字符的位置保持符。例如,dgesv使用双重精度。)

dgesv解释说它使用了LU分解。因此,您或多或少地在复制计算,但是在Python中执行更多的步骤,所以代码要慢一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49709108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档