用法:
scipy.optimize.root(fun, x0, args=(), method='hybr', jac=None, tol=None, callback=None, options=None)
查找向量函数的根。
参数:
- fun:callable
查找根的向量函数。
- x0:ndarray
初步猜测。
- args:tuple, 可选参数
额外的参数传递给目标函数及其Jacobian函数。
- method:str, 可选参数
求解器类型。应该是其中之一
‘hybr’ (see here)
‘lm’ (see here)
‘broyden1’ (see here)
‘broyden2’ (see here)
‘anderson’ (see here)
‘linearmixing’ (see here)
‘diagbroyden’ (see here)
‘excitingmixing’ (see here)
‘krylov’ (see here)
‘df-sane’ (see here)
- jac:bool 或 callable, 可选参数
如果jac是布尔值且为True,则假定fun与目标函数一起返回Jacobian的值。如果为False,则将根据数值估算雅可比行列式。杰克(jac)也可以成为回味乐趣的雅可比式的可呼唤。在这种情况下,它必须接受与fun相同的参数。
- tol:float, 可选参数
终止公差。要进行详细控制,请使用solver-specific选项。
- callback:function, 可选参数
可选的回调函数。在每次迭代中都被称为
callback(x, f)
其中x是当前解,f是相应的残差。对于除‘hybr’和‘lm’之外的所有方法。- options:dict, 可选参数
求解器选项字典。例如。 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(1,2)
还有Jorge J.,Burton S. Garbow和Kenneth E. Hillstrom。 1980年。MINPACK-1用户指南。
- 2
C. T.凯利。 1995。线性和非线性方程的迭代方法。工业和应用数学协会。 <https://archive.siam.org/books/kelley/fr16/>
- 3
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)”协议。