一输出函数是优化函数在其算法每次迭代时调用的函数。通常,您使用输出函数生成图形输出,记录算法生成的数据历史,或根据当前迭代时的数据停止算法。您可以将输出函数创建为函数文件、局部函数或r是一个嵌套函数。
你可以使用输出FCN
选项,并使用以下MATLAB®优化功能:
下面是一个简单的输出函数示例,该函数绘制了优化函数生成的点。
函数stop=outpun(x,optimValues,state)stop=false;保持不变;绘图(x(1),x(2),'.');立即绘图
您可以使用此输出函数来绘制由生成的点fminsearch
在求解最优化问题时
为此,,
创建包含上述代码的文件并将其另存为outfun.m
在MATLAB路径上的文件夹中。
设置输出FCN
领域选择权
结构到函数句柄流出
.
options=optimset('OutputFcn',@outpun);
输入以下命令:
保持开放式游戏=@(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,最优值,状态)
哪里
优化函数将输入参数的值传递给流出
在每次迭代中。
中的例子创建和使用输出函数不需要输出函数将数据从一次迭代保存到下一次迭代。当不需要在迭代之间保存数据时,可以将输出函数作为函数文件写入,并直接从命令行调用优化函数。但是,要让输出函数记录从一次迭代到下一次迭代的数据,请写入执行以下操作的单个文件:
将输出函数作为嵌套函数包含,请参见嵌套的函数在MATLAB编程基础中获取更多信息。
调用优化函数。
在下面的示例中,函数文件还包含目标函数作为局部函数。您可以将目标函数作为单独的文件或匿名函数编写。
嵌套函数可以访问周围文件中的变量。因此,此方法使输出函数能够在一次迭代到下一次迭代中保留变量。
下面的示例使用输出函数记录fminsearch
迭代求解
输出函数以矩阵形式返回点序列,称为历史
.
要运行该示例,请执行以下步骤:
在MATLAB编辑器中打开一个新文件。
将以下代码复制并粘贴到文件中。
函数[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
将文件另存为我的问题
在MATLAB路径上的文件夹中。
在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) |
描述 |
命令行显示标题 |
---|---|---|
|
功能评估的累积次数 |
|
|
当前点的函数值 |
|
|
迭代次数-开始于 |
|
|
过程消息 |
|
下表列出了的可能值状态
:
状态 |
描述 |
---|---|
|
算法在第一次迭代前处于初始状态。 |
|
算法正在执行迭代。在此状态下,输出函数可以停止优化的当前迭代。您可能希望输出函数停止迭代以提高计算效率。当状态设置为 |
|
该算法在迭代的末尾。 |
|
算法在最后一次迭代后处于最终状态。 |
下面的代码说明了输出函数如何使用状态
决定在当前迭代中执行哪些任务。
请检查是否应将“%iter”对话框中的“案例打印”或“案例打印”状态切换为“案例打印完成”,以确定是否应将“%iter”对话框中的“案例打印完成”或“案例打印结束”状态切换为“案例打印完成”
输出参数停止
这是一面国旗符合事实的
或错误的
. 该标志告诉优化函数优化是否停止(符合事实的
)还是继续(错误的
)。以下示例显示了使用停止
旗帜
输出函数可以基于当前数据在任何迭代中停止优化最优值
。例如,以下代码集停止
到符合事实的
如果目标函数值小于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');