Python 当A是条带矩阵时,如何使用scipy.linalg.solve_banded求解Ax=b?

Python 当A是条带矩阵时,如何使用scipy.linalg.solve_banded求解Ax=b?,python,scipy,linear-algebra,Python,Scipy,Linear Algebra,解线性方程组 Ax=b 其中A是一个带条纹的矩阵 谁有5条非零对角线 但与带状矩阵不同,a有三条偏移量为0、-1和1的非零对角线,以及两条偏移量为-m和m的非零对角线 我试着直接用计算机解决它 diagonals = [Ap, As, An, Aw, Ae] A = diags(diagonals, [0, -1, 1, -m, m]).toarray() x = linalg.solve(A, b) 这个方法创建了整个A。但是A是备用的,所以这个方法浪费了太多的内存来保存零元素 所以我试

解线性方程组

Ax=b
其中A是一个带条纹的矩阵

谁有5条非零对角线

但与带状矩阵不同,a有三条偏移量为0、-1和1的非零对角线,以及两条偏移量为-m和m的非零对角线

我试着直接用计算机解决它

diagonals = [Ap, As, An, Aw, Ae]
A = diags(diagonals, [0, -1, 1, -m, m]).toarray()
x = linalg.solve(A, b)
这个方法创建了整个A。但是A是备用的,所以这个方法浪费了太多的内存来保存零元素

所以我试着用解题带

A = np.zeros((2 * m + 1, len(initial)))
A[0] = Ae
A[m - 1] = An
A[m] = Ap
A[m + 1] = As
A[2 * m] = Aw
x = linalg.solve_banded((m, m), A, b)

这种方法比以前的方法花费更少的内存,但它仍然在(2m-4)零向量上浪费了一些内存。有没有更聪明的方法只使用五个非零向量?

嘿,我可以部分回答这个问题。为了减少内存存储,您可以通过删除
To.array()
命令来维护稀疏矩阵形式,而无需将其转换为大型矩阵:

A = diags(diagonals, [0, -1, 1, -m, m])
现在稀疏矩阵有它自己的
spsolve
方法,因此
scipy.sparse.linalg.spsolve(A,b)
将起作用

为了进一步提高性能,您可以
sparse.linalg.splu(A).solve(b)
,它通过LU分解转换A,然后SuperLU对象再次具有
solve
方法。(正如我所测试的,该方法比直接使用类LU分解的spsolve稍快一些。例如,请参阅。)

这里唯一的问题是在LU分解过程中,由于分解,内存使用量也会很大

我还想知道是否有任何方法可以用稀疏矩阵合成
solve\u banded
方法,因为没有固有的方法