一个输出函数是优化函数在其算法的每次迭代中调用的函数。通常,您可以使用输出函数来生成图形输出,记录算法生成的数据的历史,或者基于当前迭代中的数据暂停算法。可以以函数文件、局部函数或嵌套函数的形式创建输出函数。
你可以使用OutputFcn
选项与下列MATLAB®优化功能:
下面是一个输出函数的简单示例,它绘制由优化函数生成的点。
函数stop = outfun(x, optimValues, state) stop = false;抓住;情节(x(1),(2), '。');drawnow
您可以使用这个输出函数来绘制生成的点fminsearch
在求解最优化问题时
要做到这一点,
创建包含上述代码的文件并将其保存为outfun.m
在MATLAB路径的一个文件夹中。
设置的值Outputfcn
场的选项
结构的函数句柄outfun
.
options = optimset('OutputFcn', @outfun);
输入以下命令:
抓住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
:
输出函数的函数定义行有如下形式:
stop = outfun(x, optimValues, state)
在哪里
停止
那是国旗吗真正的
或假
取决于优化例程是停止还是继续。看到停止标志.
x
是算法在当前迭代时计算的点。
optimValues
包含来自当前迭代的数据的结构。字段optimValues详细描述了结构。
状态
表示算法的当前状态。算法的状态列出可能的值。
优化函数将输入参数的值传递给outfun
在每一个迭代。
中的例子创建和使用输出函数不需要输出函数保存从一次迭代到下一次迭代的数据。当您不需要在迭代之间保存数据时,可以将输出函数编写为函数文件,并直接从命令行调用优化函数。然而,要有一个输出函数来记录从一个迭代到下一个迭代的数据,需要编写一个文件来执行以下操作:
以嵌套函数的形式包含输出函数——请参阅嵌套函数在MATLAB编程基础中的更多信息。
调用优化函数。
在下面的示例中,函数文件还将目标函数作为本地函数包含。您可以将目标函数作为一个单独的文件或匿名函数编写。
嵌套函数可以访问周围文件中的变量。因此,该方法使输出函数能够在一次迭代到下一次迭代期间保持变量。
下面的示例使用一个输出函数来记录fminsearch
迭代解决
输出函数以调用的矩阵形式返回点序列历史
.
要运行示例,请执行以下步骤:
在MATLAB编辑器中打开一个新文件。
将下面的代码复制并粘贴到文件中。
函数[x fval history] = myproblem(x0) history = [];options = optimset('OutputFcn', @myoutput);[x fval] = fminsearch(@objfun, x0,options);函数stop = 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));结束结束
将文件保存为myproblem.m
在MATLAB路径的一个文件夹中。
在MATLAB提示符下,输入
[x fval history] = myproblem([-1 1]);
这个函数fminsearch
返回x
,最佳点,和fval
,目标函数在x处的值。
X,fval X = 0.1290 -0.5323
另外,输出函数myoutput
返回矩阵历史
,其中包含算法在每次迭代时生成的点,到MATLAB工作空间。前四行历史
是
历史(1:4,:)ans = -1.0000 1.0000 -1.0000 1.0000 -1.0750 0.9000 -1.0125 0.8500
最后一行的点历史
与最优点相同,x
.
objfun(History (end,:)) ans = -0.5689
下表列出了optimValues
结构,由优化函数提供fminbnd
,fminsearch
,fzero
.
表的“命令行显示标题”列列出了设置时出现的标题显示
参数的选项
来“通路”
.
optimValues字段(optimValues.field) |
描述 |
命令行显示标题 |
---|---|---|
|
函数计算的累计次数 |
|
|
函数值在当前点 |
|
|
迭代数——开始于 |
|
|
程序信息 |
|
的可能值如下表所示状态
:
状态 |
描述 |
---|---|
|
在第一次迭代之前,算法处于初始状态。 |
|
该算法正在执行迭代。在这种状态下,输出函数可以停止当前的优化迭代。您可能希望输出函数停止迭代,以提高计算效率。当state设置为 |
|
该算法处于迭代的末尾。 |
|
在最后一次迭代后,算法处于最终状态。 |
下面的代码演示了输出函数如何使用的值状态
来决定在当前迭代中执行哪些任务。
switch state case 'init' %情节或对话框的设置case 'iter' %根据需要对情节或对话框进行更新case 'interrupt' %检查条件,看看优化是否应该退出case 'done' %清理情节、对话框或最终情节结束
输出参数停止
那是国旗吗真正的
或假
.标志告诉优化函数优化是否停止(真正的
)或继续(假
).下面的示例展示了使用停止
国旗。
输出函数可以在基于当前数据的任何迭代中停止优化optimValues
.例如,下面的代码集停止
来真正的
如果目标函数值小于5
:
函数stop = myoutput(x, optimValues, state) stop = false;%检查目标函数是否小于5。如果optimValues。fval< 5 stop = true; end
如果你设计一个UI来执行优化,你可以让输出函数停止优化,例如,a停止按钮。下面的代码展示了如何执行这个回调。代码假设停止按钮回调存储值真正的
在optimstop
一个领域处理
结构称为hObject
存储在appdata
.
函数stop = myoutput(x, optimValues, state) stop = false;%检查用户是否要求停止优化。停止= getappdata (hObject optimstop);