我正在尝试使用Matlab和Python中的狗腿信任区域算法来解决一组非线性方程。
在Matlab中有fsolve这个算法是默认的,而对于Python,我们在scipy.optimize.minimize中指定'dogleg'。我不需要为Matlab指定Jacobian或Hessian,而Python需要一个来解决问题。
我没有Jacobian / Hessian所以有没有解决这个问题的方法?或者是否有另一个函数在fsolve
?
答案 0 :(得分:2)
在较新版本的scipy中有approx_fprime函数。它使用foward步长有限差分计算位置f
处的函数xk
的雅可比的数值近似。它返回一个ndarray,其中f
的部分派生位于xk
位置。
如果您无法升级您的scipy版本,则可以随时从scipy's source复制实施。
编辑:
如果输入scipy.optimize.minimize
, approx_fprime
会在内部调用jac=False
。因此,在您的情况下,应该足以执行以下操作:
scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=False)
修改
scipy
似乎无法正确处理jac=False
条件,因此有必要使用jac
构建可调用的approx_fprime
,如下所示
jac = lambda x,*args: scipy.optimize.approx_fprime(x,fun,epsilon,*args)
scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=jac)