您的位置:首页 > 编程语言 > MATLAB

Matlab优化函数中options选项的修改

2015-09-15 21:28 363 查看
关于非线性优化fminbnd函数的说明(仅供新手参考)

初学matlab优化,迭代中止后,经常一头雾水。参看帮助后仍似懂非懂。下面关于fminbnd函数的说明(也可作为fmincon函数的参考)对于新手也许会有帮助,不当之处请指正。

目标函数fun:

需要最小化的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。可以将fun函数指定为命令行,如

x = fminbnd(inline('sin(x*x)'),x0)

同样,fun参数可以是一个包含函数名的字符串。对应的函数可以是M文件、内部函数或MEX文件。若fun='myfun',则M文件函数myfun.m

有下面的形式

function f = myfun(x)

f = ... %计算x处的函数值。

若fun函数的梯度可以算得,且options.GradObj设为'on'(用下式设定),

options = optimset('GradObj','on')

则fun函数必须返回解x处的梯度向量g到第二个输出变量中去。注意,当被调用的fun函数只需要一个输出变量时(如算法只需要目标函数的值而不需要其梯度值时),可以通过核对nargout的值来避免计算梯度值。

function [f,g] = myfun(x)

f = ... %计算x处得函数值。

if nargout > 1 %调用fun函数并要求有两个输出变量。

g = ... %计算x处的梯度值

end

若Hessian矩阵也可以求得,并且options.Hessian设为'on',即,

options = optimset('Hessian','on')

则fun函数必须返回解x处的Hessian对称矩阵H到第三个输出变量中去。注意,当被调用的fun函数只需要一个或两个输出变量时(如算法只需要目标函数的值f和梯度值g而不需要Hessian矩阵H时),可以通过核对nargout的值来避免计算Hessian矩阵

function [f,g,H] = myfun(x)

f = ... % 计算x处得函数值。

if nargout > 1 % 调用fun函数并要求有两个输出变量。

g = ... % 计算x处的梯度值。

if nargout > 2

H = ... % 计算x处的Hessian矩阵。

End

优化参数选项options:

可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外一些则只适用于中型问题。

首先描述适用于大型问题的选项。这仅仅是一个参考,因为使用大型问题算法有一些条件。对于fminunc函数来说,必须提供梯度信息。

LargeScale – 当设为'on'时使用大型算法,若设为'off'则使用中型问题的算法。

适用于大型和中型算法的参数:

Diagnostics – 打印最小化函数的诊断信息。

Display – 显示水平。选择'off',不显示输出;选择'iter',显示每一步迭代过程的输出;选择'final',显示最终结果。打印最小化函数的诊断信息。

GradObj – 用户定义的目标函数的梯度。对于大型问题此参数是必选的,对于中型问题则是可选项。

MaxFunEvals – 函数评价的最大次数。

MaxIter – 最大允许迭代次数。

TolFun – 函数值的终止容限。

TolX – x处的终止容限。

只用于大型算法的参数:

Hessian – 用户定义的目标函数的Hessian矩阵。

HessPattern –用于有限差分的Hessian矩阵的稀疏形式。若不方便求fun函数的稀疏Hessian矩阵H,可以通过用梯度的有限差分获得的H的稀疏结构(如非零值的位置等)来得到近似的Hessian矩阵H。若连矩阵的稀疏结构都不知道,则可以将HessPattern设为密集矩阵,在每一次迭代过程中,都将进行密集矩阵的有限差分近似(这是缺省设置)。这将非常麻烦,所以花一些力气得到Hessian矩阵的稀疏结构还是值得的。

MaxPCGIter – PCG迭代的最大次数。

PrecondBandWidth – PCG前处理的上带宽,缺省时为零。对于有些问题,增加带宽可以减少迭代次数。

TolPCG – PCG迭代的终止容限。

TypicalX – 典型x值。

只用于中型算法的参数:

DerivativeCheck – 对用户提供的导数和有限差分求出的导数进行对比。

DiffMaxChange – 变量有限差分梯度的最大变化。

DiffMinChange - 变量有限差分梯度的最小变化。

LineSearchType – 一维搜索算法的选择。

exitflag:描述退出条件

exitflag>0
表示目标函数收敛于解x处。

exitflag=0 表示已经达到函数评价或迭代的最大次数。

exitflag<0 表示目标函数不收敛。

output:

该参数包含下列优化信息:

output.iterations – 迭代次数。

output.algorithm – 所采用的算法。

output.funcCount – 函数评价次数。

output.cgiterations – PCG迭代次数(只适用于大型规划问题)。

output.stepsize – 最终步长的大小(只用于中型问题)。

output.firstorderopt – 一阶优化的度量:解x处梯度的范数。

[ 本帖最后由
yxzjs 于 2008-1-9 23:09 编辑 ]

建议:

1.对于求解平方和的问题,fminunc函数不是最好的选择,用lsqnonlin函数效果更佳。

2.使用大型方法时,必须通过将options.GradObj设置为'on'来提供梯度信息,否则将给出警告信息。

关于算法:

大型优化算法 若用户在fun函数中提供梯度信息,则缺省时函数将选择大型优化算法,该算法是基于内部映射牛顿法的子空间置信域法,理论描述可参见文献[8],[9]。计算中的每一次迭代涉及到用PCG法求解大型线性系统得到的近似解。

中型优化算法 此时fminunc函数的参数options.LargeScale设置为'off'。该算法采用的是基于二次和三次混合插值一维搜索法的BFGS拟牛顿法。该法通过BFGS公式来更新Hessian矩阵。通过将HessUpdate参数设置为'dfp',可以用DFP公式来求得Hessian矩阵逆的近似。通过将HessUpdate参数设置为'steepdesc',可以用最速下降法来更新Hessian矩阵。但一般不建议使用最速下降法。

缺省时的一维搜索算法,当options.LineSearchType 设置为'quadcubic'时,将采用二次和三次混合插值法。将options.LineSearchType设置为'cubicpoly'时,将采用三次插值法。第二种方法需要的目标函数计算次数更少,但梯度的计算次数更多。这样,如果提供了梯度信息,或者能较容易地算得,则三次插值法是更佳的选择

局限性:

1.目标函数必须是连续的。fminunc函数有时会给出局部最优解。

2.fminunc函数只对实数进行优化,即x必须为实数,而且f(x)必须返回实数。当x为复数时,必须将它分解为实部和虚部。

3.在使用大型算法时,用户必须在fun函数中提供梯度(options参数中GradObj属性必须设置为'on')。

4.目前,若在fun函数中提供了解析梯度,则options参数DerivativeCheck不能用于大型算法以比较解析梯度和有限差分梯度。通过将options参数的MaxIter 属性设置为0来用中型方法核对导数。然后重新用大型方法求解问题。

通常在使用Matlab优化工具箱中的函数时,需要根据不同要求修改优化选项,例如最大迭代次数、x处的终止容限等等。可通过 optimset 语句来修改优化选项参数:

options=optimset(‘optionName’,’optionValue’);如:

options=optimset('tolx',1e-100);

options=optimset(options,'tolfun',1e-100);

后面还可以依此法添加很多选项信息。

下面举一个完整例子:求取f=4*x(1)^2+5*x(1)*x(2)+2*x(2)^2的最小值

---------------------------------------------------------------------------------------------function [f,g]=ff3(x)

f=4*x(1)^2+5*x(1)*x(2)+2*x(2)^2;

if nargut >1

g(1)=8*x(1)+5*x(2);

g(2)=5*x(1)+4*x(2);

end

通过下面将优化选项结构options.GradObj设置为’on’来得到梯度值。

options=optimset(‘Gradobj’,’on’);

x0=[1,1];

[x,fval,exitflag]=fminunc(@ff3,x0,options)

---------------------------------------------------------------------------------------------

Options的参数描述(OPTIMSET):

%OPTIMSET PARAMETERS

�rivativeCheck - Compare user supplied derivatives (gradients or Jacobian)

% to finite-differencing derivatives [ on | {off}]

%Diagnostics - Print diagnostic information about the function to be

% minimized or solved [ on | {off}]

%DiffMaxChange - Maximum change in variables for finite difference gradients

% [ positive scalar | {1e-1} ]

%DiffMinChange - Minimum change in variables for finite difference gradients

% [ positive scalar | {1e-8} ]

%Display - Level of display [ off | iter | notify | final ]

%GoalsExactAchieve - Number of goals to achieve exactly (do not over- or

% under-achieve) [ positive scalar integer | {0}]

%GradConstr - Gradients for the nonlinear constraints defined by user

% [ on | {off} ]

%GradObj - Gradient(s) for the objective function(s) defined by user

% [ on | {off}]

%Hessian - Hessian for the objective function defined by user [ on | {off} ]

%HessMult - Hessian multiply function defined by user

% [ function | {[]} ]

%HessPattern - Sparsity pattern of the Hessian for finite-differencing

% [ sparse matrix ]

%HessUpdate - Quasi-Newton updating scheme

% [ {bfgs} | dfp | gillmurray | steepdesc ]

%Jacobian - Jacobian for the objective function defined by user

% [ on | {off}]

%JacobMult - Jacobian multiply function defined by user

% [ function | {[]} ]

%JacobPattern - Sparsity pattern of the Jacobian for finite-differencing

% [ sparse matrix ]

%LargeScale - Use large-scale algorithm if possible [ {on} | off ]

%LevenbergMarquardt - Chooses Levenberg-Marquardt over Gauss-Newton algorithm

% [ on | off]

%LineSearchType - Line search algorithm choice [ cubicpoly | {quadcubic} ]

%MaxFunEvals - Maximum number of function evaluations allowed

% [ positive integer ]

%MaxIter - Maximum number of iterations allowed [ positive integer ]

%MaxPCGIter - Maximum number of PCG iterations allowed [positive integer]

%MeritFunction - Use goal attainment/minimax merit function

% [ {multiobj} | singleobj ]

%MinAbsMax - Number of F(x) to minimize the worst case absolute values

% [ positive scalar integer | {0} ]

%PrecondBandWidth - Upper bandwidth of preconditioner for PCG

% [ positive integer | Inf | {0} ]

%TolCon - Termination tolerance on the constraint violation [ positive scalar ]

%TolFun - Termination tolerance on the function value [ positive scalar ]

%TolPCG - Termination tolerance on the PCG iteration

% [ positive scalar | {0.1} ]

%TolX - Termination tolerance on X [ positive scalar ]

%TypicalX - Typical X values [ vector ]

---------------------------------------------------------------------------------------------

注:

优化问题求解时常常需要对相对误差,使用算法等进行设置.Matlab提供了options向量来对优化函数进行参数设置,options向来由18个元素.目前已经被optimset和optimget代替,详情可查阅函数optimset和optimget

下面逐个说明各个参数的功能和取值.

Options(1)=0(默认值)

功能:控制显示,优化过程中控制输出信息,0表示不显示;1表示显示;-1表隐藏信息.

Options(2)=1e-4

功能:控制x的精度,自变量x的最低精度终止条件.当所有终止条件都满足的时候,优化终止.

Options(3)=1e-4

功能:控制 f 精度,目标函数f的最低精度终止条件.当所有终止条件都满足的时候,优化终止.

options(4)=1e-7

功能:约束g的最低精度终止判别条件.当所有的终止条件都满足的时候,优化终止.

options(5)=0

功能:选择主要优化算法.

options(6)=0

功能:SD算法控制.选择搜索方向算法.

options(7)=0

功能:搜索算法控制.选择线性搜索算法.

options(8)=N/A

功能:函数值,算法结束时极值点的函数值,attgoal和minimax而言,它包含一个到达因子.

options(9)=0

功能:梯度检查控制.当值为1时,在最初的几个迭代周期,梯度将与有限差分计算的结果比较,此时,梯度函数必须存在.

options(10)=N/A

功能:函数计算计数.

options(11)=N/A

功能:梯度计算计数.

options(12)=N/A

功能:限定计数,限定函数梯度计算或差分梯度计算的次数.

options(13)=0

功能:等式约束个数,等式约束必须放在g的前几个元素中.

options(14)=0*n

功能:最大迭代次数,该值缺省时被置为n的100倍,n为自变量x的个数,在fmins中,缺省为n的200倍,在fminu中,为500n.

options(15)=0

功能:目标数,尽可能接近goals的目标数,由函数attgoal使用.

options(16)=1e-8

功能:最小摄动控制.有限差分梯度计算中的最小变化.对函数的梯度计算而言,实际使用的摄动将自动调整以提高精度,它将在最小摄动和最大摄动之间变化.

options(17)=0,1

有限差分梯度计算中变量的最大变化.

options(18)=N/A

功能:步长控制,在第一步迭代被赋值为1或更小
http://blog.sina.com.cn/s/blog_68b0c65f0100mq5m.html http://www.ilovematlab.cn/thread-99442-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: