有约束非线性最优化问题相关函数介绍

利用fmincon函数可以求多变量有约束非线性函数的最小值。假设多变量非线性函数的数学模型为:

\[\begin{matrix} \begin{matrix} {min}_{x}f\left( x \right) \\ c(x)\leq0 \end{matrix} \\ ceq(x)=0 \\ A•x\leq b \\ Aeq•x=beq \\ lb\leq x\leq ub \end{matrix}\]

在上式中,x, b, beq, lb,和ub为向量,A和Aeq为矩阵,c(x)和ceq(x)为函数,返回标量。f (x), c(x)和 ceq(x)可以是非线性函数。

fmincon函数的语法格式为:

x = fmincon(fun,x0,A,b):给定初值x0,求解fun函数的最小值x。fun函数的约束条件为Ax <= b,x0可以是标量、向量或矩阵。

x = fmincon(fun,x0,A,b,Aeq,beq):最小化fun函数,约束条件为Aeq*x = beq 和 A*x <= b。若没有不等式存在,则设置A=[ ],b=[ ]。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub):定义设计变量x的下界lb和上界ub,使得总有lb <= x <= ub。若无等式存在,则令Aeq=[ ],beq=[ ]。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon):在上面的基础上,在nonlcon参数中提供非线性不等式c(x)或等式ceq(x)。 fmincon函数要求c(x) <= 0且ceq(x) = 0。当无边界存在时,令lb=[ ]和(或)ub=[ ]。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options):用optiions指定的参数进行最小化。

[x,fval] = fmincon(...):返回解x处的目标函数值。

[x,fval,exitflag,output] = fmincon(...):返回exitflag参数,描述函数计算的退出条件,以及包含优化信息的输出参数output。exitflag参数的值为1时表示计算收敛于x处,为0时表示迭代次数超出最大迭代次数或函数计算次数大于最大计算次数时计算终止,为-1时表示由输出函数或绘图函数终止,为-2时表示找不到可行点,为2时表示x的变化小于步长容限或最大约束超出值小于指定容限,为3时表示目标函数值的变化小于指定容限或最大约束超出值小于指定容限,为4时表示搜索方向的模小于指定容限,为5时表示搜索方向中方向导数的模小于指定容限,为-3时表示当前迭代的目标函数低于指定容限。

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...):返回解x处包含Lagrange乘子的lambda参数,解x处fun函数的梯度和解x处fun函数的Hess矩阵。

在各语法格式中,nonlcon用于计算非线性不等式约束c(x)<=0 和非线性等式约束ceq(x)=0。 nonlcon是一个包含函数名的字符串。该函数可以是M文件、内部文件或MEX文件。它要求输入一个向量x,返回两个变量——解x处的非线性不等式向量c和非线性等式向量ceq。例如,若nonlcon='mycon',则M文件mycon.m具有下面的形式:

code.matlab
function [c,ceq] = mycon(x)
    c = ...     % 计算x处的非线性不等式。
    ceq = ...   % 计算x处的非线性等式。

若还计算了约束的梯度,即

code.matlab
options = optimset('GradConstr','on')

则nonlcon函数必须在第3个和第4个输出变量中返回c(x)的梯度GC和ceq(x)的梯度Gceq。当被调用的nonlcon函数只需要两个输出变量(此时优化算法只需要c和ceq的值,而不需要GC和GCeq)时,可以通过查看nargout的值来避免计算GC和Gceq的值。

code.matlab
function [c,ceq,GC,GCeq] = mycon(x)
c = ...          	% 解x处的非线性不等式。
ceq = ...        	% 解x处的非线性等式。
if nargout > 2   	% 被调用的nonlcon函数,要求有4个输出变量。
    GC = ...    	% 不等式的梯度。
    GCeq = ...    	% 等式的梯度。
end

若nonlcon函数返回有m个元素的向量c和长度为n的x,则c(x)的梯度GC是一个nm的矩阵,其中GC(i, j)是c(j)对x(i)的偏导数。同样,若ceq是一个p元素的向量,则ceq(x)的梯度Gceq是一个np矩阵,其中Gceq(i, j)是ceq(j)对x(i)的偏导数。