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 实现。

参数:
funccallable

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

x0ndarray

初始猜测。

conssequence

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

argstuple, optional

传递给函数的额外参数。

consargstuple, optional

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

rhobegfloat, optional

变量的合理初始更改。

rhoendfloat, optional

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

disp{0, 1, 2, 3}, optional

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

maxfunint, optional

最大函数评估次数。

catolfloat, optional

约束违反的绝对容差。

callbackcallable, optional

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

返回:
xndarray

最小化 f 的参数。

另请参阅

minimize

多元函数最小化算法的接口。特别是请参阅“COBYLA” 方法

说明

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

假设该函数正在 k 个变量上最小化。在第 j 次迭代中,该算法具有 k+1 个点 v_1, …, v_(k+1),一个近似解 x_j 和一个半径 RHO_j。(即,线性加一个常数)对目标函数和约束函数的近似,使得它们函数值与 v_1,.., v_(k+1) 这 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(多德雷赫特),第 51-67 页

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

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

示例

在约束 x**2 + y**2 < 1 和 y > 0 的条件下,最小化目标函数 f(x,y) = x*y

>>> 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)。