Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
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所示。 ![]() |
![]() |
![]() |
![]() |
#2 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
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',来提高插值的速度。 ![]() |
![]() |
![]() |
![]() |
#3 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
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,其输出结果都相等。 ![]() |
![]() |
![]() |
![]() |
#4 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
5.2.4 高维插值
在MATLAB中,采用函数interp3()进行三维插值,该函数的调用格式如下。 vi=interp3(x, y, z, v, xi, yi, zi):该函数通过初始数据 产生插值函数 ,然后对数据 进行插值,返回值为vi。 vi=interp3(x, y, z, v, xi, yi, zi, method):该函数中method为可以采用的插值方法,共有4种,分别是'nearest'、'linear'、'spline'和'cubic',其中线性插值为默认的插值方法。 【例5-16】 利用函数interp3()进行三维插值,代码如下: clear all; [x,y,z,v]=flow(10); [xi,yi,zi]=meshgrid(.1:.25:10,-3:.25:3,-3:.25:3); %创建网格数据 vi = interp3(x,y,z,v,xi,yi,zi); % vi为25*40*25 slice(xi,yi,zi,vi,[6 9.5],2,[-2 .2]); shading flat 程序运行后,输出结果如图5.10所示。在程序中,利用函数flow()产生数据 、 和 ,均为 的三维矩阵。利用函数meshgrid()产生网格数据, 、 和 均为 的三维矩阵。利用函数interp3()进行三维数据插值,采用系统默认的线性插值方法。 ![]() 在MATLAB中,进行高维插值的函数还有interpn(),可以进行 维插值,可以采用的插值方法,共有4种,分别是'nearest'、'linear'、'spline'和'cubic',其中线性插值为默认的插值方法。此外,在进行 维插值时,需要利用函数ndgrid()产生 维空间上的网格。 |
![]() |
![]() |
![]() |
#5 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
5.3 函数的极限
极限理论是微积分学的理论基础。在MATLAB中,采用函数limit()计算数列或函数的极限,可以非常方便地进行极限运算。下面首先介绍极限的基本概念,然后介绍利用函数limit()求函数的极限。 5.3.1 极限的概念 数列的极限定义为:设 是数列, 是常数,若对于任意给定的正数 (无论它多么小),总存在正整数 ,使得当 时,都有 则称数列 以 为极限,记作 。有极限的数列称为收敛数列。 【例5-17】 对于数列 ,当 时的变化趋势,代码如下: clear all; n=1:300; x=n./(n+2); %数列 figure; plot(n,x); %显示数列 运行程序后,输出结果如图5.11所示。由图5.11可知,随着 的增大,数列 与1非常接近。因此,可以得到结论: 【例5-18】 求当 时,函数 的变化趋势和极限,代码如下: clear all; x=linspace(-pi,pi,40); y=sin(x)./x; %数列 figure; plot(x,y,'r--') %显示数列 运行程序后,输出的结果如图5.12所示。由图5.12可知,当 时,函数 与1无限接近。由此可知: ![]() |
![]() |
![]() |
![]() |
#6 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
【例5-19】 求当 时,函数 的变化趋势和极限,代码如下:
clear all; x=1:200; y=(1+1./x).^x; %创建数列 figure; plot(x,y) %显示数列 运行程序后,输出的结果如图5.13所示。由图5.13可知,当 时,函数 无限接近于常数 e( e=2.71828)。 ![]() |
![]() |
![]() |
![]() |
#7 |
普通会员
注册日期: 2012-05-21
帖子: 37
声望力: 14 ![]() |
![]()
5.3.2 求极限的函数
当 时,函数 以 为极限,称为函数 当 时以 为左极限,记作 。当 时,函数 以 为极限,称为函数 当 时以 为右极限,记作 。左极限和右极限统称为单侧极限。极限 存在且等于 的充分必要条件是左极限 与右极限 都存在且相等。 在MATLAB中,采用函数limit()求某个函数的极限,该函数的调用格式为: y=limit(f):当 时,该函数对函数 求极限,返回值为求得的极限。系统默认设置为 。 y=limit(f, x, a)或y=limit(f, a):当 趋近于常数 时,即 ,该函数对函数 求极限,返回值为求得的极限。 y=limit(f, x, a, 'left'):当 从左侧趋近于常数 时,即 ,该函数对函数 求极限,返回值为求得的左极限。 y=limit(f, x, a, 'right'):当 右侧趋近于常数 时,即 ,该函数对函数 求极限,返回值为求得的右极限。 利用函数limit()求极限时,不同的调用方式对应的数学运算如表5.2所示。 ![]() 【例5-20】 求极限 ![]() clear all; syms x; f=(3*x^2-1)/(3*x^2-2*x+3); %函数 y=limit(f,x,1) %x趋近于1时的极限 运行程序后,输出结果如下: y = 1/2 程序运行后,该函数在 时,极限为1/2。 【例5-21】 求极限 ![]() clear all; syms x; f=x/(x-1)-2/(x^2-1); %函数 y=limit(f,x,1) %x趋近于1时的极限 运行程序后,输出结果如下: y = 3/2 程序运行后,该函数在 时,其极限为3/2。 【例5-22】 求极限 ![]() clear all; syms x; f=sin(sin(x))/x; %函数 y=limit(f,x,0) %x趋近于0时的极限 运行程序后,输出结果如下: y = 1 程序运行后,该函数在 时,其极限为1。 |
![]() |
![]() |