使用 GPS 算法进行优化
此示例展示如何使用 GPS 算法解决优化问题,该算法是 patternsearch
求解器的默认算法。该示例使用 Optimize
实时编辑器任务以可视化方式完成优化。
目标函数
此示例使用目标函数 ps_example
,该函数在您运行此示例时包含在内。查看该函数的代码。
type ps_example
function f = ps_example(x) %PS_EXAMPLE objective function for patternsearch. % Copyright 2003-2021 The MathWorks, Inc. f = zeros(1,size(x,1)); for i = 1:size(x,1) if x(i,1) < -5 f(i) = (x(i,1)+5)^2 + abs(x(i,2)); elseif x(i,1) < -3 f(i) = -2*sin(x(i,1)) + abs(x(i,2)); elseif x(i,1) < 0 f(i) = 0.5*x(i,1) + 2 + abs(x(i,2)); elseif x(i,1) >= 0 f(i) = .3*sqrt(x(i,1)) + 5/2 +abs(x(i,2)); end end
绘制函数。
fsurf(@(x,y)reshape(ps_example([x(:),y(:)]),size(x)),... [-6 2 -4 4],'LineStyle','none','MeshDensity',300) colormap 'jet' view(-26,43) xlabel('x(1)') ylabel('x(2)') title('ps\_example(x)')
找到函数的最小值
要使用 ps_example
实时编辑器任务查找 Optimize
的最小值,请完成以下步骤。
点击主页选项卡上文件部分中的新建实时脚本按钮,创建一个新的实时脚本。
插入
Optimize
实时编辑器任务。点击插入选项卡,然后在代码部分中选择任务 > 优化。
点击基于求解器的任务。
为了输入问题数据,请点击插入选项卡上的分节符按钮插入新节。新节出现在任务的上方和下方。
在任务上方的新部分中,输入以下代码来定义初始点和目标函数。
x0 = [2.1 1.7]; fun = @ps_example;
要将这些变量放入工作区,请按 Ctrl + Enter 运行该部分。
在任务的指定问题类型部分,点击目标 > 非平滑按钮。
确保选定的求解器是
patternsearch
。在任务的选择问题数据部分中,选择目标函数> 函数句柄,然后选择
fun
。选择初始点 (x0) > x0。
在任务的显示进度部分,选择最佳值和网格大小图。
要运行求解器,请点击任务窗口右上角的选项按钮 ⁝,并选择运行节。图表出现在单独的图形窗口和任务输出区域中。
上图显示了每次迭代中最佳点的目标函数值。通常,目标函数值在早期迭代中迅速提高,然后在接近最佳值时趋于平稳。
下图显示了每次迭代的网格大小。每次迭代成功后网格大小都会增大,每次迭代失败后网格大小都会减小。有关详细信息,请参阅模式搜索轮询的工作原理。
优化停止,因为网格大小变得小于由 MeshTolerance
选项定义的网格大小容差值。最小函数值约为-2。
要查看解和目标函数值,请查看任务的顶部。
Optimize
任务将变量 solution
和 objectiveValue
放入工作区。通过在任务下方放置一个新部分来查看这些值,并包含此代码。
disp(solution) disp(objectiveValue)
按 Ctrl+Enter 运行该节。
接下来将出现“优化实时编辑器”任务的最终状态。
patternsearch stopped because the mesh size was less than options.MeshTolerance.
disp(solution)
-4.7124 -0.0000
disp(objectiveValue)
-2.0000