matlab中如何求插值点,MATLAB插值

4.5  插值

插值就是在已知数据之间计算估计值的过程,是一种实用的数值方法,是函数逼近的重要方法。在信号处理和图形分析中,插值运算的应用较为广泛,MATLAB提供了多种插值函数,可以满足不同的需求。

4.5.1  一维数据插值

一维数据插值常使用函数interp1,其一般的语法格式为:yi=interp1(x,y,xi,method)。其中y为函数值矢量,x为自变量的取值范围,x与y的长度必须相同;xi为插值点的向量或者数组,method为插值方法选项。对于插值,MATLAB提供了如下几种方法。

(1)邻近点插值(method=’nearest’)。

(2)线性插值(method=’linear’):在两个数据点之间连接直线,计算给定的插值点在直线上的值作为插值结果,该方法是interp1函数的默认方法。

(3)三次样条插值(method=’spline’):通过数据点拟合出三次样条曲线,计算给定的插值点在曲线上的值作为插值结果。

(4)立方插值(method=’pchip’or’cubic’):通过分段立方Hermite插值方法计算插值结果。

选择一种插值方法时,考虑的因素包括运算时间、占用计算机内存和插值的光滑程度。一般来说:

(5)邻近点插值方法的速度最快,但平滑性最差;

(6)线性插值方法占用的内存较邻近点插值方法多,运算时间也稍长,与邻近点插值不同,其结果是连续的,但顶点处的斜率会改变;

(7)三次样条插值方法的运算时间最长,但内存的占用较立方插值法要少,但其插值数据和导数都是连续的。在这4种方法中,三次样条插值结果的平滑性最好,但如果输入数据不一致或数据点过近,就可能出现很差的插值效果。

【例4-39】  一维插值函数interp1应用与比较示例。

>> x=0:10;

>> y=cos(x);

>> xi=0:0.25:10;

>> strmod={'nearest','linear','spline',' pchip'}%  将插值方法存储到元胞数组

'nearest'    'linear'    'spline'   'pchip'

>> strlb={'(a)method=nearest','(b)method=linear',...

'(c)method=spline','(d)method=pchip'}              %  绘图标签

Columns 1through 2

'(a)method=nearest'   '(b)method=linear'

Columns 3through 4

'(c)method=spline'    '(d)method=pchip'

>> for i=1:4

yi=interp1(x,y,xi,strmod{i});                     %  插值

subplot(2,2,i)                                        %  子图

plot(x,y,'ro',xi,yi,'b'),xlabel(strlb(i))         %  绘图

本例创建了元胞数组strmod来存储4种用到的插值方法{'nearest','linear','spline','pchip'},然后通过循环来调用插值函数interp1,最终插值的结果用图形来对比。一维插值结果比较如图4-4所示。可以看出,三次样条插值结果的平滑性最好,而邻近点插值效果最差。

d45965b9954c51c4d6621241ac77c06f.png

图4-4  一维插值方法结果比较

4.5.2  二维数据插值

二维插值也是常用的插值运算方法,主要应用于图形图像处理和三维曲线拟合等领域。二维插值由函数interp2实现,其一般语法为:zi=interp2(x,y,z,xi,yi,method)。

其中x和y为由自变量组成的数组,x与y的尺寸相同,z为二者相对应的函数值;xi和yi为插值点数组,method为插值方法选项。interp1函数中的4种插值方法也可以在interp2函数中使用。

【例4-40】  二维插值函数interp2应用与比较示例。

[x,y,z]=peaks(6);                                  %  MATLAB自带的测试函数

mesh(x,y,z)                                        %  绘制原始数据图

title('原始数据')

[xi,yi]=meshgrid(-3:0.2:3,-3:0.2:3);               %  生成供插值的数据网格

strmod={'nearest','linear','spline','cubic'};     %  将插值方法存储到元胞数组

strlb={'(a)method=nearest','(b)method=linear',...

'(c)method=spline','(d)method=cubic'};       %  绘图标签

figure                                           % 建立新绘图窗口

zi=interp2(x,y,z,xi,yi,strmod{i});       % 插值

subplot(2,2,i)

mesh(xi,yi,zi);                             %  绘图

title(strlb{i})                              %  图标题

本例计算了调用'nearest'、'linear'、'spline'和'cubic'等4种方法进行插值,其中原始数据如图4-5所示,插值之后的结果如图4-6所示。由结果图可以看出,各种插值方法的精度是不同的。

11b68dc9b1d17948f82f98de22e49f57.png

图4-5 二维插值原始数据

32dddeba9e3e8a3419a5c6ecce7c4b30.png

图4-6  二维插值结果

4.5.3  多维插值

多维插值包括三维插值函数interp3和n维插值函数interpn,其函数的调用方式及插值方法与一维、二维插值基本相同。这里以三维为例,其一般格式为:

zi=interp3(x,y,z,v,xi,yi,zi,method)

其中x、y、z为由自变量组成的数组,x、y、z的尺寸相同,v为相应的函数值;xi、yi、zi为插值点数组,method为插值方法选项。和一维插值的4种方法一致。

【例4-41】  三维插值函数interp3示例。

>> [x,y,z,v]=flow(8);                             %  flow是MATLAB自带的测试函数

>> slice(x,y,z,v,[3,5],2,[-2,3])                  % 画切片图

>> title('插值前')

>>[xi,yi,zi]=meshgrid(0.1:0.25:10,-3:0.25:3,-3:0.25:3);  %  创建插值点数据网格

>> vi=interp3(x,y,z,v,xi,yi,zi);                            %  插值

>> figure

>> slice(xi,yi,zi,vi,[3,5],2,[-2,3])                        %  画插值后切片图

>> title('插值后')

插值前的flow函数如图4-7所示,进行三维插值之后的结果如图4-8所示。

7b6f147074abac5b93b79f59994522bc.png

图4-7 插值前函数图

a74f57ea12a96dc8f90e4f1dc6d1b8c3.png

图4-8  插值后函数图

4.5.4  样条插值

样条函数产生的基本思想是:设有一组已知的数据点,目标是找一组拟合多项式。在拟合过程中,对于此数据组的每个相邻样点对(Breakpoints),用三次多项式去拟合样点之间的曲线。为保证拟合的唯一性,对该三次多项式在样点处的一阶、二阶导数加以约束。这样除被研究区间端点外,所有内样点处可保证样条有连续的一阶、二阶导数。

MATLAB中提供了spline函数来进行样条插值。spline函数的调用语法如下。

(1)yy = spline(x,y,xx):根据样点数据(x,y),求xx所对应的三次样条插值。

(2)pp = spline(x,y):从样点数据(x,y)获得逐段多项式样条函数数据pp。

【例4-42】  样条插值spline函数应用示例。

>> x = -4:4;

>> y = [0 .15 1.12 2.36 2.36 1.46 .49 .060];         %  插值前数据

>> cs = spline(x,[0 y 0]);                              %  插值

>> xx = linspace(-4,4,101);                              % 创建绘图自变量数组

>> plot(x,y,'o',xx,ppval(cs,xx),'-');                  %  绘制结果图

得到的结果如图4-9所示。

67af5a6f1e62b72b23910bbd46e771b7.png

图4-9  样条插值

编辑:青樱、蓬荜生辉、倾国倾城

复核:数韵校园工作室

4518d7b27e4952cfe9a3c627f9ae7920.png

如你对话题感兴趣,

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,牛顿插值法用于在已知一些数据的情况下,构造出一个多项式,使得该多项式在给定的数据上与所函数相等。下面是 C++ 实现牛顿插值法并输出差商表的代码: ```cpp #include <iostream> #include <vector> using namespace std; double newton_interpolation(double x, const vector<double>& X, const vector<double>& Y) { int n = X.size(); vector<vector<double>> C(n, vector<double>(n)); for (int i = 0; i < n; i++) { C[i][0] = Y[i]; } for (int j = 1; j < n; j++) { for (int i = j; i < n; i++) { C[i][j] = (C[i][j - 1] - C[i - 1][j - 1]) / (X[i] - X[i - j]); } } double res = C[0][0]; double tmp = 1.0; for (int i = 1; i < n; i++) { tmp *= (x - X[i - 1]); res += C[i][i] * tmp; } return res; } int main() { vector<double> X = {1.0, 2.0, 3.0, 4.0, 5.0}; vector<double> Y = {0.0, 0.69315, 1.09861, 1.38629, 1.60944}; cout << "差商表:" << endl; int n = X.size(); vector<vector<double>> C(n, vector<double>(n)); for (int i = 0; i < n; i++) { C[i][0] = Y[i]; cout << C[i][0] << "\t"; } cout << endl; for (int j = 1; j < n; j++) { for (int i = j; i < n; i++) { C[i][j] = (C[i][j - 1] - C[i - 1][j - 1]) / (X[i] - X[i - j]); cout << C[i][j] << "\t"; } cout << endl; } double x = 2.5; double res = newton_interpolation(x, X, Y); cout << "f(" << x << ") = " << res << endl; return 0; } ``` 其,`newton_interpolation` 函数用于函数,`X` 和 `Y` 分别为已知数据的横纵坐标,`C` 为差商表,`x` 为所函数的横坐标。运行结果如下: ``` 差商表: 0 0.69315 1.09861 1.38629 1.60944 0.69315 0.20507 0.05807 0.02469 1.09861 0.12029 0.02537 1.38629 0.06323 1.60944 f(2.5) = 0.96598 ``` 可以看到,牛顿插值法成功解出了函数在横坐标为 2.5 的函数,并输出了差商表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值