具有(M,N)右手矩阵的稀疏线性方程组的迭代求解



我想求解一个稀疏线性方程组: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)更有效地求解多个右侧值,而迭代求解器则不能。这意味着,对于直接求解器来说,同时求解多列具有计算优势。

另一方面,对于迭代求解器,在同时求解多个列时没有计算增益,这可能是cgbicg等的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本质上只是类似的包装器。

相关内容

  • 没有找到相关文章

最新更新