二次规划问题和MATLAB函数quadprog的使用

题目:二次规划问题和MATLAB函数quadprog的使用

        二次规划(Quadratic Programming,QP)问题的一般形式为:


其中为纯量,阶对称矩阵。易知二次规划的Hesse矩阵等于。如果为半正定矩阵,则称此规划为凸二次规划,否则为非凸规划。对于凸二次规划,目标函数q(x)是一个凸函数。如果有至少一个向量x满足约束而且q(x)在可行域有下界,二次规划问题就有一个全局最小值x。 如果G是正定矩阵,则称此规划为严格凸二次规划,此时全局最小值就是唯一的。如果G=0,二次规划问题就变成线性规划问题。根据优化理论,一个点x 成为全局最小值的必要条件是满足Karush-Kuhn-Tucker(KKT)条件。当q(x)是凸函数时,KKT条件也是充分条件。

        对于非凸规划,由于存在比较多的驻点,求解比较困难。

        根据约束条件的不同,二次规划可分为等式约束二次规划问题和不等式约束二次规划问题。等式约束二次规划问题即只含有等式约束,常见的解法有直接消去法、广义消去法、拉格朗日(Lagrange)法;对于不等式约束二次规划问题,其基本思想是把不等式约束转化为等式约束再求解,常见解法有有效集(active set)方法,有效集方法在每步迭代中把有效约束作为等式约束,然后可以用拉格朗日法求解,重复直到求得最优解。

        很多学者专门研究各类二次规划的求解方法,如文献[4][5],对于非数学专业的的人来讲更重要的是怎么把二次规划当作一个工具去使用它。

        在MATLAB中求解二次规划的的函数是quadprog,具体使用方法可查询帮助文件。

        【例】求如下二次规划问题。


        【分析】首先应该把目标函数表示成如下矩阵形式:


        这里要细说一下如何写成矩阵形式。

        首先,向量x是很容易写出的,因为f(x)包含两个变量x1x2,因此

        其次,向量f只与两个变量x1x2的一次项有关,所以fTx=-2x1-6x2,因此


        最后,矩阵H只与两个变量x1x2的二次项有关,所以,这里要注意的是不同于二次型,这里有个系数1/2,所以矩阵H的元素是二次型中的矩阵元素大小的两倍。给出一个规律:设矩阵H第i行第j列的元素大小为H(i,j),二次项xixj的系数为a(i,j),则


        本例中,,这是由于x1的平方项(即x1x1)系数为1/2,所以第1行第1列的元素为1=2*(1/2),x2的平方项(即x2x2)系数为1,所以第2行第2列的元素为2=2*1,x1x2项(即x2x1)的系数为-1,所以第1行第2列和第2行第1列的元素均为-1。

        目标函数搞定之后,下面来看约束条件部分,约束条件应该写成如下形式:

        本例中约束条件只有不等式约束,因此Aeq和beq为空,对于A和b很容易就可以得出来:

        而约束条件中对变量x1x2只给出下限,没有给上限,因此ub为空,

        得到了所有的参数,将参数输入MATLAB,编程如下:(代码是直接在Command Window中一行一行录入的,所以每行前面有符号“>>”)

>> H = [1 -1; -1 2];
>> f = [-2; -6];
>> A = [1 1; -1 2; 2 1];
>> b = [2; 2; 3];
>> lb = [0; 0];
>> [x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb)
        输出以下结果:
Warning: Large-scale algorithm does not currently solve this problem formulation,
using medium-scale algorithm instead. 
> In quadprog at 291
Optimization terminated.

x =

    0.6667
    1.3333

fval =

   -8.2222

exitflag =

     1

output = 

         iterations: 3
    constrviolation: 0
          algorithm: 'medium-scale: active-set'
      firstorderopt: []
       cgiterations: []
            message: 'Optimization terminated.'

lambda = 

      lower: [2x1 double]
      upper: [2x1 double]
      eqlin: [0x1 double]
    ineqlin: [3x1 double]
参考文献:

【1】孙文瑜, 徐成贤,朱德通.最优化方法(第二版)[M]. 北京:高等教育出版社, 2010.

【2】龚纯,王正林. 精通MATLAB最优化计算[M].北京: 电子工业出版社,2009.

【3】lnsunqingshen, 464518439.什么是凸二次规划, 百度知道,2011-06-20.

【4】李明强.几类特殊凸二次规划问题的求解算法研究[D].山东科技大学,2013 .

【5】于绍慧.边界约束凸二次规划的求解[D].南京航空航天大学,2005.

### 如何在 MATLAB 中声明并调用外部 `quadprog` 函数 #### 声明准备输入参数 为了使用 `quadprog` 函数解决二次规划问题,需先定义目标函数中的各个组成部分以及任何适用的约束条件。具体来说: - **H**: 是半正定矩阵,表示目标函数中变量平方项前的系数[^1]。 - **f**: 表示线性部分的一维数组向量。 对于不等式约束 \(A \cdot x \leq b\) 等式约束 \(A_{eq} \cdot x = b_{eq}\),分别通过矩阵 A 及其对应的右侧常数向量 b 来指定;同样地,\(A_{eq}\) \(b_{eq}\) 定义了相等关系下的相应值。边界 lb ub 则设定了决策变量可以取的最大最小范围。 ```matlab % Example of defining inputs for quadprog function. H = [2, -1; -1, 2]; % Coefficient matrix H (twice the actual coefficients) f = [-2; -6]; % Linear term vector f A = [1, 1; % Inequality constraints coefficient matrix A -1, 2; 2, 1]; b = [2; % Right-hand side values for inequality constraints 2; 3]; Aeq = []; % Equality constraint coefficients (empty means no equality constraints) beq = []; % Corresponding right-hand sides for equalities (also empty here) lb = zeros(2, 1); % Lower bounds on variables ub = []; % Upper bounds on variables (empty implies unbounded above) ``` #### 调用 `quadprog` 并获取结果 一旦准备好上述所有必要的输入数据之后,就可以直接调用 `quadprog` 函数来计算最优解及其对应的目标函数值。这里展示了一个简单的例子,展示了如何执行这一操作,并处理返回的结果。 ```matlab [x, fval, exitflag, output, lambda] = ... quadprog(H, f, A, b, Aeq, beq, lb, ub); disp('Optimal solution:'); disp(x); disp(['Objective value at optimal point: ', num2str(fval)]); if exitflag > 0 disp('The problem was solved successfully.'); else warning('There might have been issues solving this optimization problem.'); end ``` 此代码片段不仅解决了给定的优化问题,还提供了关于算法终止状态的信息(由 `exitflag` 提供),以及拉格朗日乘子估计(存储于结构体 `lambda` 中)。这些额外信息有助于进一步分析解决方案的质量特性。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值