如何在scipy.optimize.newton_krylov中更新前置条件

时间:2018-12-28 13:35:55

标签: python optimization scipy

我正在尝试解决一个示例非线性问题,我想为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表示当前函数值。” / p>

非常感谢。

1 个答案:

答案 0 :(得分:0)

下面的示例     doc/scipy/ ... still-too-slow-precondition, 将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可能是一个更好的地方,请参阅例如     when-is-newton-krylov-not-an-appropriate-solver  )