Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 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)")

创建一个二维优化变量 xps_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

另请参阅

| |

相关主题