主要内容

基于问题优化的输出函数

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

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

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

对于基于求解器的方法和基于问题的方法,编写输出函数时就像使用基于求解器的方法一样。在基于求解器的方法中,使用单个向量变量,通常表示为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”);概率= optimproblem;

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

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

包含目标函数概率

概率。目标= f;

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

con1 = x + y - x*y >= 1.5;>= -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为变量1y是变量2。如果输入变量被命名,然后x = (1)y = (2)

类型outfun
function stop = outfun(in,optimValues,state,idx) persistent history切换状态case 'init' hold on history = [];fhistory = [];searchdir = [];case 'iter' %将当前点和目标函数%值与历史连接。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添加到输出函数中,作为最后一次输入中的额外参数。看到传递额外的参数

outputfn = @ (optimValues,状态)outfun (optimValues,状态,idx);选择= optimoptions (“fmincon”“算法”“sqp”“OutputFcn”, outputfn);

使用输出函数运行优化

使用'选项”名称-值对的论点。

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

找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
索尔=结构体字段:X: -9.5474 y: 1.0474
fval = 0.0236
eflag = OptimalSolution
输出=结构体字段:迭代:10 funcCount: 22 algorithm: 'sqp' message: '…firstderopt: 7.1930e-10 bestfeasible: [1x1 struct] 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

不支万博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支持优化变量和表达式的操作

另请参阅

相关的话题