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