matlab教程.docx
《matlab教程.docx》由会员分享,可在线阅读,更多相关《matlab教程.docx(30页珍藏版)》请在冰豆网上搜索。
![matlab教程.docx](https://file1.bdocx.com/fileroot1/2023-1/28/b7e3c9cc-ba20-4c5a-bf06-9b609e4ed2d8/b7e3c9cc-ba20-4c5a-bf06-9b609e4ed2d81.gif)
matlab教程
第1章MATLAB入门
在科学研究和工程计算领域经常会遇到一些非常复杂的计算问题,利用计算器或手工计算是无法实现的,只能借助计算机编程来实现,MATLAB正是解决这些复杂问题的强大计算软件。
MATLAB将高性能的数值计算和可视化集成在一起,提供了大量的内置函数,它被广泛地应用于科学计算、控制系统以及信息处理等领域的分析、仿真和设计工作。
本章将对MATLAB进行概述,使读者对MATLAB有一个基本的认识,为逐步深入学习打下基础。
1.1MATLAB的历史背景
1.1.1什么是MATLAB
MATLAB是一种用于科学工程计算的高效率高级语言。
MATLAB最早作为矩阵实验室,可提供使用LINPACK和EISPACK矩阵软件包接口,后来它逐渐地发展成通用科学计算、图视交互系统和程序设计语言。
与BASIC、FORTRANK、C/C++等语言相比,MATLAB的语法规则简单,更贴近人的思维方式。
用MATLAB编写程序,犹如在一张演算纸上排列公式和求解问题一样效率高,因此被称为“演算纸式的”科学工程算法语言。
MATLAB的基本数据单位是矩阵,它的命令表达与数学、工程中常用的习惯表达形式十分相似。
比如,矩阵方程b=Ax在MATLAB中被写成b=A*x。
若要通过A、b求x,那么只要写出命令x=A\b即可,而完全不需要对矩阵的乘法和求逆进行编程。
由此可见,用MATLAB解计算问题要比用BASIC、FORTRAN、C/C++等语言方便简捷得多。
随着MATLAB版本的不断更新,其功能越来越强,使它在诸如一般数值计算、数字信号处理、系统识别、自动控制、振动理论、时序分析与建模、优化设计、神经网络控制、化学统计学、动态仿真系统、特殊函数和图形领域表现出一般高级语言难以比拟的优势,并可以方便地用于几乎所有的科学和工程计算的各个方面。
可以说,MATLAB不仅是一种编程语言,而且在广义上是一种语言开发系统。
1.1.2MATLAB的发展历程
MATLAB这个名字由Matrix(矩阵)和Laboratory(实验室)两词的前3个字母组合而成。
20世纪70年代后期,时任美国新墨西哥大学计算机系主任的CleveMoler博士讲授线性代数课程时,发现应用其他高级编程语言极为不方便,于是CleveMoler博士和他的同事构思并为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,这就是用Fortran编写的萌芽状态的MATLAB。
以后几年,MATLAB作为免费软件在大学里被广泛使用,深受学生欢迎。
1984年,JohnLittle、CleveMoler和SteveBangert合作成立了MathWorks公司,专门从事MATLAB软件的开发,并把MATLAB正式推向市场。
从那时起,MATLAB的内核采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。
1993年,MathWorks公司推出MATLAB4.0版本;1995年,MathWorks公司推出MATLAB4.2C版(ForWin3.X)。
4.X版在继承和发展其原有的数值计算和图形可视能力的同时,增加了一些功能:
推出Simulink;开发出基于Word处理平台的Notebook;推出符号计算工具包;开发了与外部进行直接数据交换的组件,打通了MATLAB进行实时数据分析、处理和硬件开发的通路。
1997年,MathWorks公司推出MATLAB5.0;2000年10月,MathWorks公司推出了MATLAB6.0;2002年8月,MathWorks公司推出了MATLAB6.5,从此MATLAB拥有了强大的、成系列的交互式界面;2004年7月,MathWorks公司又进一步发展了MATLAB7.0,在MATLAB7.0中,仿真模块发展到了Simulink6.0。
MATLABR系列是从2006年开始发布的,MathWorks公司在技术层面上实现了一次飞跃,从此以后产品发布模式也发生了改变,在每年的3月和9月进行两次产品发布,版本的命令方式为“R+年份+代码”,对应上下半年的代码分别是a和b。
每一次发布都会包含所有的产品模块,如产品的newfeature、bugfixes和新产品模块的推出。
MATLABR2009a是MathWorks公司于2009年3月份推出的最新产品。
MathWorks公司于2008年11月7日发布了MATLABR2009a。
相比以前版本而言,MATLABR2009a不仅包括MATLAB和Simulink的新特性,同时还包含81个其他产品模块的升级和bug修正。
从MATLABR2009a开始,MATLAB和Simulink产品家族软件在安装后需要激活才能使用。
MATLABR2009a引入了LicenseCenter——在线License管理工具。
1.1.3MATLAB语言的特点
MATLAB之所以能如此迅速地普及,显示出强大的生命力,是因为它有着不同于其他语言的特点。
被称做第四代计算机语言的MATLAB,利用其丰富的函数资源,使编程人员从繁琐的程序代码中解放出来了。
MATLAB最突出的特点就是简洁。
MATLAB用更直观的、更符合人们思维习惯的代码,代替了C/C++和FORRAN语言的冗长代码。
MATLAB给用户提供的是最直观、最简洁的开发环境。
1.高效方便的矩阵的数组运算
MATLAB语言像BASIC、FORTRAN和C语言一样规定了矩阵的算术运算、关系运算符、逻辑运算符、条件运算符以及赋值运算符,而且这些运算符大部分可以照搬到数组的运算,如算术运算符只要增加“.”就可以用于数组间的运算,并且它不需要定义数组间的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在解决数字信号处理、建模、系统识别、自动控制、优化等领域的问题时,显得十分简洁、高效,具有其他高级语言不可比拟的优势。
【例1-1】已知矩阵
a=
25-94
387711
-4-5-90
b=
227
-3-6
-80
19
求a、b矩阵的积c矩阵。
C语言程序代码如下:
main()
{
inta[3][4]={{2,5,-9,4},{3,8,77,11},{-4,-5,-9,0}};
intb[4][2]={{22,7},{-3,-6},{-8,0},{1,9}};
intc[3][2],i,j,k;
for(i=0;i<3,i++)
{
for(j=0;j<2;j++){
c[i][j]=0;
for(k=0;k<4;k++)
c[i][j]+=a[i][k]*b[k][j];
}
}
for(i=0;i<3;i++){
for(j=0;j<2;j++)
printf("c[%d][%d]=%d,",i,j,c[i][j]);
printf("\n");
}
}
FORTRAN程序代码如下:
dimensiona(3,4),b(4,2),c(3,2)
dataa/2.,3.,-4.,5.,8.,-5.,-9.,77.,-9.,4.,11.,0./
datab/22.,-3.,-8.,1.,7.,-6.,0.,9./
do10i=1,3
do10j=1,2
c(i,j)=0
do10k=1,4
c(i,j)=c(i,j)+a(i,k)*b(k,j)
write(*,'(a)')'a'
do20i=1,3
write(*,*)(a((i,j),j)=1,4)
write(*,'(a)')'b'
do30i=1,4
write(*,*)(b((i,j),j)=1,2)
write(*,'(a)')'c'
do40i=1,3
write(*,*)(c((i,j),j)=1,2)
stop
end
BASIC程序如下:
dima(3,4),b(4,2),c(3,2)
fori=1to3
forj=1to4
reada(i,j)
nextj
nexti
fori=1to4
forj=1to2
readb(i,j)
nextj
nexti
data2.,5.,-9.,4.,3.,8.,77.,11.,-4.,-5.,-9.,0.
fori=1to3
forj=1to2
c(i,j)=0
fork=1to4
c(i,j)=c(i,j)+a(i,j)*b(k,j)
nextk
nextj
nexti
print"a"
fori=1to3
printfa(i,1),a(i,2),a(i,3),a(i,4)
nexti
printf"b"
fori=1to4
printfb(i,1),b(i,2)
nexti
printf"c"
fori=1to3
printfc(i,1),c(i,2)
nexti
reture
而下面的MATLAB程序要简洁得多。
>>a=[25-94;387711;-4-5-90];
b=[227;-3-6;-80;19];
c=a*b;
c
运行程序输出如下:
c=
10520
-56372
-12
程序中第一行输入矩阵a,第二行输入矩阵b,第三行求a、b之积。
“*”表示矩阵相乘的运算符,“>>”表示输入命令提示符。
矩阵的乘积赋给矩阵c,在没有指定变量时,赋给ans(ans为系统指定的默认变量)。
读者通过自身在BASIC、FORTRAN、C/C++方面的编程经验和上面所举的例子中可以看到,用BASIC、FORTRAN、C/C++及类似的语言去编写程序,尤其在涉及矩阵运算或是画图时,会很麻烦。
例如,用户要求求解一个线性方程,首先要编写一个读入数据的子程序,然后选用一种求解线性方程的算法(例如逼近法)编写一个子程序来求解方程,最后再编写输出数据的子程序。
编写求解线性方程的部分会很麻烦,麻烦主要在于对矩阵的元素作循环、选择稳定的算法以及代码的调试都不容易。
再如用户要用QR法求解矩阵的特征值,如果用FORTRAN语言编写,至少要编写三、四百行代码,编写及调试这种程序都是一项费时和易出错的工作,而这一步可能仅是一项系统工程中的微乎其微的一小步。
而用MATLAB求解这些问题时,就轻松多了。
以下为MATLAB编写以上两个问题的程序的方法。
用MATLAB求解下列方程,并求矩阵A的特征值。
Ax=b,其中:
A=[3-20-49;-75-130;888769;1222148;87463]
b=[12345]'
解为x=A\b;设A为特征值组成的向量为e,e=eig(A)。
MATLAB程序如下:
>>A=[3-20-49;-75-130;888769;1222148;87463]
b=[12345]'
x=A\b;
e=eig(A);
x,e
运行程序输出如下:
A=
3-20-49
-75-130
888769
1222148
87463
b=
1
2
3
4
5
x=
-0.0054
-0.0541
-0.0525
0.7268
0.4239
e=
27.8208
12.6051
-3.3505+14.9134i
-3.3505-14.9134i
-11.7251
从以上的程序可以看出,MATLAB的程序极其简短。
更重要的一点是,MATLAB具有很严格的解题规范,以上面的题为例,它会根据矩阵的特征选择适合方程的求解算法,所以不用担心MATLAB解题的准确性。
在MATLAB环境下,许多复杂的数学运算,如求矩阵的行列式值、求矩阵的逆及其特征值、求函数的微分、求函数的积分、进行多项式的插值、解微分方程等,都有现成的库函数可以调用,并且各个库函数是根据不同的应用情况采用不同的优化算法,保证了结果的可靠性和求解的快速性。
2.结构化/面向对象
新的MATLAB版本采用C++编写,既具有结构化的控制语句(如for循环、while循环、break和continue语句、if语句),又具有面向对象编程的特点,并且在制作图形用户界面(GUI)方面增加了许多新的功能。
3.编程效率高
MATLAB语言简洁紧凑,使用灵活方便,程序书写形式自由。
库函数非常丰富,避免了繁杂的子程序编程任务,删除了一切不必要的工作。
由于库函数都是由本领域的专家编写的,在可靠性和算法的高效性上有很好的保证。
可以说,使用MATLAB进行科技开发是在吸取专家经验的基础上进行的。
4.方便的绘图功能
MATLAB的绘图功能十分方便,它的高层绘图命令简单明了,不仅容易掌握,而且也是最常用的。
底层绘图命令控制和表现数据图形的能力强、灵活多变。
MATLAB有一系列绘图函数/命令例如线性坐标、对数坐标、半对数坐标以及极坐标,均只需调用不同的绘图函数/命令,在图上标出图题、X轴、Y轴的标注,格、栅的绘制也只需调用相应的命令,简单易行。
此外,在调用绘图函数时调整自变量可以绘出不同颜色的点、线、复线和多重线。
5.用户使用方便
MATLAB语言灵活、方便,其调试程序的手段丰富,调试速度快。
它不仅可以作为解释性语言使用,也可以以.m格式的文件作为编译型的语言使用。
现将MATLAB中编写程序和调试程序的步骤说明如下。
(1)编辑:
程序从键盘上输入,输入后要修改输入的错误。
在输入过程中可以利用块操作、光标操作、文件输入等,加快正确输入程序的速度。
(2)编译:
程序输入后,要把这种高级语言翻译成二进制编码。
翻译过程中要纠正程序中不符合该高级语言所规定的格式或语法错误,直到其确无上述错误为止。
(3)连接:
将翻译后的二进制的程序装入具体的计算机环境中,将其和操作系统及其他应用软件链接起来,以解决不同时刻、不同条件下新装入程序和其他软件的不同连接关系。
(4)执行和调试:
连接后要执行,执行的目的是检验用户编写的程序是否存在语义上的错误。
如果执行结果正确,说明程序已经调试完毕;如果不符合用户原来的语义,就需要进行调试,从而修改原来的程序。
如果此时回到编辑状态去修改,就会遇到一些问题,例如,在编辑修改用户程序时看不到运行结果,而在执行时能看到运行结果但又不能修改;并且在执行时看到的结果是最后的结果,许多中间结果调不出来,这样难于进一步分析和调试程序;另外,用户希望能方便地进行操作,如可能想要执行一段语句把中间结果保留下来、暂停程序以便用户分析等。
MATLAB语言与其他语言相比,较好地解决了这一问题,它把编辑、编译、链接和执行融为一体,能在同一画面上进行灵活的操作,可以快速排除输入程序中的书写错误、语法错误以至语义错误,从而加速了用户编写、修改和调试程序的进程。
6.功能强大的工具箱
MATLAB工具箱包括两个部分:
核心工具箱(核心部分中有数百个核心内部函数)和各种可选的工具箱。
其中,核心工具箱又可分为两类:
功能性工具箱和学科性工具箱。
功能性工具箱主要用来扩充其符号计算功能、图示建模仿真功能、文字处理功能以及与硬件实时交互的功能。
功能性工具箱可用于多种学科,而学科性工具箱专业性比较强,如ControlSystem、SignalProcessing、NonlinearControl、Optimization等,这些工具箱都是由该领域内的高水平专家编写的,用户可以使用它们直接进行高级研究工作。
7.扩充能力强
MATLAB语言有丰富的库函数和开放性,在进行复杂的数学运算时可以直接调用,而且用户文件和MATLAB的库函数在形式上是一样的,所以用户文件可以作为MATLAB的库函数来调用。
因此,用户可以根据自己的需要,方便地建立新的库函数或扩充原有的库函数,以提高使用MATLAB的效率。
开放性是MATLAB十分受人们喜爱的主要原因之一,除了内部函数以外,所有的MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可以对源文件进行修改,也可加入用户自己的文件。
开放性使得MATLAB成为众多领域的“专家工具”。
为了充分利用FORTRAN、C等语言的资源,包括用户已经编好的FORTRAN、C语言程序,通过建立MEX文件的形式混合编辑,可以方便地调用有关FORTRAN、C语言的子程序。
在MATLAB中,又增加了C/C++数学库的内容,并且加强了与Excel等应用软件的接口的功能。
综上所述,有人把MATLAB称为第四代计算机语言,并认为MATLAB和C语言的关系类似于C语言和汇编语言的关系。
如同高级语言比汇编语言的执行效率低一样,MATLAB比一般高级语言的执行效率低,但是MATLAB的编程效率要远远高于其他高级语言,并且其程序具有很好的可读性和可移植性。
MATLAB强大的库函数带来的简单程序代码具有无可替代的作用。
MATLAB可以轻易地实现FORTRAN和C语言的几乎所有功能,并具有较强的界面设计能力,已经成为一般工程开发人员的首选工具。
1.1.4MATLAB组成
MATLAB作为MathWorks产品家族的核心,它主要由5大部分组成,分别为MATLAB语言(theMATLABLanguage)、MATLAB工作环境(theMATLABWorkingEnvironment)、MATLAB数学函数库(theMATLABMathLibrary)、图形句柄系统(HandleGraphics)和MATLAB应用程序接口(theMATLABApplicationInterface)。
下面对它们分别进行介绍。
1.MATLAB语言
MATLAB语言是一种以矩阵(Matrix)和阵列(Array)为基本编程单元的,拥有完整的控制语句、数据结构、函数编写与调用格式和输出功能的具有面向对象程序设计特征的高级程序语言。
读者不但可以利用它方便快捷地完成小规模的算法验证、程序开发和调试工作,而且可以使用它进行大规模、高效的复杂应用程序设计。
2.MATLAB工作环境
MATLAB的工作环境简单来说就是一系列实用工具的集合,它不但包括了各种操作工作空间中变量的工具和管理数据输入输出的方法,而且包括了开发调试M文件和MATLAB应用程序的集成环境,使用起来极为方便。
关于MATLAB工作环境下一节将展开讨论,在此不作介绍。
3.MATLAB数学函数库
MATLAB数学函数库是大量的各种形式的数学函数和算法的集合,它不仅包括了最基本的初等函数,如sum、sine、cosine和复数运算等,而且包含了大量复杂的高级函数和算法,如贝塞尔(Bassel)函数、快速傅里叶变换和矩阵求逆等。
用户在编写自己的MATLAB程序时,可以轻松地调用这些函数和算法,从而极大地方便了算法的开发。
所有这些函数按类别分别存放在MATLAB工具箱目录下的8个子目录中,如表1-1所示。
表1-1MATLAB数学函数库的分类和组织
目录名函数功能
elmat对矩阵和矩阵元素的操作
elfun初等数学函数
matfun矩阵函数—数值线性代数
funfun功能函数和ODE求解
specfun专门数学函数
sparfun稀疏矩阵函数
datafun数值分析和傅里叶变换
polyfun插值和多边形近似
4.MATLAB应用程序接口
MATLAB的外部接口使得MATLAB可与外部设备和程序实现数据交互和程序移植,可以扩充MATLAB强大的数值计算和图形显示功能,从而弥补了其执行效率较低的缺点,同时增强了其他应用程序进行软件开发的功能,提高了软件开发效率。
MATLAB接口工具不仅使得MATLAB可以十分方便地与其他应用程序交换数据和信息,还实现了与其他程序函数和算法的交互,所以通过MATLAB接口编程可以充分利用现有资源,能更容易地编写出功能强大、结构简洁的应用程序。
MATLAB主要提供了MEX文件、MAT文件、MATLAB计算引擎、COM和DDE、Web服务、硬件接口和Excel生成器、Java生成器和.NET生成器等形式的接口。
5.图形句柄系统
HandleGraphics为MathWorks公司的注册商标,是MATLAB的图形系统。
它在包含了大量高级的2D和3D数据可视化、图形显示、动画生成和图像处理命令的同时,还提供了许多低级的图形命令,允许用户按照自己的需求显示图形和定制应用程序图形用户接口,既方便又灵活。
具体的函数分为5大类,分别放置在MATLAB工具箱下5个不同的目录内,如表1-2所示。
表1-2MATLAB图形函数的分类和组织
目录名函数功能
graph2d二维图形函数
graph3d三维图形函数
graphics图形句柄函数
uitools图形用户界面工具
specgraph专门图形函数
1.1.5MATLABR2009的新特点与涵盖
1.MATLABR2009的新特点
MATLABR2009中采用先进的面向对象编程,包括对类和对象、继承、方法、属性、事件和包的完全支持。
?
OptimizationToolbox中针对大量数据优化问题对内部点求解器和并行计算提供支持;
?
FinancialToolbox均方差投资优化的线性互补程序;
?
ParallelComputingToolbox对PBSPro和TORQUE规划的支持;
?
StatisticsToolbox中交叉确认、特性选择、半随机数和并行最小二乘特性。
Simulink产品家族新特性的简要介绍:
?
Simulink中重新设计的多平台库浏览器;
?
Real-TimeWorkshopEmbeddedCoder中生成对AUTOSAR兼容的代码;
?
EmbeddedMATLAB中M-Lint代码分析仪和SimulinkDesignVerifier对EmbeddedMATLAB语言子集函数生成代码进行检查;
?
SimulinkVerificationandValidation提供对安全关键系统IEC61508设计规则的检查;
?
SimulinkFixedPoint提供对浮点模型的自动定点转换的指导意见;
?
CommunicationBlockset针对调制、解调、编码和解码函数的定点支持;
?
EmbeddedIDELinkMU作为新产品将Simulink模型生成代码并应用到GreenHillsMULTI开发环境中。
MATLABR2009a将不再支持在PowerPC处理器上运行MacintoshOSX操作系统,也不支持MicrosoftWindows2000操作系统。
此外,在MATLABR2009a中15个产品模块被重新命名。
2.MATLABR2009涵盖
MATLABR2009涵盖了Simulink8、新产品SimulinkDesignVerifier、LinkforAnalogDevicesVisualDSP以及82个产品模块的更新升级及Bug修订。
在MATLABR2009b中(MATLAB7.8,Simulink8),主要更新了多个产品模块、增加了多达350个新特性、增加了对64位Windows的支持,并新推出了.NET工具箱,如R2007b、released