Scipy线性代数LinearOperator函数用于共轭梯度

时间:2017-10-05 22:36:20

标签: python scipy linear-algebra

我使用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?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

对于这部分scipy没有太多经验,有些评论:

  • 根据docs您不必使用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
        • 根据任务的不同,有时甚至可以使用无矩阵的方法来提高效率
  • 您提交的工作方法确实是正确的(some other source doing it similarily,有些course-materials doing it like that
    • 不使用逆矩阵,但在此使用 solve() 的想法是不明确形成逆转(可能非常昂贵)
      • 类似的想法在BFGS-based优化算法中很常见,尽管wiki可能在这里没有提供太多的见解
      • Source @ scicomp.stackexchange在不触及scipy的情况下讨论这个问题
      • 因为我认为spilu完全也是这样(用一个解决方法返回一个对象)