首页 > 解决方案 > 来自 scipy.optimize 的解决方案的雅可比不等于 scipy.optimize.OptimizeResult 的 fjac

问题描述

scipy.optimize.root()当使用with argument找到函数的根时jac = TrueOptimizeResult.fjac返回的 Jacobian 值与解的 Jacobian 矩阵不正确。

例如,

# objective function
def fun(x):
    return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0, 0.5 * (x[1] - x[0])**3 + x[1]]

# function returns Jacobain at x
def jac(x):
    return np.array([[1 + 1.5 * (x[0] - x[1])**2, -1.5 * (x[0] - x[1])**2],
                [-1.5 * (x[1] - x[0])**2,
                1 + 1.5 * (x[1] - x[0])**2]])
from scipy import optimize
sol = optimize.root(fun, [0, 0], jac=jac)

解收敛后,sol.fjac不同于jac(sol.x)? 我无法理解fjacfrom 表示OptimizeResult什么?

非常感谢任何见解和更正:)

标签: pythonscipyscipy-optimize

解决方案


我使用调试器进行了检查,在后台默认算法 scipy.optimize.root 使用的是 _minpack.hybrj 函数。如果您查看 fsolve 的文档(也使用 hybrj),它指定:

fjac 正交矩阵 q,由最终近似雅可比矩阵的 QR 分解产生,按列存储

因此,scipy 的文档似乎不完整。

来源:https ://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fsolve.html


推荐阅读