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