1.设置优化选项
可以使用由 optimset 函数创建的 options 结构体来指定优化参数。然后,可以将 options 作为输入传递给优化函数,例如,通过使用以下语法调用 fminbnd
x = fminbnd(fun,x1,x2,options)
或使用以下语法调用 fminsearch
x = fminsearch(fun,x0,options)
例如,要显示算法在每次迭代中的输出,请将 Display 选项设置为 'iter' :
options = optimset( 'Display' , 'iter' );
1.1 容差和终止条件
优化中的迭代次数取决于求解器的终止条件。这些条件包括几个可以设置的容差。一般来说,容差是一个阈值,超过阈值时将终止求解器的迭代。
提示: 一般情况下,将 TolFun 和 TolX 容差设置为远高于 eps 并通常高于 1e-14。设置小容差并不能保证得到精确的结果。相反,求解器在收敛时无法识别,并可能继续进行无用的迭代。容差值小于 eps 实际上是禁用了这种终止条件。此技巧不适用于 fzero ,它为 TolX 使用默认值 eps 。
• TolX 是步长的下界,表示 (x i – x i+1 ) 的范数。如果求解器尝试小于 TolX 的步长,则终止迭代。求解器通常将 TolX 用作相对边界,表示在达到 |(x i – x i+1 )| < TolX *(1 + |x i |) 或类似的相对测度时终止迭代。
• TolFun 是步长中目标函数值变化的下边界。如果 |f(x i ) – f(x i+1 )| < TolFun,则终止迭代。求解器通常将 TolFun 用作相对边界,表示在达到 |f(x i ) – f(x i+1 )| < TolFun (1 + |f(x i )|) 或类似的相对测度时终止迭代。
• MaxIter 是求解器迭代数量的边界。 MaxFunEvals 是函数求值数量的边界。
注意:与其他求解器不同, fminsearch 在同时满足 TolFun 和 TolX 时停止运行。
1.2 输出结构体
output 结构体包括函数计算次数、迭代次数和算法。当为 fminbnd 、 fminsearch 或 fzero 提供第四个输出参数时,将显示此结构体,如下所示
[x,fval,exitflag,output] = fminbnd(@humps,0.3,1);
函数参考页面上提供了每个求解器的 output 结构体的详细信息。
output 结构体选项不能选择用于 optimset 。它是 fminbnd 、 fminsearch 和 fzero 的可选输出。
2.优化求解器迭代输出
通过使用 optimset 将 Display 选项设置为 'iter',可以获取求解器采取的步骤的详细信息。显示的输出包含以下列表中的标题和项。
3. 优化求解器输出函数
输出函数是优化函数在算法的每次迭代过程中调用的函数。通常,使用输出函数生成图输出,记录算法生成的数据的历史信息,或者根据当前迭代的数据暂停算法。可以按函数文件、局部函数或嵌套函数的形式创建输出函数。
OutputFcn 选项可以与下列 MATLAB 优化函数配合使用:
• fminbnd
• fminsearch
• fzero
3.1 创建和使用输出函数
下面给出了输出函数的一个简单示例,该输出函数绘制优化函数生成的点。
function stop = outfun(x, optimValues, state)
stop = false;
hold on;
plot(x(1),x(2),'.');
drawnow
在解算以下优化问题时,可以使用此输出函数绘制 fminsearch 生成的点
为此,
1 创建一个包含前述代码的文件,并将其作为 outfun.m 保存在 MATLAB 路径的文件夹中。
2 将 options 结构体的 Outputfcn 字段的值设置为 outfun 的函数句柄。
options = optimset( 'OutputFcn' , @outfun);
3 输入以下命令:
hold on
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], options)
hold off
这些命令返回解
x =
0.1290 -0.5323
fval =
-0.5689
并显示以下关于 fminsearch 生成的点的绘图:
3.2 输出函数的结构体
输出函数的函数定义行采用以下格式:
stop = outfun(x, optimValues, state)
其中
• stop 是一个标志,根据优化例程是停止还是继续,该标志为 true 或 false。。
• x 是算法在当前迭代中计算的点。
• optimValues 是包含当前迭代中的数据的结构体。
• state 是算法的当前状态。。
优化函数在每次迭代中将输入参数的值传递给 outfun 。
3.3 嵌套输出函数的示例
示例不需要输出函数在每次迭代后保留数据。如果不需要保存各次迭代之间的数据,可以将输出函数编写为函数文件,并从命令行直接调用优化函数。但是,要使输出函数在每次迭代后记录数据,请编写一个用于实现以下目的的文件:
• 以嵌套函数的形式包括输出函数 - 有关详细信息,请参阅 MATLAB 编程基础中的“嵌套函数”。
• 调用优化函数。
在以下示例中,函数文件还包含目标函数作为局部函数。您也可以将目标函数编写为单独的文件或匿名函数。
嵌套函数可以访问其所在的文件中的变量。因此,此方法使输出函数能够在每次迭代后保留变量。
以下示例使用输出函数记录以下求解中的 fminsearch 迭代:
输出函数以矩阵(称为 history)的形式返回点序列。要运行此示例,请执行下列步骤:
1使用 MATLAB 编辑器打开一个新文件。
2 将以下代码复制并粘贴到此文件。
function [x fval history] = myproblem(x0)
history = [];
options = optimset( 'OutputFcn' , @myoutput);
[x fval] = fminsearch(@objfun, x0,options);
function stop = myoutput(x,optimvalues,state);
stop = false;
if isequal(state, 'iter' )
history = [history; x];
end
end
function z = objfun(x)
z = exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));
end
end
3 将文件作为 myproblem.m 保存到 MATLAB 路径上的某个文件夹中。
4 在 MATLAB 提示符下,输入
[x fval history] = myproblem([-1 1]);
函数 fminsearch 返回最佳点 x 及 x 处的目标函数值 fval 。
x,fval
x =
0.1290 -0.5323
fval =
-0.5689
此外,输出函数 myoutput 向 MATLAB 工作区返回矩阵 history,该矩阵包含算法在每次迭代中生成的点。 history 的前四行为
history(1:4,:)
ans =
-1.0000 1.0000
-1.0000 1.0000
-1.0750 0.9000
-1.0125 0.8500
history 最后一行的点与最佳点 x 相同。
history(end,:)
ans =
0.1290 -0.5323
objfun(history(end,:))
ans =
-0.5689
3.4 optimValues 中的字段
下表列出了由优化函数 fminbnd 、 fminsearch 和 fzero 提供的 optimValues 结构体的字段。表的“命令行显示标题”列中列出了将 options 的 Display 参数设置为 'iter' 时显示的标题。
3.5 算法的状态
下表列出了 state 的可能值:
下面的代码演示输出函数如何使用 state 的值来确定要在当前迭代中执行的任务。
switch state
case 'init'
% Setup for plots or dialog boxes
case 'iter'
% Make updates to plots or dialog boxes as needed
case 'interrupt'
% Check conditions to see whether optimization
% should quit
case 'done'
% Cleanup of plots, dialog boxes, or final plot
end
3.6 Stop 标签
输出参数 stop 是 true 或 false 的标签。此标志通知优化函数优化是停止 ( true ) 还是继续 ( false)。下面的示例演示了使用 stop 标签的典型方法。
1)根据 optimValues 中的数据停止优化
输出函数可以根据 optimValues 中的当前数据在任何迭代中停止优化。例如,下面的代码在目标函数值小于 5 时将 stop 设置为 true :
function stop = myoutput(x, optimValues, state)
stop = false;
% Check if objective function is less than 5.
if optimValues.fval < 5
stop = true;
end
2)基于对话框输入停止优化
在设计 UI 来执行优化时,可以采用控件(例如停止按钮)使输出函数停止优化。以下代码显示如何执行此回调。代码假定 停止 按钮回调将值 true 存储在名为 hObject 的 handles 结构体的 optimstop 字段中,而该结构体又存储在 appdata 中。
function stop = myoutput(x, optimValues, state)
stop = false;
% Check if user has requested to stop the optimization.
stop = getappdata(hObject, 'optimstop' );
4.优化求解器绘制函数
options 结构体的 PlotFcns 字段指定优化函数在每次迭代时调用的一个或多个函数,用于绘制各种进度测度。传递函数句柄或函数句柄的元胞数组。绘图函数的结构体与输出函数的结构体相同。
PlotFcns 选项可以与下列 MATLAB 优化函数配合使用:
• fminbnd
• fminsearch
• fzero
这些优化函数的预定义绘图函数包括:
• @optimplotx 绘制当前点
• @optimplotfval 绘制函数值
• @optimplotfunccount 绘制函数计数(不适用于 fzero )
要查看或修改预定义的绘图函数,请使用 MATLAB 编辑器打开函数文件。例如,要查看函数文件以便绘制当前点,请输入:
edit optimplotx.m
例如,想要查看使用 fminsearch 与绘图函数 @optimplotfval 求最小值的进度:
1 为目标函数编写一个文件。在本示例中,使用:
function f = onehump(x)
r = x(1)^2 + x(2)^2;
s = exp(-r);
f = x(1)*s+r/20;
2 设置 options 以便使用绘图函数:
options = optimset( 'PlotFcns' ,@optimplotfval);
3 从 [2,1] 起调用 fminsearch :
[x ffinal] = fminsearch(@onehump,[2,1],options)
4 MATLAB 返回以下内容:
x =
-0.6691 0.0000
ffinal =
-0.4052