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)[源代码]¶
使用约束线性近似优化(COBYLA)方法最小化函数。此方法包装了算法的FORTRAN实现。
- 参数
- func可调用
函数最小化。格式为func(x,*args)。
- x0ndarray
初步猜测是这样的。
- cons序列
约束函数;必须全部为
>=0
(如果只有1个约束,则为单个函数)。每个函数都接受参数 x 作为其第一个参数,它可以返回单个数字,也可以返回数字的数组或列表。- args元组,可选
要传递给函数的额外参数。
- consargs元组,可选
要传递给约束函数的额外参数(默认值为None表示使用与传递给func的参数相同的额外参数)。使用
()
没有额外的争论。- rhobeg浮动,可选
对变量进行合理的初始更改。
- rhoend浮动,可选
优化过程中的最终准确性(不能精确保证)。这是信任区域大小的下限。
- disp{0,1,2,3},可选
控制输出频率;0表示无输出。
- maxfun整型,可选
函数求值的最大次数。
- catol浮动,可选
约束冲突的绝对公差。
- 退货
- xndarray
极小化的论据 f 。
参见
minimize
与多变量函数的最小化算法的接口。看“COBYLA” method 尤其是。
注意事项
该算法基于对目标函数和每个约束的线性近似。我们简要描述了该算法。
假设函数在k个变量上被最小化。在第j次迭代中,该算法有k+1个点v_1,…,v_(k+1),一个近似解x_j和一个半径Rho_j(即,线性加一个常数)逼近目标函数和约束函数,使得它们的函数值与k+1个点v_1,…,v_(k+1)上的线性逼近一致。这给出了要求解的线性规划(其中约束函数的线性近似被约束为非负)。
然而,线性近似可能只是在当前单纯形附近才是好的近似,所以线性规划被进一步要求解必须在从x_j开始的Rho_j内,它将变成x_(j+1),而Rho_j只会减少,而不会增加。初始Rho_j为Rhobeg,最终Rho_j为Rhoend。通过这种方式,COBYLA的迭代行为类似于信任域算法。
此外,线性规划可能不一致,或者近似可能给出较差的改进。有关如何解决这些问题以及如何更新点v_i的详细信息,请参阅以下源代码或参考资料。
参考文献
鲍威尔·M·J·D(1994),“一种通过线性插值对目标函数和约束函数建模的直接搜索优化方法”,“优化与数值分析进展”,编辑。S.Gomez和J-P Hennart,Kluwer Academy(Dordrecht),第51-67页
鲍威尔·M·J·D(1998),“用于优化计算的直接搜索算法”,“数值学报”7,287-336
Powell M.J.D.(2007),“没有导数的优化算法的观点”,剑桥大学技术报告DAMTP 2007/NA03
示例
最小化目标函数f(x,y)=x 受约束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)。