首页 文章

解决稀疏的上三角系统

提问于
浏览
5

我试图弄清楚如何有效地解决稀疏的三角形系统,在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 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

    我担心这不是非常有启发性的,但您是否尝试过更改列排列?当我使用“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

相关问题