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
方法,因为没有固有的方法