1. 引言
近几十年,数学科学迅速向自然科学、工程、经济、管理和社会科学等各个领域渗透,在许多方面发挥着越来越重要的作用,在很多情况下起着举足轻重、甚至决定性的作用。而数学建模竞赛作为大学生的群众性科技活动,越来越受到各高校的重视。与此同时,数学建模和与之相伴的计算正在成为工程设计中的关键部分,数学科学与数学软件的结合,成为解决计算问题的关键技术。
MATLAB自1984年由MathWorks公司推向市场以来,经历了30年的发展和竞争,现已风靡世界。可靠的数值计算和符号计算功能、强大的绘图功能、简单易学的语言体系以及为数众多的应用工具箱是MATLAB区别于其他科技应用软件的显著标志。MATLAB有着丰富的函数资源,各行各业的专业人员不需要掌握太多的软件编程知识就可以编写出实用的程序,从而使他们从繁琐的程序代码中解放出来,专心从事手头研究或工作[1] -[4] 。
2. MATLAB的特点
2.1. 语言简单易学
MATLAB是一种集编程与解释执行于一体的高级语言,语句采取通用的数学形式,她把编辑、编译、连接、执行功能融为一体,调试程序手段丰富、调试速度快,可以快速排除输入程序时书写、语法等方面的错误,具有一般语言基础的用户可以较快掌握。
2.2. 代码短小高效
MATLAB最基本的数据单元是矩阵,它将数学问题的许多算法变成了大量函数库,既有解决许多问题的工具箱,只需简单的调用现成函数便可以快速解决问题,不需要用户再花费很长时间去实现常规算法。
2.3. 计算功能强大
MATLAB具有强大的矩阵数值计算功能,它以矩阵作为数据运算的基本单位,同时利用符号和函数可以对矩阵进行加减乘除、转置、求逆等一系列线性代数运算,轻松实现大型数值算法的程序编写,可以解决实际应用中的许多数学问题,尤其是与矩阵计算有关的问题。
2.4. 强大的绘图功能
MATLAB具有突出的绘图功能,工具箱中含有许多绘图函数命令,可以绘制各种图形,包括二维或三维图形(如线形图,条形图,饼图等)、工程特性较强的特殊图形(玫瑰花图,极坐标图等)、显示数据分析的图形(如矢量图,等值线图,曲面图等),也可以修改和装饰图形,突出呈现的效果,还可以作有关生成快照的动画,利用MATLAB图形句柄操作并同时结合绘图函数绘制自己最理想的图形,为用户在绘图方面提供了一个没有束缚的广阔空间。
2.5. 计算机仿真
运用MATLAB进行计算机仿真,就是利用Smulink来实现动态系统建模和仿真。它的优点是为用户省去了许多重复的代码编写工作,以简单的图形界面查看数学以及经济学中一些系统动态仿真效果
2.6. 领域广泛的工具箱
MATLAB分为两部分:核心部分和功能各异的工具箱。核心部分包含数百个核心内部函数,也是使用和构造工具箱的基础。工具箱(函数库)可分两个方向:功能性工具箱和学科性工具箱。功能性工具箱主要用途是对符号计算功能、图示建模仿真功能、文字处理功能以及与硬件实时交互的功能进行扩展。相比之下专业性比较强的学科性工具箱的编写都是出自于该领域内学术水平很高的专家。所以用户可以省去编写基础程序的繁琐、低效的工作,只需简单编写自己学科领域范围内的基础程序就可直接进行高效、精密、尖端的研究。
2.7. 开放性好
撇开内部函数,MATLAB的基本函数库和工具箱全部是公开的、可读可改的源文件,用户直接编写自己的函数扩充到基本函数库中或者可直接修改源文件在MATLAB中都是允许的,甚至开发新的应用领域,构造自己的工具箱。
2.8. 文件I/O和外部引用程序接口
MATLAB提供了外部程序接口,允许并支持在MATLAB与其他应用程序之间进行数据交换,也帮助其他程序设计语言能够调用MATLAB高效算法。识别并接受压缩格式的MAT文件,用户更是可以动态加载、删除或者重载Java类等。
3. 数学建模
3.1.数学模型与数学建模
数学模型是一种模拟,是用数学符号、数学式子、程序、图形等对实际课题本质属性的抽象而又简洁的刻划,而应用知识从实际课题中抽象、提炼出数学模型的过程就称为数学建模。建立数学模型的过程,是把错综复杂的实际问题简化、抽象为合理的数学结构的过程。要通过调查、收集数据资料,观察和研究实际对象的固有特征和内在规律,抓住问题的主要矛盾,建立起反映实际问题的数量关系,然后利用数学的理论和方法去分析和解决问题。这就需要深厚扎实的数学基础,敏锐的洞察力和想象力,对实际问题的浓厚兴趣和广博的知识面。数学建模是联系数学与实际问题的桥梁,是数学在各个领械广泛应用的媒介,是数学科学技术转化的主要途径,数学建模在科学技术发展中的重要作用越来越受到数学界和工程界的普遍重视,它已成为现代科技工作者必备的重要能力之一。
3.2.数学建模过程
数学建模是一种比较复杂的创造性活动,现实世界中的失误特点各异,不可能仅仅用一些公式化的框架就能规定出各种模型具体如何建立,所以,在这里只是大致归纳一下建模的一般原则和步骤:
(1) 模型准备:首先根据题目的要求,了解问题的实际背景,明确其实际意义,掌握对象的各种信息。
(2) 问题分析:对所要求的问题进行分析,根据研究对象的特点,分解复杂的研究对象为简单的和理想化的研究对象。
(3) 模型假设:根据实际对象的特征和建模的目的,对现实研究对象及问题进行必要的简化,并用精确的语言提出一些恰当合理的假设。
(4) 模型建立:在假设的基础上,利用适当的数学工具来刻划各变量之间的数学关系,建立相应的数学结构。
(5) 结果分析:对所得的结果进行数学上的分析。
(6) 模型检验:将模型分析结果与实际情形进行比较,以此来验证模型的准确性、合理性和适用性。
4. MATLAB与数学建模
在系统数学建模过程中,对象的一般特点是复杂的、受多种因素影响的,往往需要在很短的时间内完成复杂的计算,仅仅依靠手工计算几乎是不可能完成的,所以在数学建模过程中,往往伴随着大量使用计算机的计算。MATLAB强大的数值计算能力,能够非常方便、快捷、高效的解决数学建模中的许多实际问题,在模型求解方面占有不可或缺的位置,因此,MATLAB在数学建模中受到了许多建模工作者的重视与青睐[5] -[7] 。
数学建模中,有很多MATLAB求解方法,如MATLAB实现数据建模、MATLAB实现规划问题、MATLAB实现灰色预测等方法,接下来,将对这几种常用的MATLAB方法用具体实例来进行说明:
4.1. MATLAB实现数据建模
此方法在数学建模中经常应用的场合为:数据处理(数据清预处理、数值计算、数据拟合)、绘制图形、建议预测。
例如,一些骑车人常常在自行车的辐条上安装一些亮丽夺目的装饰物,自行车行驶在不同轨迹的路上行驶时,车轮装饰物的会相应呈现不同运动轨迹,增添美感。试画出自行车在直线形状、抛物线形状以及正弦曲线形状的路面上行驶时,装饰物的运动轨迹图形。借以表现MATLAB的绘图功能及方法程序。
假设自行车在行驶过程中,车轮外圆始终只与曲线
的一个点接触。将路面视作一条过原点的曲线
,车轮为半径为
的圆,该圆位于曲线
的上方,且与此曲线相切。设装饰物
在距离圆心
处,显然
。
与圆交于
点,以
点为初始接触点,圆(车轮)滚过
角度后(车轮与地面无相对滚动),圆与曲线的接触点变为
,圆心从
移动的
,装饰物
移动到
,如图1所示。
设
,
,
,则
,所以
在
过
点的法线的上侧,且在以
为圆心的圆周上,所以有
,
,联立解得
,
。又对
,有
,
,其中
,
。
所以,装饰物的运动轨迹方程为
,

Figure 1. Motion diagram of the bicycle wheels
图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程序为:

Figure 2. Trajectory graphics of the decorations
图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 delegates
表1. 本届与会代表的回执情况(单位:人)

Table 2. Receipt and present situation of the past few delegates
表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 delegates
表3. 往届未知与会率

Figure 4. Comparison of the predicted data with the original data
图4. 预测数据与原始数据的比较图
5. 结论
MATLAB一改之前软件包有接口不易扩充、程序结构不开放以及没有标准的基库等缺点,为各国科学家开发科学软件提供了新的途径与手段,原先控制领域里的一些软件工程包逐渐被淘汰或者在MATLAB的基础上重新构建。时至今日,经过MathWorks公司的不断拓展与完善,MATLAB已经发展成为适合多学科、多种工作平台的功能强劲的大型工具软件。
同时通过以上模型求解过程可以看出,MATLAB在数学建模中的巨大优势,充分显现出了MATLAB强大的数值计算、数据处理和图形处理等功能,无论是在建立模型的哪个阶段,MATLAB都有其他软件无法比拟的方便、快捷、高效的特点优势,大大提高了数学建模的效率,丰富了数学建模的方法和手段,促进了问题的解决,有事半功倍的效果。
基金项目
吉林省教育科学“十二五”规划课题:基于创新型人才培养的大学生数学建模竞赛培训模式研究(GH14020)。