大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说数学建模线性规划实例及详细解答(MATLAB代码)[通俗易懂],希望能够帮助大家进步!!!
最近在学习数学建模的算法与应用,以一本较好的书籍为指导(《数学建模算法与应用》),不过对于我来说,我主要去攻MATLAB代码及建模方法,当然书里还有lingo代码解析。对于这本书,我感觉还是蛮难啃的,就像今天我写的这篇博客来说,其中最后一题就是我啃了不知道有多久,最后我老老实实的把每一步都写在纸上,然后一步一步的用MATLAB去试,最后终于搞懂了,此时心情不可言喻啊😃。如此,我来分享一下我学到的东西吧。
先来一道简单的吧:
这是让大家熟悉一下对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 %上述转换为求最小值,再提个符号变为上述求得目标值
只听到从架构师办公室传来架构君的声音:
独立扬新令,千营共一呼。有谁来对上联或下联?
再来一道相对较难的:
不知道大家看到绝对值会出现什么反应。我们可以定义其它的变量来代替绝对值里面的数,比如用( 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,接下来,我们可以上代码了。
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代码熟悉了吧,那现在我们来实战一下。
解:设 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。
(图来源《数学建模算法与应用习题解答》)
对于该MATLAB代码我感觉是有点难度,在此小编就不在展示了哦,大家实力非常强,所以我就不展示了。😄😄😄
再来一道代码详细的题目:
在此,小编就不建模了,我给出一个好的建模解析给你们:
对于在markdown中,其数学公式太难打了,所以,我就发一张这样的笔记,给大家看一下哈,这是我将每一步写成有数字的建模方式,有了这样的,我们就可以更好的写代码。(字有点丑,大家将就一下哈)
%目标函数
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; %目标函数最终的值
啊!!!写这篇博客让我承受了莫大的打击,先是数学公式编辑的学习,再到放弃该学习,最后又是直接放图片。再则自己为了让读者易懂,写了几页的草稿…在此,我好像有点累了,我好像要去休息了。我想在此对大家说一句保护好身体哦,还有就是多多支持!!!😄😄😄
好了,这篇博客也写完了,希望对大家有帮助!!!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有