主要内容

优化解算器输出函数

什么是输出函数?

输出函数是优化函数在其算法每次迭代时调用的函数。通常,可以使用output函数生成图形输出、记录算法生成的数据的历史记录,或者在当前迭代中基于数据停止算法。可以将输出函数创建为函数文件、本地函数或嵌套函数。

你可以用输出FCN选择以下选项®优化功能:

创建和使用输出函数

下面是一个简单的输出函数示例,它绘制了优化函数生成的点。

函数stop=outfun(x,optimValues,state)stop=false;坚持住;绘图(x(1),x(2),''');刷新屏幕

可以使用此输出函数绘制fminsearch公司在求解最优化问题时

最小 F ( ) = 最小 E 1. ( 4. 1. 2. + 2. 2. 2. + 1. 2. + 2. 2. ) .

为此,

  1. 创建一个包含前面代码的文件并将其另存为流出量在MATLAB路径上的文件夹中。

  2. 设置输出FCN磁场选项结构到函数句柄出水口.

    options=optimset('OutputFcn',@outpun);
  3. 输入以下命令:

    按住objfun=@(x)exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2))[x fval]=fminsearch(objfun,[-1],选项)暂停

    这些命令返回解决方案

    x=0.1290-0.5323 fval=-0.5689

    并显示以下由fminsearch公司:

    x(1)与x(2)的曲线图。

输出函数的结构

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

停止=输出(x,optimValues,state)

哪里

  • 停止是一面是的取决于优化例程是停止还是继续。看到了吗停止标志.

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

  • 最佳值是包含来自当前迭代的数据的结构。值中的字段详细描述了结构。

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

优化函数将输入参数的值传递给出水口在每次迭代中。

嵌套输出函数示例

中的示例创建和使用输出函数不需要输出函数来保存从一个迭代到下一个迭代的数据。当不需要在迭代之间保存数据时,可以将输出函数编写为函数文件,并直接从命令行调用优化函数。但是,要使输出函数记录从一个迭代到下一个迭代的数据,请编写一个执行以下操作的文件:

  • 将输出函数作为嵌套函数包含请参见嵌套的函数有关MATLAB编程基础的详细信息。

  • 调用优化函数。

在下面的示例中,函数文件还包含作为局部函数的目标函数。您可以将目标函数作为单独的文件或匿名函数编写。

嵌套函数可以访问周围文件中的变量。因此,此方法使输出函数能够在一次迭代到下一次迭代时保留变量。

下面的示例使用输出函数来记录fminsearch公司迭代求解

最小 F ( ) = 最小 E 1. ( 4. 1. 2. + 2. 2. 2. + 1. 2. + 2. 2. ) .

output函数以一个称为历史.

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

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

  2. 将以下代码复制并粘贴到文件中。

    函数[x fval history]=myproblem(x0)history=[];options=optimset('OutputFcn',@myoutput)[x fval]=fminsearch(@objfun,x0,选项);函数stop=myoutput(x,optimvalues,state);停止=假;如果isequal(state,'iter')history=[历史;x] ;端函数z=objfun(x)z=exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));结束
  3. 将文件另存为我的问题在MATLAB路径上的文件夹中。

  4. 在MATLAB提示下,输入

    [x fval history]=myproblem([-1]);

函数fminsearch公司退货,最佳点,以及未来值,目标函数在x处的值。

x、 fval x=0.1290-0.5323 fval=-0.5689

另外,输出函数我的输出返回矩阵历史,其中包含算法在每次迭代时生成的点,并将其发送到MATLAB工作区。前四排历史

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

中的最后一行点历史与最佳点相同,.

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

值中的字段

下表列出了最佳值由优化函数提供的结构fminbnd公司,fminsearch公司,和一元函数零点.

表格的“命令行显示标题”列列出了设置显示器的参数选项“iter”.

optimValues字段(optimValues.Field)

说明

命令行显示标题

函数计数

累计功能评估数

函数计数

未来值

当前点的函数值

最小f(x)

迭代

迭代次数-开始于0

迭代

程序

过程消息

程序

算法状态

下表列出了状态:

说明

'初始化'

算法在第一次迭代前处于初始状态。

'中断'

算法正在执行迭代。在这种状态下,输出函数可以停止优化的当前迭代。您可能希望输出函数停止迭代以提高计算效率。当状态设置为'中断',的值最佳值与上次调用output函数时相同,其中状态设置为“iter”.

“iter”

算法在迭代的最后。

'完成'

算法在最后一次迭代后处于最终状态。

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

切换状态case'init'%绘图或对话框的设置case'iter'%根据需要对绘图或对话框进行更新case'interrupt'%检查条件以确定优化%是否应退出case'done'%绘图、对话框或最终绘图结束的清理

停止标志

输出参数停止是一面是的. 标志告诉优化函数优化是否停止(是的)或继续(). 下面的示例展示了使用停止旗帜。

基于optimValues中的数据停止优化

输出函数可以基于当前数据在任何迭代中停止优化最佳值. 例如,以下代码集停止是的如果目标函数值小于5.:

函数stop=myoutput(x,optimValues,state)stop=false;%检查目标函数是否小于5。如果optimValues.fval<5 stop=真;结束

基于对话框输入停止优化

如果您设计一个UI来执行优化,那么您可以让输出函数停止优化,例如住手按钮。下面的代码显示了如何执行此回调。代码假定住手按钮回调存储值是的擎天柱a的字段手柄结构调用霍布特储存于应用程序数据.

函数stop=myoutput(x,optimValues,state)stop=false;%检查用户是否已请求停止优化。stop=getappdata(hObject,'optimstop');

相关主题