如何在scipy中实现ILU predioner



对于scipy.sparse.linalg中的迭代求解器,如bicggmres等,可以选择为矩阵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兼容

相关内容

  • 没有找到相关文章

最新更新