数学建模详解.docx
《数学建模详解.docx》由会员分享,可在线阅读,更多相关《数学建模详解.docx(21页珍藏版)》请在冰豆网上搜索。
数学建模详解
1.编写函数M文件,对任意输入向量(矩阵)X,计算X的最大和最小元素.并将最大值赋予M,对应行、列下标赋值给I;将最小值赋予N,对应行、列下标赋值给J。
%写M文件命名为math1.m
X=input('pleaseinput:
');
M=max(max(X))
N=min(min(X))
[a,b]=find(X==M);
[c,d]=find(X==N);
I=[a,b]
J=[c,d]
%输入命令测试math1.m
pleaseinputMatrix:
[123;789;654]
M=
9
N=
1
I=
23
J=
11
2.根据世界1950~2005年人口数据(单位:
千)(见表Populationdata)中的非洲(AFRICA)数据完成下列任务:
(1)用3次多项式拟合人口数据,并在同一图中画出原数据的散点图和拟合结果图,将拟合结果与原数据进行比较。
t=1950:
2005;
x=[224067.97228944.869233985.575239208.038244626.804250253.059256094.356262154.89268435.987274937.081281658.503288604.469295785.684303220.497310931.65318937.034327253.709335885.283344820.452354039.863363534.745373305.407383374.622393783.578404586.128415824.0238427506.0998439630.994452216.103465278.237478824.469492857.319507360.108522294.269537607.559553254.734569215.434585474.333601996.495618744.027635684.71652799.872670075.317687490.535705026.206722668.717740413.971758263.182776217.489794281.619812465.619830767.723849205.927867835.353886727.428905935.864];
p=polyfit(t,x,3) ;%改变参数可实现不同次多项式的拟合
y=p
(1)*t.^3+p
(2)*t.^2+p(3)*t+p(4);
plot(t,x,'k-',t,y,'b.-')%作二维图形曲线图和点图
legend('原数据','拟合结果')%显示图例
(2)用最小二乘法根据带阻滞模型中人口函数进行拟合,并在同一图中画出原数据的散点图和拟合结果图,将拟合结果与原数据进行比较。
%输入函数M文件
functionf=tc(x)
t=0:
55;
c=[224067.97228944.869233985.575239208.038244626.804250253.059256094.356262154.89268435.987274937.081281658.503288604.469295785.684303220.497310931.65318937.034327253.709335885.283344820.452354039.863363534.745373305.407383374.622393783.578404586.128415824.0238427506.0998439630.994452216.103465278.237478824.469492857.319507360.108522294.269537607.559553254.734569215.434585474.333601996.495618744.027635684.71652799.872670075.317687490.535705026.206722668.717740413.971758263.182776217.489794281.619812465.619830767.723849205.927867835.353886727.428905935.864];
f=c-x
(1)./(1+((x
(1))/224067.97-1)*exp((x
(2))*t))%带阻滞模型中人口函数
formatlong
%输入运行程序
x0=[905935.864,-0.01368] ;
lsqnonlin('tc',x0)
ans=
1.0e+008*
5.165488761262176-0.000000000257224
%再以此为初始值
x0=1.0e+008*[5.165488761262176-0.000000000257224];lsqnonlin('tc',x0)
ans=
1.0e+008*
5.165488861262176-0.000000000257224
%将拟合结果与原数据进行比较
%输入运行程序
t=0:
55;
c=[224067.97228944.869233985.575239208.038244626.804250253.059256094.356262154.89268435.987274937.081281658.503288604.469295785.684303220.497310931.65318937.034327253.709335885.283344820.452354039.863363534.745373305.407383374.622393783.578404586.128415824.0238427506.0998439630.994452216.103465278.237478824.469492857.319507360.108522294.269537607.559553254.734569215.434585474.333601996.495618744.027635684.71652799.872670075.317687490.535705026.206722668.717740413.971758263.182776217.489794281.619812465.619830767.723849205.927867835.353886727.428905935.864];
y=516548886.1262176./(1+(516548886.1262176/224067.97-1)*exp(-0.0257224*t));
plot(t,c,'k-',t,y,'b.-')
legend('原数据','拟合结果')
(3)预测2020年非洲人口数。
y=516548886.1262176./(1+(516548886.1262176/224067.97-1)*exp(-0.0257224*70))
结果:
y=
1.353335981843351e+006
3.分别用MATLAB和LINGO两种方法求解非线性规划
s.t.
F=[1,1,1]
A=[];
b=[-50,-10,-20,-15];
lb=zeros[3,1];
[x,fval,exitflag,outpt,lambda]=linprog(f,A,b,[],[],lb);
分别用MATLAB和LINGO两种方法求解非线性规划
s.t.
Lingo:
方法一
model:
sets:
n/1..4/:
a,b;
m/1..3/:
x;
f(n,m):
r;
endsets
data:
a=4568;
b=50102015;
c=19;
d=16;
enddata
min=@sum(m(i):
x(i));
@for(n(i):
@sum(m(j):
x(j)*r(i,j))>=b(i));
@for(m(j):
@sum(n(i):
a(i)*r(i,j))<=c);
@for(m(j):
@sum(n(i):
a(i)*r(i,j))>=d);
End
最优单纯形表中第0行系数,检验数(min型)
对应非基变量增加1个单位时目标函数增加的量
松弛或剩余变量值
对偶价格的值,表示相应约束右端增加1个单位时目标函数增加的量
Lingo方法二:
model:
min=x1+x2+x3;
x1*r11+x2*r12+x3*r13>=50;
x1*r21+x2*r22+x3*r23>=10;
x1*r31+x2*r32+x3*r33>=20;
x1*r41+x2*r42+x3*r43>=15;
4*r11+5*r21+6*r31+8*r41<=19;
4*r12+5*r22+6*r32+8*r42<=19;
4*r13+5*r23+6*r33+8*r43<=19;
4*r11+5*r21+6*r31+8*r41>=16;
4*r12+5*r22+6*r32+8*r42>=16;
4*r13+5*r23+6*r33+8*r43>=16;
x1+x2+x3>=26;
x1+x2+x3<=31;
x1>=x2;
x2>=x3;
@gin(x1);@gin(x2);@gin(x3);
@gin(r11);@gin(r12);@gin(r13);
@gin(r21);@gin(r22);@gin(r23);
@gin(r31);@gin(r32);@gin(r33);
@gin(r41);@gin(r42);@gin(r43);
End
@free(x1);@free(x2);@free(x3);
@free(r11);@free(r12);@free(r13);
@free(r21);@free(r22);@free(r23);
@free(r31);@free(r32);@free(r33);
@free(r41);@free(r42);@free(r43);
End
4.公交车问题
根据公汽线路信息数据解决下列问题:
(1)将公汽线路信息数据导入Excel表;
(2)根据公汽线路信息数据,编写对任意车站,寻找通过该站的汽车线路的M文件;
%编写M文件命名为x1.m
A=[…………];
m=input('pleaseinputstartingstation:
');
fori=1:
929
forj=3:
88
ifA(i,j)==m
B=[A(i,1)A(i,2)]%返回该车站所在的路数,和上下行
C=[ij]%返回该站在表格中的具体位置
end
end
end
%命令行输入测试得出结果
x1
pleaseinputstartingstation:
388
B=
13
C=
15
B=
251
C=
449
B=
252
C=
4522
B=
281
C=
4921
B=
282
C=
5010
B=
1411
C=
25314
B=
1412
C=
25416
B=
2483
C=
44840
B=
2701
C=
48715
B=
2702
C=
4888
B=
2951
C=
53113
B=
2952
C=
5328
B=
3482
C=
63036
B=
3831
C=
68614
B=
3832
C=
6878
B=
4461
C=
7988
B=
4462
C=
79923
(3)编写M文件,对任意两个车站m,n,判断是否有线路通过这两车站,若有则编写寻找通过该站的汽车线路的M文件
%编写M文件命名为x2.m
A=[…..];
m=input('pleaseinputstartingstation:
');
n=input('pleaseinputtheterminal:
');
l=0;%光标放在初始处
[a,b]=find(A==m);
[p,q]=size(a);
fori=1:
1:
p
forj=b(i)+1:
1:
88
ifA(a(i),j)==n
l=l+1;%光标依次下移
f(l)=a(i);
end
end
end
I=[A(f,1),A(f,2)]
%命令行输入测试得出结果
(4)对任意两个车站m,n,若没有线路直接通过这两车站,编写通过一次转车而到达两站的M文件
%编写M文件命名为x4.m
A=[…..];
m=input('请输入起点站:
');
n=input('请输入终点站:
');
[a,b]=find(A==m);
[p,q]=size(a);
[c,d]=find(A==n);
[f,g]=size(c);
s=0;
ifA(a(i),j)==n
fori=1:
p
forj=1:
f
fork=b(i)+1:
88
fort=3:
d(j)-1
ifA(a(i),k)==A(c(j),t)
s=s+1;
M(s)=a(i);
D(s)=c(j);
R(s)=A(a(i),k);%R是行向量,按行排列,最好需要按列列
end
end
end
end
end
end
N=[A(M,1),A(M,2),R',A(D,1),A(D,2)]%起始站所在路、上下行、转车的站点、终点站所在路数、上下行
%命令行输入测试得出结果
x4
请输入起点站:
388
请输入终点站:
4
N=
1336122671
138192671
1335242671
138202671
1339142671
1336122231
138192231
1335242231
138202231
133885381
133914381
13128381
27029892671
270236332671
270224102671
27029892231
270236332231
270224102231
27021710381
29522312381
2952127381
4461283321
446121531642
446115752872
446120992872
446126482872
446139192872
2513933301
25124413301
25123633301
25138773301
25137273301
25136973301
25117463301
251393274
2513727274
2513697274
2511746274
251393381
2513931641
25123631641
25138771641
25137271641
25136971641
25117461641
25135511641
25112841641
2513933654
25123633654
25138773654
25137273654
25136973654
25117463654
2513933041
25123633041
25138773041
25137273041
25136973041
25117463041
2513934562
25123634562
25137274562
25136974562
25117464562
2513934981
25124414981
25123634981
25138774981
25137274981
25136974981
25117464981
25135514981
25112844981
25130164981
2513932871
25124412871
25123632871
25138772871
25137272871
25136972871
25117462871
2513933911
25124413911
25123633911
25138773911
25137273911
25136973911
25117463911
25135513911
25112843911
25123083911
25130163911
25124414842
25123634842
25138774842
25137274842
25136974842
25117464842
251393182
2512441182
2512363182
2513877182
2513727182
2513697182
2511746182
141139142671
141126222231
141117562231
141137152231
14112312381
1411127381
14113914381
14112622381
14111756381
14113715381
383128752192
383119692192
2701283321
141223023301
141232323301
141230792192
1412132721
28112792192
28123614041
252283321
44624372191
44624373341
(5)对任意两个车站m,n,若没有通过一次转车而到达两站的线路,编写通过2次转车而到达两站的M文件
functionLz=ff4(n,m)
A=[…………………]
L1=ff1(n);
L2=ff1(m);
k=length(L1);h=length(L2);
LL=0;
u=0;
fori=1:
k
forj=1:
h
ifL1(i)==L2(j)
u=u+1;
LL(u)=L1(i);
end
end
end
ifLL~=0
Lz=LL;
u
return
end
LL1=0;
u=0;
fori=1:
k
A1=A(L1(i),:
);
forj=1:
h
A2=A(L2(j),:
);
forl=1:
86
forg=1:
86
if(A1(l)==A2(g))&(A1(l)>0)
u=u+1;
LL1(u,1)=L1(i);LL1(u,2)=L2(j);LL1(u,3)=A1(l);
end
end
end
end
end
ifLL1~0
Lz=LL1;
u
return
end
Ax=ff1(n);
Bx=ff1(m);
k=length(Ax);h=length(Bx);
LL2=0;
u=0;
fori=1:
k
a=0;
Ad1=0;
Ad1=A(Ax(i),:
);
a=Ad1>0;
aa=sum(a);
fors=1:
aa
Ax1=0;
Ax1=ff1(Ad1(s));
k1=length(Ax1);
forj=1:
h
b=0;
Bd1=0;
Bd1=A(Bx(j),:
);
b=Bd1>0;
bb=sum(b);
fort=1:
bb
Bx1=0;
Bx1=ff1(Bd1(t));
h1=length(Bx1);
forl=1:
k1
forg=1:
h1
ifAx1(l)==Bx1(g)
u=u+1;
LL2(u,1)=Ax(i);
LL2(u,2)=Ad1(s);
LL2(u,3)=Ax1(l);
LL2(u,4)=Bd1(t);
LL2(u,5)=Bx(j);
end
end
end
end
end
end
end
Lz=LL2;
u