插值法与数据拟合.docx
- 文档编号:4755182
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:15
- 大小:113.54KB
插值法与数据拟合.docx
《插值法与数据拟合.docx》由会员分享,可在线阅读,更多相关《插值法与数据拟合.docx(15页珍藏版)》请在冰豆网上搜索。
插值法与数据拟合
佛山科学技术学院
实验报告
课程名称数值分析
实验项目插值法
专业班级姓名学号
指导教师成绩日期5月12日
一、实验目的
1、学会Lagrange插值、牛顿插值和分段线性插值等基本插值方法;
2、讨论插值的Runge现象,掌握分段线性插值方法
3、学会Matlab提供的插值函数的使用方法,会用这些函数解决实际问题。
二、实验原理
1、拉格朗日插值多项式
2、牛顿插值多项式
3、分段线性插值
三、实验步骤
1、用MATLAB编写独立的拉格朗日插值多项式函数;
2、用MATLAB编写独立的牛顿插值多项式函数;
3、利用编写好的函数计算本章P66例1、P77例1的结果并比较;
4、已知函数在下列各点的值为:
0.2
0.4
0.6
0.8
1.0
0.98
0.92
0.81
0.64
0.38
试用4次牛顿插值多项式
对数据进行插值,根据{
},画出图形。
5、在区间[-1,1]上分别取
用两组等距节点对龙格函数
作多项式插值,对不同
值,分别画出插值函数及
的图形。
6、下列数据点的插值
0
1
4
9
16
25
36
49
64
0
1
2
3
4
5
6
7
8
(1)可以得到平方根函数的近似,在区间[0,64]上作图。
(2)用这9个点作8次多项式插值
。
四、实验结果
1、用MATLAB编写独立的拉格朗日插值多项式函数
Lagrange插值多项式源代码
functionyi=Lagrange(x,y,xi)
%Lagrange插值多项式,其中
%x---向量,全部的插值节点
%y---向量,插值节点处的函数值
%xi---标量,自变量x
%yi---xi处的函数估计值
n=length(x);m=length(y);
ifn~=m
error('ThelengthsofXandYmustbeequal');
return;
end
p=zeros(1,n);
%对向量p赋初值0
fork=1:
n
t=ones(1,n);
forj=1:
n
ifj~=k
ifabs(x(k)-x(j)) error('theDATAiserror! '); return; end t(j)=(xi-x(j))/(x(k)-x(j)); end end p(k)=prod(t); end yi=sum(y.*p); 2、用MATLAB编写独立的牛顿插值多项式函数 functionyi=New_Int(x,y,xi) %Newton基本插值公式,其中 %x---向量,全部的插值节点,按行输入 %y---向量,插值节点处的函数值,按行输入 %xi---标量,自变量x %yi---xi处的函数估计值 n=length(x);m=length(y); ifn~=m error('ThelengthsofXandYmustbeequal'); return; end %计算均差表Y Y=zeros(n);Y(: 1)=y'; %Y(: 1)表示矩阵中第一列的元素 fork=1: n-1 fori=1: n-k ifabs(x(i+k)-x(i)) error('theDATAiserror! '); return; end Y(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i)); end end %计算Newton插值公式N(xi) yi=0; fori=1: n z=1; fork=1: i-1 z=z*(xi-x(k)); end yi=yi+Y(1,i)*z; end 3、利用编写好的函数计算本章P66例1、P77例1的结果并比较。 P66例1 x=[144169225]; y=[121315]; yi=Lagrange(x,y,175) yi=13.230158730158733 P77例1 x=[0.40,0.55,0.65,0.80]; >>y=[0.41075,0.57815,0.69675,0.88811]; >>yi=New_int(x,y,0.596) yi=0.631914405504000 4、已知函数在下列各点的值为: 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 试用4次牛顿插值多项式 对数据进行插值,根据{ },画出图形。 解: X=[0.2: 0.2: 1.0];y=[0.98,0.92,0.81,0.64,0.38]; xx=[0.2: 0.08: 1.0]; m=length(xx);z=zeros(1,m); fori=1: m z(i)=Lagrange(x,y,xx(i)); end holdon plot(x,y,'o');plot(xx,z,'r*'); holdoff 得到如下图形: 图一练习4的图形 5、在区间[-1,1]上分别取 用两组等距节点对龙格函数 作多项式插值,对不同 值,分别画出插值函数及 的图形。 解: a=-1;b=1;n=100;h=(b-a)/n; >>x=a: h: b;y=1./(1+25.*x.^2); >>plot(x,y,'k') 其函数原图形分别如下所示: 图二龙格函数的图形 用龙格函数的Lagrange()插值函数画图源程序 当n=10时,有: functionRunge(10) %Runge现象 %n---等距离节点 a=-1;b=1;h=(b-a)/n; x=[a: h: b];y=1./(1+25.*x.^2); xx=[a: 0.01: b];yy=1./(1+25.*xx.^2); m=length(xx);z=zeros(1,m); fori=1: m z(i)=Lagrange(x,y,xx(i)); end holdon plot(x,y,'o');plot(xx,z,'r-'); holdoff 当n=20时,有: functionRunge(10) %Runge现象 %n---等距离节点 a=-1;b=1;h=(b-a)/n; x=[a: h: b];y=1./(1+25.*x.^2); xx=[a: 0.01: b];yy=1./(1+25.*xx.^2); m=length(xx);z=zeros(1,m); fori=1: m z(i)=Lagrange(x,y,xx(i)); end holdon plot(x,y,'o');plot(xx,z,'r-'); holdoff 其图形分别如下所示: 图三Runge(10) 图四Runge(20) 6、下列数据点的插值 0 1 4 9 16 25 36 49 64 0 1 2 3 4 5 6 7 8 (1)可以得到平方根函数的近似,在区间[0,64]上作图。 (2)用这9个点作8次多项式插值 。 functionL8 %平方根函数 的8次多项式插值 x=[01491625364964];y=sqrt(x); m=length(x);z=zeros(1,m); fori=1: m z(i)=Lagrange(x,y,x(i)); end holdon plot(x,y,'o');plot(x,y,'o');xlabel('x');ylabel('y'); plot(x,z,'r-'); holdoff 得到其图形如下所示: 图五 的图形 x=[01491625364964]; y=[012345678]; xx=[0: 0.5: 64];yy=sqrt(xx); m=length(xx);z=zeros(1,m); fori=1: m z(i)=Lagrange(x,y,xx(i)); end plot(x,y,'o',xx,yy,'.',xx,z,'r-'); 的8次Lagrange插值函数图形 图六 的8次Lagrange插值函数图形 五、讨论分析 从下面这段代码可以看出,利用mathlab自带的增长型变量来作图,是一种在c语言学习中没有发现的方法。 而且,代码中还体现了一种比较作图和数据共用的思维方法。 例如: x=[01491625364964]; y=[012345678]; xx=[0: 0.5: 64];yy=sqrt(xx); m=length(xx);z=zeros(1,m); fori=1: m z(i)=Lagrange(x,y,xx(i)); end plot(x,y,'o',xx,yy,'.',xx,z,'r-'); 利用以上简单的程序,matble就可以做出图形,方便观察和研究。 我们知道,利用计算机则可以方便地增加曲线上样点的个数,随着样点的个数增加,让学生观察函数的图像性质,从而抽象出函数图像的形状。 当然,作图的话我们也可以利用z+z超级画板。 下面我们完成这个过程: (1)在坐标系的属性对话框中,选择“画坐标网格”和“显示刻度”选项。 (2)在作图区空白处单击鼠标右键,在快捷菜单中单击【函数或参数方程曲线…】命令,如下图所示弹出函数作图属性对话框,在“ ”对应的编辑框中输入: √x,然后在下面的曲线属性中,设置“曲线的点数”为: 9,选择曲线以“折线段”方式显示,设置变量x的参数范围为: 0到64,选择在折线段上“画点”,设置点的大小为: 2;最后单击【确定】按钮完成,同样可以画出函数图像,通过改变曲线的点数,函数曲线越来光滑; 六、改进实验建议 三次样条插值直接用spline函数做。 边界条件加在y的首尾,第一个表示y'(x0),最后一个表示y'(xt)。 如果不加边界条件,默认是not-a-knot边界条件(注意不是自然边界条件)自然边界条件的插值要用csape函数才能得到。 如果用interp1,则只能使用spline函数的默认边界条件,即not-a-knot条件。 下面是例子: x=0: 3: 9; y=x.*cos(x); xx=linspace(0,9); plot(x,y,'o');%样本点 holdon; plot(xx,interp1(x,y,xx,'spline'),'r');%interp1只能使用默认边界条件 plot(xx,spline(x,[0y0],xx),'r: ');%spline可以使用第一类边界条件,这里y'(0)=y'(9)=0pp=csape(x,y,'second'); plot(xx,fnval(pp,xx))%第二类边界条件要用csape做,这里自然边界条件legend('样本点','默认边界条件','一阶导数为0','自然边界条件','location','south') holdoff; 另外,我们可以设: y=a0+a1*x+a2*x^2+…+a(n-1)*x^(n-1),则其n次拉格朗日函数插值程序: functionLagrangesNs()%用于求过n点的拉格朗日n-1次插值多项式 options={'Nameofdatafile'}; title='Lagranges_points'; lineNo=2; def={'Lagranges.dat'}; outval=inputdlg(options,title,lineNo,def); ifisempty(outval)==1,return,end filename=outval{1}; data=load(filename); x=data(: 1); y=data(: 2); lagrangesN(x,y); end functionlagrangesN(x,y) %画出已知n个点的位置 plot(x,y,'*'); holdon %n次拉格朗日多项式为y=a0+a1*x+a2*x^2+…+a(n-1)*x^(n-1) %其中a0a1a2…a(n-1)为待求系数 n=length(x); X=Vandermonde(x,1); A=X\y; %绘制插值函数图象 x1=linspace(0,max(x)); x2=Vandermonde(x1',n); y1=x2*A; plot(x1',y1); holdon %显示公式 func=['y=',num2str(A (1))]; fori=2: n; b=['+',num2str(A(i)),'*x^',num2str(i-1)]; func=[func,b]; end text(0.8,0.8,func); end %创建一个Vandermonde行列式 functionXX=Vandermonde(x,m) %创建x的列向量 ifm==1 n=length(x); XX=zeros(n); fori=1: n XX(: i)=x.^(i-1); end else n=length(x); XX=zeros(n,m); fori=1: m XX(: i)=x.^(i-1); end end end 观察以上程序,我们发现其相对较复杂,但最终结果是一致的,这也为我们提供了另外一种思路-插值法与数据拟合。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 插值法 数据 拟合