Python Scipy线性代数线性化函数在共轭梯度中的应用
我正在使用spilu对矩阵进行预处理,但是,要将该预处理器传递到cg(内置共轭梯度法)中,必须使用线性化器函数,是否有人可以向我解释参数matvec,以及我为什么需要使用它。下面是我目前的代码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
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方法返回一个对象)
- 类似的想法在优化算法中非常常见,尽管wiki可能无法提供太多的见解
- 这里不使用逆矩阵,而是使用
- 根据,您不必使用
,但可以这样做LinearOperator
,所以您也可以使用显式矩阵李>M:{稀疏矩阵,稠密矩阵,LinearOperator}
:线性构造器的理念/优点
许多迭代方法(例如cg、gmres)不需要知道矩阵的单个条目来解线性系统a*x=b。此类解算器只需要计算矩阵向量积
- 根据任务的不同,有时甚至可以使用更高效的无矩阵方法
- 你提出的工作方法确实是正确的(和一些)
- 这里不使用逆矩阵,而是使用
的思想不是显式地形成逆矩阵(这可能非常昂贵)solve()
- 类似的想法在优化算法中非常常见,尽管wiki可能无法提供太多的见解
- 不显式地形成逆矩阵!(虽然我认为它只用于统计/完成/完成一些优化;但我成功地用这个构建了一些基于LBFGS的优化器)
- 讨论这件事时不要碰scipy
- 正因为如此,我假设它也完全是这样的(用solve方法返回一个对象)
- 类似的想法在优化算法中非常常见,尽管wiki可能无法提供太多的见解
- 这里不使用逆矩阵,而是使用
- 对于scipy的这一部分没有太多经验,有一些评论: