主要内容

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

使用基于问题的 Optimize 实时编辑器任务求解可行性问题

R2026a

问题描述

此示例说明如何使用 Optimize 实时编辑器任务通过各种求解器找到可行点。问题可以表示为找到满足以下约束的点 [x,y]:

(y+x2)2+0.1y2≤1

y≤exp(-x)-3

y≤x-4.

绘制约束函数等于零的曲线。要查看域的哪个部分可行(约束函数值为负),请绘制约束函数值等于 -1/2 的曲线。使用此脚本末尾的 plotobjconstr 函数。

plotobjconstr

Figure contains an axes object. The axes object contains 3 objects of type contour.

x=1.75,y=-3 附近似乎有一个小的可行域。请注意,不存在所有约束值都小于 -1/2 的点,因此可行集很小。

使用基于问题的 Optimize 实时编辑器任务

要找到可行点,请通过选择代码选项卡或插入选项卡上的任务 > 优化,从实时脚本启动 Optimize 实时编辑器任务。选择基于问题的任务。

将问题变量 x 设置为下界为 -5,上界为 5。将问题变量 y 设置为下界为 -10,上界为 10。将 x 的初始点设置为 2,将 y 的初始点设置为 -2。

将目标设置为可行性。

创建表示三个约束的不等式。您的任务如下图所示。

optimizelet_feasibility_setup.png

将任务模式切换到求解问题。该任务会选择 fmincon 求解器并得出以下解。

feasibility_sol1.png

初始点的影响

从不同初始点开始可能会导致 fmincon 找不到解。将 x 的初始点设置为 -2。

feasibility_setup2.png

此时 fmincon 找不到可行解。

feasibility_failed.png

尝试使用其他求解器

要找到解,请尝试使用其他求解器。将求解器设置为 ga。为此,请在指定与问题相关的求解器选项扩展按钮中指定求解器。为了监控求解器进度,请将绘图函数设置为最大约束违反值。

feasibility_setup3.png

ga 找到一个在约束容差范围内的可行点。

feasibility_ga.png

ga 找到的解与 fmincon 不同。该解不太可行。要获得不可行性较低的解,您可以将约束容差选项设置为小于默认值的值。或者,尝试使用其他求解器。

尝试 surrogateopt

尝试使用 surrogateopt 求解器。将绘图函数设置为最大约束违反值;此设置不会自动从 ga 解继承。

feasibility_surrogateopt.png

surrogateopt 找到一个可行解,但在第一次找到解时不停止。surrogateopt 而是会继续迭代,直到达到其函数计算限制。要提前停止迭代,请指定输出函数,一旦最大约束违反值达到 1e-6 或更小,该函数就会停止求解器。这样做会导致求解器更早停止。使用 surrout 辅助函数,它位于此脚本末尾。要指定此函数,请创建该函数的函数句柄。

outfun = @surrout;

在指定与问题相关的求解器选项 > 选项 > 诊断 > 输出函数下拉菜单中指定此函数句柄。

feasibility_setup5.png

feasibility_surr_short.png

此时,求解器在大约 30 次(而不是 200 次)函数计算后停止。该解与上一个解略有不同,但均为可行解。

结论

借助基于问题的 Optimize 实时编辑器任务,您可以尝试使用其他求解器来求解问题,即使这些求解器具有不同语法,如 fmincon 和 surrogateopt。该任务还可以帮助您设置绘图函数,以及其他选项。

此处显示的任务处于其最终状态。您可以随意试用不同的求解器和选项。

Live Task
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Maximum Constraint Violation: 0, xlabel Iteration, ylabel Constraint violation contains an object of type scatter.

Optimization stopped by a plot function or output function.
solution = struct with fields:
    x: 1.5639
    y: -2.8127

reasonSolverStopped = 
    OutputFcnStop

objectiveValue = 
0

辅助函数

以下代码会创建 plotobjconstr 辅助函数。

function plotobjconstr
[XX,YY] = meshgrid(-2:0.1:2,-4:0.1:2);
ZZ = objconstr([XX(:),YY(:)]).Ineq;
ZZ = reshape(ZZ,[size(XX),3]);
h = figure;
ax = gca;
contour(ax,XX,YY,ZZ(:,:,1),[-1/2 0],"r",ShowText="on");
hold on
contour(ax,XX,YY,ZZ(:,:,2),[-1/2 0],"k",ShowText="on");
contour(ax,XX,YY,ZZ(:,:,3),[-1/2 0],"b",ShowText="on");
hold off
end

以下代码会创建 objconstr 辅助函数。

function f = objconstr(x)
c(:,1) = (x(:,2) + x(:,1).^2).^2 + 0.1*x(:,2).^2 - 1;
c(:,2) = x(:,2) - exp(-x(:,1)) + 3;
c(:,3) = x(:,2) - x(:,1) + 4;
f.Ineq = c;
end

以下代码创建 surrout 辅助函数

function stop = surrout(~,optimValues,~)
stop = false;
if optimValues.constrviolation <= 1e-6 % Tolerance for constraint
    stop = true;
end
end

另请参阅

| | |

主题