在校学习数学建模,整理的matlab相关笔记,按照学校授课时间顺序发布相关内容,做这个的初衷是为了方便自己学习,所以有些地方以教材为主,大家不要见怪。
希望能在这里分享学习的一些知识碎片,接触时间不长,如果文章有任何错误,欢迎大家指正。
如果喜欢我的文章还请大家不吝动手给我点赞收藏关注哦,留下你来过的足迹,让我眼熟你。
目录
1.1 用MATLB优化工具箱解线性规划问题
1.模型: minz=cX
s.t. AXb
命令: x=linprog(c,A,b)
2. minz=cXc
s.t. AXb
Aeq*X=beq
命令: x=linprog(c,A,b,Aeq,beq)
或 x=linprog(c,A,b,Aeq,beq,x0)
或 [x,fval]=linprog(c,A,b,Aeq,beq)
若没有不等式约束Axb,则令 A=[ ],B=[ ]
3. VLBX
VUB
命令: X=linprog(c,A,b,Aeq,beq,VLB,VUB)
若没有等式约束Aeq·x=beq,则令 Aeq=[ ],beq=[ ]
4. [x,fval]=linprog(...)
返回最优解x及x处的目标函数值fval
例:
s.t.
注意:matlab中只能识别小于等于,大于等于可以用负号来编写
% 编写M文件xxg1.m如下:
c = [6 3 4];
A = [1 2 -3;0 1 0];
b = [80;50];
Aeq = [1 1 1];
beq = [120];
vlb = [30;0;20;];
vub = [ ];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub)
1.2 Lingo软件包使用
1.2.1 简单编程方法
模型: 程序:
Min min=7*x1+3*x2;
x1+x2>=345.5;
x1>=98;
2*x1+x2<=600;
@gin(x1);
为整数 @gin(x2);
end
注意:等号、乘号、分号、说明
1.2.2 Lingo软件包的变量界定
变量界定函数实现对变量取值范围的限制,共4种
- @bin(x) 限制x为0或1
- @bnd(L,x,U) 限制
- @free(x) x可以取任意实数
- @gin(x) 限制x为整数
默认情况下,LINGO规定变量是非负的,下界为0
例:一加工厂用牛奶生产A1,A2两种奶制品,1桶牛奶可以在甲车间12h加工成3kgA1,或者在乙车间用8h加工成4kgA2.根据市场需求,生产的A1,A2全部能售出,且每千克A1获利24元,每千克获利16元。现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间为480h,并且甲车间每天至多能加工100kgA1,乙车间的加工能力没有限制,试为该厂制定一个生产计划,使每天获利最大,问:
- 如果用35元可以买到1桶牛奶,是否应该做这项投资?如果投资,每天最多购买多少桶牛奶?最多买10桶
- 如果可以聘请临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元?
- 由于市场需求变化,每千克A1的获利增加到30元,是否应改变生产计划?
建立模型
决策变量 每天用x1桶牛奶生产A1.x2桶牛奶生产A2
目标函数 Max z=72x1+64x2 (每天获利)
约束条件 x1+x250 原料供应
12x1+8x2480 劳动时间
3x1100 加工能力
x1,x20 非负约束
Model:
Max=72*x1+64*x2;
x1+x2<=50;
12*x1+8*x2<=480;
3*x1<=100;
end
生产计划为20桶牛奶生产A1,30桶牛奶生产A2,利润3360元。
Variable 变量 objective value 目标值 Row 行
Reduced Cost 缩减成本系数 (最优解中变量Reduced Cost值自动取0)
Slack or Surplus 松弛或剩余
对于“ ”不等式右边减左边的差值成为Slack
对于“ ”不等式右边减左边的差值成为Surplus
当约束条件的左右两边相等时,Slack or Surplus 的值为0
资源剩余为0的约束为紧约束(有效约束)
Dual Price 影子价格 最优解下“资源”增加一个单位时“效益”的增量
在这里代表原料增加一单位,利润增48
时间增加一单位,利润增2
能力增减不影响利润
35元可以买到一桶牛奶,35<48,要投资。付给临时工人的工资最多是每小时2元。
结果解释 (灵敏度分析)(Range)
Objective Coefficient Range 目标函数系数的变化范围
x1系数变化范围(64,96)
x2系数变化范围(48,72)
每千克A1获利增加到30元,64<30×3<96故不应改变生产计划。
Righthand Side Ranges 右边变化范围 INFINITY 无穷大
影子价格有意义时约束右端的允许变化范围 (目标函数不变)
注意:充分但可能不必要
在这里原料最多增加10,时间最多增加53
35元可买到1桶牛奶,每天最多买10桶牛奶。
上节的代码如下:
% 任务分配问题
c = [13 9 10 11 12 8];
A = [0.4 1.1 1 0 0 0
0 0 0 0.5 1.2 1.3];
b = [800;900];
Aeq = [1 0 0 1 0 0
0 1 0 0 1 0
0 0 1 0 0 1];
beq = [400;600;500];
vlb = zeros(6,1);
vub = [ ];
[x,fval] = linprog(c,A,b,Aeq,beq,vlb,vub)
c = [40 36];
A = [-5 -3];
b = [-45];
Aeq = [ ];
beq = [ ];
vlb = zeros(2,1);
vub = [9;15];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub)