回 帖 发 新 帖 刷新版面

主题:MATLAB应用大全



                                           MATLAB应用大全

                                           赵海滨  等编著

















                                        北 京 清 华 大 学 出 版 社

内 容 简 介
本书由浅入深,全面、系统地介绍了MATLAB编程和开发的方方面面。书中的每章都提供了大量有针对性的实例,供读者实战演练。另外,为了帮助读者更高效、直观地学习,本书每章重点内容都专门录制了对应的教学视频。这些视频和本书所有的实例文件一起收录于配书DVD光盘中。
全书共23章,分为7篇。基础篇介绍了MATLAB基础、数组和矩阵分析、字符串分析;科学运算篇介绍了MATLAB数据分析、积分和微分运算、概率和数理统计、符号计算;数据可视化篇介绍了二维和三维数据的可视化;编程篇介绍了MATLAB基本编程、程序调试和编程技巧;仿真篇介绍了Simulink基本知识、Simulink建模和S-函数;高级应用篇介绍了GUI编程开发、GUIDE工具建立GUI界面、文件夹管理和文件I/O操作、MATLAB编译器;工具箱与接口编程篇介绍了信号处理、小波分析、图像处理、神经网络4个工具箱,最后还介绍了MATLAB与Word和Excel的接口技术。
无论是对于MATLAB的初学者,还是有一定基础的高级用户,本书都是一本难得的参考书。本书非常适合使用MATLAB进行编程和开发的本科生、研究生及教师,也适合广大科研和工程技术人员研读。

本书封面贴有清华大学出版社防伪标签,无标签者不得销售。
版权所有,侵权必究。侵权举报电话:010-62782989  13701121933


图书在版编目(CIP)数据

MATLAB应用大全 / 赵海滨等编著. —北京:清华大学出版社,2012.3
ISBN 978-7-302-27616-6

Ⅰ. ①M…  Ⅱ. ①赵…  Ⅲ. ①Matlab软件  Ⅳ.  ①TP317

中国版本图书馆CIP数据核字(2011)第271712号

责任编辑:夏兆彦
责任校对:徐俊伟
责任印制:

出版发行:清华大学出版社    
网    址:http://www.tup.com.cn, http://www.wqbook.com
地    址:北京清华大学学研大厦A座        邮    编:100084
社 总 机:010-62770175                邮    购:010-62786544
投稿与读者服务:010-62776969,c-service@tup.tsinghua.edu.cn
质量反馈:010-62772015,zhiliang@tup.tsinghua.edu.cn
印 刷 者:
装 订 者:肖  米
经    销:全国新华书店
开    本:185mm×260mm        印    张:46.75          字    数:1170千字
          (附光盘1张)
版    次:2012年3月第1版                          印    次:2012年3月第1次印刷
印    数:1~5000
定    价:25.00元
产品编号:043740-01

[b]当当地址:http://product.dangdang.com/product.aspx?product_id=22704305[/b]

回复列表 (共38个回复)

21 楼

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。

22 楼

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时,对多项式进行展开后的结果如下:
 

23 楼


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。

[img]http://www.tu265.com/di-e73892daf12b43aada4b6b59b88b3999.png[/img]

24 楼


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所示。


[img]http://www.tu265.com/di-bca944d8974d45d29704042c47dac6b5.png[/img]

25 楼


在Basic Fitting对话框的Plot fits选项区域中,勾选5th degree polynomial复选框;在Numerical results选项区域中,会自动列出曲线拟合的多项式系数和残留误差,如图5.4所示。同时,在Figure窗口中会把拟合曲线绘制出来,如图5.5所示。

[img]http://www.tu265.com/di-b9fb401c3a09f83689d46cd4a5eee7bd.png[/img]

26 楼

5.2  插    值
在数字信号处理和图像处理中,插值是极其常用的方法。MATLAB提供了大量的插值函数。在MATLAB中,插值函数保存在MATLAB工具箱的polyfun子目录下。下面对一维插值、二维插值、样条插值和高维插值分别进行介绍。
5.2.1  一维插值
一维插值是进行数据分析的重要方法,在MATLAB中,一维插值有基于多项式的插值和基于快速傅立叶的插值两种类型。一维插值就是对一维函数 进行插值。
1.一维多项式插值
在MATLAB中,一维多项式插值采用函数interp1()进行实现。函数interp1()使用多项式技术,用多项式函数通过提供的数据点来计算目标插值点上的插值函数值,其调用格式如下。
    yi = interp1(x, y, xi):其中x必须为向量,y可以是向量也可以是矩阵。如果y是向量,必须与x具有相同的长度,这时xi可以是标量、向量或矩阵,yi与xi具有相同的大小。如果y是矩阵,则其大小必须是 ,n为向量x的长度,函数对 组y值都进行插值。
    yi = interp1(y, xi):其中xi默认为1:n,n为向量y的长度length(y)。
    yi = interp1(x, y, xi, method):其中输入变量method用于指定插值的方法,默认方法为线性插值('linear')。
    yi = interp1(x, y, xi, method,'extrap'):对超出数据范围的插值数据指定外推方法'extrap'。
    yi = interp1(x, y, xi, method, extrapval):对超出数据范围的插值数据返回extrapval值,一般设置为NaN或0。
一维插值可以采用的方法如下。
    临近点插值(Nearest neighbor interpolation):设置method ='nearest',这种插值方法在已知数据的最邻近点设置插值点,对插值点的数采用四舍五入的方法。对超出范围的点将返回一个NaN(Not a Number)。
    线性插值(Linear interpolation):设置method = 'linear',该方法采用直线连接相邻的两点,为MATLAB系统中采用的默认方法。对超出范围的点将返回NaN。
    三次样条插值(Cubic spline interpolation):设置method = 'spline',该方法采用三次样条函数来获得插值点。
    分段三次Hermite插值(Piecewise cubic Hermite interpolation):设置method ='pchip'。
    三次多项式插值:设置method ='cubic',与分段三次Hermite插值相同。
    MATLAB5中使用的三次多项式插值:设置method = 'v5cubic',该方法使用一个三次多项式函数对已知数据进行拟合。

27 楼


选择插值方法时主要考虑的因素有运算时间、占用计算机内存和插值的光滑程度。下面对临近点插值、线性插值、三次样条插值和分段三次Hermite插值进行比较,如表5.1所示。临近点插值的速度最快,但是得到的数据不连续,其他方法得到的数据都连续。三次样条插值的速度最慢,可以得到最光滑的结果,是最常用的插值方法。
[img]http://www.tu265.com/di-642aaad075a8632b19c3b3db5cd58288.png[/img]

28 楼


2.一维快速傅立叶插值
在MATLAB中,一维快速傅立叶插值通过函数interpft()来实现,该函数利用傅立叶变换将输入数据变换到频域,然后用更多点的傅立叶逆变换,变换回时域,其结果是对数据进行增采样。调用格式如下。
    y=interpft(x, n):对x进行傅立叶变换,然后采用n点傅立叶反变换,变回到时域。如果x是一个向量,数据x的长度为m,采样间隔为dx,则数据y的采样间隔是dx×m/n,其中n必须大于m。如果x是矩阵,该函数对矩阵x的列进行操作,其返回的结果y与x具有相同的列,行数为n。
    y=interpft(x, n, dim):在dim指定的维度上进行操作。
【例5-13】 利用一维快速傅立叶插值实现数据增采样,其实现的MATLAB代码如下:

clear all;
x=0:1.1:8;
y=sin(x);
n=2*length(x);                %增采样1倍
yi=interpft(y,n);            %采用一维快速傅立叶插值
xi=0:0.55:8.3;                %要插值的数据
figure;                        %画图显示
hold on;
plot(x,y,'ro',xi,yi,'b-');
legend('原始数据','插值后结果');

运行程序后,输出的结果如图5.7所示。

[img]http://www.tu265.com/di-6c862881cfd92f0fba67a80b239a3cf5.png[/img]

29 楼


5.2.2  二维插值
二维插值主要用于图像处理和数据的可视化,其基本思想与一维插值相同,对函数 进行插值。在MATLAB中,采用函数interp2()进行二维插值,其调用格式如下。
    zi=interp2(x, y, z, xi, yi):通过初始数据x、y和z产生插值函数y = f(x, y),返回值zi是(xi, yi)在函数f(x, y)上的值。
    zi=interp2(x, y, z, xi, yi, method):其中method为可疑采用的插值方法。二维插值采用的方法有4种,分别是'nearest'、'linear'、'spline'和'cubic',其中线性插值为默认的插值方法。
    zi=interp2(x, y, z, xi, yi, method, extrapval):当数据超过原始数据范围时,用extraval进行替代的一种外推方法。
【例5-14】 二维插值函数实例分析,分别采用'nearest'、'linear'、'spline'和'cubic'进行二维插值,并绘制三维表面图。其实现的MATLAB代码如下:

>> clear all;
[x,y]=meshgrid(-4:0.8:4);                        %原始数据
z=peaks(x,y);
[xi,yi]=meshgrid(-4:0.2:4);                        %插值数据
zi_nearest=interp2(x,y,z,xi,yi,'nearest');        %临近点插值
zi_linear=interp2(x,y,z,xi,yi);                %系统默认为线性插值
zi_spline=interp2(x,y,z,xi,yi,'spline');        %三次样条插值
zi_cubic=interp2(x,y,z,xi,yi,'cubic');            %三次多项式插值
figure;                                            %数据显示
hold on;
subplot(321);
surf(x,y,z);                                    %绘制原始数据点
title('原始数据');
subplot(322);
surf(xi,yi,zi_nearest);                            %绘制临近点插值的结果
title('临近点插值');
subplot(323);
surf(xi,yi,zi_linear);                            %绘制线性插值的结果
title('线性插值');
subplot(324);
surf(xi,yi,zi_spline);                            %绘制三次样条插值的结果
title('三次样条插值');
subplot(325);
surf(xi,yi,zi_cubic);                            %绘制三次多项式插值的结果
title('三次多项式插值');

运行程序后,输出的结果如图5.8所示,分别采用临近点插值、线性插值、三次样条插值和三次多项式插值。在二维插值中已知数据(x, y)必须是栅格格式,一般采用函数meshgrid()产生,例如本程序中采用[x, y] = meshgrid(-4:0.8:4)来产生数据(x, y)。另外,函数interp2()要求数据(x, y)必须是严格单调的,即单调增加或单调减少。如果数据(x, y)在平面上分布不是等间距时,函数interp2()会通过变换将其转换为等间距;如果数据(x, y)已经是等间距的,可以在method参数的前面加星号'*',例如参数'cubic'变为'*cubic',来提高插值的速度。

[img]http://www.tu265.com/di-536473152acd20cb2698cff3985c3def.png[/img]

30 楼


5.2.3  样条插值
在MATLAB中,三次样条插值可以采用函数spline(),该函数的调用格式如下。
    yi=spline(x, y, xi):通过初始数据 产生插值函数 ,然后对数据xi进    行插值,返回值 。采用这种调用方式时,其相当于yi=interp1(x, y, xi, 'spline')。
    pp=spline(x, y):该函数通过对初始数据x和y产生插值函数,并进行返回。然后利用函数ppval()对数据xi进行插值计算,其调用方式为yi=ppval(pp, xi),其中pp为插值函数。
【例5-15】 对正弦函数 进行三次样条插值,代码如下:

clear all;
x=0:10;                                     %原始数据
y=sin(x);
xi=0:.25:10;                               %插值数据
yi=spline(x,y,xi);                          %三次样条插值
pp=spline(x,y)                              %产生插值函数
y1=ppval(pp,xi);                            %结果相同y1=yi
y2=interp1(x,y,xi,'spline');            %结果相同y2=yi
figure;                                     %画图显示
plot(x,y,'o',xi,yi);
legend('原始数据','三次样条插值');

运行程序后,得到的三次样条函数如下:

pp = 
      form: 'pp'
    breaks: [0 1 2 3 4 5 6 7 8 9 10]
     coefs: [10x4 double]
    pieces: 10
     order: 4
       dim: 1

原始数据和三次样条插值后的结果,如图5.9所示。在该程序中,分别采用3种方法进行三次样条插值,输出结果分别是yi、y1和y2,其输出结果都相等。

[img]http://www.tu265.com/di-d5c6d9c3236877273715ebd3923d52cb.png[/img]

我来回复

您尚未登录,请登录后再回复。点此登录或注册