我使用spilu预处理矩阵,但是,要将此预处理器传递给cg(内置共轭梯度法),必须使用LinearOperator函数,有人可以向我解释参数matvec,以及为什么我需要用它。以下是我目前的代码
Ainv=scla.spilu(A,drop_tol= 1e-7)
Ainv=scla.LinearOperator(Ainv.shape,matvec=Ainv)
scla.cg(A,b,maxiter=maxIterations, M = Ainv)
然而,这不起作用,我得到错误TypeError:'SuperLU'对象不可调用。我玩过了,试过
Ainv=scla.LinearOperator(Ainv.shape,matvec=Ainv.solve)
代替。这似乎有效,但我想知道为什么matvec需要Ainv.solve而不仅仅是Ainv,并且它是否适合提供LinearOperator?
感谢您的时间
答案 0 :(得分:0)
对于这部分scipy没有太多经验,有些评论:
LinearOperator
,但您可能会这样做
M : {sparse matrix, dense matrix, LinearOperator}
,所以你也可以使用显式矩阵!LinearOperator
的想法/优势:
Many iterative methods (e.g. cg, gmres) do not need to know the individual entries of a matrix to solve a linear system A*x=b. Such solvers only require the computation of matrix vector products
docs
solve()
的想法是不明确形成逆转(可能非常昂贵)