Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2012-05-21, 11:16   #1
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

前 言
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进行编程和开发的技术人员;
 大中专院校的学生和老师;
 相关培训学校的学员。
本书作者
本书由东北大学机械电子工程研究所的赵海滨主笔编写。其他参与编写的人员有武冬、郅晓娜、孙美芹、卫丽行、尹翠翠、蔡继文、陈晓宇、迟剑、邓薇、郭利魁、金贞姬、李敬才、李萍、刘敬、陈慧、刘艳飞、吕博、全哲、佘勇、宋学江、王浩、王康、王楠、杨宗芳、张严虎、周玉、张平、张靖波、周芳、杨罡、于海滨、张晶杰、张利峰、杨景凤、陈锴、郑剑锋、叶佩思、张涛、赵东彪、王双。在此表示感谢!
在此感谢我的父母、家人、研究所的老师,以及所有帮助过我的人。由于时间仓促,笔者水平有限,书中难免存在遗漏和不足之处,恳请广大读者提出宝贵意见。

编著者
lili123 当前离线   回复时引用此帖
旧 2012-05-21, 11:17   #2
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

第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()对创建的多项式进行显示。
lili123 当前离线   回复时引用此帖
旧 2012-05-21, 11:17   #3
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

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是一个向量,其长度等于多项式的根的个数。
lili123 当前离线   回复时引用此帖
旧 2012-05-21, 11:18   #4
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

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。
lili123 当前离线   回复时引用此帖
旧 2012-05-21, 11:20   #5
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

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时,对多项式进行展开后的结果如下:
lili123 当前离线   回复时引用此帖
旧 2012-05-21, 11:22   #6
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

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。
lili123 当前离线   回复时引用此帖
旧 2012-05-21, 11:23   #7
lili123
普通会员
 
注册日期: 2012-05-21
帖子: 37
声望力: 13
lili123 正向着好的方向发展
默认 回复: MATLAB应用大全 书连载

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所示。
lili123 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码



所有时间均为北京时间。现在的时间是 03:15


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.