设置网格选项
网格扩张和收缩
MeshExpansionFactor 和 MeshContractionFactor 选项控制每次迭代时网格大小的扩大或收缩程度。使用默认的 MeshExpansionFactor 值 2,模式搜索在每次成功轮询后将网格大小乘以 2。使用默认的 MeshContractionFactor 值 0.5,模式搜索会在每次轮询不成功后将网格大小乘以 0.5。
您可以通过将 @psplotmeshsize 设置为 PlotFcn 选项来查看模式搜索中网格大小的膨胀和收缩。为了在命令行中显示网格大小和目标函数的值,请将 Display 选项设置为 'iter'。
例如,将使用 patternsearch 和 Optimize 实时编辑器任务进行约束最小化中描述的问题设置如下:
在命令行输入以下内容:
x0 = [2 1 0 9 1 0]'; Aineq = [-8 7 3 -4 9 0]; bineq = 7; Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3]; beq = [84 62 65 1]; H = [36 17 19 12 8 15; 17 33 18 11 7 14; 19 18 43 13 8 16; 12 11 13 18 6 11; 8 7 8 6 9 8; 15 14 16 11 8 29]; f = [ 20 15 21 18 29 24 ]'; F = @(x)0.5*x'*H*x + f'*x;创建选项以使用
GSSPositiveBasis2N轮询方法、提供迭代显示并绘制网格大小。options = optimoptions('patternsearch',... 'PollMethod','GSSPositiveBasis2N',... 'PlotFcn',@psplotmeshsize,... 'Display','iter');
运行优化。
[x,fval,exitflag,output] = patternsearch(F,x0,... Aineq,bineq,Aeq,beq,[],[],[],options);
为了更清楚地看到网格大小的变化,将 y 轴更改为对数缩放,如下所示:
从绘图窗口的编辑菜单中选择轴属性。
在属性编辑器中,选择标尺选项卡。
将 YScale 设置为 Log。
在 MATLAB® 属性编辑器中更新这些设置将显示下图中的图表。

前 5 次迭代均成功完成轮询,因此在此期间网格大小稳步增加。通过查看命令行显示,您可以看到第一次不成功的轮询发生在第 6 次迭代中。
Iter f-count f(x) MeshSize Method
0 1 2273.76 1
1 2 2251.69 2 Successful Poll
2 3 2209.86 4 Successful Poll
3 4 2135.43 8 Successful Poll
4 5 2023.48 16 Successful Poll
5 6 1947.23 32 Successful Poll
6 15 1947.23 16 Refine Mesh请注意,第 5 次迭代成功后,下一次迭代的网格大小将加倍。但在第 6 次迭代中,网格大小乘以了 0.5,但这次迭代失败了。
要查看 MeshExpansionFactor 和 MeshContractionFactor 如何影响模式搜索,请将 MeshExpansionFactor 设置为 3.0 并将 MeshContractionFactor 设置为 2/3。
options = optimoptions(options,'MeshExpansionFactor',3.0,... 'MeshContractionFactor',2/3); [x,fval,exitflag,output] = patternsearch(F,x0,... Aineq,bineq,Aeq,beq,[],[],[],options);
最终的目标函数值与之前的设置大致相同,但求解器需要更长的时间才能达到该点。
当您将 y 轴的缩放更改为对数时,网格大小图将如下图所示。

请注意,与默认值 MeshExpansionFactor 相比,将 3.0 设置为 2.0 时,网格大小增加得更快,而与默认值 MeshContractionFactor 相比,将 2/3 设置为 0.5 时,网格大小减小得更慢。
网格加速器
网格加速器可以通过减少达到网格容差所需的迭代次数,使模式搜索更快地收敛到最优点。当网格大小低于某个值时,模式搜索会将网格大小收缩一个小于 MeshContractionFactor 因子的因子。网格加速器仅适用于 GPS 和 GSS 算法。
注意
为了获得最佳效果,请使用网格加速器来解决目标函数在最优点附近不太陡峭的问题,否则可能会失去一些准确性。对于可微问题,这意味着导数的绝对值在解附近不会太大。
要使用网格加速器,请将 AccelerateMesh 选项设置为 true。
例如,将使用 patternsearch 和 Optimize 实时编辑器任务进行约束最小化中描述的问题设置如下:
在命令行输入以下内容:
x0 = [2 1 0 9 1 0]; Aineq = [-8 7 3 -4 9 0]; bineq = 7; Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3]; beq = [84 62 65 1]; H = [36 17 19 12 8 15; 17 33 18 11 7 14; 19 18 43 13 8 16; 12 11 13 18 6 11; 8 7 8 6 9 8; 15 14 16 11 8 29]; f = [ 20 15 21 18 29 24 ]'; F = @(x)0.5*x'*H*x + f'*x;创建选项,包括网格加速器。
options = optimoptions('patternsearch',... 'PollMethod','GSSPositiveBasis2N',... 'Display','iter','AccelerateMesh',true);
运行优化。
[x,fval,exitflag,output] = patternsearch(F,x0,... Aineq,bineq,Aeq,beq,[],[],[],options);
patternsearch 在 78 次迭代中完成,而当网格加速器未打开时则需要 84 次迭代。您可以在迭代显示中看到网格加速器的效果。运行具有和不具有网格加速的示例。直到第 70 次迭代时网格大小都相同,但在第 71 次迭代时网格大小有所不同。MATLAB 命令窗口在没有加速器的情况下显示第 70 次和第 71 次迭代的以下行。
Iter f-count f(x) MeshSize Method 70 618 1919.54 6.104e-05 Refine Mesh 71 630 1919.54 3.052e-05 Refine Mesh
注意网格大小乘以了 0.5,默认值为 MeshContractionFactor。
为了进行比较,命令窗口使用加速器显示相同迭代次数的以下行。
Iter f-count f(x) MeshSize Method 70 618 1919.54 6.104e-05 Refine Mesh 71 630 1919.54 1.526e-05 Refine Mesh
在这种情况下,网格大小乘以 0.25。