如何在中更新预处理程序scipy.optimize.newton\u kry公司

2024-05-16 22:32:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解决一个样本非线性问题,我想建立一个预条件的牛顿库洛夫解算器科学优化. 你知道吗

我通过lineroperator使用spilu设置预条件器。矩阵是随自变量变化的,即矩阵M(x),在每次非线性迭代中,M(x)需要像F(x)一样更新,即残差。你知道吗

似乎newton\u krylov中的“inner\M”选项只在过程开始时被线性化器调用一次。如何设置“inner\M”预条件器选项以在每次牛顿迭代中执行M(x)更新?你知道吗

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

“…如果预条件器有一个名为‘update’的方法,则在每个非线性步骤之后,它将被称为update(x,f),其中x表示当前点,f表示当前函数值。”

非常感谢。你知道吗


Tags: 过程选项update矩阵newton科学scipy条件
1条回答
网友
1楼 · 发布于 2024-05-16 22:32:24

遵循下面的示例 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.堆栈也许是一个更好的提问的地方。 when-is-newton-krylov-not-an-appropriate-solver ()

相关问题 更多 >