fmincon函数•功能:求多变量有约束非线性函数的最小值。•数学模型:•minF(X)•subjectto:A*X=B,Aeq*X=Beq(线性约束)C(X)=0,Ceq(X)=0(非线性约束)LB=X=UB其中,X,B,Beq,LB,和UB为向量,A和Aeq为矩阵,C(X)和Ceq(X)为函数,返回标量。f(x),c(x),和ceq(x)可以是非线性函数。•调用格式:[x,fval,exitflag,output]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)Fval:目标函数在解X处的目标函数值Exitflag:返回算法终止的状态指示结构变量Output:优化计算结束之时返回结构变量由于本问题中需要优化的变量只有两个,属于中等规模优化问题。fmincon命令使用序列二次规划算法(SQP)来求解。序列二次规划方法是将一个带有等式和不等式约束(可以是非线性)的非线性优化问题转化为二次规划问题求解。对于中等规模优化问题,求解二次规划问题涉及到Hessian矩阵。Hessian矩阵的近似计算是通过拟牛顿法得到的,拟牛顿法提供了两个公式可用于Hessian矩阵(或其逆)的迭代:BFGS公式和DFP公式,而初始的Hessian矩阵是任意给的,如给一个单位阵I。MATLAB中SQP法的实现分三步,即•拉格朗日函数Hessian矩阵的更新;•二次规划问题求解;•一维搜索和目标函数的计算序列二次规划(SQP)算法•序列二次规划(SequentialQuadraticProgramming,简称SQP)是当前公认的处理中、小规模非线性规划问题最优秀的算法之一,该算法通过将原问题转化为一系列二次规划子问题的求解来获得原问题的最优解,对拉格朗日函数取二次近似,从而提高二次规划子问题的近似程度,对非线性较强的优化问题也能进行计算。•SQP方法的基本思想如下:在某个近似解处将原非线性规划问题简化为处理一个二次规划问题,求取最优解,如果有,则认为是原非线性规划问题的最优解,否则,用近似解代替构成一个新的二次规划问题,继续迭代。•Matlab优化工具箱中SQP算法的实现主要由以下三部分组成。(1)更新拉格朗日函数的Hessian矩阵•式中:•在每一次的迭代中,采用BFGS方法计算拉格朗日函数的Hessian矩阵的正定拟牛顿近似值H。只要保证为正,并且H初始化为正定矩阵,则Hessian矩阵一直保持正定。1(5TTkkkkkkTTkkkkkqqHHHHqssHs)1111()()[()()]mmkkiikkiikiiqfxgxfxgx1kkksxx1min()(6)2nTTdRqddHdcd,1,...,iieAdbim,1,...,iieAdbimm•(3)一维搜索和目标函数计算•求解QP子问题会得到一个向量,由它可以得到新的迭代如式(4),的每次•取值必须保证指标函数有足够的减小量,这里的目标函数如式(7)所示:••式中:11(,)()()max{0,()}(7)eemmiiiiiimLxrfxrgxrgx11()max{,(())}21,...,ikiikiiirrrim•另外两种算法subspacetrustregion(信赖域反射算法),activeset(有效集算法)对于大规模问题,fmincon采用了subspacetrustregion(信赖域反射算法)优化算法。这种算法是把目标函数在点x的邻域泰勒展开(x可以认为是人为提供的初始猜测),这个展开的邻域就是所谓的trustregion,泰勒展开进行到二阶项为止:Q(x)=1/2*x,Hx+f,x•(1)这时目标函数在某一个局部的特性就可以看出来了。在这样的一个邻域里,我们求一个新的点x1,使得目标函数值减小,这个问题相比于原来的问题要简单。然而实际上对于存在非常大规模优化变量的问题,直接对这个子问题的求解仍然是不可忍受的。•同时我们注意到,由于泰勒展开要进行的第二项,这就要求我们能够提供一阶导计算的函数。如果我们不能提供一阶导表达式,二阶导(Hessian矩阵)matlab是无法计算的。所以我们使用fmincon命令而不给一阶导表达式,fmincon会放弃使用大规模算法。•如前所述,原问题转化后的直接求解仍然是无法忍受的,通过进一步近似subspacetrustregion将这个问题局限在trustregion的二维子空间内求解。