如何更新scipy.optimize.newton_krylov中的预处理器



我正在尝试解决一个样本非线性问题,我想为scipy.optimize.的newton_krylov求解器设置一个预处理器

我使用spilu通过LinearOperator设置预处理器。矩阵随着自变量(即矩阵M(x))而变化,并且在每次非线性迭代中,需要像残差F(x)一样更新M(x。

newton_krylov中的"inner_M"选项似乎只在过程开始时被LinearOperator调用过一次。如何设置"inner_M"预处理器选项以在每次牛顿迭代中执行M(x)更新?

具体来说,我无法理解中的描述https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.newton_krylov.html对于"inner_M"设置:

"…如果预处理器有一个名为‘update’的方法,它将在每个非线性步骤后被称为update(x,f),x给出当前点,f给出当前函数值。">

非常感谢。

下面的示例doc/scipy/。。。仍然太慢的前提条件,将M.update设置为将x复制到全局(此处为xglo)的函数。或者,用self.xupdate创建一个类。

xglo = None
def get_preconditioner():
...
J1_ilu = spilu(J1)  # better spsolve ?
M = LinearOperator(shape=(nx*ny, nx*ny), matvec=J1_ilu.solve)
#.......................................................................
def xglobal( x, F ):
""" newton_krylov calls this at each iteration: xglo = x """
global xglo
xglo = x.copy()
print( "update: x %s  F %s " % (nu.asum(x), nu.asum(F)) )  # test
# nu.asum: array summary, size min av max
M.update = xglobal
return M

(我不知道这是否真的是个好主意——这取决于你的预处理器。
scicomp.stack可能是一个更好的提问场所,参见例如。牛顿-克里洛夫什么时候不是一个合适的解算器.)

最新更新