使用 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
指定为 2 元素行向量。
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.
solfminunc = struct with fields:
x: [1.9240 8.8818e-16]
fvalfminunc = 2.9161
另请参阅
patternsearch
| fcn2optimexpr
| solve