Matlab中线性规划,非线性规划(约束条件为线性,为非线性的情况)

初学Matlab的同学可能会被定义以及推导弄得头晕眼花的,那么接下来阅读完这篇文章后,你可能会更清楚些。

1.线性规划问题

例题:

minf=-3x1+4x2-2x3+5x4

s.t  4x1-x2+2x3-x4=-2

        x1+x2+3x3-x4<=14

        -2x1+3x2-x3+2x4>=2

        x1,x2,x3>=0,x4无约束

对于此类线性规划模型,有着一个对应的解题模板

即:[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)

其中f表示目标函数的各项系数,此题中的系数为[-3,4,-2,5]

(值得注意的是,若目标函数为maxf则系数要取反,为[3,4,2,-5],因为线性规划的解题原理是求函数极小值,故要取反)

A表示约束条件中多选式不等式中的系数,此题中的系数为[1,1,3,-1;2,-3,1,-2]

若缺失,某一项系数,用0补齐,例如x1+x2+3x3<=14,这里缺少了第四项,故系数要写成[1,1,3,0;......]

b表示约束条件中多项式中不等式右侧的数,此题中为[14;-2]

(值得注意的是,若不等式为>=,则系数要取反,为[14;-2],且用";"将右侧的数分隔开,表示不同约束条件函数的数)

Aeq表示约束条件中取“=”多项式的系数,如此题中,取“=”号的式子是4x1-x2+2x3-x4

Aeq=[4,-2,2,-1]

beq表示约束条件中取“=”多项式等号右侧的数,此题中beq=-2。

lb表示各个变量的下限,此题中各个变量的下限为[0,0,0,-inf]

inf表示无穷,由于x4无约束,因此取-inf

ub表示各个变量的上限,此题中各个变量的上限为[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.非线性规划问题(约束函数为线性的)

例题:

max f(x)=x1x2x3,s.t   -x1+2x2+2x3>=0

                                        x1+2x2+2x3<=72

                                        10<x2<20

                                        x1-x2=10

在此题中,由于目标函数为非线性的,而约束函数为线性的,所以这里作为非线性规划的一个特例解题

首先需要定义一个函数

function f=objfun(x);
f=-x(1)*x(2)*x(3);
end

值得注意的是这里的目标函数f(x)由于是取值max,与上述线性规划相同的步骤,将目标函数取负号求极小值。

将这行代码保存到objfun.m文件中

与线性规划相同的步骤

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.非线性规划(约束函数为非线性函数的情况)

例题

min f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8

s.t x_{1}^2-x_{2}+x_{3}^2\geq 0

        x_{1}+x_{2}^2+x_{3}^3\leq 20

        -x_{1}-x_{2}^2+2= 0

        x_{2}+2x_{3}^2=3

        x_{1},x_{2},x_{3}\geq 0

此题中需要用另外方式解答

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,x_{0},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')

运行代码结果为

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值