scipy.optimize.

fmin_cobyla#

scipy.optimize.fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0, rhoend=0.0001, maxfun=1000, disp=None, catol=0.0002, *, callback=None)[源代码][源代码]#

使用线性近似约束优化(COBYLA)方法最小化一个函数。该方法封装了算法的FORTRAN实现。

参数:
函数可调用

待最小化的函数。形式为 func(x, *args)。

x0ndarray

初始猜测。

缺点序列

约束函数;必须全部为 >=0 (如果只有一个约束,则为单个函数)。每个函数将参数 x 作为其第一个参数,并且它可以返回单个数字或数字数组或列表。

参数tuple, 可选

传递给函数的额外参数。

consargstuple, 可选

传递给约束函数的额外参数(默认的 None 表示使用与传递给 func 的额外参数相同的参数)。使用 () 表示没有额外参数。

rhobegfloat, 可选

对变量进行合理的初始更改。

rhoendfloat, 可选

优化中的最终精度(不精确保证)。这是信任区域大小的下限。

disp{0, 1, 2, 3}, 可选

控制输出的频率;0 表示没有输出。

maxfunint, 可选

最大函数评估次数。

猫科动物float, 可选

约束违反的绝对容差。

回调可调用,可选

在每次迭代后调用,形式为 callback(x),其中 x 是当前的参数向量。

返回:
xndarray

最小化 f 的参数。

参见

minimize

用于多元函数最小化算法的接口。特别参见 ‘COBYLA’ 方法

注释

该算法基于目标函数和每个约束的线性近似。我们简要描述该算法。

假设函数在 k 个变量上被最小化。在第 j 次迭代中,算法有 k+1 个点 v_1, …, v_(k+1),一个近似解 x_j,以及一个半径 RHO_j。(即,线性加上一个常数)对目标函数和约束函数的近似,使得它们在 k+1 个点 v_1, …, v_(k+1) 上的函数值与线性近似一致。这给出一个线性规划问题来解决(其中约束函数的线性近似被限制为非负)。

然而,线性近似可能仅在当前单纯形附近是良好的近似,因此线性规划被赋予了进一步的要求,即解(将成为 x_(j+1))必须在 x_j 的 RHO_j 范围内。RHO_j 只会减少,不会增加。初始的 RHO_j 是 rhobeg,最终的 RHO_j 是 rhoend。通过这种方式,COBYLA 的迭代行为类似于信任域算法。

此外,线性规划可能不一致,或者近似可能带来较差的改进。关于如何解决这些问题以及如何更新点 v_i 的详细信息,请参阅源代码或以下参考文献。

参考文献

Powell M.J.D. (1994), “一种通过线性插值建模目标和约束函数的直接搜索优化方法”,收录于《优化与数值分析进展》,编辑:S. Gomez 和 J-P Hennart,Kluwer Academic (Dordrecht),第51-67页

Powell M.J.D. (1998), “用于优化计算的直接搜索算法”, Acta Numerica 7, 287-336

Powell M.J.D. (2007), “无导数优化算法的观点”, 剑桥大学技术报告 DAMTP 2007/NA03

示例

最小化目标函数 f(x,y) = x*y 受限于约束条件 x**2 + y**2 < 1 且 y > 0:

>>> def objective(x):
...     return x[0]*x[1]
...
>>> def constr1(x):
...     return 1 - (x[0]**2 + x[1]**2)
...
>>> def constr2(x):
...     return x[1]
...
>>> from scipy.optimize import fmin_cobyla
>>> fmin_cobyla(objective, [0.0, 0.1], [constr1, constr2], rhoend=1e-7)
array([-0.70710685,  0.70710671])

精确解是 (-sqrt(2)/2, sqrt(2)/2)。