使用 patternsearch 优化非光滑函数,基于问题
此示例说明如何在基于问题的方法中使用直接搜索来最小化非光滑函数。运行此示例时,将包含要最小化的函数 ps_example(x)。
绘制目标函数。
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)")

创建一个二维优化变量 x。ps_example 函数期望变量是行向量,因此将 x 指定为二元素行向量。
x = optimvar("x",1,2);要使用 ps_example 作为目标函数,请使用 fcn2optimexpr 将该函数转换为优化表达式。
fun = fcn2optimexpr(@ps_example,x);
创建一个具有目标函数 ps_example 的优化问题。
prob = optimproblem("Objective",fun);将初始点 x0 指定为一个结构体,其字段 x 取值 [2.1 1.7]。
x0.x = [2.1 1.7];
求解问题,指定 patternsearch 求解器。
[sol,fval] = solve(prob,x0,"Solver","patternsearch")
Solving problem using patternsearch. patternsearch stopped because the mesh size was less than options.MeshTolerance.
sol = struct with fields:
x: [-4.7124 -7.6294e-07]
fval = -2.0000
patternsearch 比默认的 fminunc 求解器找到更好的解(更低的函数值),不建议用于最小化非光滑函数。
[solfminunc,fvalfminunc] = solve(prob,x0)
Solving problem using fminunc. Local minimum possible. fminunc stopped because it cannot decrease the objective function along the current search direction. <stopping criteria details>
solfminunc = struct with fields:
x: [1.9240 8.8818e-16]
fvalfminunc = 2.9161
另请参阅
patternsearch | fcn2optimexpr | solve