【问题标题】:Optimization algorithm (dog-leg trust-region) in Matlab and PythonMatlab 和 Python 中的优化算法(狗腿信任区域)
【发布时间】:2017-04-19 21:33:06
【问题描述】:

我正在尝试使用 Matlab 和 Python 中的狗腿信任域算法求解一组非线性方程。

在 Matlab 中,fsolve 是默认算法,而对于 Python,我们在 scipy.optimize.minimize 中指定“dogleg”。我不需要为 Matlab 指定 Jacobian 或 Hessian,而 Python 需要其中任何一个来解决问题。

我没有 Jacobian/Hessian,那么 Python 有没有办法解决这个问题?或者是否有另一个函数可以在fsolve 中执行相当于 Matlab 的狗腿法的功能?

【问题讨论】:

    标签: python matlab optimization scipy minimization


    【解决方案1】:

    在较新版本的 scipy 中有 approx_fprime 函数。它使用前步有限差分计算函数f 在位置xk 的雅可比数值逼近。它在位置xk 处返回一个带有f 部分导数的ndarray。

    如果您无法升级您的 scipy 版本,您可以随时从 scipy's source 复制实现。


    编辑:

    如果输入jac=Falsescipy.optimize.minimize 在内部调用approx_fprime。因此,在您的情况下,执行以下操作就足够了:

    scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=False)
    

    编辑

    scipy 似乎无法正确处理jac=False 条件,因此有必要使用approx_fprime 构建可调用的jac,如下所示

    jac = lambda x,*args: scipy.optimize.approx_fprime(x,fun,epsilon,*args)
    scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=jac)
    

    【讨论】:

    • 是的,你是对的!谢谢你让我注意到。我编辑了我的答案,还添加了一个部分,说明如果jac=Falseapprox_fprime内部调用最小化
    • 当我指定jac=False: ValueError: Jacobian is required for dogleg minimization时出现错误。
    • 这似乎是 scipy 处理 numeric estimation 的错误。该错误在当前版本的 scipy 中仍然存在,因此似乎有必要放置错误票或其他东西。要解决您的特定问题,您必须使用approx_fprime 构建可调用的jac。我已经相应地编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2015-10-25
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多