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) 方法最小化函数。此方法使用 PRIMA 中算法的纯 Python 实现。
- 参数:
- func可调用对象
要最小化的函数。形式为 func(x, *args)。
- x0ndarray
初始猜测。
- cons序列
约束函数;所有函数都必须
>=0
(如果只有一个约束,则为单个函数)。每个函数都将参数 x 作为其第一个参数,并且可以返回单个数字或数字数组或列表。- args元组,可选
传递给函数的额外参数。
- consargs元组,可选
传递给约束函数的额外参数(默认为 None 表示使用与传递给 func 相同的额外参数)。使用
()
表示没有额外参数。- rhobeg浮点数,可选
变量合理的初始变化量。
- rhoend浮点数,可选
优化的最终精度(不精确保证)。这是信任域大小的下限。
- disp{0, 1, 2, 3},可选
控制输出频率;0 表示无输出。
- maxfun整数,可选
函数评估的最大次数。
- catol浮点数,可选
约束违反的绝对容差。
- callback可调用对象,可选
在每次迭代后调用,形式为
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 如何更新的详细信息,请参阅源代码或下面的参考文献。
版本 1.16.0 中有改动: 原有的 Powell 实现已被来自 PRIMA 包的纯 Python 版本取代,并进行了错误修复和改进。
参考文献
Powell M.J.D. (1994), “A direct search optimization method that models the objective and constraint functions by linear interpolation.”, in Advances in Optimization and Numerical Analysis, eds. S. Gomez and J-P Hennart, Kluwer Academic (Dordrecht), pp. 51-67
Powell M.J.D. (1998), “Direct search algorithms for optimization calculations”, Acta Numerica 7, 287-336
Powell M.J.D. (2007), “A view of algorithms for optimization without derivatives”, Cambridge University Technical Report DAMTP 2007/NA03
Zhang Z. (2023), “PRIMA: Reference Implementation for Powell’s Methods with Modernization and Amelioration”, https://www.libprima.net, DOI:10.5281/zenodo.8052654
示例
最小化目标函数 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)。