linprog函数在octave中的使用

octive可以用一个比较好的网站使用:

Octave Online

进入正题:

linprog 函数是matlab中求解线性规划问题所常用到的一个函数,它在octave中仍然适用,接下来就从一个具体的线性规划例子中看它是如何运用的。

	在这里补充一下,线性规划是数学规划的一个分支,是研究线性约束条件下线性目标函数的极值问题的数学理论和方法,解决线性规划问题,要标明决策变量,约束条件,目标函数三个要素,从而建立模型解决问题。

例题:
在这里插入图片描述

在这个问题中我们设 xi (i=1,2) 为甲乙两个机床的每日生产量,其中 xi 就是决策变量。

根据题意列出约束条件:
{ 2 x 1 + x 2 ⩽ 10 , x 1 + x 2 ⩽ 8 , x 2 ⩽ 7 , x i ⩾   0 , ( i = 1 , 2 ) \left\{ \begin{matrix} 2 x_1+x_2\leqslant10 , \\ x_1+x_2\leqslant8, \\ x_2\leqslant7, \\ x_i \geqslant \ 0,(i=1,2) \end{matrix} \right. 2x1+x210,x1+x28,x27,xi 0,i=1,2

此时可以建立数学模型:
m a x z = 4 x 1 + 3 x 2 maxz =4x_1+3x_2 maxz=4x1+3x2
s . t . = { 2 x 1 + x 2 ⩽ 10 , x 1 + x 2 ⩽ 8 , x 2 ⩽ 7 , x i ⩾   0 , ( i = 1 , 2 ) s.t.= \left\{ \begin{matrix} 2 x_1+x_2\leqslant10 , \\ x_1+x_2\leqslant8, \\ x_2\leqslant7, \\ x_i \geqslant \ 0,(i=1,2) \end{matrix} \right. s.t.= 2x1+x210,x1+x28,x27,xi 0,i=1,2
其中, s . t . s.t. s.t. (subject to) 表示“受约束为”

建立完数学模型后,,就可以用linprog函数进行解答了
linprog的一般形式为:
[ x , f v a l ] = l i n p r o g ( f , a , b , A e q , B e q , l b , u b ) [x,fval] =linprog(f,a,b,Aeq,Beq,lb,ub) [x,fval]=linprog(f,a,b,Aeq,Beq,lb,ub)

对应的数学模型为:

寻找x使得
m i n ( f T x ) min(f^Tx) min(fTx)
s . t . = { a ⋅ x ⩽ b , A e q ⋅ x = B e q , l b ⩽ x ⩽ u b s.t.= \left\{ \begin{matrix} a\cdot x\leqslant b, \\ Aeq \cdot x=Beq, \\ lb\leqslant x\leqslant ub \end{matrix} \right. s.t.= axb,Aeqx=Beq,lbxub
其中x是返回决策向量的取值,fval是返回目标函数的最优值,f为价值向量,a,b是对应线性不等式约束,Aeq和Beq是对应线性等式约束,lb和ub分别对应决策向量的下界向量和上界向量,要注意的是在MATLAB中求解线性规划标准形式为求最小值,所以如果求最大值只需进行变号,变不等式方向即可。

在octave中运用linprog函数时需要先调用,要用pkg load optim来调用。

此时对 f , a , b , A e q , B e q , l b , u b f,a,b,Aeq,Beq,lb,ub f,a,b,Aeq,Beq,lb,ub赋值

根据不等式得
4 x 1 + 3 x 2 4x_1+3x_2 4x1+3x2的最小值,则
f = f= f= [ 4 ; 3 ] \begin{bmatrix} 4;3\\ \end{bmatrix} [4;3]
a = a= a= [ 2 , 1 ; 1 , 1 ; 0 , 1 ] \begin{bmatrix} 2,1;1,1;0,1\\ \end{bmatrix} [2,1;1,1;0,1]
b = b= b= [ 10 , 8 , 7 ] \begin{bmatrix} 10,8,7\\ \end{bmatrix} [10,8,7]

a , b a,b a,b 中一个分号表示一个对应式子

由于此题没有等式限制,则 A e q = B e q = [ ] Aeq=Beq=[ ] Aeq=Beq=[]

l b = [ 0 , 0 ] lb=[0,0] lb=[0,0]
u b = [ 10000 , 10000 ] , ub=[10000,10000], ub=[10000,10000], ub可以根据题意修改,这里是随便的一个数,

最后求的fval是最小值,所以要求反得到最大值

clear
c=[4;3]
b=[10;8;7]
a=[2,1;1,1;0,1]
lb=zeros(2,1)//21列为0
ub=[10000;10000]
[x,FVAL]=linprog(-c,a,b,[ ],[ ],lb,ub)
y=-FVAL

结果加求反为
在这里插入图片描述
在这里插入图片描述
则答案为 x 1 = 2 , x 2 = 6 x_1=2,x_2=6 x1=2,x2=6
最大利润为 − F V A L = 26 -FVAL=26 FVAL=26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值