当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy optimize.fmin_cobyla用法及代码示例


本文简要介绍 python 语言中 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 可调用的

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

x0 ndarray

初步猜测。

cons 序列

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

args 元组,可选

传递给函数的额外参数。

consargs 元组,可选

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

rhobeg 浮点数,可选

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

rhoend 浮点数,可选

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

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

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

maxfun 整数,可选

函数评估的最大数量。

catol 浮点数,可选

对违反约束的绝对容忍度。

callback 可调用的,可选的

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

返回

x ndarray

最小化 f 的论证。

注意

该算法基于对目标函数和每个约束的线性逼近。我们简要介绍一下算法。

假设函数在 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 的详细信息,请参阅源代码或下面的引用。

参考

鲍威尔 M.J.D. (1994),“通过线性插值对目标函数和约束函数进行建模的直接搜索优化方法。”,优化和数值分析进展,编辑。 S. Gomez 和 J-P Hennart, Kluwer Academic (Dordrecht),第 51-67 页

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

鲍威尔 M.J.D. (2007),“无导数优化算法的观点”,剑桥大学技术报告 DAMPP 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)。

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.optimize.fmin_cobyla。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。