对于scipy.sparse.linalg
中的迭代求解器,如bicg
、gmres
等,可以选择为矩阵A
添加预分解器。然而,文件并不是很清楚我作为预处理者应该给出什么。如果我使用ilu = sp.sparse.linalg.spilu(A)
,ilu
不是任何矩阵,而是一个包含许多内容的对象。
有人在这里为Python 2.7问了一个类似的问题,但我不适合我(Python 3.7,scipy 1.1.0版本(
所以我的问题是,对于那些迭代算法,如何合并不完全LU预条件?
作为预处理器,bicg或gmres接受
- 稀疏矩阵
- 稠密矩阵
- 线性算子
在你的情况下,预条件来自因子分解,因此它必须作为线性算子传递。
因此,您可能希望从通过spilu
获得的ILU因子分解中显式定义线性算子。大致如下:
sA_iLU = sparse.linalg.spilu(sA)
M = sparse.linalg.LinearOperator((nrows,ncols), sA_iLU.solve)
这里,sA
是CSC格式的稀疏矩阵,M
现在将是您将提供给迭代求解器的预条件线性算子。
基于您提到的问题的完整示例:
import numpy as np
from scipy import sparse
from scipy.sparse import linalg
A = np.array([[ 0.4445, 0.4444, -0.2222],
[ 0.4444, 0.4445, -0.2222],
[-0.2222, -0.2222, 0.1112]])
sA = sparse.csc_matrix(A)
b = np.array([[ 0.6667],
[ 0.6667],
[-0.3332]])
sA_iLU = sparse.linalg.spilu(sA)
M = sparse.linalg.LinearOperator((3,3), sA_iLU.solve)
x = sparse.linalg.gmres(A,b,M=M)
print(x)
注:
- 我实际上使用了一个密集矩阵作为例子,而在您的情况下,从一个有代表性的稀疏矩阵开始会更有意义
- 线性算子CCD_ 10的大小是硬编码的
- ILU无论如何都没有配置,但使用了默认值
- 这几乎就是前面提到的答案的评论中所建议的,然而,我不得不做一些小的调整,使其与Python3兼容