我正在尝试解决一个示例非线性问题,我想为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>
非常感谢。
答案 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
)