主要内容gydF4y2Ba

查找全局或多个局部极小值gydF4y2Ba

这个例子说明了gydF4y2BaGlobalSearchgydF4y2Ba如何有效地找到全局最小值gydF4y2BaMultiStartgydF4y2Ba找到更多的局部极小值。gydF4y2Ba

本例的目标函数有许多局部最小值和唯一的全局最小值。在极坐标下,函数是gydF4y2Ba

fgydF4y2Ba (gydF4y2Ba rgydF4y2Ba ,gydF4y2Ba tgydF4y2Ba )gydF4y2Ba =gydF4y2Ba ggydF4y2Ba (gydF4y2Ba rgydF4y2Ba )gydF4y2Ba hgydF4y2Ba (gydF4y2Ba tgydF4y2Ba )gydF4y2Ba

在哪里gydF4y2Ba

ggydF4y2Ba (gydF4y2Ba rgydF4y2Ba )gydF4y2Ba =gydF4y2Ba (gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba rgydF4y2Ba )gydF4y2Ba -gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba rgydF4y2Ba )gydF4y2Ba 2gydF4y2Ba +gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 3.gydF4y2Ba rgydF4y2Ba )gydF4y2Ba 3.gydF4y2Ba -gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 4gydF4y2Ba rgydF4y2Ba )gydF4y2Ba 4gydF4y2Ba +gydF4y2Ba 4gydF4y2Ba )gydF4y2Ba rgydF4y2Ba 2gydF4y2Ba rgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba hgydF4y2Ba (gydF4y2Ba tgydF4y2Ba )gydF4y2Ba =gydF4y2Ba 2gydF4y2Ba +gydF4y2Ba 因为gydF4y2Ba (gydF4y2Ba tgydF4y2Ba )gydF4y2Ba +gydF4y2Ba 因为gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba tgydF4y2Ba -gydF4y2Ba 1gydF4y2Ba 2gydF4y2Ba )gydF4y2Ba 2gydF4y2Ba 。gydF4y2Ba

画出函数gydF4y2Ba ggydF4y2Ba 而且gydF4y2Ba hgydF4y2Ba ,并创建函数的曲面图gydF4y2Ba fgydF4y2Ba 。gydF4y2Ba

图次要情节(1、2、1);fplot (@ (r)(罪罪(r) - (2 * r) / 2 +罪(3 * r) / 3 -罪(4 * r) / 4 + 4)。* r。^ 2. / (r + 1), 20[0])标题(gydF4y2Ba''gydF4y2Ba);ylabel (gydF4y2Ba‘g’gydF4y2Ba);包含(gydF4y2Ba“r”gydF4y2Ba);次要情节(1、2、2);fplot (@ (t) 2 + cos (t) + cos(2 * 2) / 2,[0 2 *π])标题(gydF4y2Ba''gydF4y2Ba);ylabel (gydF4y2Ba“h”gydF4y2Ba);包含(gydF4y2Ba“t”gydF4y2Ba);gydF4y2Ba

图中包含2个轴对象。Axes对象1包含一个functionline类型的对象。Axes对象2包含一个functionline类型的对象。gydF4y2Ba

图fsurf(@(x,y) sawtooxy (x,y), [-20 20])gydF4y2Basawtoothxy在下面的第一步中定义gydF4y2Ba包含(gydF4y2Ba“x”gydF4y2Ba);ylabel (gydF4y2Ba“y”gydF4y2Ba);标题(gydF4y2Ba“sawtoothxy (x, y)”gydF4y2Ba);视图(-18年52)gydF4y2Ba

图中包含一个轴对象。标题为sawtooxy (x,y)的axes对象包含一个functionsurface类型的对象。gydF4y2Ba

全局最小值是gydF4y2Ba rgydF4y2Ba =gydF4y2Ba 0gydF4y2Ba ,目标函数为0。这个函数gydF4y2Ba ggydF4y2Ba (gydF4y2Ba rgydF4y2Ba )gydF4y2Ba 近似线性增长gydF4y2Ba rgydF4y2Ba ,具有重复的锯齿形。这个函数gydF4y2Ba hgydF4y2Ba (gydF4y2Ba tgydF4y2Ba )gydF4y2Ba 有两个局部极小值,其中一个是全局极小值。gydF4y2Ba

的gydF4y2Basawtoothxy.mgydF4y2Ba文件从笛卡尔坐标转换到极坐标,然后在极坐标中计算值。gydF4y2Ba

类型gydF4y2BasawtoothxygydF4y2Ba
函数f = sawtooxy (x,y) [t r] = cart2pol(x,y);转换到极坐标的百分比h = cos(2*t - 1/2)/2 + cos(t) + 2;g = (sin (r) -罪(2 * r) / 2 +罪(3 * r) / 3 -罪(4 * r) / 4 + 4)…。* r。^ 2. / (r + 1);F = g.*h;结束gydF4y2Ba

单全局最小值路径gydF4y2BaGlobalSearchgydF4y2Ba

搜索全局最小值gydF4y2BaGlobalSearchgydF4y2Ba,首先创建一个问题结构。使用gydF4y2Ba“sqp”gydF4y2Ba算法gydF4y2BafmincongydF4y2Ba,gydF4y2Ba

问题= createOptimProblem(gydF4y2Ba“fmincon”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“目标”gydF4y2Ba@ (x) sawtoothxy (x (1), (2)),gydF4y2Ba...gydF4y2Ba“x0”gydF4y2Ba(100、-50),gydF4y2Ba“选项”gydF4y2Ba,gydF4y2Ba...gydF4y2Baoptimoptions (@fmincongydF4y2Ba“算法”gydF4y2Ba,gydF4y2Ba“sqp”gydF4y2Ba,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“关闭”gydF4y2Ba));gydF4y2Ba

起点是gydF4y2Ba(100、-50)gydF4y2Ba而不是gydF4y2Ba(0,0)gydF4y2Ba所以gydF4y2BaGlobalSearchgydF4y2Ba不从全局解决方案开始。gydF4y2Ba

通过运行验证问题结构gydF4y2BafmincongydF4y2Ba。gydF4y2Ba

[x,fval] = fmincon(问题)gydF4y2Ba
x =gydF4y2Ba1×2gydF4y2Ba45.7332 - -107.6469gydF4y2Ba
Fval = 555.5422gydF4y2Ba

创建gydF4y2BaGlobalSearchgydF4y2Ba对象,并设置迭代显示。gydF4y2Ba

gs = GlobalSearch(gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“通路”gydF4y2Ba);gydF4y2Ba

为了重现性,设置随机数生成器种子。gydF4y2Ba

rng(14日gydF4y2Ba“旋风”gydF4y2Ba)gydF4y2Ba

运行求解器。gydF4y2Ba

[x,fval] = run(gs,problem)gydF4y2Ba
Num分最佳电流阈值当地当地分析F-count f (x)点球点球f (x) exitflag过程0 0初始点200 200 555.5 555.5 1463 1.547 e15汽油1.547 e15汽油1阶段1当地300 1.074 1564 1.547 e15汽油5.858 e + 04第二阶段搜索400 4.16 1664 1.547 e15汽油1.84 e + 05年第二阶段搜索500 11.84 1764 1.547 e15汽油2.683 e + 04第二阶段搜索600 30.95 1864 1.547 e15汽油1.122 e + 04第二阶段搜索700 65.25 1964 1.547 e15汽油1.353 e + 04第二阶段搜索800 163.8 2064 1.547 e15汽油6.249 e + 04第二阶段搜索900 2164 1.547 e15汽油4.119e+04 409.2 Stage 2 Search 950 2356 1.547e-15 477 589.7 387 2 Stage 2 Local 952 2420 1.547e-15 368.4 477 250.7 2 Stage 2 Local 1000 2468 1.547e-15 4.031e+04 530.9 Stage 2 Search GlobalSearch stopped because it analyzed all the trial points. 3 out of 4 local solver runs converged with a positive local solver exit flag.
x =gydF4y2Ba1×2gydF4y2Ba10gydF4y2Ba7gydF4y2Ba× 0.0414 0.1298gydF4y2Ba
Fval = 1.5467 -15gydF4y2Ba

求解器找到三个局部最小值,包括[0,0]附近的全局最小值。gydF4y2Ba

多重局部极小值通道gydF4y2BaMultiStartgydF4y2Ba

搜索多个最小值使用gydF4y2BaMultiStartgydF4y2Ba,首先创建一个问题结构。因为问题是不受约束的,所以使用gydF4y2BafminuncgydF4y2Ba解算器。设置选项,在命令行上不显示任何显示。gydF4y2Ba

问题= createOptimProblem(gydF4y2Ba“fminunc”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“目标”gydF4y2Ba@ (x) sawtoothxy (x (1), (2)),gydF4y2Ba...gydF4y2Ba“x0”gydF4y2Ba(100、-50),gydF4y2Ba“选项”gydF4y2Ba,gydF4y2Ba...gydF4y2Baoptimoptions (@fminuncgydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“关闭”gydF4y2Ba));gydF4y2Ba

通过运行问题结构来验证问题结构。gydF4y2Ba

[x,fval] = fminunc(problem)gydF4y2Ba
x =gydF4y2Ba1×2gydF4y2Ba8.4420 - -110.2602gydF4y2Ba
Fval = 435.2573gydF4y2Ba

创建默认值gydF4y2BaMultiStartgydF4y2Ba对象。gydF4y2Ba

ms = MultiStart;gydF4y2Ba

运行求解器50次迭代,记录局部最小值。gydF4y2Ba

rng (1)gydF4y2Ba%用于再现性gydF4y2Ba[x,fval,eflag,output,manymins] = run(ms,problem,50)gydF4y2Ba
MultiStart从起点完成了一些运行。50个本地求解器运行中有10个收敛于一个积极的本地求解器退出标志。gydF4y2Ba
x =gydF4y2Ba1×2gydF4y2Ba-73.8348 - -197.7810gydF4y2Ba
Fval = 766.8260gydF4y2Ba
Eflag = 2gydF4y2Ba
输出=gydF4y2Ba带字段的结构:gydF4y2BafuncCount: 8583 localSolverTotal: 50 localSolverSuccess: 10 localSolverIncomplete: 40 localSolverNoSolution: 0 message: 'MultiStart完成了一些运行从起点....'gydF4y2Ba
manymins =gydF4y2Ba1×10对象gydF4y2Ba1x10 GlobalOptimSolution数组,属性:X Fval Exitflag输出X0gydF4y2Ba

求解器不能在附近找到全局最小值gydF4y2Ba(0,0)gydF4y2Ba。求解器会找到10个不同的局部最小值。gydF4y2Ba

绘制局部极小值处的函数值:gydF4y2Ba

直方图([manymins.Fval], 10)gydF4y2Ba

图中包含一个轴对象。坐标轴对象包含一个直方图类型的对象。gydF4y2Ba

在三个最佳点处绘制函数值:gydF4y2Ba

bestf = [manymin . fval];直方图(bestf (1:3), 10)gydF4y2Ba

图中包含一个轴对象。坐标轴对象包含一个直方图类型的对象。gydF4y2Ba

MultiStartgydF4y2Ba开始gydF4y2BafminuncgydF4y2Ba从分量均匀分布在-1000到1000之间的起点开始。gydF4y2BafminuncgydF4y2Ba经常被困在众多局部极小值中的一个。gydF4y2BafminuncgydF4y2Ba超过其迭代限制或函数求值限制40次。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba