我想求解一个稀疏线性方程组:ax=b,其中a是(MxM)数组,b为(MxN)数组,且x和(Mxn)数组。
我使用以下三种方法来解决此问题:
- CCD_ 1
- CCD_ 2
scipy.sparse.linalg.splu(A).solve(b.toarray())
#返回密集数组
我希望使用迭代scipy.sparse.linalg
方法来解决问题:
- CCD_ 5
- CCD_ 6
然而,这些方法只支持形状为(M,)或(M,1)的右手边b。关于如何将这些方法扩展到(M x N)数组b,有什么想法吗?
迭代求解器和直接求解器之间的一个关键区别是,直接求解器可以通过使用因子分解(通常是Cholesky或LU)更有效地求解多个右侧值,而迭代求解器则不能。这意味着,对于直接求解器来说,同时求解多列具有计算优势。
另一方面,对于迭代求解器,在同时求解多个列时没有计算增益,这可能是cg
、bicg
等的API中不支持矩阵解的原因
因此,像scipy.sparse.linalg.spsolve
这样的直接解决方案可能是您的最佳方案。如果出于某种原因,你仍然想要一个迭代的解决方案,我只需要创建一个简单的方便函数,如下所示:
from scipy.sparse.linalg import bicg
def bicg_solve(M, B):
X, info = zip(*(bicg(M, b) for b in B.T))
return np.transpose(X), info
然后您可以创建一些数据,并按如下方式调用它:
import numpy as np
from scipy.sparse import csc_matrix
# create some matrices
M = csc_matrix(np.random.rand(5, 5))
B = np.random.rand(5, 4)
X, info = bicg_solve(M, B)
print(X.shape)
# (5, 4)
任何接受右手边矩阵的迭代求解器API本质上只是类似的包装器。