当前位置: 首页>>代码示例>>用法及示例精选>>正文


python scipy optimize.root用法及代码示例

用法:

scipy.optimize.root(fun, x0, args=(), method='hybr', jac=None, tol=None, callback=None, options=None)

查找向量函数的根。

参数:

funcallable

查找根的向量函数。

x0ndarray

初步猜测。

argstuple, 可选参数

额外的参数传递给目标函数及其Jacobian函数。

methodstr, 可选参数

求解器类型。应该是其中之一

jacbool 或 callable, 可选参数

如果jac是布尔值且为True,则假定fun与目标函数一起返回Jacobian的值。如果为False,则将根据数值估算雅可比行列式。杰克(jac)也可以成为回味乐趣的雅可比式的可呼唤。在这种情况下,它必须接受与fun相同的参数。

tolfloat, 可选参数

终止公差。要进行详细控制,请使用solver-specific选项。

callbackfunction, 可选参数

可选的回调函数。在每次迭代中都被称为callback(x, f)其中x是当前解,f是相应的残差。对于除‘hybr’和‘lm’之外的所有方法。

optionsdict, 可选参数

求解器选项字典。例如。 xtol或maxiter,请参见show_options()有关详细信息。

返回值:

sol优化结果

解决方案表示为OptimizeResult Object 。重要属性是:x解决方案数组,success布尔标志,指示算法是否成功退出,以及message描述终止的原因。看到OptimizeResult用于其他属性的描述。

注意:

本节介绍可以通过‘method’参数选择的可用求解器。默认方法是hybr。

方法hybr使用MINPACK中实现的Powell混合方法的修改[1]

方法lm使用对MINPACK中实现的Levenberg-Marquardt算法的修改,以最小二乘法求解非线性方程组[1]

方法df-sane是derivative-free频谱方法。[3]

方法broyden1,broyden2,anderson,线性混合,diagbroyden,令人兴奋的混合,krylov是不精确的牛顿方法,具有回溯或整行搜索[2]。每种方法都对应于特定的雅可比近似值。参考nonlin有关详细信息。

  • 方法brooyden1使用Broyden的第一个Jacobian近似,这是Broyden的好方法。

  • broyden2方法使用Broyden的第二个Jacobian逼近法,即Broyden的错误方法。

  • 方法Anderson使用(扩展的)Anderson混合。

  • 方法Krylov对逆Jacobian使用Krylov逼近。适用于large-scale问题。

  • 方法diagbroyden使用对角Broyden Jacobian逼近。

  • 方法线性混合使用标量雅可比近似。

  • 令人兴奋的混合方法使用调谐对角雅可比近似。

警告:

为diagbroyden,线性混合和令人兴奋的混合方法实现的算法可能对特定问题很有用,但是它们是否有效可能在很大程度上取决于问题。

0.11.0版中的新函数。

参考文献:

1(12)

还有Jorge J.,Burton S. Garbow和Kenneth E. Hillstrom。 1980年。MINPACK-1用户指南。

2

C. T.凯利。 1995。线性和非线性方程的迭代方法。工业和应用数学协会。 <https://archive.siam.org/books/kelley/fr16/>

3
  1. La Cruz,J.M。Martinez,M.Raydan。数学。比较75,1429(2006)。

例子:

以下函数定义了一个非线性方程组及其雅可比。

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]]
>>> 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, method='hybr')
>>> sol.x
array([ 0.8411639,  0.1588361])

源码:

scipy.optimize.root的API实现见:[源代码]

注:本文由纯净天空筛选整理自 scipy.optimize.root。非经特殊声明,原始代码版权归原作者所有,本译文的传播和使用请遵循“署名-相同方式共享 4.0 国际 (CC BY-SA 4.0)”协议。