主要内容

优化求解器输出函数

什么是输出函数?

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

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

创建和使用输出函数

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

函数stop = outfun(x, optimValues, state) stop = 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

    options = 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 1], options) hold off

    这些命令返回解决方案

    X = 0.1290 -0.5323 fval = -0.5689

    并显示由生成的点的以下图fminsearch:

    x(1) vs. x(2)的图。

输出函数的结构

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

stop = outfun(x, optimValues, state)

在哪里

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

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

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

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

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

嵌套输出函数示例

中的例子创建和使用输出函数不需要输出函数保存从一个迭代到下一个迭代的数据。当不需要在迭代之间保存数据时,可以将输出函数写成函数文件,直接从命令行调用优化函数。然而,要有一个输出函数来记录从一个迭代到下一个迭代的数据,可以写一个单独的文件,执行以下操作:

  • 以嵌套函数的形式包含输出函数-参见嵌套函数在MATLAB编程基础中获取更多信息。

  • 调用优化函数。

在下面的例子中,函数文件也包含了目标函数作为local函数。你可以把目标函数写成一个单独的文件或者一个匿名函数。

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

下面的例子使用一个输出函数来记录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 history] = myproblem([-1 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

History (end,:) ans = 0.1290 -0.5323 objfun(History (end,:)) ans = -0.5689

字段optimValues

下表列出了optimValues结构,由优化函数提供fminbnd,fminsearch,fzero

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

optimValues字段(optimValues.field)

描述

命令行显示标题

funccount

函数计算的累计次数

Func-count

fval

函数在当前点的值

最小f (x)

迭代

迭代号-开始于0

迭代

过程

程序信息

过程

算法状态

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

状态

描述

“init”

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

“中断”

算法正在执行迭代。在这种状态下,输出函数可以停止当前迭代的优化。你可能希望输出函数停止迭代,以提高计算的效率。当state被设置为“中断”的值。xoptimValues都与最后一次调用输出函数时相同,在哪个状态被设置为“通路”

“通路”

算法在迭代的最后。

“完成”

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

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

开关状态case 'init' %设置情节或对话框case 'iter' %根据需要更新情节或对话框case 'interrupt' %检查条件,看看优化%是否应该退出case 'done' %清除情节、对话框或最终情节结束

停止标志

输出参数停止那是国旗吗真正的。标志告诉优化函数优化是否停止(真正的)或继续()。的典型用法停止国旗。

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

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

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

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

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

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

相关的话题

Baidu
map