主要内容

优化工具箱的输出函数

什么是输出函数?

对于某些问题,您可能希望在每次迭代时得到优化算法的输出。例如,您可能希望找到算法计算的点序列并绘制这些点。为此,创建优化函数在每次迭代时调用的输出函数。看到输出函数和绘图函数语法有关详细信息和语法。

本例对输出函数使用基于求解器的方法。关于基于问题的方法,请参见基于问题优化的输出函数

一般情况下,采用输出函数的求解器可以采用非线性函数作为输入。通过查看函数参考页的Options部分,可以确定哪些求解器可以使用输出函数。

使用输出函数

这个例子展示了如何使用输出函数来监视fmincon一个有约束的非线性优化问题的求解过程。在每一个的结尾fmincon迭代时,输出函数执行以下操作:

  • 画出当前的点。

  • 将当前点及其对应的目标函数值存储在一个名为历史,并将当前搜索方向存储在一个名为searchdir.搜索方向是指向从当前点到下一个点方向的向量。

此外,要使历史记录在fmincon函数,在调用的嵌套函数中执行优化fmincon并返回输出函数变量。有关此传递信息的方法的详细信息,请参见传递额外的参数.的runfmincon的辅助函数这个例子到此结束包含嵌套函数调用。

目标与约束函数

问题是最小化这个函数

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

服从非线性不等式约束

x 1 + x 2 - x 1 x 2 3. / 2 x 1 x 2 - 1 0

objfun函数嵌套runfmincon实现目标函数。的confun函数嵌套runfmincon实现约束函数。

电话解决

获取问题的解决方案并查看历史fmincon迭代,调用runfmincon函数。

[xsol, fval,历史,searchdir] = runfmincon;
马克斯线搜索方向一阶Iter F-count f (x)约束steplength导数最优过程0 3 1.8394 - 0.5不可行的起点1 6 1.85127 -0.09197 1 0.313 -0.117 0.109 0.300167 - 9.33 0.778 - 2 9 1黑森修改两次3 12 0.529835 0.9209 1 0.12 0.186965 -1.517 0.5 -0.224 0.13 0.232 - 4 16 5 19 0.0729085 -0.121 - 0.054 0.3313 - 1 6220.03.53323 -0.03303 1 -0.0542 0.0271 7 25 0.0235566 0.003184 1 -0.0271 0.00587 8 28 0.0235504 9.035e-08 1 -0.0146 8.51e-07 Active inequalities (to within options.ConstraintTolerance = 1e-06): lower upper ineqlin ineqnonlin 1 2

图中包含一个轴对象。标题为“由fmincon计算的点序列”的轴对象包含18个类型为line, text的对象。

找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。

输出函数创建一个由fmincon.每个点都用它的迭代数标记。最优点出现在第八次迭代。序列的最后两点非常接近,以至于它们重叠了。

输出历史是包含两个字段的结构。

disp(历史)
X: [9x2 double] fval: [9x1 double]

fval历史包含点序列所对应的目标函数值fmincon计算。

disp (history.fval)
1.8394 1.8513 0.3002 0.5298 0.1870 0.0729 0.0353 0.0236 0.0236

这些相同的值在带有标题的列的迭代输出中显示f (x)

x领域的历史包含点的序列fmincon计算。

disp (history.x)
-1.0000 1.0000 1.2500 -5.5708 3.4699 -4.8000 2.2752 -6.7054 1.2618 -8.0679 1.0186 -9.0230 1.0532 -9.5471 1.0471 -9.5474 1.0474

searchdir输出包含的搜索方向fmincon在每一个迭代。搜索方向是从当前迭代计算的点指向下一次迭代计算的点的向量。

disp (searchdir)
0.3679 0.2500 -4.2029 2.2199 0.7708 -1.1947 -3.8108 -2.0268 -1.3625 -0.2432 -0.9552 0.0346 -0.5241 -0.0061 -0.0003 0.0003

辅助函数

下面的代码创建runfmincon函数,其中包含outfun输出函数,objfun目标函数,confun非线性约束函数作为嵌套函数。

函数[xsol, fval,历史,searchdir] = runfmincon%使用outfun设置共享变量历史。x = [];历史。fval=[]; searchdir = [];%调用优化X0 = [-1 1];选择= optimoptions (@fmincon,“OutputFcn”@outfun,...“显示”“通路”“算法”“激活集”);[xsol, fval] = fmincon (x0 @objfun ,[],[],[],[],[],[],@ confun选项);函数stop = outfun(x,optimValues,state) stop = false;开关状态情况下“init”持有情况下“通路”%连接电流点和目标函数%值与历史。X一定是一个行向量。历史。fval=[history.fval; optimValues.fval]; history.x = [history.x; x];%连接当前的搜索方向% searchdir。searchdir = [searchdir;...optimValues.searchdirection ');情节(x (1), (2),“o”);%用迭代号标记点并添加标题。给x(1)加。15以分离标号和标号'o'。文本(x(1) +酒精含量,(2),...num2str (optimValues.iteration));标题(' fmincon计算的点数序列');情况下“完成”持有否则结束结束函数f = objfun f (x) = exp (x (1)) * (4 * x (1) ^ 2 + 2 * (2) ^ 2 + 4 * x (1) * (2) +...2 * x (2) + 1);结束函数[c, ceq] = confun(x)非线性不等式约束C = [1.5 + x(1)*x(2) - x(1) - x(2);x - x (1) * (2) - 10);%非线性等式约束测查= [];结束结束

相关的话题