分段插值程序
分段插值计算在Matlab 中有现成的程序
解:在matlab 中编写M-文件如下:
x=[1:12];
fx=[12 234 34 -1 34 2 5 23 34 9 45 23]; xi=[1:0.2:12];
y=interp1(x,fx,xi); plot(x,fx,xi,y)
得到如下结果:
12.0000 56.4000 100.8000 145.2000 189.6000 234.0000 194.0000 154.0000 114.0000 74.0000 34.0000 27.0000 20.0000 13.0000 6.0000 -1.0000 6.0000 13.0000 20.0000 27.0000 34.0000 27.6000 21.2000 14.8000 8.4000 2.0000 2.6000 3.2000 3.8000 4.4000 5.0000 8.6000 12.2000 15.8000 19.4000 23.0000 25.2000 27.4000 29.6000 31.8000 34.0000 29.0000 24.0000 19.0000 14.0000 9.0000 16.2000 23.4000 30.6000 37.8000 45.0000 40.6000 36.2000 31.8000 27.4000 23.0000
250y
200
150
100
50
O -500 2 4 6 8 10 12
x
以下为详细讲解:
目录
一.问题的重述……………………………………………… 1 二.问题的分析……………………………………………… 1 三.问题的假设……………………………………………… 1 四.分段线性插值原理……………………………………… 2 五.问题的求解……………………………………………… 2 六.插值方法的优劣性分析………………………………… 5 附录…………………………………………………………… 6
一.问题的重述
已知g (x ) =
1
, -6≤x ≤6用分段线性插值法求插值,绘出插值结果图1+x 2
形,并观察插值误差。
1. 在[-6,6]中平均选取5个点作插值 2. 在[-6,6]中平均选取11个点作插值 3. 在[-6,6]中平均选取21个点作插值 4. 在[-6,6]中平均选取41个点作插值
二.问题的分析
在数值计算中,已知数据通常是离散的,如果要得到这些离散点以外的其他点的函数值,就需要根据这些已知数据进行插值。而本题只提供了取样点和原函数g(x).分析问题求解方法如下: (1)利用已知函数式g (x ) =
1
计算取样点X 对应的函数值Y ;将X,Y 作为1+x 2
两个等长的已知向量,分别描述采样点和样本值. 因此被插值函数是一个单变量函数,可利用一维插值处理该数据插值问题。一维插值采用的方法通常有拉格朗日多项式插值(本题采用3次多项式插值),3次样条插值法和分段线性插值。
(2)分别利用以上插值方法求插值。以0.5个单位为步长划分区间[-6,6],并将每一点作为插值函数的取样点。再根据插值函数计算所选取样点的函数值。最后再利用所得函数值画出相应的函数图象,并与原函数g(x)的图象进行对比。
三.问题的假设
为了解决上述分析所提到的问题,本题可以作出如下假设:
(1)假设原函数g(x)仅作为求解取样点对应的样点值的函数关系式。而其他各点的函数值都是未知量,叙用插值函数计算。
(2)为了得到理想的对比函数图象,假设g(x)为已知的标准函数。可以选取0.5个单位为步长划分区间[-6,6],分别计算插值函数和标准函数g(x)在该区间的取样点的函数值。画出函数图象进行对比。
四.分段线性插值原理
给定区间[a,b], 将其分割成a=x 0
y k =f(x k )(k=0,1,…,n) 求一个分段函数I k (x),使其满足: (1) I h (x k )=y k ,(k=0,1,…,n) ;
(2) 在每个区间[x k , x k +1] 上, I h (x)是个一次函数。
易知, I h (x)是个折线函数, 在每个区间[x k , x k +1]上,(k=0,1,…,n)
I h (x k ) =
x -x k +1x -x k
y k +y k +1
x k -x k +1x k +1-x k
于是, I h (x)在[a,b]上是连续的,但其一阶导数是不连续的。 于是即可得到如下分段线性插值函数: I n (x ) =∑y i l i (x )
i =0n
其中
⎧x -x i -1⎪x -x
i -1
⎪i
⎪x -x i +1
l i =⎨
⎪x i -x i +1⎪⎪0⎩
当x i -1≤x ≤x i 时,且i =0时舍去当x i ≤x ≤x i +1时,且i =n 时舍去 其他
五.问题的求解
在MATLAB 中实现分段线性插值,最近点插值,3次多项式插值,3次样条插值的命令为interp1, 其调用格式为: Y1=interp1(X,Y,X1,’method ’) 函数根据X,Y 的值,计算函数在X1处的值。X,Y 是两个等长的已知向量,分别描述采样点和样本值,X1是一个向量或标量,描述欲插值点,Y1是一个与X1等长的插值结果。method 是插值方法,包括:
linear :分段线性插值。它是把与插值点靠近的两个数据点用直线连接,然后
在直线让选取对应插值点的数
nearest :近点插值法。根据已知两点间的插值点与这两点间的位置远近插值.
当插值点距离前点远时, 取前点的值, 否则取后点的值。
cubic :3次多项式插值。根据已知数据求出一个3次多项式,然后根据多项式
进行插值。
spline :3次样条插值。在每个分段(子区间)内构造一个3次多项式,使其
插值函数除满足插值条件外,还要求个节点处具有光滑条件。再根据已知数据求出样条函数后, 按照样条函数插值。
运用Matlab 工具软件编写代码(见附录),并分别画出图形如下: (一) 在[-6,6]中平均选取5个点作插值:
分段线性插值
10.80.60.40.20-1010.80.60.40.20-10
-5
5
10
-5
0最近点插值
10.80.60.40.20-10
-5
5
10
-0.5-10
-5
10.50
3次样条插值
05103次多项式插值
0510
(二)在[-6,6]中平均选取11个点作插值:
分段线性插值
1
-1010-10
-5
5
10
-5
0最近点插值
10-10
-5
5
10
10-10
-5
3次样条插值
05100510
(三)在[-6,6]中平均选取21个点作插值:
分段线性插值
10.80.60.40.20
-1010.80.60.40.20-10
-5
5
10
-5
0最近点插值
10.80.60.40.20-10
-5
5
1010.8
0.60.40.20-10
-5
3次样条插值
05
103次多项式插值
0510
(四)在[-6,6]中平均选取41个点作插值
分段线性插值
10.80.60.40.20-1010.80.60.40.20
-10
-5
5
10
-5
0最近点插值
10
-10
-5
5
1010
-10
-5
3次样条插值
05103次多项式插值
0510
六. 插值方法的优劣性分析
从以上对比函数图象可以看出,分段线性插值其总体光滑程度不够。在数学上,光滑程度的定量描述是函数(曲线) 的k 阶导数存在且连续,则称该曲线具有k 阶光滑性。一般情况下,阶数越高光滑程度越好。分段线性插值具有零阶光滑性,也就是不光滑。3次样条插值就是较低次数的多项式而达到较高阶光滑性的方法。总体上分段线性插值具有以下特点: 优点: 1.分段线性插值在计算上具有简洁方便的特点。
2. 分段线性插值与3次多项式插值函数在每个小区间上相对于原函数都有很强的收敛性,(舍入误差影响不大),数值稳定性好且容易在计算机上编程实现等优点
缺点: 分段线性插值在节点处具有不光滑性的缺点(不能保证节点处插值
函数的导数连续) ,从而不能满足某些工程技术上的要求。而3次样条插值却具有在节点处光滑的特点。
附录:
x1=-6:12/n:6; %在四个问题的解答中,n 的取值分别为:4,10,20,40; y=1./(1+x1.^2) X=-6:1:6 Y=1./(1+X.^2)
y1=interp1(x1,y,X,'linear' ) y2=interp1(x1,y,X,'spline' ) y3=interp1(x1,y,X,'nearest' ) y4=interp1(x1,y,X,'cublic' )
subplot(2,2,1);plot(X,Y,'k' ,X,y1, ':.') title(' 分段线性插值' );grid on ; legend('g(x)', 'y1' )
subplot(2,2,2);plot(X,Y,'k' ,X,y2, ':.') title('3次样条插值' );grid on ; legend('g(x)', 'y2' )
subplot(2,2,3);plot(X,Y,'k' ,X,y3, ':.') title(' 最近点插值' );grid on ; legend('g(x)', 'y3' )
subplot(2,2,4);plot(X,Y,'k' ,X,y4, ':.') title('3次多项式插值' );grid on ; legend('g(x)', 'y4' )
备注:运行代码时请输入n 的值。