基于问题优化的输出函数
这个例子展示了如何使用输出函数来绘制和存储非线性问题的迭代历史。这个历史记录包括被评估的点、求解器用来生成点的搜索方向,以及被评估点上的目标函数值。
有关此示例的基于求解器的方法,请参见优化工具箱的输出函数。
Plot函数与输出函数具有相同的语法,因此此示例也适用于Plot函数。
对于基于求解器的方法和基于问题的方法,都要根据基于求解器的方法编写输出函数。在基于求解器的方法中,您使用单个向量变量,通常表示为x
,而不是各种大小的优化变量的集合。因此,要为基于问题的方法编写输出函数,必须理解优化变量和基于单个求解器的方法之间的对应关系x
。来映射优化变量和x
,使用varindex
。在本例中,为避免与名为x
,使用"在“
作为向量变量名。
问题描述
问题是最小化下面的变量函数x
和y
:
此外,问题还存在两个非线性约束:
具体问题具体分析设置
要在基于问题的方法中设置问题,请定义优化变量和优化问题对象。
X = optimvar(“x”);Y = optimvar(“y”);Prob =优化问题;
将目标函数定义为优化变量中的表达式。
F = exp(x)*(4*x²+ 2*y²+ 4*x*y + 2*y + 1);
包含目标函数概率
。
概率。目标= f;
要包含非线性约束,请创建优化约束表达式。
con1 = x + y - x*y >= 1.5;con2 = x*y >= -10;prob.Constraints。con1 = con1;prob.Constraints。con2 = con2;
因为这是一个非线性问题,你必须包含一个初始点结构x0
。使用x0。x=–1
和x0。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
函数停止= outfun(在,optimValues,状态,idx)持久化历史搜索dir fhistory停止= false;切换状态大小写'init'保持历史= [];Fhistory = [];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
作为最后一个输入的额外参数输入到输出函数。看到传递额外参数。
outputfn = @(in,optimValues,state)outfun(in,optimValues,state,idx);Opts = optimoptions(“fmincon”,“算法”,“sqp”,“OutputFcn”, outputfn);
使用输出函数运行优化
运行优化,包括输出函数,方法是使用选项”
名称-值对参数。
[sol,fval,eflag,output] = solve(prob,x0,“选项”选择)
使用fmincon解决问题。
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
索尔=带字段的结构:X: -9.5474 y: 1.0474
Fval = 0.0236
eflag = OptimalSolution
输出=带字段的结构:迭代:10 funcCount: 22算法:'sqp'消息:'局部最小值发现满足约束....' constrviolation: 1.2434e-14 stepsize: 1.4785e-07 lssteplth: 1 firstorderopt: 7.1930e-10 best可行:[1x1 struct] objectivederivative: "reverse-AD" constraintderivative: "closed-form"求解器:'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
检查searchdirhistory
和functionhistory
数组。
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优化变量和表达式的支持操作。