解决稀疏的上三角系统

时间:2013-09-03 22:59:40

标签: python scipy linear-algebra sparse-matrix

我正试图弄清楚如何有效地解决稀疏的三角形系统,即scipy稀疏的Au * x = b。

例如,我们可以构造一个稀疏的上三角矩阵,Au和一个右手边b:

import scipy.sparse as sp
import scipy.sparse.linalg as sla
import numpy as np

n = 2000
A = sp.rand(n, n, density=0.4) + sp.eye(n)
Au = sp.triu(A).tocsr()
b = np.random.normal(size=(n))

我们可以使用spsolve来解决问题,但很明显三角形结构没有被利用。这可以通过对解决方案进行计时并将其与splu中的求解方法进行比较来证明。 (这里使用iPython的%time magic)

%time x1 = sla.spsolve(Au,b)
CPU times: user 3.63 s, sys: 79.1 ms, total: 3.71 s
Wall time: 1.1 s

%time Au_lu = sla.splu(Au)
CPU times: user 3.61 s, sys: 62.2 ms, total: 3.67 s
Wall time: 1.08 s

%time x2 = Au_lu.solve(b)
CPU times: user 25 ms, sys: 332 µs, total: 25.4 ms
Wall time: 7.01 ms

由于Au已经是上三角形,所以对splu的调用确实不应该做任何事情,但是,随着n变大,这个调用变得非常昂贵(使用spsolve),而求解时间仍然很小

有没有办法在没有先调用splu的情况下使用superLU的三角形求解器?或者有更好的方法完全这样做吗?

1 个答案:

答案 0 :(得分:0)

我担心这不是非常有启发性的,但您是否尝试过更改列排列?当我使用" NATURAL"时,我获得了巨大的加速。

%time x1 = sla.spsolve(Au, b, permc_spec="NATURAL")
CPU time: user 46.7 ms, sys: 0 ns, total: 46.7 ms
Wall time: 49 ms

对我来说,它不如使用splu函数输出的求解方法快,但它似乎合理地接近(并避免调用splu)。也许这就足够了? Scipy Docs