主要内容

基于问题的优化输出功能

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

对于基于求解器的方法来实现这个例子,请参阅优化工具箱™的输出功能

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

对于基于解算器的方法和基于问题的方法,请像使用基于解算器的方法一样编写输出函数。在基于求解器的方法中,您使用单个向量变量,通常表示为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 ('是');prob = OptimProblem;

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

f = exp(x)*(4*x²+ 2*y²+ 4*x*y + 2*y + 1);

包括目标函数概率

prob.objective = f;

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

cons1 = x + y  -  x * y> = 1.5;cons2 = x * y> = -10;prob.constraints.cons1 = cons1;prob.constraints.cons2 = cons2;

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

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

输出函数

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

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

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

idx = varindex(概率);idx.x
ans = 1
idx.y
ans = 2

映射显示了x是变量1和y是可变的2.所以,如果输入变量命名,然后x = (1)y =(2)

类型outfun.
函数停止= outfun(在,优化值,状态,idx)持久历史searchdir fhistory stop = false;Switch状态案例'init'保持历史= [];fhistory = [];searchDir = [];案例'iter'%concatenate当前点和目标函数%历史值。必须是一排矢量。fhistory = [fhistory;优化values.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作为最后一个输入中的额外参数传递到输出函数。看到通过额外的参数

outputfn = @(in,OptimValues,状态)Outfun(In,OptimValues,State,IDX);opts = Optimoptions('粉丝','算法','SQP',“OutputFcn”, outputfn);

使用输出函数运行优化

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

[溶胶,fval eflag、输出]=解决(x0,概率“选项”选择)
使用Fmincon解决问题。

发现满足约束的本地最小值。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
sol =结构与字段:x: -9.5474 y: 1.0474
FVAL = 0.0236.
eflag = OptimalSolution
输出=结构与字段:迭代:10 Funccount:22算法:'SQP'消息:'...'Constrviolation:1.2434E-14步骤:1.4785E-07 Lssteplenth

检查迭代历史记录。每一行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

检查SearchDirhistory.functionhistory数组。

DISP(的搜索方向); disp (searchdirhistory)
搜索方向0 0 -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.00100
DISP(的函数值); DISP(功能函数)
功能值1.8394 1.8513 1.7757 0.9839 0.6343 0.3250 0.0978 0.0517 0.0236 0.0236 0.0236

不支万博1manbetx持的功能需要FCN2Optimexpr.

如果目标函数或非线性约束函数不是由初等函数组成的,则必须使用FCN2Optimexpr.。看到将非线性函数转换为优化表达式。对于目前的例子:

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

有关支持的函数列表,请参见万博1manbetx万博1manbetx支持对优化变量和表达式的操作

另请参阅

相关话题