代码之家  ›  专栏  ›  技术社区  ›  Cousin Dupree

在scipy.optimize.root中计算雅可比矩阵的默认选项

  •  1
  • Cousin Dupree  · 技术社区  · 7 年前

    在文件中 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.49012e-08, 'ftol': 1.49012e-08}

    关于的描述 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)

    col_deriv = True jacobian

    :如果速度更快,为什么 默认值?。

    我是不是漏掉了什么?。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    4 年前

    可能是来自 scipy.optimize.leastsq 可能会有所帮助,因为它记录了这两个方面 Dfun (雅可比)和 col_deriv Dfun公司

    Dfun:可调用,可选

    计算func的雅可比矩阵的函数或方法 带跨行导数

    从…起 col_deriv上校 我们得到:

    非零指定 雅可比函数计算列的导数 (更快,因为没有转置操作)。

    我对此的解读如下:

    1. scipy https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant ).

    2. 然而 本身调用其他函数,可能用Fortran编写 see, e.g., minpack ,期望导数(关于坐标)放置在列中。

    因此,如果计算雅可比矩阵的函数可以返回沿列而不是行放置导数的矩阵,则 在将雅可比矩阵传递给 minpack 函数,从而节省计算时间。

        2
  •  2
  •   user6655984 user6655984    7 年前

    Wikipedia 其中:矩阵的第一行由函数第一个分量的偏导数等组成。这在多变量演算中效果更好,因为可以将右侧的矩阵乘以变量列向量,以获得函数的线性近似。

    fun = lambda x: [x[0]**3-x[1], 2*x[0]+x[1]-12]
    

    jac = lambda x: [[3*x[0]**2, -1], [2, 1]]
    

    哪里 [3*x[0]**2, -1] fun x[0]**3-x[1] .

    方法 root(fun, [0, 0], jac=jac) 在12次迭代中收敛。或者我们可以用转置的方式写出雅可比矩阵,

    jact = lambda x: [[3*x[0]**2, 2], [-1, 1]]
    

    root(fun, [0, 0], jac=jact, options={"col_deriv": 1})
    

    达到同样的效果。对我来说,这一收益是否值得并不明显,但对于非常大的系统来说可能是值得的。

    如果 "col_deriv": 1