我试图弄清楚如何有效地解决稀疏三角系统,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?还是有更好的方法来完全做到这一点?