这个例子展示了如何使用输出函数来绘制和存储一个非线性问题的迭代历史。此历史记录包括求值点、求解器用于生成点的搜索方向,以及求值点处的目标函数值。
有关此示例的基于求解器的方法,请参见输出函数优化工具箱™。
绘图函数具有与输出函数相同的语法,因此本示例也适用于绘图函数。
对于基于解算器的方法和基于问题的方法,请像使用基于解算器的方法一样编写输出函数。在基于求解器的方法中,您使用单个向量变量,通常表示为x
,而不是各种大小的优化变量的集合。因此,要为基于问题的方法编写输出函数,您必须理解优化变量和基于单个解算器之间的对应关系x
。优化变量之间的映射x
,使用varindex
。在本例中,为了避免与名为的优化变量混淆x
,使用“在“
作为向量变量名。
问题是最小化下面的变量函数x
和y
:
此外,该问题有两个非线性约束:
在基于问题的方法中建立问题,定义优化变量和优化问题对象。
x = optimvar (“x”);y = optimvar (“y”);概率= optimproblem;
将目标函数定义为优化变量中的表达式。
f = exp(x)*(4*x²+ 2*y²+ 4*x*y + 2*y + 1);
包括目标函数概率
。
概率。目标= f;
要包含非线性约束,请创建优化约束表达式。
if (x + y - x*y) = 0;2 = x*y >;prob.Constraints。cons1 = cons1;prob.Constraints。cons2 = cons2;
因为这是一个非线性问题,你必须包含一个初始点结构x0
。使用x0。x=–1
和x0。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
function stop = outfun(in,optimValues,state,idx) persistent history searchdir fhistory stop = false;switch state case 'init' hold on history = [];fhistory = [];searchdir = [];case 'iter' %将当前点和目标函数% value与历史连接起来。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: '…[1x1 struct]解算器:` 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
fcn2optimexpr
如果目标函数或非线性约束函数不是由初等函数组成的,则必须使用fcn2optimexpr
。看到将非线性函数转换为优化表达式。对于目前的例子:
有趣= @ (x, y) exp (x) * (4 * x ^ 2 + y ^ 2 * 2 + 4 * x * y + 2 * y + 1);f = fcn2optimexpr(有趣,x, y);
有关支持的函数列表,请参见金宝app金宝app支持对优化变量和表达式的操作。