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)