数学建模线性规划实例及详细解答(MATLAB代码)

前言:

 最近在学习数学建模的算法与应用,以一本较好的书籍为指导(《数学建模算法与应用》),不过对于我来说,我主要去攻MATLAB代码及建模方法,当然书里还有lingo代码解析。对于这本书,我感觉还是蛮难啃的,就像今天我写的这篇博客来说,其中最后一题就是我啃了不知道有多久,最后我老老实实的把每一步都写在纸上,然后一步一步的用MATLAB去试,最后终于搞懂了,此时心情不可言喻啊😃。如此,我来分享一下我学到的东西吧。

注意:如要那本书的电子版可以关注我,然后免费送你!!!

1.题目1:

先来一道简单的吧:
图一
这是让大家熟悉一下对MATLAB代码的😄

1.1.MATLAB代码:

f=[-3,1,1];
A=[1,-2,1;4,-1,-2]
b=[11;-3];
Aeq=[-2,0,1];
beq=[1];
lb=zeros(3,1);
[x,fval]=linprog(f,A,b,Aeq,beq,lb,[])
x=-x                                                 %上述转换为求最小值,再提个符号变为上述求得目标值

再来一道相对较难的:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191127200556922.png图2
图3
不知道大家看到绝对值会出现什么反应。我们可以定义其它的变量来代替绝对值里面的数,比如用( x 1 x_{1} x1+ x 2 x_{2} x2)/2表示绝对值 x 1 x_{1} x1当然这里的 x 1 x_{1} x1更上面的不一样。然而,去掉绝对值的数,我们可以用( x 1 x_{1} x1- x 2 x_{2} x2)/2,其中,每个数都大于等于0,接下来,我们可以上代码了。

1.2.MATLAB代码:

f=[1/2,1/2,1,1,3/2,3/2,2,2];
Aeq=[1/2,-1/2,-1/2,1/2,-1/2,1/2,1/2,-1/2;1/2,-1/2,-1/2,1/2,1/2,-1/2,-3/2,3/2;1/2,-1/2,-1/2,1/2,-1,1,3/2,-3/2];
beq=[0;1;-1/2];
lb=zeros(8,1);
[x,fval]=linprog(f,[],[],Aeq,beq,lb,[])

好了,我相信大家看到这里应该对相关的MATLAB代码熟悉了吧,那现在我们来实战一下。

2.题目2:

图4
图5
 解:设 x 1 x_{1} x1 x 2 x_{2} x2分别表示在产品I中通过设备 A 1 A_{1} A1, A 2 A_{2} A2的机器个数,同样 x 3 x_{3} x3, x 4 x_{4} x4, x 5 x_{5} x5,分别表示在产品I中通过设备 B 1 B_{1} B1, B 2 B_{2} B2, B 3 B_{3} B3的机器个数。 x 6 x_{6} x6, x 7 x_{7} x7, x 8 x_{8} x8,分别在产品II中表示通过设备 A 1 A_{1} A1, A 2 A_{2} A2, B 1 B_{1} B1的机器个数, x 9 x_{9} x9表示在产品III中 A 2 A_{2} A2机器的个数。
有这样的等式: x 1 x_{1} x1+ x 2 x_{2} x2+ x 3 x_{3} x3= x 4 x_{4} x4+ x 5 x_{5} x5, x 6 x_{6} x6+ x 7 x_{7} x7= x 8 x_{8} x8
图5
(图来源《数学建模算法与应用习题解答》)
对于该MATLAB代码我感觉是有点难度,在此小编就不在展示了哦,大家实力非常强,所以我就不展示了。😄😄😄
再来一道代码详细的题目:
图6
在此,小编就不建模了,我给出一个好的建模解析给你们:
图7
图8
对于在markdown中,其数学公式太难打了,所以,我就发一张这样的笔记,给大家看一下哈,这是我将每一步写成有数字的建模方式,有了这样的,我们就可以更好的写代码。(字有点丑,大家将就一下哈)

2.1.代码:

%目标函数
c=[3100;3800;3500;2850];     %由目标函数可知有12个未知数,且有一些规律,大家可以自行找一下
c=c*ones(1,3);               %使c变成一个4行3列的函数,并且,刚刚对应于目标函数未知量前面的系数
c=c(:);                    %将c以列排序
%接下来就看约束条件1,可看出未知数前面系数是1,且需要构造一个下面的数组
a1=zeros(3,12);
for i=1:3
    a1(i,4*i-3:4*i)=1;          %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
end
b1=[10 16 8]';
%看约束条件2
a2=zeros(4,12);
for i=1:4                             
    a2(i,i:4:12)=1;                    %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
end
b2=[18 15 23 12]';
%看约束条件3
bb=[480;650;580;390];
a3=zeros(3,12);
for i=1:3
    a3(i,4*i-3:4*i)=bb;           %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
end
b3=[6800 8700 5300]';
a=[a1;a2;a3];
b=[b1;b2;b3];
%看平衡条件
aeq=zeros(2,12);             %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
aeq(1,1:4)=1/10;
aeq(1,5:8)=-1/16;
aeq(2,5:8)=1/16;
aeq(2,9:12)=-1/8;
beq=[0;0];
lb=zeros(12,1);
[x,y]=linprog(-c,a,b,aeq,beq,lb,[])
x=reshape(x,[4,3])         %解出的x值以列排序,将它重组为3*4的数组
x=sum(x')                  %表示舱口1,2,3分别放入货物的总重量
y=-y;                  %目标函数最终的值

啊!!!写这篇博客让我承受了莫大的打击,先是数学公式编辑的学习,再到放弃该学习,最后又是直接放图片。再则自己为了让读者易懂,写了几页的草稿…在此,我好像有点累了,我好像要去休息了。我想在此对大家说一句保护好身体哦,还有就是多多支持!!!😄😄😄

好了,这篇博客也写完了,希望对大家有帮助!!!
晚安

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值