Python 如何在scipy中实现ILU预失真器?
对于Python 如何在scipy中实现ILU预失真器?,python,numpy,scipy,sparse-matrix,linear-algebra,Python,Numpy,Scipy,Sparse Matrix,Linear Algebra,对于scipy.sparse.linalg中的迭代解算器,如bicg、gmres等,可以选择为矩阵A添加预失真器。然而,对于我作为先决条件应该给出什么,这个问题还不是很清楚。如果我使用ilu=sp.sparse.linalg.spilu(A),ilu不是任何矩阵,而是包含许多东西的对象 有人问了关于Python 2.7的类似问题,但我不适合自己(Python 3.7,scipy 1.1.0版) 因此,我的问题是如何为这些迭代算法合并不完全LU预条件器?作为预条件器,或者接受 稀疏矩阵 密矩阵
scipy.sparse.linalg
中的迭代解算器,如bicg
、gmres
等,可以选择为矩阵A
添加预失真器。然而,对于我作为先决条件应该给出什么,这个问题还不是很清楚。如果我使用ilu=sp.sparse.linalg.spilu(A)
,ilu
不是任何矩阵,而是包含许多东西的对象
有人问了关于Python 2.7的类似问题,但我不适合自己(Python 3.7,scipy 1.1.0版)
因此,我的问题是如何为这些迭代算法合并不完全LU预条件器?作为预条件器,或者接受
- 稀疏矩阵
- 密矩阵
- 线性算子
spilu
获得的ILU分解中显式定义线性运算符。大致如下:
sA_iLU = sparse.linalg.spilu(sA)
M = sparse.linalg.LinearOperator((nrows,ncols), sA_iLU.solve)
这里,sA
是CSC格式的稀疏矩阵,M
现在将是预条件线性算子,您将提供给迭代解算器
一个完整的例子: 注:
- 我实际上是以密集矩阵为例,而在你的例子中,从一个有代表性的稀疏矩阵开始会更有意义
- 线性运算符
的大小是硬编码的M
- ILU尚未以任何方式配置,但使用默认值
- 这几乎就是人们所建议的,然而,我不得不做一些小的调整以使其与Python3兼容
bicgstab
和gmres
,但当我将其用于bicg
时,它会给出NotImplementedError:rmatvec未定义
,当我将其用于minres
时,它会给出ValueError:unfinite predicted
。知道会发生什么吗?
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)