资源描述
数学建模考题答案
********感谢赵汝强同学整理*********
一、选择题
1、 矩阵输入
2、 实验1(2)
随机生成4种类型的随机矩阵,编程求出其最大值及其所处的位置
% 要重复四次,使用自定义函数更方便,虽然函数只有两行。
x = rand(3) % [0,1] 均匀分布
[i,j,v] = myMax(x)
x = randn(3) % 标准正态分布
[i,j,v] = myMax(x)
x = exprnd(1,3) % 均值为1的指数分布
[i,j,v] = myMax(x)
x = poissrnd(1,3) % lambda为1的poisson分布
[i,j,v] = myMax(x)
function [i,j,v] = myMax(x)
% 编程求最大值所在的位置
v = max(x(:));
[i,j] = find(x == v);
3、实验1(3)画出 y = x*sin(x) 在[0,100] 上的图,求出局部极小值的位置,并统计出现局部极小值出现的次数。
h = 1e-2; % 可以调整步长来调整结果的精度。
x = 0:h:100;
y = x.*sin(x);
xmin = []; %存放局部极小点的x坐标
ymin = []; %存放局部极小点的y坐标
for i = 2:length(x)-1
if y(i)<y(i-1) && y(i)<y(i+1)
xmin = [xmin x(i)];
ymin = [ymin,y(i)];
end
end
plot(x,y,'b');
hold on;
plot(xmin,ymin,'r*');
disp('局部极小点个数');
disp(length(xmin))
4、实验2(3)用两种方法画出半径为1的球面。
% 方法1
figure, sphere(100) % 100表示画出的曲面小方块为100*100
% 方法2 给出参数方程,使用ezsurf,最不容易出错的方法。
r = 1;
x = @(theta,phi) r*sin(theta)*cos(phi);
y = @(theta,phi) r*sin(theta)*sin(phi);
z = @(theta,phi) r*cos(theta);
figure, ezsurf(x,y,z,100) % 100表示画出的曲面小方块为100*100
% 方法3 这种写法比教材上好懂一点。
[theta,phi] = meshgrid(linspace(0,2*pi,100)); % 100表示画出的曲面小方块为100*100
x = r*sin(theta).*cos(phi);
y = r*sin(theta).*sin(phi);
z = r*cos(theta);
figure,surf(x,y,z);
5、实验3(1)1. 2011高教社杯全国大学生数学建模竞赛B题附件2中有582个路口信息,请求出各个区内部,任意两个路口之间的直线距离。
赛题链接:
解答说明:
(1) 附件是Excel文件,如果对Excel文件不熟悉,可以将数据拷贝到txt文件里面,使用load,最简单。 如果使用xlsread,请参考教材p425页的例子或者查找matlab帮助。
(2) 因为要求6个区内部点之间的直线距离,如果直接写成程序段,这个程序段会重复6次,所以写出函数的形式,然后调用6次是比较合适的做法。函数见myDis.m
(3) 不同的区之间的数据最好是能够使用程序来自动区分,而不是靠人来指定范围。
% 不同路口的坐标和路口所在的坐标,
% 第一个输出数字,第二输出文本
[Points,Districts] = xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls', '全市交通路口节点数据','B2:D583');
%% 求出6个区的起始和终点的序号。
% 竞赛时,如果编程不熟练,直接手工查找也花不了多长时间,可能比编程效率还高。
% 下面用编程的方法解决。
% 将细胞数组转换为简单字符串。
d = [];
for i = 1:length(Districts)
d = [d,Districts{i}];
end % d会变成'AA.....FF'
pos = zeros(6,2); % pos 中存储6个区的起始和终点位置。
ch = 'A';
for i = 1:6
p = find(d==ch);
pos(i,1) = p(1); % 起始位置
pos(i,2) = p(end); % 终点位置
ch = ch + 1;
end
%% 如果不使用上面代码,直接手工做,应该类似于下面的写法。
% pos = [1,92; 93,165; 166,319; 320,371; 372,474; 475,582];
% 以这个问题而言,手工效率更高。如果城市区达到100个左右,手工会是一件很痛苦的事情,而且
% 容易出错。
%% 求6个区,每一个区内部的路口之间的直线距离。
ch = 'A';
for i = 1:size(pos,1)
part_points = Points(pos(i,1):pos(i,2),:); % 取出第i个区的所有点坐标
dis = myDis(part_points);
dlmwrite(['区间',char(ch+i-1),'距离.txt'],dis,'delimiter','\t');
end
6、实验5(1)
a=zeros(9); %容量矩阵初始化
a(1,[2:4])=[20,20,100]; %输入各弧上的容量
a(2,[5 6 8])=[30,10,40];
a(3,[7,8])=[10,50];
a(4,[5:8])=[20,10,40,5];
a([5:8],9)=[20,20,60,20];
a=sparse(a); %构造工具箱需要的稀疏矩阵
[b,c]=graphmaxflow(a,1,9) %调用工具箱求最大流的命令
7、6(1)
% 教材习题中的数据可以从光盘中电子版的习题里面直接拷贝出来,存放在txt文件中。
x = 0:400:5600;
y = 4800:-400:0;
[xx,yy] = meshgrid(x,y);
z = load('data.txt');
surf(xx,yy,z) % 大家可以看到曲面非常的不光滑。
% 待插值的数据
x1 = 0:50:5600;
y1 = 4800:-50:0;
% 请完成剩下的任务,完成插值,函数interp2,
z1=interp2(x,y,z,x1,y1,'spline');
[xx2,yy2]=meshgrid(x1,y1);
% 画出曲面,函数surf
figure;
surf(xx2,yy2,z1)
% 画出等高线 contour
figure;
8、实验7(1)
range = 1; % 大家可以修改range,尝试 3,5,10,看看结果是否有差异
step = 1e-1;
x = -range:step:range;
y = x.^3- 6*x.^2 + 5*x -3; % 真实数据
figure,plot(x,y);
y2 = y + randn(size(x)); % 干扰数据
figure,plot(x,y2,'b');
% 通过x,y2拟合出多项式系数。 建议使用polyift
c2 = polyfit(x,y2,2);
c3 = polyfit(x,y2,3);
c4 = polyfit(x,y2,4);
% 结果
yp2 = polyval(c2,x);
yp3 = polyval(c3,x);
yp4 = polyval(c4,x);
%在同一幅图上画出拟合的结果 2次多项式
hold on;
plot(x,yp2,'r');
%在同一幅图上画出拟合的结果 3次多项式
plot(x,yp3,'b--o');
%在同一幅图上画出拟合的结果 4次多项式
plot(x,yp4,'c--*');
9、实验7(2)
x = 1:8;
y = [15.3 20.5 27.4 36.6 49.1 65.6 87.87 117.6 ];
figure,plot(x,y,'r*');
% 使用方法1拟合 lsqcurvefit
f = @(ab,x) ab(1)*exp(ab(2)*x);
ab = lsqcurvefit(f,rand(2,1),x,y);
y2 = ab(1)*exp(ab(2)*x);
% 使用方法2拟合,将指数转换为线性,然后使用polyfit
c = polyfit(x,log(y),1);
b2 = c(1);
a2 = exp(c(2));
y3 = a2*exp(b2*x);
%在同一幅图上画出拟合的结果
hold on;
plot(x,y2,'bo');
plot(x,y3,'g+');
10、实验9(1)
问题1 求微分方程组初值问题
式中,,,,。
选用ode45函数计算,其相对误差限为,绝对误差限为,分别画出初值条件为,,,,解的相平面轨迹图。
options = odeset('RelTol',1e-5,'AbsTol',[1e-6 1e-6]);
[t1,y1] = ode45(@f91,[0 12],[1,0.3],options);
[t2,y2] = ode45(@f91,[0 12],[1,0.5],options);
[t3,y3] = ode45(@f91,[0 12],[1,0.7],options);
[t4,y4] = ode45(@f91,[0 12],[1,0.9],options);
[t5,y5] = ode45(@f91,[0 12],[1,1.1],options);
figure,plot(y1(:,1),y1(:,2));
hold on; plot(y2(:,1),y2(:,2));
plot(y3(:,1),y3(:,2));
plot(y4(:,1),y4(:,2));
plot(y5(:,1),y5(:,2));
function dx =f91(t,x)
dx = zeros(2,1);
dx(1) = 2*x(1)-x(1)*x(2);
dx(2) = -x(2)+2*x(1)*x(2);
二、模型
1.实验4(1)(2)
如何选择物流中心,使得成本最小而且能够覆盖所有街区?建立模型,给出Lingo代码,给出结果。
模型:
sets:
Cri/1..10/:x,w;
Blo/1..12/;
links(Cri,Blo):a;
endsets
data:
a = 0 0 1 1 1 1 1 1 0 1 0 0
0 0 1 1 1 0 1 1 1 1 0 0
1 1 0 0 0 0 0 1 0 1 0 0
0 0 1 0 1 1 0 1 0 1 0 0
0 0 0 0 0 0 1 0 1 1 0 0
0 0 0 0 0 0 1 0 1 0 1 1
1 0 0 1 0 0 0 0 1 1 0 0
1 0 1 1 0 0 0 0 0 0 1 1
0 1 0 0 1 1 0 0 0 1 1 1
1 1 1 0 1 0 1 0 1 0 0 1;
w = 56, 45,78,80,90,10,40,65,45,56;
enddata
min = @sum(Cri(i):x(i)*w(i));
!@for(Cri(i):@bnd(0,x(i),1));
@for(Cri(i):@bin(x(i)));
@for(Blo(j): @sum(Cri(i):x(i)*a(i,j))>=1);
4(2)
2、实验8(3)
展开阅读全文