一输出函数是优化函数在其算法每次迭代时调用的函数。通常,可以使用output函数生成图形输出、记录算法生成的数据的历史记录,或者在当前迭代中基于数据停止算法。可以将输出函数创建为函数文件、本地函数或嵌套函数。
你可以用输出FCN
选择以下选项®优化功能:
下面是一个简单的输出函数示例,它绘制了优化函数生成的点。
函数stop=outfun(x,optimValues,state)stop=false;坚持住;绘图(x(1),x(2),''');刷新屏幕
可以使用此输出函数绘制fminsearch公司
在求解最优化问题时
为此,
创建一个包含前面代码的文件并将其另存为流出量
在MATLAB路径上的文件夹中。
设置输出FCN
磁场选项
结构到函数句柄出水口
.
options=optimset('OutputFcn',@outpun);
输入以下命令:
按住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,optimValues,state)
哪里
优化函数将输入参数的值传递给出水口
在每次迭代中。
中的示例创建和使用输出函数不需要输出函数来保存从一个迭代到下一个迭代的数据。当不需要在迭代之间保存数据时,可以将输出函数编写为函数文件,并直接从命令行调用优化函数。但是,要使输出函数记录从一个迭代到下一个迭代的数据,请编写一个执行以下操作的文件:
将输出函数作为嵌套函数包含请参见嵌套的函数有关MATLAB编程基础的详细信息。
调用优化函数。
在下面的示例中,函数文件还包含作为局部函数的目标函数。您可以将目标函数作为单独的文件或匿名函数编写。
嵌套函数可以访问周围文件中的变量。因此,此方法使输出函数能够在一次迭代到下一次迭代时保留变量。
下面的示例使用输出函数来记录fminsearch公司
迭代求解
output函数以一个称为历史
.
要运行该示例,请执行以下步骤:
在MATLAB编辑器中打开一个新文件。
将以下代码复制并粘贴到文件中。
函数[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));结束
将文件另存为我的问题
在MATLAB路径上的文件夹中。
在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) |
说明 |
命令行显示标题 |
---|---|---|
|
累计功能评估数 |
|
|
当前点的函数值 |
|
|
迭代次数-开始于 |
|
|
过程消息 |
|
下表列出了状态
:
州 |
说明 |
---|---|
|
算法在第一次迭代前处于初始状态。 |
|
算法正在执行迭代。在这种状态下,输出函数可以停止优化的当前迭代。您可能希望输出函数停止迭代以提高计算效率。当状态设置为 |
|
算法在迭代的最后。 |
|
算法在最后一次迭代后处于最终状态。 |
下面的代码说明了输出函数如何使用状态
决定在当前迭代中执行哪些任务。
切换状态case'init'%绘图或对话框的设置case'iter'%根据需要对绘图或对话框进行更新case'interrupt'%检查条件以确定优化%是否应退出case'done'%绘图、对话框或最终绘图结束的清理
输出参数停止
是一面是的
或假
. 标志告诉优化函数优化是否停止(是的
)或继续(假
). 下面的示例展示了使用停止
旗帜。
输出函数可以基于当前数据在任何迭代中停止优化最佳值
. 例如,以下代码集停止
到是的
如果目标函数值小于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');