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

x0ndarray

初始猜测。

conssequence

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

argstuple,可选

传递给函数的额外参数。

consargstuple,可选

传递给约束函数的额外参数(无默认值意味着使用传递给 func 的相同额外参数)。对于没有额外参数,使用 ()

rhobegfloat,可选

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

rhoendfloat,可选

优化中的最终准确度(未明确保证)。这是信任域大小的下界。

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

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

maxfunint,可选

函数求值的最大次数。

catolfloat,可选

违反约束的绝对容差。

callbackcallable,可选

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

返回:
xndarray

使 f 最小的参数。

另请参阅

最小化

用于多元函数最小化算法的接口。特别是,请参阅 ‘COBYLA’ method

注释

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

假设该函数在线性变量上最小化。在第 j 次迭代中,该算法有 k+1 个点 v_1, …, v_(k+1),近似解 x_j,和半径 RHO_j。(即,线性加常数)近似于目标函数和约束函数,使得它们在 k+1 个点 v_1, .., v_(k+1) 上的函数值与其线性近似相符。这提供了一个要解决的线性规划(其中对约束函数的线性近似被约束为非负)。

然而,线性近似可能只有在当前单纯形附近是良好的近似,因此线性规划提出了进一步的要求,即解(将成为 x_(j+1))必须在 RHO_j 与 x_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

示例

最小化目标函数 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)。