实验二 插值法 P50
专业班级:信计131班 姓名:段雨博 学号:2013014907 一、实验目的
1、熟悉MATLAB 编程;
2、学习插值方法及程序设计算法。 二、实验题目
试用4次牛顿插值多项式P 4(x )及三次样条函数S (x )(自然边界条件)对数据进行插值用图给出
{(x , y ), x =0.2+0.08i , i =0,1,11,10},P (x )及S (x )。
i
i
i
4
2、在区间[-1,1]上分别取n =10,20用两组等距节点对龙格函数f (x )=
1
作多项式2
1+25x
插值及三次样条插值,对每个n 值,分别画出插值函数及f (x )的图形。 3、下列数据点的插值
可以得到平方根函数的近似,在区间[0,64]上作图 (1)用这9个点作8次多项式插值L 8(x ) (2)用三次样条(第一边界条件)程序求S (x )
从得到结果看在[0,64]上,哪个插值更精确;在区间[0,1]上,两种插值哪个更精确? 三、实验原理与理论基础 1、拉格朗日差值公式
L 1(x ) =y k +
y k +1-y k
(x -x k ) 点斜式
x k +1-x k
两点式
L 1(x ) =y k
x k +1-x x -x k
+y k +1
x k +1-x k x k +1-x k
n
2、n 次插值基函数 L n (x j ) =
∑y l (x ) =y , j =0, 1, 2..., n .
k k
j
i
k =0
l k (x ) =
(x -x 0)
x k -x 0)
...
(x -x k -1)
x k -x k -1)
...
(x -x n )
x k -x n )
, k =0, 1,..., n
3、牛顿插值多项式
P n (x ) =f (x 0) +f [x 0, x 1](x +x 0) +f [x 0, x 1, x 2](x -x 0)(x -x 1) +... +f [x 0,..., x n ](x -x 0)...(x -x n -1)
R n (x ) =f (x ) -P n (x ) =f [x , x 0,..., x n ]ωn +1(x )
4、三次样条函数
若函数S (x ) ∈C 2[a , b ],且在每个小区间[x j , x j +1]上是三次多项式,其中,
a =x 0
5、三次样条函数的边界条件
(1)S ' ' (x 0) =f 0' ' =S ' ' (x n ) =f n ' ' =0 (2)S ' (x 0) =f 0' , S ' (x n ) =f n ' 四、实验内容 1、M 文件:
function [p]=Newton_Polyfit(X,Y)
format long g r=size(X); n=r(2); M=ones(n,n); M(:,1)=Y'; for i=2:n for j=i:n
M(j,i)=(M(j,i-1)-M(j-1,i-1))/(X(j)-X(j-i+1)); end end
p0=[zeros(1,n-1) M(1,1)];p=p0; for i=1:n-1
p1=M(i+1,i+1).*poly(X(1:i)); p0=[zeros(1,n-i-1) p1]; p=p+p0; end
3、M 文件:
function f=Language(~,~,~)
%%求已知数据点的拉格朗日插值多项式 %%已知数据点的x 坐标向量:x %%已知数据点的y 坐标向量:y %%插值点的x 坐标:x0 %%解得的拉格朗日插值多项式f
x=[0.0 0.4 0.8 1.2 1.6];
y=[0 0.428392 0.722101 0.910314 0.970348]; x0=[0.3 0.5]; syms t l ;
if (length(x)==length(y)) n=length(x); else
disp('x ,y 维数不一样' ); return ; end p=sym(0); for i=1:n l=sym(y(i)); for k=1:i-1
l=l*(t-x(k))/(x(i)-x(k)); end
for k=i+1:n
l=l*(t-x(k))/(x(i)-x(k)); end p=p+1; end
simplify(p); f=subs(p,'t' ,x0); f=vpa(f,6); end
五、实验结果
1、
>> X=[0.2 0.4 0.6 0.8 1.0];
>> Y=[0.98 0.92 0.81 0.64 0.38]; >> [p]=Newton_Polyfit(X,Y); >> Y2=polyval(p,X); >> X1=0:0.01;1;
>> Y3=interp1(X,Y,X1,'spline');
>> plot(X,Y,'o',X,Y2,'r',X1,Y3,'g') 图像:
2、
>> X=-1:0.01:1;
>> Y=1./(1+25*X.^2); >> X1=-1:0.2:1;
>> Y1=1./(1+25*X1.^2);
>> Y2=interp1(X1,Y1,X,'linear'); >> Y3=interp1(X1,Y1,X,'spline'); >> subplot(211)
>> plot(X,Y,X,Y2,'r-',X,Y3,'g-') 图像:
3、
>> x=[0;1;4;9;16;25;36;49;64]; >> y=0:1:8;
>> x0=0:0.1:64;
>> f=Language(x,y,x0);
>> Y=interp1(x,y,x0,'spline'); >> Y1=sqrt(x0);
>> plot(x0,Y1,x0,f,'g',x0,Y,'r') 图像:
六、实验结果分析与小结
1、通过这次实习,我学会了用matlab 设计程序并运行绘制出图形。根据已知的点的信息用牛顿插值法、三次样条插值法、拉格朗日插值法等插值方法来求得近似函数,在运行出图形时可以很直观地看出近似函数的精确度哪个更好。使用matlab 来处理数学问题确实很方便,使我对matlab 的很多功能也有了不少的了解,知道了最基本最常用的术语怎么来表达,同时让我对这几个插值方法的算法更熟悉。
2、不过,使用matlab 进行程序设计对我来说确实有点难度,不太会编写函数,特别是涉及到专门的函数,matlab 中已有的函数,不太会调用,查一下资料看到别人如何表示我也不是太懂,现在用matlab 写作业需要很长时间,而且还参考别人是如何写函数的,自己只是稍作修改来运行,出现问题也不太会修改。以后实习多练习,学会编写程序,学会调用matlab 内部函数,了解更多。
实验二 插值法 P50
专业班级:信计131班 姓名:段雨博 学号:2013014907 一、实验目的
1、熟悉MATLAB 编程;
2、学习插值方法及程序设计算法。 二、实验题目
试用4次牛顿插值多项式P 4(x )及三次样条函数S (x )(自然边界条件)对数据进行插值用图给出
{(x , y ), x =0.2+0.08i , i =0,1,11,10},P (x )及S (x )。
i
i
i
4
2、在区间[-1,1]上分别取n =10,20用两组等距节点对龙格函数f (x )=
1
作多项式2
1+25x
插值及三次样条插值,对每个n 值,分别画出插值函数及f (x )的图形。 3、下列数据点的插值
可以得到平方根函数的近似,在区间[0,64]上作图 (1)用这9个点作8次多项式插值L 8(x ) (2)用三次样条(第一边界条件)程序求S (x )
从得到结果看在[0,64]上,哪个插值更精确;在区间[0,1]上,两种插值哪个更精确? 三、实验原理与理论基础 1、拉格朗日差值公式
L 1(x ) =y k +
y k +1-y k
(x -x k ) 点斜式
x k +1-x k
两点式
L 1(x ) =y k
x k +1-x x -x k
+y k +1
x k +1-x k x k +1-x k
n
2、n 次插值基函数 L n (x j ) =
∑y l (x ) =y , j =0, 1, 2..., n .
k k
j
i
k =0
l k (x ) =
(x -x 0)
x k -x 0)
...
(x -x k -1)
x k -x k -1)
...
(x -x n )
x k -x n )
, k =0, 1,..., n
3、牛顿插值多项式
P n (x ) =f (x 0) +f [x 0, x 1](x +x 0) +f [x 0, x 1, x 2](x -x 0)(x -x 1) +... +f [x 0,..., x n ](x -x 0)...(x -x n -1)
R n (x ) =f (x ) -P n (x ) =f [x , x 0,..., x n ]ωn +1(x )
4、三次样条函数
若函数S (x ) ∈C 2[a , b ],且在每个小区间[x j , x j +1]上是三次多项式,其中,
a =x 0
5、三次样条函数的边界条件
(1)S ' ' (x 0) =f 0' ' =S ' ' (x n ) =f n ' ' =0 (2)S ' (x 0) =f 0' , S ' (x n ) =f n ' 四、实验内容 1、M 文件:
function [p]=Newton_Polyfit(X,Y)
format long g r=size(X); n=r(2); M=ones(n,n); M(:,1)=Y'; for i=2:n for j=i:n
M(j,i)=(M(j,i-1)-M(j-1,i-1))/(X(j)-X(j-i+1)); end end
p0=[zeros(1,n-1) M(1,1)];p=p0; for i=1:n-1
p1=M(i+1,i+1).*poly(X(1:i)); p0=[zeros(1,n-i-1) p1]; p=p+p0; end
3、M 文件:
function f=Language(~,~,~)
%%求已知数据点的拉格朗日插值多项式 %%已知数据点的x 坐标向量:x %%已知数据点的y 坐标向量:y %%插值点的x 坐标:x0 %%解得的拉格朗日插值多项式f
x=[0.0 0.4 0.8 1.2 1.6];
y=[0 0.428392 0.722101 0.910314 0.970348]; x0=[0.3 0.5]; syms t l ;
if (length(x)==length(y)) n=length(x); else
disp('x ,y 维数不一样' ); return ; end p=sym(0); for i=1:n l=sym(y(i)); for k=1:i-1
l=l*(t-x(k))/(x(i)-x(k)); end
for k=i+1:n
l=l*(t-x(k))/(x(i)-x(k)); end p=p+1; end
simplify(p); f=subs(p,'t' ,x0); f=vpa(f,6); end
五、实验结果
1、
>> X=[0.2 0.4 0.6 0.8 1.0];
>> Y=[0.98 0.92 0.81 0.64 0.38]; >> [p]=Newton_Polyfit(X,Y); >> Y2=polyval(p,X); >> X1=0:0.01;1;
>> Y3=interp1(X,Y,X1,'spline');
>> plot(X,Y,'o',X,Y2,'r',X1,Y3,'g') 图像:
2、
>> X=-1:0.01:1;
>> Y=1./(1+25*X.^2); >> X1=-1:0.2:1;
>> Y1=1./(1+25*X1.^2);
>> Y2=interp1(X1,Y1,X,'linear'); >> Y3=interp1(X1,Y1,X,'spline'); >> subplot(211)
>> plot(X,Y,X,Y2,'r-',X,Y3,'g-') 图像:
3、
>> x=[0;1;4;9;16;25;36;49;64]; >> y=0:1:8;
>> x0=0:0.1:64;
>> f=Language(x,y,x0);
>> Y=interp1(x,y,x0,'spline'); >> Y1=sqrt(x0);
>> plot(x0,Y1,x0,f,'g',x0,Y,'r') 图像:
六、实验结果分析与小结
1、通过这次实习,我学会了用matlab 设计程序并运行绘制出图形。根据已知的点的信息用牛顿插值法、三次样条插值法、拉格朗日插值法等插值方法来求得近似函数,在运行出图形时可以很直观地看出近似函数的精确度哪个更好。使用matlab 来处理数学问题确实很方便,使我对matlab 的很多功能也有了不少的了解,知道了最基本最常用的术语怎么来表达,同时让我对这几个插值方法的算法更熟悉。
2、不过,使用matlab 进行程序设计对我来说确实有点难度,不太会编写函数,特别是涉及到专门的函数,matlab 中已有的函数,不太会调用,查一下资料看到别人如何表示我也不是太懂,现在用matlab 写作业需要很长时间,而且还参考别人是如何写函数的,自己只是稍作修改来运行,出现问题也不太会修改。以后实习多练习,学会编写程序,学会调用matlab 内部函数,了解更多。