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