前言:
最近在学习数学建模的算法与应用,以一本较好的书籍为指导(《数学建模算法与应用》),不过对于我来说,我主要去攻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 %上述转换为求最小值,再提个符号变为上述求得目标值
再来一道相对较难的:
/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:
解:设
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中,其数学公式太难打了,所以,我就发一张这样的笔记,给大家看一下哈,这是我将每一步写成有数字的建模方式,有了这样的,我们就可以更好的写代码。(字有点丑,大家将就一下哈)
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; %目标函数最终的值
啊!!!写这篇博客让我承受了莫大的打击,先是数学公式编辑的学习,再到放弃该学习,最后又是直接放图片。再则自己为了让读者易懂,写了几页的草稿…在此,我好像有点累了,我好像要去休息了。我想在此对大家说一句保护好身体哦,还有就是多多支持!!!😄😄😄
好了,这篇博客也写完了,希望对大家有帮助!!!