Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
前 言
MATLAB软件是由美国Mathworks公司发布的主要面向科学计算、数据可视化、系统仿真及交互式程序设计的高科技计算环境。由于MATLAB功能强大,简单易学,并且对问题的描述和求解符合人们的思维方式和数学表达习惯,所以它已经成为高校教师、科研人员和工程技术人员的必学软件。使用MATLAB,可极大地提高人们的工作效率和质量。 MATLAB软件代表了当今国际科学计算软件的先进水平,应用领域非常广泛。很多人都希望将MATLAB强大的数值计算和分析功能应用于自己的项目和实践中,从而可以直观、方便地进行分析、计算和设计工作。编写这本书的目的,就是为了向读者全方位介绍MATLAB编程和开发技术。 本书由浅入深,全面、系统地介绍了MATLAB基础、科学计算、数据可视化、编程、Simulink仿真技术、高级应用及常用的工具箱等内容。书中的每一章都提供了大量的实例程序,以方便读者进行练习和学习,每个例程都经过精挑细选,具有很强的针对性,适合各个阶段的读者学习。本书既注重基础知识,又非常注重实践,读者可以快速上手并迅速提高。通过本书的学习,读者不仅可以全面掌握MATLAB编程和开发技术,还可以提高快速分析和解决实际问题的能力,从而能够在最短的时间内,以最好的效果解决实际的工程和科学问题,提升工作效率。 本书的特点 1.每章都提供对应的教学视频,学习高效、直观 为了便于读者高效、直观地学习本书中的内容,作者对每章的重点内容都特意制作了教学视频,这些视频和本书的实例文件一起收录于配书DVD光盘中。 2.结构合理,内容全面、系统 本书详细介绍了MATLAB编程、数据分析和处理、数据可视化、Simulin仿真、GUI编程开发及常用的工具箱,将实际项目开发经验贯穿于全书,思想和内容都非常丰富。在内容的安排上,则根据读者的学习习惯和内容的梯度合理安排,更加适合读者学习。 3.叙述详实,例程丰富 本书有详细的例程,每个例子都经过作者的精挑细选,有很强的针对性。书中的程序都有完整的代码,而且代码非常简洁和高效,便于读者学习和调试。读者也可以直接重用这些代码来解决自己的问题。 4.结合实际,编程技巧贯穿其中 MATLAB编程非常灵活,所以本书写作时特意给出了大量的实用编程技巧,这些技巧的灵活使用,将会让你事半功倍。 5.语言通俗,图文并茂 对于程序的运行结果,本书给出了大量的图片。本书不仅注重基础知识,而且非常注重实践,让读者快速上手,迅速掌握MATALB知识。 本书内容体系 本书共23章,分为7篇,各篇对应的章节和具体内容介绍如下。 第1篇包括第1~4章,主要介绍MATLAB的基础知识,讲解MATLAB 2010a的安装和基本操作,MATLAB的数据类型和运算符,数组和矩阵及字符串等操作。 第2篇包括第5~8章,主要介绍利用MATLAB进行科学计算,包括多项式、插值、极限等基本数据分析,微积分运算、概率论和数理统计,以及MATLAB的符号计算功能。 第3篇包括第9章和第10章,主要介绍MATLAB的数据可视化,包括二维数据可视化和三维数据可视化,同时讲解了图形的标注、特殊图形的绘制,以及三维图形的视角、色彩和光照效果等。 第4篇包括第11章和第12章,主要介绍MATLAB编程,包括脚本M文件和函数M文件,以及程序的流程控制,最后介绍了程序的调试、程序的性能分析和常用的编程技巧等。 第5篇包括第13章和第14章,主要介绍利用Simulink进行系统的仿真,包括Simulink建模的原理、常用操作、基本模块库、子系统的封装技术、Simulink调试器和S-函数等。 第6篇包括第15~18章,主要介绍MATLAB的一些高级应用,例如图形句柄、利用GUIDE建立图形用户界面、文件I/O操作及MATLAB的编译器等。 第7篇包括第19~23章,主要介绍MATLAB的常用工具箱和与Word和Excel的接口,包括信号处理工具箱、小波分析工具箱、图像处理工具箱、神经网络工具箱。 本书读者对象 MATLAB初学者; 想全面、系统地学习MATLAB的人员; MATLAB技术爱好者; 利用MATLAB进行编程和开发的技术人员; 大中专院校的学生和老师; 相关培训学校的学员。 本书作者 本书由东北大学机械电子工程研究所的赵海滨主笔编写。其他参与编写的人员有武冬、郅晓娜、孙美芹、卫丽行、尹翠翠、蔡继文、陈晓宇、迟剑、邓薇、郭利魁、金贞姬、李敬才、李萍、刘敬、陈慧、刘艳飞、吕博、全哲、佘勇、宋学江、王浩、王康、王楠、杨宗芳、张严虎、周玉、张平、张靖波、周芳、杨罡、于海滨、张晶杰、张利峰、杨景凤、陈锴、郑剑锋、叶佩思、张涛、赵东彪、王双。在此表示感谢! 在此感谢我的父母、家人、研究所的老师,以及所有帮助过我的人。由于时间仓促,笔者水平有限,书中难免存在遗漏和不足之处,恳请广大读者提出宝贵意见。 编著者 |
![]() |
![]() |
![]() |
#2 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
第5章 MATLAB数据分析
针对数据分析和处理,MATLAB提供了大量的函数,非常方便和灵活。本章将详细介绍如何利用MATLAB进行一些基本的数据分析,主要包括多项式及其函数,插值,以及函数的极限。MATLAB能够很好地解决多项式运算问题,这些函数用于多项式的建立、多项式求值、多项式乘法和除法、多项式求导和多项式展开和拟合等。插值函数,主要包括一维插值、二维插值、样条插值和高维插值等内容。MATLAB提供了非常强大的函数,可以非常方便和灵活地求得函数的极限。 5.1 多项式及其函数 MATLAB提供了一些处理多项式的专用函数,用户可以很方便地进行多项式的建立、多项式求值、乘法和除法运算,以及求多项式的导数和微分、多项式的根、多项式的展开和拟合等。 5.1.1 多项式的建立 MATLAB语言中,对于多项式 ,用多项式的系数按照降幂次序存放在向量 中。顺序必须是从高到低进行排列。例如,多项式 可以用系数向量 来表示。对多项式的操作就转换为对多项式系数向量的操作问题, 次多项式用一个 维的行向量表示,在多项式中缺少的幂次要用“0”来补齐。在MATLAB中,可以采用直接输入多项式系数建立多项式,也可以采用多项式的根来建立多项式,下面分别进行介绍。 1.直接输入多项式系数法 MATLAB中多项式是以向量的形式存储的,输入向量后,MATLAB将按照降幂顺序自动把向量的元素分配给多项式各项的系数。该向量可以是行向量,也可以是列向量。 【例5-1】 使用向量来创建多项式 ,并进行显示。 首先创建系数向量,然后使用函数poly2sym()将该向量转换为多项式,直接进行输出,也可以采用函数disp()进行多项式的显示,代码如下: >> clear all; p1=[4 3 2 1]; y=poly2sym(p1) %由向量创建多项式 disp(y) %显示多项式 运行程序,输出结果如下: y = 4*x^3+3*x^2+2*x+1 4*x^3+3*x^2+2*x+1 在MATLAB中,多项式的输出采用降幂形式。如果多项式的系数为0,则在输出的时候不显示,可采用函数disp()来显示多项式。 2.由多项式的根来建立多项式 如果多项式的根已知,可以采用函数poly()建立多项式。其调用格式为p=poly(r),其中r为由多项式的根组成的向量,p为输出的多项式的系数向量。 【例5-2】 已知某多项式的根为2、3、4,求该多项式。代码如下: >> r=[2 3 4]; p=poly(r); %由多项式的根创建多项式 y=poly2sym(p) %显示多项式 运行程序后,输出结果如下: y = x^3-9*x^2+26*x-24 在程序中,函数poly()通过多项式的根创建多项式,多项式的根向量为r。通过函数poly2sym()对创建的多项式进行显示。 |
![]() |
![]() |
![]() |
#3 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
5.1.2 多项式的求值与求根
在MATLAB中,通过函数polyval()和polyvalm()可以对多项式进行求值,两者的区别为前者是代数多项式求值,后者是矩阵多项式求值。通过函数roots()对多项式进行求根,如果已经知道多项式的根,也可以通过函数poly()建立相对应的多项式。下面分别进行 介绍。 1.多项式求值 在MATLAB中,提供了两个函数对多项式进行求值,函数polyval()和polyvalm()。函数polyval()以数组或矩阵中的元素为计算单位,函数polyvalm()以矩阵为计算单位。 函数polyval()的调用方式为y=polyval(p, x),其中参数p为行向量形式的多项式,参数x为带入多项式的值。参数x可以是标量,也可以是向量和矩阵。如果参数x为向量或矩阵,则该函数对向量或矩阵中的每一个元素计算多项式的值,其返回值y也分别为向量或矩阵。 【例5-3】 求多项式 在点2、3、4、5的值。代码如下: >> clear all; p=[1 -1 -6]; %多项式的系数向量 x=2:5; y=polyval(p,x) %求多项式在x处的值 运行程序后输出结果如下: y = -4 0 6 14 函数polyvalm()的调用方式为y=polyvalm(p, x),其中参数p为行向量形式的多项式,参数x必须为方阵,输出结果仍然为方阵。 【例5-4】 求 时,多项式 的值。 利用函数polyvalm()时,输出结果计算公式为 ,常数值变为常数乘以相同阶次的单位矩阵。如果采用函数polyval(),计算矩阵中每个元素对应的多项式的值。下面分别采用函数polyvalm()和polyval()对该矩阵进行计算,代码如下: >> x=[1 2 ;3 4]; p=[2 3 4]; y1=polyvalm(p,x) %采用polyvalm()函数,以矩阵为计算单位 x=[1 2 ;3 4]; p=[2 3 4]; y2=polyval(p,x) %采用polyval()函数,以矩阵的元素为计算单位 运行程序后,输出结果如下: y1 = 21 26 39 60 y2 = 9 18 31 48 当采用函数polyval()时,虽然输入参数是矩阵,但在计算时将矩阵的每个元素分别输入多项式,计算对应的输出。 2.多项式求根 在MATLAB中,利用roots()函数来求多项式的根,其调用格式为x=roots(p),其中参数p为多项式系数,输出参数x为多项式的根。对于n次多项式具有n个根,这些根可能是实根,也可能是共轭复根。在MATLAB中,如果已经知道多项式的根,可以利用函数poly()求多项式的系数,其调用格式为y=poly(x),输入参数x为根,输出参数y为得到的多项式系数向量。 【例5-5】 求多项式 的根,以及以4和5为根的多项式。代码如下: >> clear all; p=[1 0 0 -1 -6]; x1=roots(p) %对多项式p求根 x2=[4 5]; y=poly(x2); %求以x2为根的多项式 y=poly2sym(y) 运行程序后,输出结果如下: x1 = 1.6638 -0.1021 + 1.5684i -0.1021 - 1.5684i -1.4597 y = x^2 - 9*x + 20 利用函数roots()计算多项式的根,非常方便,函数的返回值x是一个向量,其长度等于多项式的根的个数。 |
![]() |
![]() |
![]() |
#4 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
5.1.3 多项式乘法和除法
在MATLAB中,使用函数conv()对多项式进行乘法运算。其调用格式为c=conv(a, b),a和b为多项式的系数向量,该函数实现向量a和b的卷积,在代数上相当于多项式a乘以多项式b,其中c为相乘所产生的多项式的系数向量。 【例5-6】 求多项式 和 的乘积。采用函数conv()实现,其MATLAB程序如下: p1=[4 2 0 5]; %缺少的幂次用0补齐 p2=[5 8 1]; y1=poly2sym(p1) y2=poly2sym(p2) p3=conv(p1,p2); %多项式相乘 y=poly2sym(p3) 运行程序后,输出结果如下: y1 = 4*x^3+2*x^2+5 y2 = 5*x^2+8*x+1 y = 20*x^5+42*x^4+20*x^3+27*x^2+40*x+5 在MATLAB中,采用poly2sym()函数将向量作为多项式的系数进行输出,和其相对应的函数是sym2poly(),该函数将输入多项式的系数提取出来,作为向量进行输出。对于例5-6程序也可以用poly2sym()函数实现(和例5-6的计算结果相同),其MATLAB程序如下: >> syms x p1=sym2poly(4*x^3+2*x^2+5) p2=sym2poly(5*x^2+8*x+1) p3=conv(p1,p2); %多项式相乘 y=poly2sym(p3) 运行程序后,输出结果如下: p1 = 4 2 0 5 p2 = 5 8 1 y = 20*x^5+42*x^4+20*x^3+27*x^2+40*x+5 在MATLAB中,使用函数deconv()对多项式进行除法运算。其调用格式为[q, r] = deconv(a, b),实现解卷积运算。其中a和b为多项式的系数向量,在代数上相当于多项式a除以b,得到的商为q和余多项式r,它们之间的关系为a = conv(b, q) + r。 【例5-7】 求多项式 除以多项式 的商和余数,代码如下: >> p1=[4 3 8 1 4]; p2=[2 3 1]; [q,r]=deconv(p1,p2); %多项式p1除以p2 y1=poly2sym(q) %商 y2=poly2sym(r) %余数 运行程序后,输出结果如下: y1 = 2*x^2-3/2*x+21/4 y2 = -53/4*x-5/4 5.1.4 多项式的导数和积分 在MATLAB中,通过函数polyder()和polyint()分别对多项式进行求导和积分。求导和积分互为逆运算,如果先对多项式进行积分,然后再求导,结果仍然为原来的多项式。下面对多项式的求导和积分分别进行讲解。 1.多项式的导数 在MATLAB中,采用函数polyder()进行多项式的求导,调用方式如下。 y=polyder(p):对以向量p为系数的多项式求导。 y=polyder(a, b):对以a和b为系数的多项式乘积进行求导。 [q,d]=polyder(b, a):返回以b为系数的多项式除以以a为系数的多项式的商的导数,并以q/d格式表示。 【例5-8】 对多项式求导,其MATLAB程序如下: >> p1=[4 3 2]; p2=[2 2 1]; y1=polyder(p1); %对多项式p1求导 y1=poly2sym(y1) y2=polyder(p1,p2); %对多项式p1和p2的乘积求导 y2=poly2sym(y2) [q,d]=polyder(p1,p2); %对多项式p1除以p2的商求导 q=poly2sym(q) d=poly2sym(d) 运行程序后,输出结果如下: y1 = 8*x + 3 y2 = 32*x^3 + 42*x^2 + 28*x + 7 q = 2*x^2 - 1 d = 4*x^4 + 8*x^3 + 8*x^2 + 4*x + 1 在MATLAB中,通过函数polyder()对多项式进行求导,通过对输入参数和输出参数个数的不同,对相对应的多项式进行求导计算。对于函数[q,d]=polyder(b, a),相当于对多项式 求导,结果为 。 2.多项式的积分 在MATLAB中,使用函数polyint()对多项式进行积分运算,其调用方式如下。 polyint(p, k):返回以向量p为系数的多项式的积分,积分的常数项为k。 polyint(p):返回以向量p为系数的多项式的积分,积分的常数项为默认值0。 【例5-9】 对多项式 进行积分运算,其常数项分别为3和0,其实现的MATLAB程序代码如下: p1=[3 2 2]; y1=polyint(p1,3); %对多项式p1进行积分,常数项为3 y1=poly2sym(y1) y2=polyint(p1); %对多项式p1进行积分,常数项为0 y2=poly2sym(y2) 运行程序后,输出结果如下: y1 = x^3 + x^2 + 2*x + 3 y2 = x^3 + x^2 + 2*x 通过polyint()函数对多项式进行积分运算,积分的常数项通过参数k进行设置。如果不对参数k进行设置,则k取默认值0。 |
![]() |
![]() |
![]() |
#5 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
5.1.5 多项式展开
在MATLAB中,有理多项式用它们的分子多项式和分母多项式进行表示,函数residue()可以将多项式之比用部分分式展开,也可以将一个部分分式用多项式之比进行表示。函数residue()的调用方式如下。 [r, p, k]=residue(b, a):求多项式之比b/a的部分分式展开,函数的返回值r是余数,p是部分分式的极点,k是常数项。如果多项式a没有重根,部分分式展开的形式如下: 其中向量r、p的长度和向量a、b的长度有如下关系: 当向量b的长度小于a时,向量k中没有元素,否则应满足: [b, a]=residue(r, p, k):通过部分分式得到多项式,该多项式的形式为b/a。 【例5-10】 将多项式 和 展开成几个简单多项式的和。其实现的MATLAB代码如下: >> clear all; clear all; b=[1 -1 -7 -1]; %分子多项式 a=poly([1;5;6]); %分母多项式 [r,p,k]=residue(b,a) %进行多项式b/a展开 [b1,a1]=residue(r,p,k); %通过余数、极点和常数项来求多项式b1/a1 b1=poly2sym(b1) a1=poly2sym(a1) b=[1 -1 -7 -1]; %多项式a有三重根 a=poly([1;1;1]); %分母多项式 [r,p,k]=residue(b,a) %展开多项式b/a 运行程序后,输出结果如下: r = 27.4000 -16.0000 -0.4000 p = 6.0000 5.0000 1.0000 k = 1 b1 = x^3 - x^2 - 7*x - 1 a1 = x^3 - 12*x^2 + 41*x - 30 r = 2.0000 -6.0000 -8.0000 p = 1.0000 1.0000 1.0000 k = 1 利用函数[r, p, k]=residue(b, a)将多项式b/a进行展开,结果为余数、极点和常数项。对该多项式进行展开后的结果如下: ![]() 将余数、极点和常数项带入函数[b, a]=residue(r, p, k)中,可以求得对应的多项式,并通过b/a的形式给出。 当多项式a有三重根1时,对多项式进行展开后的结果如下: ![]() |
![]() |
![]() |
![]() |
#6 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
5.1.6 多项式拟合
在MATLAB中,函数polyfit()采用最小二乘法对给定的数据进行多项式拟合,得到该多项式的系数。该函数的调用方式为p = polyfit(x, y, n),采用n次多项式来拟合数据x和y,得到以p为系数的多项式。该函数使得p(x)与y最小均方误差最小。 【例5-11】 某数据的横坐标为x=[0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8],纵坐标为y=[1 2 3 5 6 7 6 5 4 1],对该数据进行多项式拟合,代码如下: clear all; x=[0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8]; y=[1 2 3 5 6 7 6 5 4 1]; p5=polyfit(x,y,5); %5阶多项式拟合 y5=polyval(p5,x); p5=vpa(poly2sym(p5),5) %显示5阶多项式 p9=polyfit(x,y,9); %9阶多项式拟合 y9=polyval(p9,x); figure; %画图显示 plot(x,y,'bo'); hold on; plot(x,y5,'r:'); plot(x,y9,'g--'); legend('原始数据','5阶多项式拟合','9阶多项式拟合'); xlabel('x'); ylabel('y'); 运行程序后,得到的5阶多项式如下: p5 = - 10.041*x^5 + 58.244*x^4 - 124.54*x^3 + 110.79*x^2 - 31.838*x + 4.0393 运行程序后,得到的输出结果如图5.1所示。由图5.1可以看出,使用5次多项式拟合时,得到的结果比较差。当采用9次多项式拟合时,得到的结果与原始数据符合的比较好。当使用函数polyfit()进行拟合时,多项式的阶次最大不超过length(x)-1。 ![]() |
![]() |
![]() |
![]() |
#7 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 13 ![]() |
![]()
5.1.7 曲线拟合图形用户接口
为了方便用户的使用,在MATLAB中提供了曲线拟合的图形用户接口。它位于MATLAB图形窗口Tools菜单下的Basic Fitting菜单中。在使用该工具时,首先将需要拟合的数据采用函数plot()画图,其MATLAB代码如下: >> clear all; x=[0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8]; y=[1 2 3 5 6 7 6 5 4 1]; figure; plot(x,y,'bo'); 该程序运行后,得到Figure窗口,如图5.2所示。然后选择Tools | Basic Fitting命令,弹出Basic Fitting对话框。单击该窗口右下角的 按钮,将会全部展开Basic Fitting对话框,如图5.3所示。 ![]() |
![]() |
![]() |