for ix=array (commands) end ix为循环变量,commands为循环体 ix依次取array中元素,每取一个元素,执行循环体依次,直到ix大于array的最后一个元素跳出循环 for循环的循环次数确定 三、读写Excel文件
while expression (commands) end 检测expression的值,若为逻辑真(非0)则执行循环体,否则结束循环。 while循环的循环次数不确定 现在竞赛的附件大多是以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种主要重金属元素的浓度数据: format short g
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列的变化,保持一一对应。
四、插值与拟合、回归分析
在生产和实验中,由于函数f(x)的表达式不便于计算或这没有表达式而只有在给定点的函数值(或其导数值),为此,我们希望建立一个简单而且便于计算的近似函数g(x),来逼近函数f(x),这就用到差值和拟合方法。
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=[12 9 9 10 18 24 28 27 25 20 18 15 13]; 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(Not a Number),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);hold on;
surf(XI,YI,ZZ+15) %为作比较,将插值曲面向上平移15单位。 hold off
(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); hold on plot3(x,y,z,'o'); hold off;
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 = [0 2 4 5 8 12 12.8 17.2 19.9 20]; 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.5 0.75, 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16]'; vol=[20 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 18 15 12 10 7 7 4]'; plot(time,vol,'o')
p=polyfit(time,vol,7) % 7次多项式拟合 f=polyval(p,time); %求多项式的值
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数学建模竞赛中常用软件的操作(2)在线全文阅读。
相关推荐: