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

Python LU分解的必要性(以numpy为例),python,numpy,math,scipy,linear-algebra,Python,Numpy,Math,Scipy,Linear Algebra,我试图理解使用numpy和scipy库进行LU分解的必要性。根据我的理解,我们要解Ax=b,我们首先把A分解成两个三角形矩阵L和U,然后通过解Ly=b然后解Ux=y来解LUx=b。通过求解三角矩阵,我们可以比高斯消去法减少时间 因此,我厌倦了使用numpy和scipy在python中实现这个想法 我首先使用玩具示例构造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

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

因此,我厌倦了使用numpy和scipy在python中实现这个想法

我首先使用玩具示例构造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_因子快?我猜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\u解决方案

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 decomp并不比高斯消去快。事实上,分解的算法与消去法非常相似,速度也不快

当给定矩阵
A
并且要为多个不同的给定向量
b
求解方程
Ax=b
时,LU分解的优势就出现了。高斯消去法需要从头开始,每个解都需要相同的时间。在LU分解中,您可以存储第一次计算得到的矩阵
L
U
,这大大加快了使用不同向量
b
的后续方程的求解速度


关于这一点,你可以在C语言的“数字食谱”一节中阅读更多内容。

这里有一个部分答案,因为我对你的一个前提有异议

你写道“LU解应该比高斯消去快。”你似乎误解了LU分解的目的。如果您只解决一个这样的问题(
Ax=b
其中矩阵
A
和向量
b
),LU decomp并不比高斯消去快。事实上,分解的算法与消去法非常相似,速度也不快

当给定矩阵
A
并且要为多个不同的给定向量
b
求解方程
Ax=b
时,LU分解的优势就出现了。高斯消去法需要从头开始,每个解都需要相同的时间。在LU分解中,您可以存储第一次计算得到的矩阵
L
U
,这大大加快了使用不同向量
b
的后续方程的求解速度

你可以在C语言中的数字配方部分阅读更多关于这方面的内容。

查看文档字符串以了解更多信息。在“注释”一节中,它说“解决方案是使用LAPACK例程计算的”。(下划线是对应于数据类型的字符的占位符。例如,
dgesv
使用双精度。)

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

查看docstring以了解更多信息。在“注释”一节中,它说“解决方案是使用LAPACK例程计算的”。(下划线是对应于数据类型的字符的占位符。例如,
dgesv
使用双精度。)


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

我想知道“通过求解三角矩阵,我们可以比高斯消去法减少时间”这一说法的来源。AFAIU LU分解基本上是高斯消去法的一种改进形式,所以LU分解本身的时间复杂度不能比高斯消去法好。如果您想用不同的
b
s来解决许多
Ax=b
问题,LU分解可能是有益的,但是对于单个系统,我看不出它应该更快的原因。在更大的矩阵上尝试它,以确保Python与C算法对话的开销(相对而言)尽可能小。在4x4矩阵上进行比较是毫无意义的,为函数调用分配所有帧堆栈将花费比实际计算更长的时间。@SergGr也许我前面的问题令人困惑。我是说在LU分解之后,用L和U来解方程应该比用高斯消去法来解方程要快得多。@Andreytukin我现在用一个更大的矩阵来解方程,而用LU_来解方程的结果要快得多。我想知道这种说法的来源“通过求解三角矩阵,与高斯消去法相比,我们可以减少时间。AFAIU LU分解基本上是高斯消去法的一种改进形式,所以LU分解本身的时间复杂度不能比高斯消去法好。如果您想用不同的
b
s解决许多
Ax=b
问题,LU分解可能是有益的,但是对于单个系统,我看不出它应该更快的原因。请在很多很多b上尝试它