在MATLAB的优化工具箱中,用于求解无约束非线性优化规划问题的函数有fminunc和fminsearch。
1.fminunc函数
用fminunc函数可以求多变量无约束函数的最小值。多变量无约束函数的数学模型为:
在上式中,x为向量,f (x)为函数,返回标量。
fminunc函数在给定初值的情况下,可以求多变量标量函数的最小值。其常用于无约束非线性最优化问题,语法格式为:
x = fminunc(fun,x0):给定初值x0,求fun函数的局部极小点x。x0可以是标量、向量或矩阵。
x = fminunc(fun,x0,options):用options中指定的优化参数进行最小化。
[x,fval] = fminunc(...):将解x处目标函数的值返回到fval参数中。
[x,fval,exitflag,output] = fminunc(...):返回exitflag值,描述函数的退出条件,返回包含优化信息的结构输出。
[x,fval,exitflag,output,grad,hessian] = fminunc(...):将解x处目标函数的Hessian矩阵信息返回hessian参数中。
表3-1中介绍了各输入/输出变量的描述。
表3-1 输入/输出变量描述表
| 变 量 | 描 述 |
|---|---|
| fun | fun为目标函数,即需要最小化的函数。fun函数需要输入向量参数x,返回x处的目标函数标量值f。可以将fun函数指定为M文件函数的句柄,如
x = fminunc(@myfun,x0)
其中myfun为MATLAB函数,具有下面的形式:
function f = myfun(x)
f = ... %计算x处的函数值
fun函数也可以是匿名函数的句柄,即:
x=fminunc(@(x)norm(x) 2,x0)
若fun函数的梯度可以求得,且SpecifyObjectiveGradient选项设为true,即:
options = optimoptions('fminunc', 'SpecifyObjectiveGradient',true)
则fun函数必须返回解x处的梯度向量g到第2个输出参数中。
如果Hess矩阵也可以求得,并且通过
options = optimoptions('fminunc','HessianFcn','objective')
将HessianFcn选项设置为'objective',且将Algorithm选项设置为'trust-region',则fun函数必须返回解x处的Hess对称矩阵H到第3个输出参数中。 |
| options | options为优化参数选项。指定为optimoptions的输出或optimset函数返回的结构体。
适用于所有算法的参数为:
Algorithm:选择算法,值为'quasi-newton'(默认值)或'trust-region',使用后者需要提供梯度。
CheckGradients:比较提供的梯度和有限差分导数,值为false(默认值)或true。
Diagnostics:是否显示最小化函数的诊断信息,值为'on'或'off'。
DiffMaxChange:变量有限差分的最大变化,默认值为Inf。 |
| options | DiffMinChange:变量有限差分的最小变化,默认值为0。
Display:显示级别。当选择'off'时,不显示输出;当选择'iter'时,显示每一步迭代过程的输出;当选择'final'时,显示最终结果。打印最小化函数的诊断信息。
FiniteDifferenceStepSize:有限差分的标量或向量步长因子。
FiniteDifferenceType:有限差分类型,值为'forward'(默认值)或'central',对应于前向差分和中心差分。
FunValCheck:检查目标函数值是否合法。当值为'on'时,如果目标函数返回复数值或NaN,则显示警告信息;当值为'off'时,不显示警告信息。默认值为'off'。
MaxFunEvaluations:函数评价的最大次数。
MaxIterations:最大允许迭代次数。
OutputFcn:每次迭代时优化函数调用的自定义函数。
PlotFcn:算法执行过程中进行绘图。
SpecifyObjectiveGradient:用户定义的目标函数梯度。
StepTolerance:x处的终止容限。
TypicalX:典型x值。
只用于trust-region算法的参数:
FunctionTolerance:函数的终止容限,默认值为1e-6。用optimset函数设置时,参数名称为TolFun。
HessianFcn:用户定义的目标函数的Hess矩阵,值为[](默认值)或'objective'。用optimset函数设置时,参数名称为HessFcn。
HessianMultiplyFcn:Hess乘函数的函数句柄。对于大型结构化问题,该函数在没有实际形成H的情况下计算Hess矩阵的叉积HY。函数形式为:
W=hmfun(Hinfo,Y)
其中,Hinfo包含计算HY用到的矩阵。第1个参数必须与目标函数fun返回的第3个参数相同:
[f,g,Hinfo]=fun(x)
Y矩阵的行数与问题的维数相同。
HessPattern:用于有限差分的Hess矩阵的稀疏形式。
MaxPCGIter:PCG迭代的最大次数。
PrecondBandWidth:PCG预条件上带宽。对于有些问题,增加带宽可以减少迭代次数。
SubproblemAlgorithm:迭代步的计算方式。
TolPCG:PCG迭代的终止容限。
只用于quasi-newton算法的参数介绍为:
HessUpdate:在拟Newton法中选择搜索方向的方法,包括'bfgs','dfp'和'steepdesc'。
ObjectiveLimit:容限(终止条件),默认值为-1e20。
UseParallel:是否以并行方式计算梯度。默认值为false。 |
| exitflag | 描述退出的条件介绍为: 1:表示目标函数收敛于解x处。 2:x处的改变小于指定容限。 3:目标函数值的改变小于指定容限。 5:目标函数值的预测值小于指定容限。 0:表示已经达到函数评价或迭代的最大次数。 -1:算法被输出函数终止。 -3:目标函数的迭代次数小于指定次数。 |
| grad | x处的梯度 |
| hessian | x处的Hess矩阵 |
| output | 该参数为包含优化信息的结构,其字段说明为: iterations:迭代次数。 firstorderopt:一阶最优性的度量。 lssteplength:相对于搜索方向的线搜索步的步长,仅用于拟牛顿法。 algorithm:所采用的算法。 funcCount:函数评价次数。 cgiterations:PCG迭代次数(只适用于'trust-region'算法)。 stepsize:最终步长的大小。 message:推出消息 |
2.fminsearch函数
使用fminsearch函数可以求解多变量无约束函数的最小值。该函数常用于无约束非线性最优化问题。其语法格式为:
x = fminsearch(fun,x0):初值为x0,求fun函数的局部极小点x。
x = fminsearch(fun,x0,options):用options指定的优化参数进行最小化。使用optimset函数进行设置。
[x,fval] = fminsearch(...):将x处的目标函数值返回fval参数中。
[x,fval,exitflag] = fminsearch(...):返回exitflag值,描述函数的退出条件。值为1时表示目标函数收敛于解x处;值为0时表示迭代次数超出了最大迭代次数,或函数计算次数超出了最大计算次数。
[x,fval,exitflag,output] = fminsearch(...):返回包含优化信息的输出参数output。
对于求解形式更复杂的目标函数的问题,fminsearch函数比fminunc函数有效。当问题为高度非线性时,fminsearch函数更具稳健性。应用fminsearch函数可能会得到局部最优解。fminsearch函数只对实数进行最小化,即x必须由实数组成,f (x)函数必须返回实数。如果x为复数,则必须将它分为实部和虚部两部分。另外,fminsearch函数不适合求解平方和问题,用lsqnonlin函数更好一些。