system: [SYSTEM]

user: 4. MATLAB与数学建模 在系统数学建模过程中，对象的一般特点是复杂的、受多种因素影响的，往往需要在很短的时间内完成复杂的计算，仅仅依靠手工计算几乎是不可能完成的，所以在数学建模过程中，往往伴随着大量使用计算机的计算。MATLAB强大的数值计算能力，能够非常方便、快捷、高效的解决数学建模中的许多实际问题，在模型求解方面占有不可或缺的位置，因此，MATLAB在数学建模中受到了许多建模工作者的重视与青睐[ 5 ] -[ 7 ] 。 数学建模中，有很多MATLAB求解方法，如MATLAB实现数据建模、MATLAB实现规划问题、MATLAB实现灰色预测等方法，接下来，将对这几种常用的MATLAB方法用具体实例来进行说明： 4.1. MATLAB实现数据建模 此方法在数学建模中经常应用的场合为：数据处理(数据清预处理、数值计算、数据拟合)、绘制图形、建议预测。 例如，一些骑车人常常在自行车的辐条上安装一些亮丽夺目的装饰物，自行车行驶在不同轨迹的路上行驶时，车轮装饰物的会相应呈现不同运动轨迹，增添美感。试画出自行车在直线形状、抛物线形状以及正弦曲线形状的路面上行驶时，装饰物的运动轨迹图形。借以表现MATLAB的绘图功能及方法程序。 假设自行车在行驶过程中，车轮外圆始终只与曲线 的一个点接触。将路面视作一条过原点的曲线 ，车轮为半径为 的圆，该圆位于曲线 的上方，且与此曲线相切。设装饰物 在距离圆心 处，显然 。 与圆交于 点，以 点为初始接触点，圆(车轮)滚过 角度后(车轮与地面无相对滚动)，圆与曲线的接触点变为 ，圆心从 移动的 ，装饰物 移动到 ，如图1所示。 设 ， ， ，则 ，所以 在 过 点的法线的上侧，且在以 为圆心的圆周上，所以有 ， ，联立解得 ， 。又对 ，有 ， ，其中 ， 。 所以，装饰物的运动轨迹方程为 ， 图1. 自行车车轮运动示意图 接下来，任意取自行车运行路线的曲线方程， (1) 直线：取 ，则有 ， ，此时装饰物的运动轨迹方程为： ， (2) 抛物线：取 ，则有 ， ，此时，装饰物的运动轨迹方程为： ， (3) 正弦曲线：取 ，则有 ， ，此时，装饰物的运动轨迹方程为： ， 具体MATLAB程序为： clc，clear all; %(1)直线情况的实现 x0=0:0.01:2;R=0.1;r=0.075; x1=x0-r*sin(x0/R); %计算f(x)=0时，p点的运动轨迹 y1=R-r*cos(x0/R); subplot(3，1，1); plot(x1，y1，x0，0); %绘制运动轨迹曲线和f(x)曲线 xlabel('x1车轮水平运行距离');ylabel('y1水平面高度');grid on %(2)抛物线情况的实现 x0=0:0.01:2;R=0.1;r=0.075; y0=0.2-(0.2*x0).^2; %计算路面曲线 fai=atan(-0.4*x0); %求φ int=inline('sqrt(1+(-0.4*x).^2)'); %定义θ的积分函数 for k=1:length(x0) xita1(k)=quad(int，0，x0(k))/R; %调用quad函数求θ end x2=x0+R*0.4*x0/sqrt(1+(-0.4*x0).^2)-r*sin(xita1-fai); %运动轨迹方程 y2=y0+R./sqrt(1+(-0.4*x0).^2)-r*cos(xita1-fai); subplot(3，1，2); plot(x2，y2，x0，y0); %绘制运动轨迹曲线和f(x)曲线 xlabel('x2车轮水平运行距离');ylabel('y2水平面高度');grid on %(3)正弦曲线情况的实现 x0=0:0.01:10;R=0.1;r=0.075; y0=0.2*sin(x0); %计算路面曲线 fai=atan(0.2*cos(x0)); %求φ int=inline('sqrt(1+(0.2*cosx).^2)'); %定义θ的积分函数 for k=1:length(x0) xita2(k)=quad(int，0，x0(k))/R; %调用quad函数求θ end x3=x0-R*0.2*cos(x0)/sqrt(1+(0.2*cos(x0)).^2)-r*sin(xita2-fai); %运动轨迹方程 y3=0.2*sin(x0)+R./sqrt(1+(0.2*cos(x0)).^2)-r*cos(xita2-fai); subplot(3，1，3); plot(x3，y3，x0，y0); %绘制运动轨迹曲线和f(x)曲线 xlabel('x3车轮水平运行距离');ylabel('y3水平面高度');grid on 运行此程序，得到三种情况下，装饰物的运动轨迹图形为(图2)。 4.2. MATLAB实现规划问题 此方法在数学建模中经常应用的场合为：多约束线性规划、整数规划和不太复杂的多约束非线性规划、整数规划。 例如，某公司在六个城市 ， ， ， ， ， 中有分公司，从 到 的直接航程票价记在下述矩阵的( ， )位置上。( 表示无直接航路)，请帮助该公司设计一张城市 到其他城市之间的票价最便宜的路线图。 用矩阵 ( 为顶点个数)存放各边权的邻接矩阵，行向量 、 、 、 分别用来存放 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。其中分量 ； 存放始点到第 点最短通路中第 顶点前一顶点的序号； 存放由始点到第 点最短通路的值。求第一个城市到其他城市的最短路径，MATLAB程序为： 图2. 装饰物的运动轨迹图形 clc， clear all; a=zeros(6); a(1，2)=50;a(1，4)=40;a(1，5)=25;a(1，6)=10; a(2，3)=15;a(2，4)=20;a(2，6)=25; a(3，4)=10;a(3，5)=20; a(4，5)=10;a(4，6)=25; a(5，6)=55; a=a+a'; a(find(a==0))=inf; %矩阵为零的位置距离为无穷小inf pb(1:length(a))=0;pb(1)=1; index1=1;index2=ones(1，length(a)); d(1:length(a))=inf;d(1)=0;temp=1; while sum(pb) tb=find(pb==0) d(tb)=min(d(tb)，d(temp)+a(temp，tb)); tmpb=find(d(tb)==min(d(tb))); temp=tb(tmpb(1)); pb(temp)=1; index1=[index1，temp]; temp2=find(d(index1)==d(temp)-a(temp，index1)); index2(temp)=index1(temp2(1)); end d，index1，index2 运行该程序，即可得到城市 到其他城市之间的票价最便宜的路线： d = 0 35 45 35 25 10 4.3. MATLAB实现灰色预测 此方法在数学建模中经常应用的场合为：数据量少的情况下预测。 例如，2009年的全国大学生数学建模竞赛(CUMCM)的D题为某服务公司承办了一次全国性的会议，会议筹备组要制定一个预定宾馆客房，租借会议室吧、租用客车的合理方案。筹备组需要先预测与会代表人数。预测的依据是代表回执数量以及往届的与会人员数据。已知本届会议的回执情况(见表1)及以往几届会议代表回执和与会情况(见表2)。要解决的问题是：根据这些数据，预测本届会议与会代表人数。 根据题目所给出的数据，知道本届发来回执的代表人数为 ，由于发来回执但未与会的代表人数 与发来回执的代表人数 之间有一定的关系，所以利用最小二乘法拟合出相应曲线，然后得到发来回执但未与会的代表数量。MATLAB程序为： x=[315 356 408 711]; y=[89 115 121 213]; p2=polyfit(x，y，2) x1=300:800; y2=polyval(p2，x1); plot(x，y，'rp'，x1，y2) xlabel('发来回执的代表数量');ylabel('发来回执但未与会的代表数量'); z=polyval(p2，755) 运行此程序，即得到二次拟合曲线系数与结果及二次拟合图(图3)： p2 = −0.0001 0.4463−33.8704 z = 223.4953 二次拟合曲线为： ，可得到今年发来回执但未与会的代表人数为223.4953 (人)，为保守起见，对223.4953 (人)进行向下取整，即发来回执但未与会的代表人数为223 (人)。 另一方面，由于未发来回执而与会的代表人数 与发来回执的代表人数 之间的影响关系不大，需要使用题目给出的数据单独进行预测，但由于题目所给数据有限，即采用对数据要求不大但精度较高的灰色预测模型来进行预测。 首先，我们定义：未知与会率 = 未发来回执而与会的代表人数/发来回执的代表人数。则可得到往届 Table 1 The receipt situation of delegate 要求 独住1 独住2 独住3 合住1 合住2 合住3 男 107 68 41 154 104 32 女 59 28 19 78 48 17 表1. 本届与会代表的回执情况(单位：人) Table 2 Receipt and present situation of the past few delegate 届 次 第一届 第二届 第三届 第四届 发来回执的代表数量 315 356 408 711 发来回执但未与会的代表数量 89 115 121 213 未发回执而与会的代表数量 57 69 75 104 表2. 以往几届与会代表回执和与会情况(单位：人) 的未知与会率，如表3所示。 MATLAB程序为： clear syms a b; c=[a b]'; A=[0.180952381 0.193820225 0.183823529 0.146272855]; B=cumsum(A); n=length(A); for i=1:(n-1) C(i)=(B(i)+B(i+1))/2; end D=A;D(1)=[ ]; D=D'; E=[-C;ones(1，n-1)]; c=inv(E*E')*E*D; c=c'; a=c(1);b=c(2); F=[ ];F(1)=A(1); for i=2:(n+1) F(i)=(A(1)-b/a)/exp(a*(i-1))+b/a; end G=[ ];G(1)=A(1); for i=2:(n+1) G(i)=F(i)-F(i-1); end t1=1:4; t2=1:5; G plot(t1，A，'o'，t2，G) 运行此程序，得到本届大会的未知与会率预测数据为： G = 0.1810 0.1980 0.1735 0.1520 0.1331 以及预测数据与原始数据的比较图(图4)。 得到本届的未知与会率为0.1331，所以，本届会议未发来回执而与会的代表人数为：755 (人) × 0.1331 = 100.49 (人)，同样为保守考虑，向上取整为101 (人)。 综上可预测，本届与会代表人数为：755 (人) – 223 (人) + 101 (人) = 633 (人)。 Table 3 Unknown present rate of the past delegate 届次 第一届 第二届 第三届 第四届 未知与会率 0.180952381 0.193820225 0.183823529 0.146272855 表3. 往届未知与会率 图3. 二次拟合图 图4. 预测数据与原始数据的比较图