1.非线性规划matlab函数
非线性规划函数的约束函数和目标函数至少有一个是非线性函数。而对比于线性规划的区别也就一眼识别了。
MATLAB中用于求解非线性规划的函数为fmincon,其调用格式如下:
x= fmincon(f, x0,A, b)
x= fmincon(f, x0,A, b, Aeq, beq)
x= fmincon(f, x0, A, b, Aeg, beq, lb, ub)
x= fmincon(f, x0,A, b, Aeq, beq, lb, ub, nonlcon)
x= fmincon(f, x0, A, b, heq, beq, lb, ub, nonlcon, options)
[x,fval]= fmincon( ...)
[x, fval, exitflag]= fmincon( ...)
[x, fval, exitflag, output]= fmincon(... )
[x, fval, exitflag, output, lanbda] = fmincon( ... )
其中,x0为初始点,A,b分别为不等式约束的系数矩阵和右端列向量,lb,ub分别为变量x的下界和上界,options为指定优化参数进行最小化。
2.无约束非线性规划
2.1基本数学原理
求解无约束最优化问题的方法主要有两类。直接搜索法(searchmethod)和梯度法(gradient method)。
直接搜索法适用于目标函数高度非线性、没有导数或导数很难计算的情况。由于实际工程中很多问题都是非线性的,直接搜索法不失为一种有效的解决办法。常用的直接搜索法为单纯形法,此外还有HookeJeeves搜索法、Pavell共轭方向法等。
在函数的导数可求的情况下,梯度法是一种更优的方法。该法利用函数的梯度(一阶导数)和Hessian矩阵(二阶导数)构造算法,可以获得更快的收敛速度。函数f(x)的负梯度方向 -梯度f(x)反映了函数的最大下降方向,当搜索方向取为负梯度方向时称为最速下降法。常见的梯度法有最速下降法、Newton法、Marquart法、共轭梯度法和拟牛顿法(QuasiNewton method)等。
在所有这些方法中,用得最多的是拟牛顿法,这个方法在每次迭代过程中建立曲率信息,构成二次模型问题。
下面介绍有关MATLAB优化工具箱中求解无约東最优化问题的算法。
- (1)大型优化算法:若用户在函数中提供梯度信息,则函数将默认选择大型优化算法,该算法是基于内部映射牛顿法的子空间置信域法。计算中的每一次迭代涉及用PCG法求解大型线性系统得到的近似解。
- (2)中型优化算法: fminunc函数的参数options.LargeScale设置为off。该算法采用的是基于二次和三次混合插值一维搜索法的BFGS拟牛顿法。但- .般不建议使用最速下降法。
- (3)默认时的一维搜索算法:当options. LineSearch Type设置为quadcubic时,将采用二次和三次混合插值法。将options. LineSearchType设置为cubiepoly 时,将采用三次插值法。第二种方法需要的目标函数计算次数更少,但梯度的计算次数更多。这样,如果提供了梯度信息,或者能较容易地计算出,则三次插值法是更好的选择。
上述涉及的算法局限性主要表现在以下4个方面:
- 目标函数必须是连续的。fminunc函数有时会给出局部最优解。
- fminune 函数只对实数进行优化,即x必须为实数,而且f(x)必须返回实数。 当x为复数时,必须将它分解为实部和虚部。
- 在使用大型算法时,用户必须在fun函数中提供梯度(options参数中GradObj 属性必须设置为on)。
- 目前若在fun函数中提供了解析梯度,则options参数DerivativeCheck 不能用于大型算法以比较解析梯度和有限差分梯度。通过将options参数的Maxlter属性设置为0用中型方法核对导数,然后重新用大型方法求解问题。
2.2无约束非线性规划函数
- fminunc函数
该函数用于求多变量无约束函数的最小值,其调用格式如下:
fminunc给定初值,求多变量标量函数的最小值,常用于无约束非线性最优化问题。
x = fminunc(fun,x0):给定初值x0,求fun函数的局部极小点x。x0可以是标量、向量或矩阵。
x = fminunc(fun, x0 ,options):用options参数中指定的优化参数进行最小化。
x = fminunc( fun, x0 ,options,P1,P2,…):将问题参数P1、P2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的默认值。
[x,fval]=fminunc(…):将解x处目标函数的值返回到fval参数中。
[x.fval,exitflag] = fminunc(…): 返回exitflag值,描述函数的输出条件。
[x.fval,exitflag,output] = fminunc(…): 返回包含优化信息的结构输出。
[x,fval,exitflag ,output,grad] = fminunc(…):将解x处fun 函数的梯度值返回到grad参数中。
[x,fval, exitflag, output, grad, hessian] = fminunc(…): 将解x处目标函数的Hessian矩阵信息返回到hessian参数中。
输人/输出变量的描述如下表所示。
变量 | 描述 |
---|---|
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=…若fun函数的梯度可以算得,且options.GradObj设为on :options = opt inset( ‘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 = opt imset( ‘Hessian’, ‘on’)则fun函数必须返回解x处的Hessian对称矩阵H到第3个输出变量中去。当被调用的fun函数只需要一个或两个输出变量时(如算法只需要目标函数的值I和梯度值g而不需要Hessian矩阵H时),可以通过核对nargout的值来避免计算Hessian矩阵 |
options | 优化参数选项。可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外-些则只适用于中型问题。首先描述适用于大型问题的选项。这仅是一个参考,因为使用大型问题算法需要满足一些条件。对于fminune函数来说.必须提供梯度信息。LargeScale;当设为on时.使用大型算法:若设为off时,则使用中型问题的算法。适用于大型和中型算法的参数如下:Diagnostics:打印最小化函数的诊断信息。Display:显示水平。选择off,不显示输出:选择iter.显示每一步迭代过 程的输出:选择final,显示最终结果.打印最小化函数的诊断信息。GradObj:用户定义的目标函数的梯度。对于大型问题此参数是必选的,对于中型问题则是可选项。MaxFunEvals:函数评价的最大次数。Maxlter:最大允许迭代次数。TolFun;函数值的终止容限。TolX: x处的终止容限。只用于大型算法的参数如下:Hessian:用户定义的目标函数的Hessian矩阵。HessPattern:用于有限差分的Hessian矩阵的稀疏形式。若不方便求fun丙数的稀琉Hessian矩阵H.可以通过用梯度的有限差分获得的H的稀疏结构(如非零值的位置等)来得到近似的Hessian矩阵H。若连矩阵的稀疏结构都不知道,则可以将HessPattern设为密集矩阵,在每一次迭代过程中,都将进行密集矩阵的有限差分近似(这是默认设置的)。这将非常麻烦,所以花一些力气得到Hessian矩阵的稀疏结构还是值得的。MaxPCGIter; PCG迭代的最大次数。PrecondBandWidth: PCG前处理的上带宽,默认为零。对于有些问题,增加带宽可以减少迭代次数。TolPCG: PCG迭代的终止容限。TypicalX:典型2值。只用于中型算法的参数如下:DerivativeCheck:对用户提供的导数和有限差分求出的导数进行对比。DiffMaxChange:变量有限差分梯度的最大变化。DiffMinChange:变量有限差分梯度的最小变化。LineSearchType: 一维搜索算法的选择 |
exitflag | 描述退出条件如下:>0;表示目标函数收敛于解x处。0:表示已经达到函数评价或迭代的最大次数。<0:表示目标函数不收敛 |
output | 该参数包含的优化信息如下:output, iterations:迭代次数。output. algorithm:所采用的算法。output. funcCount:函数评价次数。output. cgiterations: PCG 迭代次数(只适于大型规划问题)。output. stepsize :最终步长的大小(只用于中型问题)。output. firstorderopt:一阶优化的度量,解x处梯度的范数 |
- fminsearch
该函数是求解多变量无约束函数的最小值.其调用格式如下:
fminsearch求解多变量无约束函数的最小值。该函数常用于无约束非线性最优化问题。
x = fminsearch(fun,x0):初值为x0,求fun函数的局部极小点x。x0可以是标量、向量或矩阵。
x = fminsearch( fun, x0 ,options):用options参数指定的优化参数进行最小化。
x = fminsearch( fun, x0 ,options,P,P…):将问题参数P1、P2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的默认值。
[x,fval] = fminsearch(…):将x处的目标函数值返回到fval 参数中。
[x,fval,exitflag] = fminsearch(…): 返回exitflag值,描述函数的退出条件。
[x, fval, exitflag, output] = fminsearch(…): 返回包含优化信息的输出参数output。 - fminbnd函数
该函数是求解局部极小值点,只可能返回一个极小值点,其调用格式如下:
[x, fval] = fminbnd( fun, x1, x2, options)
X= fminbnd(...)
例 求minf(x)=e -x+2x2 ,其搜索区间为(0,2)。
clear all
clc
[x,fral]= fminbnd('exp(-x)+2*x.^2',0,2)
- lsqnonlin函数
该函数为求解多元非线性最小二乘问题。
非线性最小二乘问题的数学模型为
minf(x)= Σfi(x)2 +L 。L为常数,范围从i=1到m的求和
函数调用格式如下:
x= lsqnonlin( fun, x0)
x= lsqnonlin( fun, x0, 1b, ub)
x = lsqnonlin( fun, x0, options)
x= lsqnonlin( fun, x0, options,P1,P2)
[x, resnorm] = lsqnonlin( )
[x, resnorm, residual, exitflag] = lsqnonlin( ... )
[x, resnorm, residual,exitflag, output] = lsqnonlin( ... )
[x, resnorm, residual, exitflag, output, lambda] = lsqnonlin(...)
[x, resnorm, r esidual, exitflag, output, lambda, jacobian] = lsqnonlin( )
其中,x返回解向量; resnorm 返回x处残差的平方范数值sum(fun(x). ^2);residual返回x处的残差值fun(x); lambda 返回包含x处Lagrange乘子的结构参数;jacobian返回解x处的fun函数的雅可比矩阵。
lsqnonlin默认时选择大型优化算法。Lsqnonlin 通过将options. LargeScale设置为’off’来选择中型优化算法,其采用一维搜索法。
例 求解minf(x)=3 (x2一x1)2十(x2-5)2 ,其初始点为(1,2)。
clear all
clc
f = '3*(x(2)-x(1))^2+(x(2)-5)^2'
[x,resnorm] =lsqnonlin(f,[1,2])
3.求解非线性规划
3.1 一维最优化方法
一维最优化方法是指寻求一元函数在某区间上最优值点的方法。这类方法不仅有实用价值,而且大量多维最优化方法都依赖于一系列的一维最优化方法。常用的一维最优化方法有黄金分制法、切线法和插值法。
- (1)黄金分割法,又称0.618法。它适用于单峰函数。其基本思想是在初始寻查区间中设计一列点,通过逐次比较其函数值,逐步缩小寻查区间,以得出近似最优值点。
- (2)切线法,又称牛顿法。它也是针对单峰函数的。其基本思想是在一个猜测点附近将目标函数的导函数线性化.用此线性函数的零点作为新的猜测点,逐步迭代去逼近最优点。
- (3)插值法,又称多项式逼近法。其基本思想是用多项式(通常用二次或三次多项式)去拟合目标函数。
此外,还有斐波那契法、割线法、有理插值法、分批搜索法等。
3.2 无约束最优化方法
无约束最优化方法是指上述一般非线性规划模型的求解方法。常用的约東最优化方法有以下4种:
- (1)拉格朗日乘子法:它是将原问题转化为求拉格朗日函数的驻点。
- (2)制约函数法:又称系列无约束最小化法,简称SUMT法。它又分为两类,一类叫惩罚函数法,又称外点法:另一类叫障碍函数法,又称内点法。它们都是将原问题转化为一系列无约束问题来求解。
- (3)可行方向法:这是一类通过逐次选取可行下降方向去逼近最优点的迭代算法。如佐坦迪克法、弗兰克沃尔夫法、投影梯度法和简约梯度法都属于此类算法。
- (4)近似型算法:这类算法包括序贯线性规划法和序贯二次规划法。前者将原问题化为一系列线性规划问题来求解,后者将原问题化为一系列二次规划问题来求解。
3.3 约束最优化方法
约束最优化方法是指寻求n元实函数在整个n维向量空间上的最优值点的方法。这类方法的意义在于虽然实用规划问题大多是有约束的,但许多约束最优化方法可将有约束问题转化为若干无约束问题来求解。
无约束最优化方法大多是逐次一维搜索的迭代算法。这类迭代算法可分为两类。一类需要用目标函数的导函数,称为解析法。另一类不涉及导数,只用到函数值,称为直接法。这些迭代算法的基本思想是在- - 个近似点处选定-一个有 利搜索方向,沿这个方向进行一维寻查,得出新的近似点。然后对新点施行同样手续,如此反复迭代,直到满足预定的精度要求为止。根据搜索方向的取法不同,可以有各种算法。属于解析型的算法有以下4种:
- (1)梯度法:又称最速下降法。这是早期的解析法,收敛速度较慢。
- (2)牛顿法:收敛速度快,但不稳定,计算也较困难。
- (3)共轭梯度法:收敛较快,效果较好。
- (4)变尺度法:这是-类效率较高的方法。其中达维登弗菜彻鲍威尔变尺度法,简 称DFP法,是最常用的方法。
属于直接型的算法有交替方向法(又称坐标轮换法)。模式搜索法、旋转方向法、鲍威尔共轭方向法和单纯形加速法等。