主要内容

基于问题优化的输出函数

这个例子展示了如何使用输出函数来绘制和存储非线性问题的迭代历史。该历史包括评估点,求解器用于生成点的搜索方向,以及评估点处的目标函数值。

有关此示例的基于求解器的方法,请参见优化工具箱的输出函数

绘图函数与输出函数具有相同的语法,因此本示例也适用于绘图函数。

对于基于求解器的方法和基于问题的方法,都要根据基于求解器的方法编写输出函数。在基于求解器的方法中,您使用单个向量变量,通常表示为x,而不是大小不一的优化变量集合。因此,要为基于问题的方法编写输出函数,您必须了解优化变量与基于单个求解器的方法之间的对应关系x.在优化变量和之间映射x,使用varindex.在本例中,为了避免与名为x,使用“在“作为向量变量名。

问题描述

问题是最小化下面的变量函数xy

f = 经验值 x 4 x 2 + 2 y 2 + 4 x y + 2 y + 1

此外,该问题具有两个非线性约束:

x + y - x y 1 5 x y - 1 0

具体问题具体分析设置

采用基于问题的方法对问题进行设置,定义优化变量和优化问题对象。

X = optimvar()“x”);Y = optimvar()“y”);Prob = optimproblem;

将目标函数定义为优化变量中的表达式。

F = exp(x)*(4*x^2 + 2*y^2 + 4*x*y + 2*y + 1);

包含目标函数概率

概率。目标= f;

要包含非线性约束,请创建优化约束表达式。

con1 = x + y - x*y >= 1.5;x*y >= -10;prob.Constraints。con1 = con1;prob.Constraints。con2 = con2;

因为这是一个非线性问题,你必须包含一个初始点结构x0.使用x0。x=–1x0。y=1

x0。x=-1; x0.y = 1;

输出函数

outfun输出函数记录由生成的点的历史fmincon在迭代过程中。输出函数还绘制了点,并保留了搜索方向的单独历史记录sqp算法。搜索方向是从前一个点到下一个点的向量fmincon尝试。在最后的步骤中,输出函数将历史保存在工作空间变量中,并在每个迭代步骤中保存目标函数值的历史。

有关优化输出函数所需的语法,请参见输出函数和绘图函数语法

输出函数接受单个向量变量作为输入。但目前的问题有两个变量。要查找优化变量和输入变量之间的映射,请使用varindex

Idx = varindex(prob);idx.x
Ans = 1
idx.y
Ans = 2

映射显示x是变量1和y是变量2。因此,如果输入变量被命名,然后X = in(1)Y = in(2)

类型outfun
函数stop = outfun(in,optimValues,state,idx)Switch状态case 'init' hold on history = [];历史= [];Searchdir = [];将当前点和目标函数%值与历史记录连接起来。In一定是一个行向量。Fhistory = [Fhistory;optimValues.fval];历史=[历史;(:)的]; % Ensure in is a row vector % Concatenate current search direction with % searchdir. searchdir = [searchdir;... optimValues.searchdirection(:)']; plot(in(idx.x),in(idx.y),'o'); % Label points with iteration number and add title. % Add .15 to idx.x to separate label from plotted 'o' text(in(idx.x)+.15,in(idx.y),... num2str(optimValues.iteration)); title('Sequence of Points Computed by fmincon'); case 'done' hold off assignin('base','optimhistory',history); assignin('base','searchdirhistory',searchdir); assignin('base','functionhistory',fhistory); otherwise end end

在优化中包含输出函数OutputFcn选择。同时,设置算法选项,以使用“sqp”算法,而不是默认值“内点”算法。通过idx作为最后一个输入的额外参数传递给输出函数。看到传递额外参数

outfun(in,optimValues,state,idx);Opts = optimoptions(“fmincon”“算法”“sqp”“OutputFcn”, outputfn);

使用输出函数运行优化

运行优化,包括输出函数,使用选项”名称-值对参数。

[sol,fval,eflag,output] = solve(prob,x0,“选项”选择)
使用fmincon解决问题。

图包含一个轴对象。标题为Sequence of Points Computed by fmincon的axes对象包含22个类型为line, text的对象。

找到满足约束的局部最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。
索尔=带有字段的结构体:X: -9.5474 y: 1.0474
Fval = 0.0236
eflag = OptimalSolution
输出=带有字段的结构体:迭代:10 funcCount: 22算法:'sqp'消息:'找到满足约束的局部最小值....构造违逆:0 stepsize: 1.4785e-07 lssteplength: 1 firstderopt: 7.1930e-10 bestpossible: [1x1 struct] objective - derivative: "reverse-AD" constraint - derivative: "close -form" solver: " fmincon "

检查迭代历史。每一行optimhistory矩阵表示一个点。最后几个点非常接近,这就解释了为什么绘制的序列显示点8、9和10的套印数字。

disp (“位置”); disp (optimhistory)
位置-1.0000 1.0000 -1.3679 1.2500 -1.6509 1.1813 -3.5870 2.0537 -4.4574 2.2895 -5.8015 1.5531 -7.6498 1.1225 -8.5223 1.0572 -9.5463 1.0464 -9.5474 1.0474 -9.5474 1.0474

检查searchdirhistoryfunctionhistory数组。

disp (的搜索方向); disp (searchdirhistory)
搜索方向00 -0.3679 0.2500 -0.2831 -0.0687 -1.9360 0.8725 -0.8704 0.2358 -1.3441 -0.7364 -2.0877 -0.6493 -0.8725 -0.0653 -1.0241 -0.0108 -0.0011 0.0010 0.0000 -0.0000
disp (的函数值); disp (functionhistory)
函数值1.8394 1.8513 1.7757 0.9839 0.6343 0.3250 0.0978 0.0517 0.0236 0.0236 0.0236

不支金宝app持的功能fcn2optimexpr

如果目标函数或非线性约束函数不是由初等函数组成,则必须使用fcn2optimexpr.看到将非线性函数转换为优化表达式.对于本例,您将输入以下代码:

有趣= @ (x, y) exp (x) * (4 * x ^ 2 + y ^ 2 * 2 + 4 * x * y + 2 * y + 1);F = fcn2optimexpr(fun,x,y);

有关支持的函数列表,请参见金宝app金宝app支持的变量和表达式优化操作

另请参阅

相关的话题