MATLAB的使用.docx
《MATLAB的使用.docx》由会员分享,可在线阅读,更多相关《MATLAB的使用.docx(39页珍藏版)》请在冰豆网上搜索。
MATLAB的使用
第一讲MATLAB的使用
MATLAB作为线性系统的一种分析和仿真工具,是理工科大学生应该掌握的技术工具,它作为一种编程语言和可视化工具,可解决工程、科学计算和数学学科中许多问题。
MATLAB建立在向量、数组和矩阵的基础上,使用方便,人机界面直观,输出结果可视化。
其中,矩阵是MATLAB的核心!
下面将从基本规则和操作,编程和作图以及文件的操作等等多个方面,来讲解数学建模中MATLAB的一些常用方法。
一、变量与函数
变量、函数与编程所形成的m文件是MATLAB操作的基本,在介绍它们的具体使用方法之前,先给出一些必须了解的基本规则。
1、变量
MATLAB和其他编程工具一样,变量是必须的基本元素,它也是以字母开头,后接字母、数字或下划线的字符序列,用法也基本一样。
其具体的命名规则是:
(1)变量名必须是不含空格的单个词;
(2)变量名区分大小写;
(3)变量名最多不超过19个字符;
(4)变量名必须以字母打头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号。
特殊变量表
注意,自定义的变量不能和表中变量名相同。
2、数学运算符号及标点符号
(1)MATLAB的每条命令后,若为逗号或无标点符号,则显示命令的结果;若命令后为分号,则禁止显示结果;
(2)“%”后面所有文字为注释;
(3)“...”表示续行。
3、数学函数
基本上,常用的数学函数在MATLAB中都有相应的命令,部分如下:
4、M文件
MATLAB的内部函数是有限的,有时为了研究某一个函数的各种性态,需要为MATLAB定义新函数,为此必须编写函数文件.函数文件是文件名后缀为M的文件,这类文件的第一行必须是一特殊字符function开始,格式为:
function因变量名=函数名(自变量名)
函数值的获得必须通过具体的运算实现,并赋给因变量。
M文件建立方法:
1.在Matlab中,点:
File->New->M-file
2.在编辑窗口中输入程序内容
3.点:
File->Save,存盘,M文件名必须与函数名一致。
Matlab的应用程序也以M文件保存。
例:
定义函数f(x1,x2)=100(x2-x1
)
+(1-x1)
1.建立M文件:
fun.m
functionf=fun(x)
f=100*(x
(2)-x
(1)^2)^2+(1-x
(1))^2
2.可以直接使用函数fun.m
例如:
计算f(1,2),只需在Matlab命令窗口键入命令:
x=[12]
fun(x)
二、数组与矩阵
矩阵是MATLAB最基本的数据对象,MATLAB的大部分运算或命令都是在矩阵运算的意义下执行的。
在MATLAB中,不需对矩阵的维数和类型进行说明,MATLAB会根据用户所输入的内容自动进行配置。
1、数组
数组可以看作是只有一行或一列的简单矩阵,但作为常用的计算单元,matlab也专门为其设计了一系列命令。
(1)创建简单的数组
x=[abcdef]
创建包含指定元素的行向量
x=first:
last
创建从first开始,加1计数,到last结束的行向量
x=first:
increment:
last
创建从first开始,加increment计数,last结束的行向量
x=linspace(first,last,n)
创建从first开始,到last结束,有n个元素的行向量
x=logspace(first,last,n)
创建从开始,到结束,有n个元素的对数分隔行向量。
(2)数组元素的访问
(i)访问一个元素:
x(i)表示访问数组x的第i个元素;
(ii)访问一块元素:
x(a:
b:
c)表示访问数组x的从第a个元素开始,以步长为b到第c个元素(但不超过c),b可以为负数,b缺损时为1;
(iii)直接使用元素编址序号:
x([abcd])表示提取数组x的第a、b、c、d个元素构成一个新的数组[x(a)x(b)x(c)x(d)]。
(3)数组的方向
前面例子中的数组都是一行数列,是行方向分布的,称之为行向量。
数组也可以是列向量,它的数组操作和运算与行向量是一样的,唯一的区别是结果以列形式显示。
产生列向量有两种方法:
直接产生例c=[1;2;3;4]
转置产生例b=[1234];c=b’
说明:
以空格或逗号分隔的元素指定的是不同列的元素,而以分号分隔的元素指定了不同行的元素。
(4)数组的运算
(i)标量-数组运算
数组对标量的加、减、乘、除、乘方是数组的每个元素对该标量施加相应的加、减、乘、除、乘方运算。
设:
a=[a1,a2,…,an],c=标量
则:
a+c=[a1+c,a2+c,…,an+c]
a.*c=[a1*c,a2*c,…,an*c]
a./c=[a1/c,a2/c,…,an/c](右除)
a.\c=[c/a1,c/a2,…,c/an](左除)
a.^c=[a1^c,a2^c,…,an^c]
c.^a=[c^a1,c^a2,…,c^an]
(ii)数组-数组运算
当两个数组有相同维数时,加、减、乘、除、幂运算可按元素对元素方式进行的,不同大小或维数的数组是不能进行运算的。
设:
a=[a1,a2,…,an],b=[b1,b2,…,bn]
则:
a+b=[a1+b1,a2+b2,…,an+bn]
a.*b=[a1*b1,a2*b2,…,an*bn]
a./b=[a1/b1,a2/b2,…,an/bn]
a.\b=[b1/a1,b2/a2,…,bn/an]
a.^b=[a1^b1,a2^b2,…,an^bn]
2、矩阵
通过下面的介绍,大家可以发现矩阵的相关命令和数组基本类似。
(1)矩阵的建立
逗号或空格用于分隔某一行的元素,分号用于区分不同的行。
除了分号,在输入矩阵时,按Enter键也表示开始一新行。
输入矩阵时,严格要求所有行有相同的列。
例m=[1234;5678;9101112]
p=[1111
2222
3333]
特殊矩阵的建立:
a=[]产生一个空矩阵,当对一项操作无结果时,返回空矩阵,空矩阵的大小为零;
b=zeros(m,n)产生一个m行、n列的零矩阵
c=ones(m,n)产生一个m行、n列的元素全为1的矩阵
d=eye(m,n)产生一个m行、n列的单位矩阵
(2)矩阵中元素的操作
(a)矩阵A的第r行:
A(r,:
)
(b)矩阵A的第r列:
A(:
,r)
(c)依次提取矩阵A的每一列,将A拉伸为一个列向量:
A(:
)
(d)取矩阵A的第i1~i2行、第j1~j2列构成新矩阵:
A(i1:
i2,j1:
j2)
(e)以逆序提取矩阵A的第i1~i2行,构成新矩阵:
A(i2:
-1:
i1,:
)
(f)以逆序提取矩阵A的第j1~j2列,构成新矩阵:
A(:
j2:
-1:
j1)
(g)删除A的第i1~i2行,构成新矩阵:
A(i1:
i2,:
)=[]
(h)删除A的第j1~j2列,构成新矩阵:
A(:
,j1:
j2)=[]
(i)将矩阵A和B拼接成新矩阵:
[AB];[A;B]
(3)矩阵的运算
(i)标量-矩阵运算:
同标量-数组运算;
(ii)矩阵-矩阵运算:
[1]元素对元素的运算,同数组-数组运算;
[2]矩阵运算:
矩阵加法:
A+B
矩阵乘法:
A*B
方阵的行列式:
det(A)
方阵的逆:
inv(A)
方阵的特征值与特征向量:
[V,D]=eig[A]。
三、MATLAB编程
Matlab虽然提供了大量现成的函数供我们计算时使用,但当要真正解决一些实际问题时,这还远远不够,编程仍然是不可或缺的一步。
Matlab也可以象C,FORTRAN等高级计算机语言一样,进行程序设计。
下面简单介绍Matlab中一些重要的编程手段。
1、关系与逻辑运算
除了传统的数学运算,Matlab支持关系和逻辑运算。
一个重要的应用是控制基于真/假命题的一系列Matlab命令的流程,或执行次序。
(1)关系操作符
Matlab关系操作符包括所有常用的比较。
能用来比较两个同样大小的矩阵,或用来比较一个矩阵和一个标量(矩阵中每一个元素都与标量相比,结果与矩阵大小一样)。
(2)逻辑运算符
逻辑操作符提供了一中组合或否定关系表达式,具体如下:
(3)控制流
MATLAB提供三种决策或控制流结构:
for循环、while循环、if-else-end结构。
这些结构经常包含大量的MATLAB命令,故经常出现在MATLAB程序中,而不是直接加在MATLAB提示符下。
i、for循环:
允许一组命令以固定的和预定的次数重复
forx=array
{commands}
end
在for和end语句之间的命令串{commands}按数组(array)中的每一列执行一次。
在每一次迭代中,x被指定为数组的下一列,即在第n次循环中,x=array(:
,n)。
ii、While循环
与for循环以固定次数求一组命令相反,while循环以不定的次数求一组语句的值。
whileexpression
{commands}
end
只要在表达式(expression)里的所有元素为真,就执行while和end语句之间的命令串{commands}。
iii、If-Else-End结构
(a)有一个选择的一般形式是:
ifexpression
{commands}
end
如果在表达式(expression)里的所有元素为真,就执行if和end语句之间的命令串{commands}。
先建立M文件fun1.m定义函数f(x),再在Matlab命令窗口输入fun1
(2),fun1(-1)即可。
(b)有三个或更多的选择的一般形式是:
if(expression1)
{commands1}
elseif(expression2)
{commands2}
elseif(expression3)
{commands3}
elseif……
…………………………………
else
{commands}
end
end
end
……
end
先建立M文件fun2.m定义函数f(x),再在Matlab命令窗口输入fun2
(2),fun2(0.5),fun2(-1)即可。
四、MATLAB作图
强大的图形功能是Matlab的优点之一,它能方便快速的出图,给我们的工作带来了巨大的便利。
1.曲线图
Matlab作图是通过描点、连线来实现的,故在画一个曲线图形之前,必须先取得该图形上的一系列的点的坐标(即横坐标和纵坐标),然后将该点集的坐标传给Matlab函数画图。
命令为:
PLOT(X,Y,S)
其中,X,Y是向量,分别表示点集的横坐标和纵坐标,
S指定曲线的颜色、线形等:
y:
黄色c:
蓝绿色r:
红色m:
洋红
.:
点-:
连线o:
圈:
:
短虚线
x:
x-符号-.:
长短线+:
加号--:
长虚线
PLOT(X,Y)——画实线
PLOT(X,Y1,S1,X,Y2,S2,……,X,Yn,Sn)——将多条线画在一起
例在[0,2*pi]用红线画sin(x),用绿圈画cos(x)。
解:
x=linspace(0,2*pi,30);
y=sin(x);
z=cos(x);
plot(x,y,'r',x,z,’g0')
2.符号函数(显函数、隐函数和参数方程)画图
(1)ezplot
ezplot(‘f(x)’,[a,b])
表示在aezplot(‘f(x,y)’,[xmin,xmax,ymin,ymax])
表示在区间xmin隐函数f(x,y)=0的函数图
ezplot(‘x(t)’,’y(t)’,[tmin,tmax])
表示在区间tmin例在[0,pi]上画y=cos(x)的图形;
解:
输入命令
ezplot(‘sin(x)’,[0,pi])
例在[0,2*pi]上画
,
星形图;
解:
输入命令
ezplot(‘cos(t)^3’,’sin(t)^3’,[0.2*pi])
例在[-2,0.5],[0,2]上画隐函数
的图。
解:
输入命令
ezplot('exp(x)+sin(x*y)',[-2,0.5,0,2])
(2)fplot
fplot(‘fun’,lims)表示绘制字符串fun指定的函数在lims=[xmin,xmax]的图形
注意:
[1]fun必须是M文件的函数名或是独立变量为x的字符串;
[2]fplot函数不能画参数方程和隐函数图形,但在一个图上可以画多个图形。
例在[-1,2]上画
的图形
解:
先建M文件myfun1.m
functionY=myfun1(x)
Y=exp(2*x)+sin(3*x.^2)
再输入命令:
fplot(‘myfun1’,[-1,2])
例在[-2,2]范围内绘制函数tanh的图形
解:
fplot(‘tanh’,[-2,2])
例x、y的取值范围都在[-
,
],画函数tanh(x),sin(x),cos(x)的图形
解:
输入命令
fplot(‘[tanh(x),sin(x),cos(x)]’,2*pi*[-11–11])
3、空间曲线
(1)一条曲线:
PLOT3(x,y,z,s)
其中,X,Y,Z是n维向量,分别表示曲线上点集的横坐标、纵坐标、函数值
S则指定颜色、线形等
例在区间[0,10*pi]画出参数曲线x=sin(t),y=cos(t),z=t
解:
t=0:
pi/50:
10*pi;
plot3(sin(t),cos(t),t)
rotate3d%旋转
(2)多条曲线:
PLOT3(x,y,z)
其中x,y,z是都是m*n矩阵,其对应的每一列表示一条曲线.
例画多条曲线观察函数Z=(X+Y).^2.
解:
x=-3:
0.1:
3;y=1:
0.1:
5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
plot3(X,Y,Z)
(这里meshgrid(x,y)的作用是产生一个以向量x为行、向量y为列的矩阵)
4、空间曲面
(1)surf(x,y,z)画出数据点(x,y,z)表示的曲面数据矩阵。
分别表示数据点的横坐标、纵
坐标、函数值
例画函数Z=(X+Y).^2的图形.
解:
x=-3:
0.1:
3;
y=1:
0.1:
5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
surf(X,Y,Z)
shadingflat%将当前图形变得平滑
(2)Mesh(x,y,z)画网格曲面
例画出曲面Z=(X+Y).^2在不同视角的网格图.
解:
x=-3:
0.1:
3;y=1:
0.1:
5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
mesh(X,Y,Z)
(3)meshz(X,Y,Z)在网格周围画一个curtain图(如,参考平面)
例绘peaks的网格图
解:
输入命令:
[X,Y]=meshgrid(-3:
.125:
3);
Z=praks(X,Y);
Meshz(X,Y,Z)
5、特殊二、三维图形
二维:
1、极坐标图:
polar(theta,rho,s)
用角度theta(弧度表示)和极半径rho作极坐标图,用s指定线型。
2、散点图:
scatter(X,Y,S,C)
在向量X和Y的指定位置显示彩色圈.X和Y必须大小相同.
3、平面等值线图:
contour(x,y,z,n)绘制n个等值线的二维等值线图
三维:
1、空间等值线图:
contour3(x,y,z,n)其中n表示等值线数。
2、三维散点图:
scatter3(X,Y,Z,S,C)
在向量X,Y和Z指定的位置上显示彩色圆圈;
向量X,Y和Z的大小必须相同。
五、文件操作
Matlab提供了对数据文件建立、打开、读、写以及关闭等一系列函数,数据文件一般存放在磁盘等介质上,用文件名标识,系统对文件名没有特殊要求。
文件数据格式有二种形式,一是二进制格式文件,二是ASCII文本文件,系统对这两类文件提供了不同的读写功能函数。
1、文件的打开与关闭
(1)fopen打开文件
在读写文件之前,必须先用fopen命令打开一个文件,并指定允许对该文件进行的操作。
文件操作结束后,应及时关闭文件,以免数据的丢失或误修改。
fopen函数格式为:
Fid=fopen(filename,permission)
其中filename为文件名,permission为文件格式,可以是下列格式之一:
•‘r’打开文件,读数据,文件必须存在。
•‘w’打开文件,写数据,若文件不存在,系统会自动建立。
•‘a’打开文件,在文件末尾添加数据。
•‘r+’打开文件,可以读和写数据,文件必须存在。
•‘w+’打开文件,供读与写数据用。
•‘a+’打开文件,供读与添加数据用。
•‘W’打开文件供写数据用,无自动刷新功能。
•‘A’打开文件供添加数据用,无自动刷新功能。
例如:
打开一个名为std.dat的数据文件并进行读操作,其命令格式为:
Fid=fopen(‘std.dat’,’r’)
上述打开格式均为二进制格式,如果想用ASCII文本格式,则必须在格式字符串中加上字符t,例如用’rt’表示以ASCII格式打开供读操作的数据文件。
(2)fclose关闭文件
文件在进行完读、写等操作后,应及时关闭,以保证文件的安全可靠。
关闭文件命令格式为:
Sta=fclose(Fid)关闭Fid所表示的文件
Sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回–1。
2、文件的读写操作
(1)二进制数据文件
fread读二进制数据文件。
格式为:
[A,COUNT]=fread(Fid,size,precision)
其中A为数据矩阵,COUNT返回所读取的数据元素个数。
size为可选项,若不选用则读取整个文件内容,若选用它的值可以是下列值:
N读取N个元素到一个列向量。
inf读取整个文件。
[M,N]读数据到M×N的矩阵中,数据按列存放。
precision用于控制所读数据的精度格式。
缺省格式为uchar,即无符号字符格式。
例如:
Fid=fopen(‘std.dat’,‘r’);
A=fread(Fid,100,’long’);
Sta=fclose(fid);
以读数据方式打开数据文件std.dat,并按长整型数据格式读取文件的前100个数据放入向量A,然后关闭文件。
fwrite函数以二进制格式向数据文件写数据,其格式为:
COUNT=fwrite(Fid,A,precision)
例如:
Fid=fopen(‘magic5.bin’,‘wb’);
fwrite(Fid,magic,’int32’);
上述语句将矩阵magic中的数据写入文件magic5.bin中,数据格式为32位整型二进制格式。
例建立一数据文件test.dat,用于存放矩阵A的数据。
已知A=[-0.6515-0.2727-0.4354-0.3190-0.9047
-0.7534-0.4567-0.3212-0.4132-0.3583
-0.9264-0.8173-0.7823-0.3265-0.0631
-0.1735-0.7373-0.0972-0.3267-0.6298
-0.4768-0.6773-0.6574-0.1923-0.4389]
Fid=fopen(‘test.dat’,‘w’)
cnt=fwrite(Fid,A,‘float’)
fclose(Fid)
程序段将矩阵A的数据以二进制浮点数格式写入文件test.dat中。
Fid=fopen(‘test.dat’,‘r’)
[B,cnt]=fread(Fid,[5,inf],‘float’)
fclose(Fid)
读取文件test.dat的内容。
(2)文本文件
fscanf读ASCII文本文件:
[A,COUNT]=fscanf(Fid,format,size)
其中A为数据矩阵,用以存放读取的数据,COUNT返回所读取的数据元素个数。
format用以控制读取的数据格式,由%加上格式符组成,格式符为:
d,i,o,u,x,e,f,g,s,c与[...]
例如:
s=fscanf(fid,‘%s’)读取一个字符串
a=fscanf(fid,‘%5d’)读取5位数的整数
b=fscanf(fid,‘%6.2d’)读取浮点数
fprintf写ASCII数据文件,其格式为:
COUNT=fprintf(Fid,format,A,…)
其中A为要写入文件的数据矩阵,先按format格式化数据矩阵A,后写入到Fid所指定的文件。
例如:
x=0:
0.1:
1;
y=[x;exp(x)];
Fid=fopen('exp.txt','w');
fprintf(Fid,'%6.2f%12.8f\n',y);
fclose(Fid);
六、数据处理与多项式计算
求一组数据的最值,中值,累加和等等简单的数据处理和多项式求根等相关运算是我们最常遇见的一类问题,下面介绍如何使用MATLAB来解决这些问题。
1、最大值和最小值
MATLAB提供的求数据序列的最大值和最小值的函数分别为max和min,两个函数的调用格式和操作过程类似。
(1)求向量的最大值和最小值
求一个向量X的最大值的函数有两种调用格式,分别是:
(1)y=max(X):
返回向量X的最大值存入y,如果X中包含复数元素,则按模取最大值。
(2)[y,I]=max(X):
返回向量X的最大值存入y,最大值的序号存入I,如果X中包含复数元素,则按模取最大值。
求向量X的最小值的函数是min(X),用法和max(X)完全相同。
例求向量x的最大值。
命令如下:
x=[-43,72,9,16,23,47];
y=max(x)%求向量x中的最大值
[y,l]=max(x)%求向量x中的最大值及其该元素的位置
(2)求矩阵的最大值和最小值
求矩阵A的最大值的函数有3种调用格式,分别是:
(1)max(A):
返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。
(2)[Y,U]=max(A):
返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大值的行号。
(3)max(A,[],dim):
dim取1或2。
dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值。
求最小值的函数是min,其用法和max完全相同。
(3)两个向量或矩阵对应元素的比较
函数max和min还能对两个同型