Matlab线性/非线性规划优化算法(7)

介绍如何使用quadprog and mpcqpsolver.
依然是解决一类典型的二次规划问题:
在这里插入图片描述
通过看matlab文档中的例子可以基本了解如何使用。下面给出几个例子:

quadprog:

%% the use of quadprog
H = [1 -1; -1 2]; 
f = [-2; -6];
A = [1 1; -1 2; 2 1];
b = [2; 2; 3];
[x,fval,exitflag,output,lambda] = ...
   quadprog(H,f,A,b)
%%
H = [1 -1; -1 2]; 
f = [-2; -6];
Aeq = [1 1];
beq = 0;
[x,fval,exitflag,output,lambda] = ...
   quadprog(H,f,[],[],Aeq,beq)
%% here you can set max iteration and tolerance 
options = optimoptions('quadprog','Display','iter','MaxIterations',5,'TolFun',1e-16);
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [2;-3;1];
lb = zeros(3,1);
ub = ones(size(lb));
Aeq = ones(1,3);
beq = 1/2;
x0 = [];
[x,fval,exitflag,output,lambda] = quadprog(H,f,[],[],Aeq,beq,lb,ub,x0,options)

值的注意的问题:

options = optimoptions('quadprog','Display','iter','MaxIterations',5,'TolFun',1e-16);

在优化选项中,我们可以人为设定maxiteration, tolerance这种对迭代次数产生影响的参数,这个在工程问题中是至关重要的。
另外,通过查看exitflag, 确定是否是正确解。只有exitflag == 1才对。通过查看H的正定性,必须是正定矩阵,才能有解。通过查看lamda,也就是拉格朗日橙子,必须不为负。

mpcqpsolver:
解决如下所示的问题,但是要注意,不等式约束采用了另一种方式,两种方式都是可以的,这种大于号写法,拉格朗日函数写起来不好看,但是后面的对偶问题写起来好看,对应的KKT条件的表示写起来也好看,总之无论怎么写,总是一边好看,另一边就不好看。
在这里插入图片描述

%% the use of   mpcqpsolver to solve quadratic programming problems
H = [1 -1; -1 2];
f = [-2; -6];
A = [1 0; 0 1; -1 -1; 1 -2; -2 -1];
b = [0; 0; -2; -2; -3];Aeq = [];
beq = zeros(0,1);
[L,p] = chol(H,'lower');
Linv = inv(L);
p
opt =  mpcqpsolverOptions('double');
opt.MaxIter = 100;
iA0 = false(size(b)); %If your problem has no inequality constraints, use false(0,1). For a cold start, false(m,1).
[x,status,iA,lambda] = mpcqpsolver(Linv,f,A,b,Aeq,beq,iA0,opt)

mpcsolver首先要求H 是正定的,另外options里面也没法显示迭代细节。用的是KWIK算法, 意思是算在SDP里面的一支,我所学的SDP里面没学到这个,不是很了解KWIK, 应该不是什么主流算法吧。

连个解算器mathworks连接:
mpc
quadprog

发布了71 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gophae/article/details/104354633