问题
For the iterative solvers in the scipy.sparse.linalg
such as bicg
, gmres
, etc, there is an option to add the precondioner for the matrix A
. However, the documentation is not very clear about what I should give as the preconditioner. If I use ilu = sp.sparse.linalg.spilu(A)
, ilu
is not any matrices but an object that encompasses many things.
Someone asked about a similar question here for Python 2.7, but I doesn't work for me (Python 3.7, scipy version 1.1.0)
So my question is how to incorporate incomplete LU preconditioner for those iterative algorithms?
回答1:
As a preconditioner, bicg or gmres accept
- sparse matrix
- dense matrix
- linear operator
In your case, the preconditioner comes from a factorization, thus it has to be passed as a linear operator.
Thus, you may want to explicitly define a linear operator from the ILU factorization you obtained via spilu
. Something along the lines:
sA_iLU = sparse.linalg.spilu(sA)
M = sparse.linalg.LinearOperator((nrows,ncols), sA_iLU.solve)
Here, sA
is a sparse matrix in a CSC format, and M
will now be the preconditioner linear operator that you will supply to the iterative solver.
A complete example based on the question you mentioned:
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)
Notes:
- I am actually using a dense matrix as an example, while it would make more sense to start from a representative sparse matrix in your case.
- size of the linear operator
M
is hardcoded. - ILU has not been configured anyhow, but with the defaults.
- this is pretty much what has been suggested in the comments to that aforementioned answer, however, I had to do small tweaks to make it Python3-compatible.
来源:https://stackoverflow.com/questions/58895934/how-to-implement-ilu-precondioner-in-scipy