6

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

例如,我们可以构造一个稀疏的上三角矩阵 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 得到问题的解决方案,但是很明显三角形结构没有被利用。这可以通过定时求解并将其与 slu 中的求解方法进行比较来证明。(这里使用 iPython 的 %time 魔法)

%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 已经是上三角形的,所以对 slu 的调用实际上不应该做任何事情,但是,随着 n 变大,这个调用变得非常昂贵(就像使用 spsolve 一样),而求解时间仍然很短。

有什么方法可以使用 superLU 的三角求解器而不先调用 slu?还是有更好的方法来完全做到这一点?

4

1 回答 1

0

恐怕这不是很有指导意义,但是您是否尝试过更改列排列?当我使用“自然”时,我得到了巨大的加速。

%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

对我来说,它不如使用 slu 函数输出的求解方法快,但它似乎相当接近(并且避免调用 slu)。也许这就足够了?Scipy 文档

于 2014-05-05T13:58:22.983 回答