主要内容

优化解算器输出功能

一个输出函数是什么?

一个输出函数是一个函数,一个优化函数调用的每个迭代算法。通常,您使用一个输出函数输出图形,数据算法生成的历史记录,或停止在当前迭代算法基于数据。您可以创建一个输出函数是一个函数文件,本地函数,或嵌套的函数。

您可以使用OutputFcn选择以下MATLAB®优化功能:

创建和使用一个输出函数

下面是一个简单的示例输出函数的情节产生的点一个优化函数。

函数停止= outfun (x, optimValues状态)停止= false;持有;情节(x (1), (2),“。”);drawnow

你可以使用这个函数来绘制点生成的输出fminsearch在解决优化问题

最小值 x f ( x ) = 最小值 x e x 1 ( 4 x 1 2 + 2 x 2 2 + x 1 x 2 + 2 x 2 )

要做到这一点,

  1. 创建一个包含前面的代码并将其保存为文件outfun.m在MATLAB上一个文件夹路径。

  2. 设置的值Outputfcn场的选项结构函数句柄outfun

    选择= optimset (“OutputFcn”,@outfun);
  3. 输入以下命令:

    持有objfun = @ (x) exp (x (1)) * (4 * x (1) ^ 2 + 2 * (2) ^ 2 + x (1) * (2) + 2 * x (2));[x fval] = fminsearch (objfun[1],选项)

    这些命令返回的解决方案

    x = 0.1290 - -0.5323 fval = -0.5689

    并显示下面的情节点生成的fminsearch:

    块x(1)和(2)。

结构的输出功能

输出的函数定义行函数具有以下形式:

停止= outfun (x, optimValues状态)

在哪里

  • 停止是一个标志呢真正的这取决于优化程序暂停或继续。看到停止标志

  • x是点在当前迭代计算的算法。

  • optimValues是一个包含当前迭代的数据结构。字段optimValues详细描述了结构。

  • 状态的当前状态算法。算法的状态列出了可能的值。

优化将输入参数的值传递给函数outfun在每一个迭代。

一个嵌套的输出函数的例子

中的例子创建和使用一个输出函数不需要保留数据的输出函数从一个迭代到另一个。迭代之间当你不需要保存数据,您可以编写输出函数是一个函数文件,直接从命令行调用优化函数。然而,有一个输出函数来记录数据从一个迭代到另一个,写一个文件,如下:

  • 包含嵌套函数从输出函数嵌套函数在MATLAB编程基础更多的信息。

  • 调用优化函数。

在接下来的例子中,函数文件还包含目标函数作为本地函数。你可以写目标函数作为一个单独的文件或者是一个匿名函数。

嵌套函数可以访问变量在周围的文件中。因此,这种方法使输出函数保存变量从一个迭代到另一个。

下面的示例使用一个函数来记录输出fminsearch迭代解决

最小值 x f ( x ) = 最小值 x e x 1 ( 4 x 1 2 + 2 x 2 2 + x 1 x 2 + 2 x 2 )

输出函数返回的序列点矩阵称为历史

要运行示例,请执行以下操作步骤:

  1. 在MATLAB编辑器中打开一个新文件。

  2. 下面的代码复制并粘贴到文件。

    函数[x fval历史]= myproblem (x0)历史= [];选择= optimset (“OutputFcn”,@myoutput);[x fval] = fminsearch (x0, @objfun选项);函数停止= myoutput (x, optimvalues状态);停止= false;如果isequal(状态,“通路”)历史=[历史;x];结束结束函数z = objfun (x) z = exp (x (1)) * (4 * x (1) ^ 2 + 2 * (2) ^ 2 + x (1) * (2) + 2 * x (2));结束结束
  3. 将文件保存为myproblem.m在MATLAB上一个文件夹路径。

  4. 在MATLAB提示,输入

    [x fval历史]= myproblem ([1]);

这个函数fminsearch返回x最优点,fval目标函数在x的值。

x, fval
x = 0.1290 - -0.5323 fval = -0.5689

此外,输出函数myoutput返回矩阵历史,其中包含生成的点在每个迭代算法,在MATLAB工作区。第一个四行历史

:历史(1:4)
ans = -1.0000 1.0000 -1.0000 1.0000 -1.0750 - 0.9000 -1.0125 - 0.8500

最后一排点历史是一样的最佳点,x

历史(最终,:)
ans = 0.1290 - -0.5323
objfun(历史(结束,:))
ans = -0.5689

字段optimValues

下表列出的字段optimValues结构优化所提供的功能fminbnd,fminsearch,fzero

“命令行显示标题”列的表列出了当你设置显示的标题显示参数的选项“通路”

optimValues字段(optimValues.field)

描述

命令行显示标题

funccount

累积的数量评估函数

Func-count

fval

在当前点函数值

最小f (x)

迭代

迭代次数——开始0

迭代

过程

程序信息

过程

算法的状态

下表列出了可能的值状态:

状态

描述

“init”

该算法在第一次迭代前的初始状态。

“中断”

执行迭代算法。在这种状态下,输出函数可以停止当前迭代的优化。您可能希望输出函数停止迭代来提高计算的效率。状态被设置的时候出现“中断”的值,xoptimValues是一样的在最后输出函数的调用,在吗状态被设置为“通路”

“通路”

该算法是迭代的末尾。

“完成”

该算法是在最后一次迭代后的最终状态。

下面的代码演示了如何输出函数使用的价值状态决定哪些任务在当前迭代执行。

开关状态情况下“init”%设置情节或对话框情况下“通路”%更新情节或对话框情况下“中断”%检查条件是否优化%应该戒烟情况下“完成”%清理的情节、对话框或最后的情节结束

停止标志

输出参数停止是一个标志呢真正的。国旗告诉优化函数优化是否暂停(真正的)或持续()。下面的例子展示典型的使用方法停止国旗。

基于数据optimValues停止优化

输出功能可以在任何迭代停止优化基于当前数据optimValues。例如,下面的代码集停止真正的如果目标函数值小于5:

函数停止= myoutput (x, optimValues状态)停止= false;%检查如果目标函数小于5。如果optimValues。fval< 5 stop = true;结束

停止优化基于对话框的输入

如果你设计一个用户界面进行优化,可以输出函数停止优化,例如,一个停止按钮。下面的代码显示了如何做这个回调。代码假设停止按钮回调存储值真正的optimstop一个领域处理结构称为hObject存储在appdata

函数停止= myoutput (x, optimValues状态)停止= false;%检查用户请求停止优化。停止= getappdata (hObject,“optimstop”);

相关的话题