西安交通大学数学建模实验报告.docx
《西安交通大学数学建模实验报告.docx》由会员分享,可在线阅读,更多相关《西安交通大学数学建模实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
![西安交通大学数学建模实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/11/d010c03f-f5f7-4a07-b75d-be09c1828819/d010c03f-f5f7-4a07-b75d-be09c18288191.gif)
西安交通大学数学建模实验报告
数学建模实验报告
儿童受教育水平的研究
解决思路
i.第一问
X1(N),X2(N),X3(N)分别代表第N代中,教育程度分别为E,S,C的比例。
则第N代与第N-1代有以下关系:
X1(N)=0.6X1(N-1)+0.4X2(N-1)+0.1X3(N-1);
X2(N)=0.3X1(N-1)+0.4X2(N-1)+0.2X3(N-1);
X3(N)=0.1X1(N-1)+0.2X2(N-1)+0.7X3(N-1);
X(N)=
X(0);
ii.第二问
X1(N),X2(N),X3(N)分别代表第N代中,教育程度分别为E,S,C的比例。
则第N代与第N-1代有以下关系:
X1(N)=0.6X1(N-1)+0.4X2(N-1);
X2(N)=0.3X1(N-1)+0.4X2(N-1);
X3(N)=0.1X1(N-1)+0.2X2(N-1)+X3(N-1);
X(N)=
X(0);
1)主要程序
第一问
L=[0.60.40.1;0.30.40.2;0.10.20.7];%传递方程
x=[0.4;0.4;0.2];%S的第一代的受教育水平
M=L*L*x%S的第三代的受教育水平
第二问
L=[0.60.40;0.30.40;0.10.21];%传递方程
x=[0.4;0.4;0.2];%S的第一代的受教育水平
k=2;
M=L*x;
s=[x';M';];%记录S后代中各种类型的比率
whileM(3,1)<0.999
M=L*M;
s=[s;M'];
k=k+1;
end
holdon;
t1=[1:
1:
46];
t0=0:
0.1:
46;
v1=s(:
3);
cz1=interp1(t1,v1,t0);
v2=s(:
2);
cz2=interp1(t1,v2,t0);
v3=s(:
1);
cz3=interp1(t1,v3,t0);
plot(t0,cz1,'r');
plot(t0,cz2,'b');
plot(t0,cz3,'g');
gtext('E');
gtext('S');
gtext('C');
xlabel('generation');
ylabel('rate');
title('S类子女受高等教育水平比率的变化图');
s
C代
L=[0.60.40;0.30.40;0.10.21];%´«µÝ·½³Ì
x=[0.6;0.3;0.1];%cµÄµÚÒ»´úµÄÊܽÌÓýˮƽ
k=2;
M=L*x;
s=[x';M';];%¼Ç¼cºó´úÖи÷ÖÖÀàÐ͵ıÈÂÊ
whileM(3,1)<0.999
M=L*M;
s=[s;M'];
k=k+1;
end
holdon;
t1=[1:
1:
47];
t0=0:
0.1:
47;
v1=s(:
3);
cz1=interp1(t1,v1,t0);
v2=s(:
2);
cz2=interp1(t1,v2,t0);
v3=s(:
1);
cz3=interp1(t1,v3,t0);
plot(t0,cz1,'r');
plot(t0,cz2,'b');
plot(t0,cz3,'g');
gtext('E');
gtext('S');
gtext('C');
xlabel('generation');
ylabel('rate');
title('CÀà×ÓÅ®ÊܸߵȽÌÓýˮƽ±ÈÂʵı仯ͼ');
s
k
2)结果输出
i.S类
k=
46
ii.C类
k=
47
1.等车问题
1)解决思路
生成随机数,判断时间。
2)主要程序
n=input('Pleaseinputthescaleofthesamples');
a=60*rand(1,n);
a=a-floor(a./5)*5;
k=0;
fori=1:
n
if(a(1,i)>2)
k=k+1;
end
end
fprintf('therateis%d\n',k/n);
3)结果输出
Pleaseinputthescaleofthesamples
100
therateis5.900000e-001
Pleaseinputthescaleofthesamples
1000
therateis6.170000e-001
Pleaseinputthescaleofthesamples
10000
therateis5.938000e-001
Pleaseinputthescaleofthesamples
100000
therateis5.994300e-001
Pleaseinputthescaleofthesamples
1000000
therateis5.998900e-001
3.流水问题
1)解决思路
上液面水失去的体积等于小孔流出的体积,对其两边微分,求出微分方程。
描点显示液面高度的变化情况。
2)主要程序
h=8;%初始水面高度
hh=[8;];%记录水面高度的数组
dt=5;%时间间隔
t0=0;
tt=[0;];%记录时间间隔的数组
while(h>0.001)
A=pi*(8+h)*(8+h)/64;
dh=-0.001*sqrt(2*9.8*h)/A*dt;
h=h+dh;
hh=[hh,h;];
t0=t0+dt;
tt=[tt,t0;];
end
hh
fprintf('经过%d秒之后,容其中的水全部流出\n',t0);
3)结果输出
经过7445秒之后,容其中的水全部流出
4.立方体问题
1)解决思路
i.递归生成十三个0与十四个1的全排列。
ii.将每种排列从一维数组转为三维数组。
iii.分别判定每一种数组的条数
iv.比较出最小值
v.根据最小值搜索所有的情况
2)主要程序
#include
intmin=49;//记录最小的边数
intcount=0;//记录符合条件的方法的个数
voidreshape(intD1[27],intD3[3][3][3])//将一维数组转化为三维数组
{
inti,j,k;
intx=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
{
D3[i][j][k]=D1[x];
x++;
}
}
voidprint3d(intd3[3][3][3])//打印三维数组
{
inti,j,k;
printf("第1层第2层第3层\n");
for(i=0;i<3;i++)
{
for(k=0;k<3;k++)
{
for(j=0;j<3;j++)
{
printf("%d",d3[i][j][k]);
}
printf("");
}
printf("\n");
}
}
intjudge(inta[3][3][3])//判断
{
inti,j,sum;
sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(a[i][j][0]==a[i][j][1]&&a[i][j][1]==a[i][j][2])sum++;
//9条竖线的判断
if(a[i][0][j]==a[i][1][j]&&a[i][1][j]==a[i][2][j])sum++;
//9条左右方向的横线的判断
if(a[0][i][j]==a[1][i][j]&&a[1][i][j]==a[2][i][j])sum++;
//9条前后方向的横线的判断
}
if(a[i][0][0]==a[i][1][1]&&a[i][1][1]==a[i][2][2])sum++;
//3条左低右高的正面的面对角线
if(a[0][i][0]==a[1][i][1]&&a[1][i][1]==a[2][i][2])sum++;
//3条左高右低的侧面的面对角线
if(a[0][0][i]==a[1][1][i]&&a[1][1][i]==a[2][2][i])sum++;
//3条左高右低的上面的面对角线
if(a[i][2][0]==a[i][1][1]&&a[i][1][1]==a[i][0][2])sum++;
if(a[2][i][0]==a[1][i][1]&&a[1][i][1]==a[0][i][2])sum++;
if(a[2][0][i]==a[1][1][i]&&a[1][1][i]==a[0][2][i])sum++;
}
if(a[0][0][0]==a[1][1][1]&&a[1][1][1]==a[2][2][2])sum++;
//4条体对角线
if(a[2][0][0]==a[1][1][1]&&a[1][1][1]==a[0][2][2])sum++;
if(a[0][2][0]==a[1][1][1]&&a[1][1][1]==a[2][0][2])sum++;
if(a[2][2][0]==a[1][1][1]&&a[1][1][1]==a[0][0][2])sum++;
returnsum;
}
voidcompare(intt)//比较
{
if(tmin=t;
}
voidcube_permutation(intn,int*P,int*A,intcur)//递归生成全部不同的排列
{
inti,j;
if(cur==n)
{
ints[3][3][3];
reshape(A,s);
compare(judge(s));
if(judge(s)==4)
{
count++;
printf("第%d种情况\n",count);
print3d(s);
}
}
elsefor(i=0;iif(!
i||P[i]!
=P[i-1])
{
intc1=0,c2=0;
for(j=0;jfor(j=0;jif(c1{
A[cur]=P[i];
cube_permutation(n,P,A,cur+1);
}
}
}
intmain()
{
intP[27]={1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
intA[27];
cube_permutation(27,P,A,0);
printf("单一色球的最小数量为%d个\n",min);
return0;
}
3)结果输出
5.锁具装箱
1)解决思路
循环生成每一个尺的长度,判断每一种情况是否合乎要求,记录合乎要求的种类的数目。
2)主要程序
s=0;
forj1=1:
4
forj2=1:
4
forj3=1:
4
a1=j1;a2=j2;a3=j3;
amax=max([a1,a2,a3]');
amin=min([a1,a2,a3]');
numbers=(amax-a1)*(a1-amin)+(amax-a2)*(a2-amin)+(amax-a3)*(a3-amin);
if(numbers>0.5)
if(abs(a1-a2)==3|abs(a2-a3)==3)
s=s+1;
end
end
end
end
end
fprintf('thereare%dkindsofkeys(3teeth)\n',s);
s=0;
forj1=1:
4
forj2=1:
4
forj3=1:
4
forj4=1:
4
a1=j1;a2=j2;a3=j3;a4=j4;
amax=max([a1,a2,a3,a4]');
amin=min([a1,a2,a3,a4]');
numbers=(amax-a1)*(a1-amin)+(amax-a2)*(a2-amin)+(amax-a3)*(a3-amin)+(amax-a4)*(a4-amin);
if(numbers>0.5)
if(abs(a1-a2)==3|abs(a2-a3)==3|abs(a3-a4)==3)
s=s+1;
end
end
end
end
end
end
fprintf('thereare%dkindsofkeys(4teeth)\n',s);
s=0;
forj1=1:
4
forj2=1:
4
forj3=1:
4
forj4=1:
4
forj5=1:
4
a1=j1;a2=j2;a3=j3;a4=j4;a5=j5;
amax=max([a1,a2,a3,a4,a5]');
amin=min([a1,a2,a3,a4,a5]');
numbers=(amax-a1)*(a1-amin)+(amax-a2)*(a2-amin)+(amax-a3)*(a3-amin)+(amax-a4)*(a4-amin)+(amax-a5)*(a5-amin);
if(numbers>0.5)
if(abs(a1-a2)==3|abs(a2-a3)==3|abs(a3-a4)==3|abs(a4-a5)==3)
s=s+1;
end
end
end
end
end
end
end
fprintf('thereare%dkindsofkeys(5teeth)\n',s);
s=0;
forj1=1:
4
forj2=1:
4
forj3=1:
4
forj4=1:
4
forj5=1:
4
forj6=1:
4
a1=j1;a2=j2;a3=j3;a4=j4;a5=j5;a6=j6;
amax=max([a1,a2,a3,a4,a5,a6]');
amin=min([a1,a2,a3,a4,a5,a6]');
numbers=(amax-a1)*(a1-amin)+(amax-a2)*(a2-amin)+(amax-a3)*(a3-amin)+(amax-a4)*(a4-amin)+(amax-a5)*(a5-amin)+(amax-a6)*(a6-amin);
if(numbers>0.5)
if(abs(a1-a2)==3|abs(a2-a3)==3|abs(a3-a4)==3|abs(a4-a5)==3|abs(a5-a6)==3)
s=s+1;
end
end
end
end
end
end
end
end
fprintf('thereare%dkindsofkeys(6teeth)\n',s);
s=0;
forj1=1:
4
forj2=1:
4
forj3=1:
4
forj4=1:
4
forj5=1:
4
forj6=1:
4
forj7=1:
4
a1=j1;a2=j2;a3=j3;a4=j4;a5=j5;a6=j6;
amax=max([a1,a2,a3,a4,a5,a6]');
amin=min([a1,a2,a3,a4,a5,a6]');
numbers=(amax-a1)*(a1-amin)+(amax-a2)*(a2-amin)+(amax-a3)*(a3-amin)+(amax-a4)*(a4-amin)+(amax-a5)*(a5-amin)+(amax-a6)*(a6-amin);
if(numbers>0.5)
if(abs(a1-a2)==3|abs(a2-a3)==3|abs(a3-a4)==3|abs(a4-a5)==3|abs(a5-a6)==3)
s=s+1;
end
end
end
end
end
end
end
end
end
fprintf('thereare%dkindsofkeys(7teeth)\n',s);
s=0;
forj1=1:
4
forj2=1:
4
forj3=1:
4
forj4=1:
4
forj5=1:
4
forj6=1:
4
forj7=1:
4
forj7=1:
4
a1=j1;a2=j2;a3=j3;a4=j4;a5=j5;a6=j6;
amax=max([a1,a2,a3,a4,a5,a6]');
amin=min([a1,a2,a3,a4,a5,a6]');
numbers=(amax-a1)*(a1-amin)+(amax-a2)*(a2-amin)+(amax-a3)*(a3-amin)+(amax-a4)*(a4-amin)+(amax-a5)*(a5-amin)+(amax-a6)*(a6-amin);
if(numbers>0.5)
if(abs(a1-a2)==3|abs(a2-a3)==3|abs(a3-a4)==3|abs(a4-a5)==3|abs(a5-a6)==3)
s=s+1;
end
end
end
end
end
end
end
end
end
end
fprintf('thereare%dkindsofkeys(8teeth)\n',s);
3)结果输出
thereare8kindsofkeys(3teeth)
thereare64kindsofkeys(4teeth)
thereare360kindsofkeys(5teeth)
thereare1776kindsofkeys(6teeth)
thereare7104kindsofkeys(7teeth)
thereare28416kindsofkeys(8teeth)