matlab解决有约束条件的二次规划问题

  在数学建模与生活实际问题中,我们经常会遇到“优化问题”。而所谓“优化”,就是对于一个目标函数,在给定一些等式或不等式的约束后,求极值的过程。高中学的“线性规划”,就是一种简单的优化问题。

  现在我们来看,如何将相对复杂一点的“二次规划问题”(Quadratic Programming)在matlab中得以解决。

一.遍历法

  这是最简单暴力的方法,根据约束条件得到自变量的取值范围,然后在自变量的取值范围中对自变量进行遍历,当因变量取得极值的时候问题就得到解决。

  但是在整个过程中,需要许多“人工”的操作,比如手算取值范围,然后编程计算因变量的各种值,然后找出极值,balabala一堆事情,很不“自动化”。而且在很多情况下手算会十分复杂,所以不在所有情况下适用。

二.使用quadprog()函数

如图,是quadprog()函数的帮助文档

  

图中的数学公式,表示的是二次规划问题的一般形式。

而下方的Syntax部分表示的是这个函数的不同调用格式。

用一个例子具体说明式中各个变量的意思:

【例】解决二次规划问题

【分析】

1.目标函数的表示

对比文档,首先应该把目标函数表示成如下矩阵形式:

H矩阵与线性代数中的“二次型”十分相似,要注意的是与二次型不同的地方,这里有个系数1/2,所以矩阵H的元素是二次型中的矩阵元素大小的两倍。

本例中,,这是由于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。

 f矩阵则是目标函数中的一次项,这里写为f=\begin{bmatrix} -2\\ -6 \end{bmatrix}

2.约束条件的表示

对比文档,约束条件需要表示成这种格式,而这里只有不等式约束,所以式中的Aeq和Beq为空。(eq的意思是equation,等式)

 而约束条件中对变量x1和x2只给出下限,没有给上限,因此ub为空,(lb的意思是low_b:b的下限;ub的意思是up_b:b的上限)

3.使用程序解决问题

通过1.和2.两步,完成了目标函数与约束条件的表示,根据文档中的调用格式,录入程序即可

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)

注意最后一行不加分号,方便显示结果

显示结果如下:

x =

    0.6667
    1.3333


fval =

   -8.2222


exitflag =

     1


output = 

  包含以下字段的 struct:

            message: '太长了...省略'
          algorithm: 'interior-point-convex'
      firstorderopt: 2.6645e-14
    constrviolation: 0
         iterations: 4
       cgiterations: []


lambda = 

  包含以下字段的 struct:

    ineqlin: [3×1 double]
      eqlin: [0×1 double]
      lower: [2×1 double]
      upper: [2×1 double]

成功完成!

另外可以参考:https://blog.csdn.net/jbb0523/article/details/50598523

详细解释了二次型,正定矩阵,海塞矩阵的含义

发布了29 篇原创文章 · 获赞 6 · 访问量 3427

猜你喜欢

转载自blog.csdn.net/qq_42138454/article/details/100132822