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

时间:2015-11-05 07:35:32

标签: python arrays numpy scipy linear-algebra

我想解决一个稀疏线性方程组: A x = b ,其中 A 是a(M x M)阵列, b 是(M x N)阵列, x 是和(M x N)阵列。

我使用以下三种方式解决这个问题:

  • scipy.linalg.solve(A.toarray(), b.toarray())
  • scipy.sparse.linalg.spsolve(A, b)
  • scipy.sparse.linalg.splu(A).solve(b.toarray())#返回密集数组

我希望使用迭代scipy.sparse.linalg方法解决问题:

  • scipy.sparse.linalg.cg
  • scipy.sparse.linalg.bicg
  • ...

然而,方法只支持右侧 b 形状(M,)或(M,1)。关于如何将这些方法扩展到(M x N)数组 b

的任何想法

1 个答案:

答案 0 :(得分:6)

迭代求解器和直接求解器之间的关键区别在于,直接求解器可以通过使用分解(通常是Cholesky或LU)来更有效地求解多个右手值,而迭代求解器则可以。这意味着对于直接求解器,同时求解多个列具有计算优势。

另一方面,对于迭代求解器,在同时求解多列时没有计算收益,这可能是cg的API本身不支持矩阵解决方案的原因, bicg等等。

正因为如此,像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基本上只是这样的包装器。