在 scipy.optimize.root 的文档中对于 method = lm
,以下是 options
关键字的默认值。
options={'col_deriv': 0, 'diag': None, 'factor': 100, 'gtol': 0.0, 'eps': 0.0, 'func': None, 'maxiter': 0, 'xtol': 1.49012 e-08, 'ftol': 1.49012e-08}
关于 col_deriv
的描述,他们是这样说的
col_deriv : bool, 可选
非零以指定 Jacobian 函数计算列下的导数(更快,因为没有转置操作)
如果我理解它所说的声明,例如,如果我编写 col_deriv = True
,jacobian
将按列计算,因此速度更快。
问题:如果它更快,为什么 col_deriv
的非零值不是默认值?。
我是不是漏掉了什么?
最佳答案
也许来自 scipy.optimize.leastsq
的文档可以提供帮助,因为它记录了 Dfun
(Jacobian) 和 col_deriv
。从 Dfun
我们得到:
Dfun : callable, optional
A function or method to compute the Jacobian of func with derivatives across the rows. If this is None, the Jacobian will be estimated.
从 col_deriv
我们得到:
col_deriv : bool, optional
non-zero to specify that the Jacobian function computes derivatives down the columns (faster, because there is no transpose operation).
我的解读如下:
默认情况下,
scipy
期望计算雅可比矩阵的函数返回一个遵循“正常”定义的矩阵(参见,例如 https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant)。但是,
scipy
本身会调用其他函数,可能是用 Fortran 编写的 see, e.g., minpack ,它期望导数(关于坐标)被放置在列中。
因此,如果计算雅可比矩阵的函数可以返回一个矩阵,其导数沿列而不是行放置,那么 scipy
将不需要在将雅可比矩阵传递给 minpack
函数从而节省计算时间。
关于python - 在 scipy.optimize.root 中计算 Jacobian 的默认选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45135563/