数学建模竞赛中常用软件的操作.docx
《数学建模竞赛中常用软件的操作.docx》由会员分享,可在线阅读,更多相关《数学建模竞赛中常用软件的操作.docx(47页珍藏版)》请在冰点文库上搜索。
数学建模竞赛中常用软件的操作
数学建模竞赛中常用软件的操作
本节主要介绍数学建模竞赛中常用软件MATLAB和Lingo的一些基本操作。
一、Desktop简介
在桌面双击MATLABb图标,或双击安装目录C:
\ProgramFiles\MATLAB\R2012a\bin下的MATLAB文件。
启动后默认界面如下图。
图1Desktop操作桌面的外貌
1.CommandWindow
该窗口是进行MATLAB各种操作的主要窗口。
在该窗内可以输入各类指令、函数、表达式;显示除了图形外所有的运算结果,错误时,给出相关出错提示。
指令输入完后只有按回车键【Enter】才能执行;如果输入的指令不含赋值号,计算结果被赋于默认的变量ans。
变量名和函数名对大小写敏感,变量第一个字符必须是英文字母,最多包含63个字符(英文、数字和下划线),不能包括空格、标点、运算符;不能使MATLAB的关键词和自用的变量名(eps,pi等)函数名(sin,exp等)、文件夹名(rwt,toolbox等)。
在Matlab中有一些固定变量,例如
(1)ans:
在没有定义变量名时,系统默认变量名为ans;
(2)eps:
容许误差,非常小的数;
(3)pi:
即圆周率
;
(4)i,j:
虚数单位;
(5)inf:
表示正无穷大,由1/0运算产生;
(6)NaN(NotANumber):
表示不定值,由inf/inf或0/0运算产生;
(7)nargin:
函数的输入变量数目;
(8)nargout:
函数的输出变量数目。
在MATLAB中,控制流关键字if,for,end等用蓝色字体表示;输入指令中的非控制指令、数字显示为黑色字体;字符串显示为紫色字体;注释为绿色字体;警告信息为红色字体。
2工作空间浏览器
工作空间(Workspace)窗口用于浏览MATLAB中的变量。
在工作空间窗口内,用户可以方便地查看、编辑存储的数据变量。
表1工作空间浏览器主要功能及其操作方法
功能
操作方法
新变量创建
单
击该图标,在工作空间产生unnamed新变量;双击该变量,引出VariableEditor变量编辑器;可输入数据;可重新命名
变量内容显示
选中变量,点击该图标,则变量内容显示在VariableEditor变量编辑器中
向内存装载文件数据
选择MAT数据文件,单击该图标,引出ImportWizard界面,选择需要装载的数据
把变量保存进文件
选择一个或多个内存变量,单击该图标或单击右键,选择Saveas,把这些变量保存到MAT数据文件
图形绘制启动键
绘制选定类型的图形
绘图类型菜单引出键
点击引出绘图类型菜单以供选择
工作空间常用的管理指令有:
(1)who及whos:
查询指令
(2)clear:
清除工作空间中的所有变量
clearvar1var2:
清除工作空间中的变量var1和var2
(3)saveFileName:
把全部内存变量保存为Filename.mat文件
saveFileNamev1v2:
把变量v1和v2保存为Filename.mat文件
saveFileNamev1v2–append:
把变量v1和v2添加到Filename.mat文件
(4)loadFileName:
把Filename.mat文件中全部变量调入内存
loadFileNamev1v2:
把Filename.mat文件中v1,v2调入内存
3.CurrentFolder
用户保存文件时,如果不专门指定目录名,则所存文件将保存在当前文件夹下。
注意尽量不要把MATLAB所在的根目录或其任何子目录作为当前目录,以免破坏MATLAB原有文件的完整性。
4.向量与矩阵的产生
MATLAB的操作对象为矩阵。
标量被看作是1×1的矩阵,
维行向量或列向量可看作是
或
维矩阵。
行向量生成基本格式:
start:
step:
end(step缺省时为1)
例如:
在命令窗口中提示符>>后输入,x=1:
5,按回车【Enter】后,显示输出结果如下:
x=
12345
Matlab的每条命令后,若为逗号“,”或无标点符号,则显示命令的结果;若命令后为分号“;”,则禁止显示结果,用“%”来实现注释功能。
利用下面两个函数也可以产生向量。
linspace:
线性等分向量,例如,a=linspace(0,2*pi,100)。
logspace:
对数等分向量,例如,a=logspace(0,2*pi,100)。
100为插入点数(99等分),默认值为100。
在矩阵的输入中,约定:
(1)元素之间用空格或逗号隔开;
(2)用中括号方[]把所有元素括起来;(3)用分号(;)说明行结束。
在命令窗口,输入矩阵时,按Shift+Enter键表示开始输入新的一行,且要求所有的行具有相同的列。
例如:
a=[123;4,56;78,9]
该矩阵一直保存在工作空间,直至被修改。
二、M文件与编程
1.M文件
M文件有两种类型:
脚本类M文件和函数类脚本文件。
脚本类M文件是一串按照用户意图排列而成的Matlab指令集合。
脚本文件运行后,产生的所有变量都驻留在Matlab的基本工作空间(baseworkspace)中。
只有用clear清除或关闭指令窗清除,否则一直保留。
基本工作空间随Matlab的启动而产生,只有当Matlab关闭时,基本空间才被删除。
函数类M文件的第一行总是以function引导的函数申明行,还包括函数与外界交换数据的全部标称输入\输出量(可有可无)。
Matlab允许使用比标称数目少的输入\输出量,实现对函数的调用。
运行函数文件时,Matlab开辟一个临时工作空间,称之为函数工作空间(functionworkspace),所有中间变量都存放在工作空间中,该函数文件运行结束后,该函数临时工作空间及其中间变量立即删除。
在函数文件中,对某脚本文件的调用而产生的所有变量也存放于函数工作空间,而不存放在基本工作空间。
函数工作空间随M函数文件的被调用而产生,调用结束后删除,可产生任意多个,相对于基本工作空间而言是独立的、临时的。
2.编程
MATLAB程序的编写主要有以下几种控制结构。
(1)if-else-end条件控制
表2if-else-end分支结构的使用方法
单分支
双分支
多分支
ifexpr
(commands)
End
ifexpr
(commands1)
else
(commands2)
end
ifexpr1
(commands1)
elseifexpr2
(commands2)
......
else
(commandsk)
end
当expr为"逻辑1"时,指令组(commands)被执行。
当expr为"逻辑1"时,指令组1执行;否则,指令组2执行。
expr1,expr2,…中,首先给出"逻辑1"的分支被执行;否则,分支k被执行。
常被switch-case替代。
expr为控制分支的条件表达式,通常为关系、逻辑表达式,其运算结果为“标量逻辑值1或0”。
也可以为一般代数表达式,则任何非0值均等同于“逻辑1”。
expr也可以进行数组间的关系、逻辑运算,其运算结果为逻辑数组,只有该数组不包含任何0元素时,expr控制的分支才被执行。
expr可为空数组,Matlab认为条件为“假”,分支不被执行。
(2)switch-case控制结构
表3switch-case控制结构的使用方法
指令格式
含义
switchexpr
casevalue_1
(commands1)
casevalue_2
(command2)
.
.
.
casevalue_k
(commandsk)
otherwise
(commands)
end
expr为根据此前给定的变量进行计算的表达式;
value_1是给定的数值、字符串标量(或胞元数组)
若expr结果与value_1(或其中的胞元元素)相等,则执行commands1
该项是以上各项的“并”的“补”;即以上所有的case均不发生,则执行改组指令。
【说明】switch后的表达式expr的值只能是标量数值或标量字符串。
对于标量数值,比较:
表达式==检测值i;对于字符串,利用strcmp(表达式,检测值i)比较。
case后的检测值不仅可以是一个标量数值或字符串,还可以是一个胞元数组。
此时将expr和胞元数组中每一个元素比较,如与某一胞元数组元素相等,认为比较结果为真,从而执行与该检测值相应的一组命令。
(3)for循环和while循环
表4循环结构的使用
for循环
while循环
forix=array
(commands)
end
whileexpression
(commands)
end
ix为循环变量,commands为循环体
ix依次取array中元素,每取一个元素,执行循环体依次,直到ix大于array的最后一个元素跳出循环
for循环的循环次数确定
检测expression的值,若为逻辑真(非0)则执行循环体,否则结束循环。
while循环的循环次数不确定
三、读写Excel文件
现在竞赛的附件大多是以Excel电子表格的形式给出,所以读写Excel电子表格文件的方法就显得十分重要。
MATLAB提供了读取excel文件(后缀为.xls)的函数xlsread,其调用格式有:
num=xlsread('filename'):
从工作文件夹中,从A1单元格开始读取filename文件,把数据返回给num。
num=xlsread('filename',sheet):
选择所在的sheet,比如说'sheet1'。
num=xlsread('filename',range):
所在的单元格范围,比如说range='A1:
A8'。
num=xlsread('filename',sheet,range):
sheet和单元格范围同时限制。
[num,txt]=xlsread('filename',...):
把返回的数据与文本分开保存。
[num,txt,raw]=xlsread('filename',...):
分开保存的同时,有把num和txt保存到raw里,形成一个单一变量。
输出结果num中存储的是数据,txt存储的是文本,raw为所有的数据和文件。
例如2011年全国大学生数学建模竞赛的A题《城市表层土壤重金属污染分析》中的附件,可以按如下的方法读取附件数据。
读取cumcm2011A附件_数据.xls中附件1中有关取样点位置及其所属功能区数据:
A=xlsread('cumcm2011A附件_数据.xls','附件1','B4:
E322')
读取附件2中8种主要重金属元素的浓度数据:
formatshortg
B=xlsread('cumcm2011A附件_数据.xls','附件2','B4:
I322')
读取附件3中8种主要重金属元素的背景值(平均值,标准偏差和范围):
C=xlsread('cumcm2011A附件_数据.xls','附件3','B4:
C11')
MATLAB提供了读取excel写入的函数xlswrite,其调用格式有:
[status,message]=xlswrite('filename',array,sheet,range)
其中array为要保存的数据矩阵,sheet为工作表,range制定存储的区域,例如'C1:
C2'。
status为返回完成状态值,如果写入成功,则status为1;反之写入失败,则status为0。
message包括了错误、警告信息和标识信息。
例如:
将数据写入testdata.xls文件的Sheet1。
>>xlswrite('testdata.xls',[12.7,5.02,-98,63.9,0,-.2,56])
将文本和数值混合数据从E1单元格开始写入testdata.xls文件的Sheet2:
>>d={'Time','Temperature';12,98;13,99;14,97};
xlswrite('testdata.xls',d,2,'E1')
在testdata.xls中新建表格Temperature:
>>[status,msginfo]=xlswrite('testdata.xls',d,'Temperatures','E1')
在程序中,经常要对数据进行排序,常有以下函数。
(1)sort函数
sort(A):
若A是列(或行)向量,默认对A进行升序排列,而sort(A,'descend')是降序排序。
若A是矩阵,默认对A的各列进行升序排列。
sort(A,dim):
dim=1时等效sort(A),dim=2时表示对A中的各行元素升序排列。
(2)sortrow函数
B=sortrows(A,n):
A为要排序的矩阵,n表示按第几列进行排序,正整数代表升序,负整数代表降序。
B=sortrows(a,2)表示将矩阵A按照第2列的升序排列,其他列不作升序排列,而是将跟随着第2列的变化,保持一一对应。
B=sortrows(a,-3)表示将矩阵A按照第3列的降序排列,其他列将跟随着第3列的变化,保持一一对应。
四、插值与拟合、回归分析
在生产和实验中,由于函数
的表达式不便于计算或这没有表达式而只有在给定点的函数值(或其导数值),为此,我们希望建立一个简单而且便于计算的近似函数
,来逼近函数
,这就用到差值和拟合方法。
1插值
插值就是在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。
插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。
MATLAB中的插值函数主要有以下几个。
(1)interp1函数
Matlab中用于一维数据插值的函数是interp1,其调用格式为:
yi=interp1(x,y,xi,'method','extrap')
该命令用于找出由参量x决定的一元函数y=y(x)在点xi处的值yi。
其中x,y为插值节点的横坐标和纵坐标,yi为在被插值点xi处的插值结果;x,y为向量,'method'表示采用的插值方法,Matlab提供的插值方法有几种:
'nearest':
最近邻点插值算法;
'linear':
线性插值
spline':
三次样条函数插值;
'pchip':
分段三次Hermite插值;
'cubic':
与'pchip'操作相同;
缺省时表示线性插值。
‘extrap’表示对于超出x范围的xi中的分量将执行特殊的外插值法extrap。
注意:
所有的插值方法都要求x是单调的。
例如,在一天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为
12,9,9,1,0,18,24,28,27,25,20,18,15,13
推测中午13时的温度。
我们采用三次样条插值,在命令窗口输入:
>>x=0:
2:
24;
a=13;
y=[129910182428272520181513];
y1=interp1(x,y,a,'spline')
输出结果为:
y1=
27.8725
(2)interp2函数
Matlab中用于二维数据插值的函数是interp2,其调用格式为:
zi=interp2(x,y,z,xi,yi,‘method’)
该命令用于找出由参量x,y决定的二元函数z=z(x,y)在点(xi,yi)处的值zi。
其中返回矩阵为zi,其元素为对应于参量xi与yi(可以是向量、或同型矩阵)的元素,若xi与yi中有在x与y范围之外的点,则相应地返回NaN(NotaNumber),method和interp1一样,常用的是‘cubic’(双三次插值),缺省为‘linear’(双线性插值算法)。
例如,在命令窗口输入
[X,Y]=meshgrid(-3:
.25:
3);
Z=peaks(X,Y);%具有两个变量的采样函数,可产生一个凹凸有致的曲面,包含了三个局部极大点及三个局部极小点。
[XI,YI]=meshgrid(-3:
.125:
3);
ZZ=interp2(X,Y,Z,XI,YI);
surf(X,Y,Z);holdon;
surf(XI,YI,ZZ+15)%为作比较,将插值曲面向上平移15单位。
holdoff
(3)griddata函数
griddata也是一种常用的二维插值方法,其调用格式为:
zi=griddata(x,y,z,xi,yi,‘method’)
该命令用于找出由参量x,y决定的二元函数z=z(x,y)在点(xi,yi)处的值zi。
它和interp2的区别在于,interp2的插值数据必须是矩形域,即已知数据点(x,y)组成规则的矩阵,可使用meshgid生成。
而griddata函数的已知数据点(x,y)不要求规则排列,特别是对试验中随机没有规律采取的数据进行插值具有很好的效果。
method包括:
‘nearest’(最近邻点插值);‘linear’(线性插值,为缺省算法);‘cubic’(基于三角形的三次插值)和‘v4’(Matlab4中的griddata算法)。
例如,有一组散乱数据点矩阵如下:
A=[1.486,3.059,0.1;2.121,4.041,0.1;2.570,3.959,0.1;3.439,4.396,0.1;
4.505,3.012,0.1;3.402,1.604,0.1;2.570,2.065,0.1;2.150,1.970,0.1;
1.794,3.059,0.2;2.121,3.615,0.2;2.570,3.473,0.2;3.421,4.160,0.2;
4.271,3.036,0.2;3.411,1.876,0.2;2.561,2.562,0.2;2.179,2.420,0.2;
2.757,3.024,0.3;3.439,3.970,0.3;4.084,3.036,0.3;3.402,2.077,0.3;
2.879,3.036,0.4;3.421,3.793,0.4;3.953,3.036,0.4;3.402,2.219,0.4;
3.000,3.047,0.5;3.430,3.639,0.5;3.822,3.012,0.5;3.411,2.385,0.5;
3.103,3.012,0.6;3.430,3.462,0.6;3.710,3.036,0.6;3.402,2.562,0.6;
3.224,3.047,0.7;3.411,3.260,0.7;3.542,3.024,0.7;3.393,2.763,0.7];
x=A(:
1);y=A(:
2);z=A(:
3);
[X,Y,Z]=griddata(x,y,z,linspace(min(x),max(x),20)',linspace(min(y),max(y),20),'v4');
mesh(X,Y,Z);holdon
plot3(x,y,z,'o');holdoff;
2011年的A题《城市表层土壤重金属污染分析》,可用插值拟合的方法获得各重金属污染物浓度的空间分布。
由于空间数据是不规则的,较好的方法是用散乱数据插值,例如Kriging插值、Shepard插值等。
也可以用其他方法插值拟合,但应明确所使用的方法,并作出分析,不能只简单套用软件。
4.spline函数
该函数是利用三次样条对数据进行插值,其调用格式为:
yy=spline(x,y,xx)
该命令用三次样条插值计算出由向量x与y确定的一元函数y=f(x)在点xx处的值。
若参量y是一矩阵,则以y的每一列和x配对,再分别计算由它们确定的函数在点xx处的值。
则yy是一个阶数为length(xx)*size(y,2)的矩阵。
例如,对离散地分布在y=exp(x)sin(x)函数曲线上的数据点进行样条插值。
在命令窗口输入:
x=[024581212.817.219.920];
y=exp(x).*sin(x);
xx=0:
.25:
20;
yy=spline(x,y,xx);
plot(x,y,'o',xx,yy)
2.拟合
拟合就是用连续曲线近似地刻画或比拟平面上离散点组所表示的坐标之间的函数关系的一种数据处理方法。
如果已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1,λ2,…,λn),使得该函数与已知点集的差别(最小二乘意义)最小。
如果待定函数是线性,就叫线性拟合或者线性回归(主要在统计中),否则叫做非线性拟合或者非线性回归。
MATLAB中提供了线性最小二乘拟合和非线性最小二乘拟合函数。
(1)polyfit函数
ployfit函数是多项式拟合函数,其调用格式为:
p=polyfit(x,y,n)
其中x,y为长度相同的向量,n为拟合多项式的次数,返回值p是拟合多项式的系数向量,幂次由高到低,拟合多项式在x处的值可以通过y=polyval(p,x)来计算。
例如,2004年全国大学生数学建模竞赛C题,《饮酒驾车》问题,时间和血液中酒精浓度的函数关系,可以利用polyfit进行拟合。
可输入:
>>time=[0.25,0.50.75,11.522.533.544.55678910111213141516]';
vol=[2068758282776868585150413835282518151210774]';
plot(time,vol,'o')
p=polyfit(time,vol,7)%7次多项式拟合
f=polyval(p,time);%求多项式的值
holdon
plot(time,f)
holdoff
输出7多项次的系数向量为:
p=
0.0002-0.01130.2817-3.630725.5345-94.6710153.8757-1.2592
如果要求血液中酒精浓度的最大值,可用以下指令:
roots(polyder(p))
重庆文理学院的一个参赛队于2004年关于“饮酒驾车”问题获得一等奖后,研制了“酒后安全驾车时刻表”和“人体内酒精浓度反推软件”两个产品,并在重庆永川交警大队得到使用。
Matlab提供了两个非线性最小二乘拟合函数:
lsqcurvefit和lsqnonlin。
两个命令都要先建立M-文件fun.m,在其中定义函数f(x),但两者定义f(x)的方式是不同的。
(2)lsqcurvefit函数
该函数用来进行非线性拟合,其调用格式为:
x=lsqcurvefit(‘fun’,x0,xdata,ydata,options);
其中,fun为事先建立的拟合函数F(x,xdata),其中自变量x表示拟合函数中的待定参数,xdata为已知拟合节点的x坐标,x0为待定参数x的迭代初始值,xdata,ydata为已知数据点的