主要内容

优化工具箱的输出函数

什么是输出函数?

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

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

通常,使用输出函数的解算器可以将非线性函数作为输入。通过查看函数参考页的选项部分,可以确定哪些解算器可以使用输出函数。

使用输出函数

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

  • 绘制当前点。

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

此外,要使历史记录在铁铬镍铁合金函数,在调用铁铬镍铁合金和返回输出函数变量。有关此信息传递方法的更多信息,请参阅传递额外的参数.这个朗夫米肯辅助函数在这个例子到此结束包含嵌套函数调用。

目标与约束函数

问题是最小化这个函数

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

这个奥布吉芬嵌套在中的函数朗夫米肯实现目标函数。这个confun嵌套在中的函数朗夫米肯实现约束函数。

呼叫解决程序

获取问题的解决方案并查看历史铁铬镍铁合金迭代,调用朗夫米肯作用

[xsol, fval,历史,searchdir] = runfmincon;
最大线搜索方向一阶Iter F计数F(x)约束步长导数优化程序03 1.8394 0.5不可行起点16 1.85127-0.09197 1 0.109 0.778 2 9 0.300167 9.33 1-0.117 0.313 Hessian两次修改3120.529835 0.9209 1 0.12 0.232 4 16 0.186965-1.517 0.5-0.224 0.13 5 19 0.0729085 0.3313 1-0.121 0.054 22 0.0353323-0.03303 1-0.0542 0.0225.003184 1-0.0271 0.00587 8 28 0.0235504 9.035e-08 1-0.0146 8.51e-07有效不等式(在选项范围内。约束公差=1e-06):上下ineqlin ineqnonlin 1 2

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

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

“输出”函数将创建由计算得出的点的绘图铁铬镍铁合金.每个点都用它的迭代数标记。最优点出现在第八次迭代。序列的最后两点非常接近,以至于它们重叠了。

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

disp(历史)
x:[9x2双精度]fval:[9x1双精度]

这个未来值野外历史包含点序列所对应的目标函数值铁铬镍铁合金计算。

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

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

这个x领域历史包含以下点的序列:铁铬镍铁合金计算。

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

这个搜索目录输出包含以下内容的搜索方向:铁铬镍铁合金在每次迭代中。搜索方向是从当前迭代计算的点指向下一次迭代计算的点的向量。

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

辅助函数

下面的代码创建朗夫米肯函数,其中包含outfun输出函数,奥布吉芬目标函数,confun非线性约束函数为嵌套函数。

函数[xsol,fval,history,searchdir]=runfmincon%使用outfun设置共享变量历史。x = [];历史。未来值=[]; searchdir = [];%呼叫优化X0 = [-1 1];选择= optimoptions (@fmincon,“OutputFcn”,@outfun,...“显示”,“国际热核实验堆”,“算法”,“激活集”);[xsol, fval] = fmincon (x0 @objfun ,[],[],[],[],[],[],@ confun选项);函数stop = outfun(x,optimValues,state) stop = false;开关状态案例“init”持有案例“国际热核实验堆”%连接电流点和目标函数%重视历史。x必须是行向量。history.fval=[history.fval;optimValues.fval];history.x=[history.x;x];%将当前搜索方向与% searchdir。searchdir=[searchdir;...optimValues.searchdirection'];图(x(1),x(2),“o”);%使用迭代编号标记点并添加标题。%将.15添加到x(1)中,以将标签与标绘的“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(1)*x(2)-10];%非线性等式约束ceq=[];终止终止

相关的话题