主要内容

优化解算器输出函数

什么是输出函数?

输出函数是优化函数在其算法每次迭代时调用的函数。通常,您使用输出函数生成图形输出,记录算法生成的数据历史,或根据当前迭代时的数据停止算法。您可以将输出函数创建为函数文件、局部函数或r是一个嵌套函数。

你可以使用输出FCN选项,并使用以下MATLAB®优化功能:

创建和使用输出函数

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

函数stop=outpun(x,optimValues,state)stop=false;保持不变;绘图(x(1),x(2),'.');立即绘图

您可以使用此输出函数来绘制由生成的点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. 设置输出FCN领域选择权结构到函数句柄流出.

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

    保持开放式游戏=@(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,最优值,状态)

哪里

  • 停止这是一面国旗符合事实的错误的取决于优化例程是停止还是继续。请参阅停车标志.

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

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

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

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

嵌套输出函数的示例

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

  • 将输出函数作为嵌套函数包含,请参见嵌套的函数在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 history]=myproblem(x0)history=[];options=optimset('OutputFcn',@myoutput);[x fval]=fminsearch(@objfun,x0,options);函数stop=myoutput(x,optimvalues,state);stop=false;if-isequal(state,'iter')history=[history;x];end-end函数z=objfun(x)z=exp(x(1))*(4*x(1)^2+2*x(2)^2+x(2));end
  3. 将文件另存为我的问题在MATLAB路径上的文件夹中。

  4. 在MATLAB提示下,输入

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

功能fminsearch返回x,最佳点,以及未来值,目标函数在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

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

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

优化值中的字段

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

该表的“命令行显示标题”列列出了设置标题时显示的标题陈列参数选择权“国际热核实验堆”.

optimValues字段(optimValues.Field)

描述

命令行显示标题

功能计数

功能评估的累积次数

Func计数

未来值

当前点的函数值

最小f(x)

迭代

迭代次数-开始于0

迭代

程序

过程消息

程序

算法的状态

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

状态

描述

“初始化”

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

“打断”

算法正在执行迭代。在此状态下,输出函数可以停止优化的当前迭代。您可能希望输出函数停止迭代以提高计算效率。当状态设置为“打断”,而x最优值与上次调用输出函数时相同,其中状态设置为“国际热核实验堆”.

“国际热核实验堆”

该算法在迭代的末尾。

“完成”

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

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

请检查是否应将“%iter”对话框中的“案例打印”或“案例打印”状态切换为“案例打印完成”,以确定是否应将“%iter”对话框中的“案例打印完成”或“案例打印结束”状态切换为“案例打印完成”

停车标志

输出参数停止这是一面国旗符合事实的错误的. 该标志告诉优化函数优化是否停止(符合事实的)还是继续(错误的)。以下示例显示了使用停止旗帜

基于optimValues中的数据停止优化

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

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

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

如果您设计一个UI来执行优化,您可以让输出函数停止优化,例如停止下面的代码假设回调函数停止按钮回调存储该值符合事实的optimstop处理结构称为霍布特储存在应用数据.

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

相关话题