Python Scipy线性代数线性化函数在共轭梯度中的应用

Python Scipy线性代数线性化函数在共轭梯度中的应用,python,scipy,linear-algebra,Python,Scipy,Linear Algebra,我正在使用spilu对矩阵进行预处理,但是,要将该预处理器传递到cg(内置共轭梯度法)中,必须使用线性化器函数,是否有人可以向我解释参数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

我正在使用spilu对矩阵进行预处理,但是,要将该预处理器传递到cg(内置共轭梯度法)中,必须使用线性化器函数,是否有人可以向我解释参数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馈电是正确的吗


感谢您抽出时间

对scipy的这一部分没有太多经验,请发表以下评论:

  • 根据,您不必使用
    LinearOperator
    ,但可以这样做
    • M:{稀疏矩阵,稠密矩阵,LinearOperator}
      ,所以您也可以使用显式矩阵
    • 线性构造器的理念/优点
      • 许多迭代方法(例如cg、gmres)不需要知道矩阵的单个条目来解线性系统a*x=b。此类解算器只需要计算矩阵向量积
        • 根据任务的不同,有时甚至可以使用更高效的无矩阵方法
  • 你提出的工作方法确实是正确的(和一些)
    • 这里不使用逆矩阵,而是使用
      solve()
      的思想不是显式地形成逆矩阵(这可能非常昂贵)
      • 类似的想法在优化算法中非常常见,尽管wiki可能无法提供太多的见解
        • 不显式地形成逆矩阵!(虽然我认为它只用于统计/完成/完成一些优化;但我成功地用这个构建了一些基于LBFGS的优化器)
      • 讨论这件事时不要碰scipy
      • 正因为如此,我假设它也完全是这样的(用solve方法返回一个对象)

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

      • 根据,您不必使用
        LinearOperator
        ,但可以这样做
        • M:{稀疏矩阵,稠密矩阵,LinearOperator}
          ,所以您也可以使用显式矩阵
        • 线性构造器的理念/优点
          • 许多迭代方法(例如cg、gmres)不需要知道矩阵的单个条目来解线性系统a*x=b。此类解算器只需要计算矩阵向量积
            • 根据任务的不同,有时甚至可以使用更高效的无矩阵方法
      • 你提出的工作方法确实是正确的(和一些)
        • 这里不使用逆矩阵,而是使用
          solve()
          的思想不是显式地形成逆矩阵(这可能非常昂贵)
          • 类似的想法在优化算法中非常常见,尽管wiki可能无法提供太多的见解
            • 不显式地形成逆矩阵!(虽然我认为它只用于统计/完成/完成一些优化;但我成功地用这个构建了一些基于LBFGS的优化器)
          • 讨论这件事时不要碰scipy
          • 正因为如此,我假设它也完全是这样的(用solve方法返回一个对象)