初学Matlab的同学可能会被定义以及推导弄得头晕眼花的,那么接下来阅读完这篇文章后,你可能会更清楚些。
1.线性规划问题
例题:
无约束
对于此类线性规划模型,有着一个对应的解题模板
即:
其中表示目标函数的各项系数,此题中的系数为[-3,4,-2,5]
(值得注意的是,若目标函数为则系数要取反,为[3,4,2,-5],因为线性规划的解题原理是求函数极小值,故要取反)
A表示约束条件中多选式不等式中的系数,此题中的系数为[1,1,3,-1;2,-3,1,-2]
若缺失,某一项系数,用0补齐,例如,这里缺少了第四项,故系数要写成[1,1,3,0;......]
b表示约束条件中多项式中不等式右侧的数,此题中为[14;-2]
(值得注意的是,若不等式为,则系数要取反,为[14;-2],且用";"将右侧的数分隔开,表示不同约束条件函数的数)
表示约束条件中取“=”多项式的系数,如此题中,取“=”号的式子是
故=[4,-2,2,-1]
表示约束条件中取“=”多项式等号右侧的数,此题中
=-2。
表示各个变量的下限,此题中各个变量的下限为[0,0,0,-inf]
inf表示无穷,由于无约束,因此取-inf
表示各个变量的上限,此题中各个变量的上限为[inf,inf,inf,inf]
基于此,在matlab中代码实现为
f = [-3, 4, -2, 5];
A = [ 1, 1, 3, -1; 2, -3, 1, -2];
b = [14; -2];
Aeq = [4, -1, 2, -1];
beq = -2;
lb = [0, 0, 0, -inf];
ub = [inf, inf, inf, inf];
[x, fval] = linprog(f, A, b, Aeq, beq, lb, ub);
disp(x);
disp(fval);
2.非线性规划问题(约束函数为线性的)
例题:
,
在此题中,由于目标函数为非线性的,而约束函数为线性的,所以这里作为非线性规划的一个特例解题
首先需要定义一个函数
function f=objfun(x);
f=-x(1)*x(2)*x(3);
end
值得注意的是这里的目标函数由于是取值
,与上述线性规划相同的步骤,将目标函数取负号求极小值。
将这行代码保存到文件中
与线性规划相同的步骤
A=[1,-2,-2;1,2,2];
b=[0,72];
lb=[-inf,10,-inf];
ub=[inf,20,inf];
beq=10;
Aeq=[1,-1,0];
[x,fval]=fmincon(@objfun,[22,12,2],A,b,Aeq,beq,lb,ub)
(参照第一问的说明)
将这行代码保存到一个新的文件united1.m中,命名随便,但是要符合Matlab的命名规则
运行此代码
结果为
3.非线性规划(约束函数为非线性函数的情况)
例题
此题中需要用另外方式解答
function f = objfun(x)
f = x(1)^2 + x(2)^2 + x(3)^2 + 8;
end
将目标函数和非线性约束条件分别写成函数形式
function [c,ceq] = nonlcon(x)
c = [-x(1)^2 + x(2) - x(3)^2; x(1) + x(2)^2 + x(3)^3 - 20];
ceq = [x(1) + x(2)^2 - 2; x(2) + 2*x(3)^2 - 3];
end
c表示约束条件中的非线性函数不等式,ceq表示非线性函数的等式。
将函数分别保存到 objfun.m
和 nonlcon.m
文件中。
最后在第三个脚本文件中写入fmincon函数
其形式为[x,fval]=fmincon(@objfun,,A,b,Aeq,beq,lb,ub,'nonlcon')
在此题中,由于约束函数都为非线性的,故写成
[x,fval] = fmincon(@objfun,[0 0 0],[],[],[],[],[0 0 0],[],@nonlcon)
% 或
[x,fval] = fmincon('objfun',[0 0 0],[],[],[],[],[0 0 0],[],'nonlcon')
运行代码结果为