主要内容

优化求解器输出功能

什么是输出功能?

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

你可以使用OutputFcn选项与下列MATLAB®优化功能:

创建和使用输出函数

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

功能停止= outfun(x,优化值,状态)stop = false;坚持,稍等;绘图(x(1),x(2),'。');drawn

您可以使用此输出功能来绘制由此生成的点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 * x(2)^ 2 + x(1)* x(2)+ 2 * x(2));[x fval] = fminsearch(objfun,[-1 1],选项)阻止

    这些命令返回解决方案

    x = 0.1290 -0.5323 fval = -0.5689

    并显示由。生成的点的下图fminsearch.

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

输出函数的结构

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

停止= outfun(x,优化值,状态)

在哪里

  • 停止是国旗吗真正的取决于优化例程是停止还是继续。看到停止标志

  • 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 history] = myproblem(x0) history = [];options = optimset('OutputFcn', @myoutput);[x fval] = fminsearch(@objfun, x0,options);函数停止= myoutput(x,optimvalues,state);停止= false;If isequal(state,'iter') history = [history;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 1]);

这个函数fminsearch.回报X,最佳点,和fval.,目标函数在x处的值。

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

另外,输出函数myoutpul.返回矩阵历史,其中包含算法在每次迭代时生成的点,到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由优化函数提供的结构FMINBNDfminsearch.,fzero

表的“命令行显示标题”列列出了设置时出现的标题展示参数的选项'iter'

optimValues字段(optimValues.field)

描述

命令行显示标题

Funccount.

函数求值的累计次数

Func-count

fval.

当前点的函数值

最小f (x)

迭代

迭代数-从0.

迭代

程序

程序信息

程序

算法的状态

下表列出了可能的值状态

状态

描述

“init”

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

“中断”

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

'iter'

该算法在迭代结束时。

“完成”

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

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

切换状态案例'Init'%的绘图或对话框的Cuist'Iter'%,根据需要的情况“中断”%的案例或对话框的更新,以查看优化%是否应退出案例'完成'%的绘图案例,对话框或最终情节结束

停止标志

输出参数停止是国旗吗真正的.标志告诉优化函数优化是否停止(真正的)或继续().下面的示例展示了使用的典型方法停止国旗。

基于优化值中的数据停止优化

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

功能停止= myOutput(x,优化值,状态)stop = false;%检查客观函数是否小于5.如果优化values.fval <5 stop = true;结尾

基于对话框输入停止优化

如果您设计了一个执行优化的UI,您可以使用输出函数停止优化,例如,a停止按钮。下面的代码展示了如何执行这个回调。该代码假设停止按钮回调存储该值真正的优化器一个领域把手结构称为新奇存储在appdata

功能停止= myOutput(x,优化值,状态)stop = false;%检查用户是否要求停止优化。stop = getAppData(fremject,'OptimStop');

相关的话题