实验名称插值法资料.docx
- 文档编号:6848702
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:20
- 大小:107.86KB
实验名称插值法资料.docx
《实验名称插值法资料.docx》由会员分享,可在线阅读,更多相关《实验名称插值法资料.docx(20页珍藏版)》请在冰豆网上搜索。
实验名称插值法资料
探索实验5插值法
一、实验目的
了解插值问题及其适用的场合,理解并掌握常用的插值算法的构造和计算,了解差商概念、Runge现象及样条插值方法,学习用计算机求近似函数的一些科学计算方法和简单的编程技术。
二、概念与结论
1.插值问题与插值函数:
由实验或测量的方法得到所求函数y=f(x)在互异点x0,x1,...,xn处的值y0,y1,…,yn,构造一个简单函数(x)作为函数y=f(x)的近似表达式
y=f(x)(x)
使(x0)=y0,(x1)=y1,,(xn)=yn,
(1)
这类问题称为插值问题。
f(x)称为被插值函数,(x)称为插值函数,x0,x1,...,xn称为插值节点。
(1)式称为插值条件。
常用的插值函数是多项式函数。
且当n=1时是称为线性插值,n=2时称为Simpson插值或抛物线插值。
2.插值定理:
假设x0,x1,…,xn是n+1个互异节点,函数f(x)在这组节点的值f(xk)(k=0,1,…,n)是给定的,那么存在唯一的n次次多项式pn(x)满足
pn(xk)=f(xk),k=0,1,…,n
3.插值的截断误差
设n(x)是过点x0,x1,x2,…xn的n次插值多项式,f(n+1)(x)在(a,b)上存在,其中[a,b]是包含点x0,x1,x2,…,xn的任一区间,则对任意给定的x[a,b],总存在一点(a,b)(依赖于x)使
其中n+1(x)=(x–x0)(x-x1)…(x-xn),f(n+1)()是f(x)的n+1阶微商在的值。
4.差商:
给定一个函数表
x|x0x1…....xn
-----------------------------------------------------------------
y|y0,y1…….yn
其中当ij时,xixj记f[xi]=f(xi),定义f(x)关于xi,xj的一阶差商
一般的,f(x)关于xi,xi+1,…,xi+k的k阶差商定义为:
5.分段线性插值:
在区间[a,b]上给定一组节点:
a=x0 且在节点上的函数值f(xi)=yi,i=0,1,2,,n,如果函数(x)满足: 1)(x)在[a,b]上连续 2)(xi)=yi,i=0,1,2,,n 3)(x)在每个子区间[xi,xi+1](i=0,1,2,,n-1)上是次数为1的多项式 则称(x)是定义在[a,b]上的分段线性插值函数。 6.m次样条插值函数: 设f(x)是区间[a,b]上的一个连续可微函数,在区间[a,b]上给定一组节点: a=x0 且y=f(x)在点x0,x1,x2,xn的值为y0,y1,y2,yn,如果函数s(x)满足条件 (1)s(x)在每个子区间[xi,xi+1](i=0,1,2,,n-1)上是次数不超过m的多项式; (2)s(x)在区间[a,b]上有m-1阶连续导数; (3)s(xi)=f(xi)=yi,i=0,1,2,,n 则称s(x)为函数f(x)的在[a,b]上的m次样条插值函数。 x0,x1,x2,称为样条结点,其中x1,,xn-1称为内结点,x0,xn称为边界结点。 当m=3时,则称s(x)为函数f(x)的三次样条插值函数。 三、程序中Mathematica语句解释: 1.Product[f(i),{i,imin,imax,h}] 计算乘积f(imin)f(imin+h)f(imin+2h)……f(imin+nh)} imax–himin+nhimax,h>0 2.Simplify[expr]对expr进行化简 3.Append[list,elem]在表list的后面加一个元素elem 4.Prepend[list,elem]在表list的前面加一个元素elem 四、方法与程序 插值法是函数逼近的重要方法之一,它是求近似函数的一种方法,有着广泛的应用。 插值法有很多种,其中以拉格朗日(Lagrange)插值和牛顿(Newton)插值为代表的多项式插值最有特点,常用的插值还有Hermit插值,分段插值和样条插值等。 这里只给出Lagrange插值、Newton插值、分段线性插值和样条插值的构造过程及程序。 1.Lagrange插值 Lagrange插值是将待求的n次多项式插值函数Pn(x)改写成另一种表示方式,再利用插值条件确定其中的待定插值基函数,从而求出插值多项式。 Lagrange插值是多项式插值,它成功地用构造插值基函数的方法解决了求多项式插值函数出现的病态问题。 1.1Lagrange插值的构造过程: 令插值多项式为 Ln(x)=l0n(x)y0+l1n(x)y1+l2n(x)y2+…+lnn(x)yn 式中l0n(x),l1n(x),l2n(x),…,lnn(x)都是次数n的待定多项式,利用插值条件 Pn(x0)=y0,Pn(x1)=y1,......,Pn(xn)=yn 可以得到 l0n(x0)=1,l1n(x0)=0,l2n(x0)=0,…,lnn(x0)=0 l0n(x1)=0,l1n(x1)=1,l2n(x1)=0,…,lnn(x1)=0 ……... l0n(xn)=0,l1n(xn)=0,l2n(xn)=0,…,lnn(xn)=1 考虑函数l0n(x),由其在x1,x2...xn的零值,可以知道它含有 x-x1,x-x2,...,x-xn n个因子,于是可令 l0n(x)=a(x-x1)(x-x2)...(x-xn) 利用l0n(x0)=1确定其中的系数a,得 (x-x1)(x-x2)…(x-xn) l0n(x)=----------------------------- (x0-x1)(x0-x2)…(x0-xn) 类似的可以得出l1n(x),l2n(x),…,lnn(x) (x-x0)(x-x1)…(x-xi-1)(x-xi+1)…(x-xn) lin(x)=----------------------------------------------------- (xi-x0)(xi-x1)…(xi-xni-1)(xi-xi+1)…(xi-xn) l0n(x),l1n(x),…,lnn(x)称为以x0,x1,...,xn为节点的插值基函数。 于是,将这些插值基函数代入前面的多项式Ln(x)即得到如下所求的n次Lagrange插值多项式: 1.2求n次Lagrange插值多项式算法: 1.输入n+1个插值点: (xi,yi),i=0,1,…,n 2.计算插值基函数l0n(x),l1n(x),…,lnn(x) 3.给出n次Lagrange插值多项式: Ln(x)=y0l0n(x)+y1l1n(x)+…+ynlnn(x) 1.3求Lagrange插值多项式程序: Clear[lag,xi,x,yi]; xi=Input["xi="] yi=Input["yi="] n=Length[xi]-1; p=Sum[yi[[i]]*(Product[(x-xi[[j]])/(xi[[i]]-xi[[j]]),{j,1,i-1}] *Product[(x-xi[[j]])/(xi[[i]]-xi[[j]]),{j,i+1,n+1}]),{i,1,n+1}]; lag[x_]=Simplify[p] 说明: 本程序用于求n次Lagrange插值多项式。 程序执行后,按要求通过键盘输入插值基点xi: {x0,x1,...,xn}和对应函数值yi: {y0,y1,…,yn}后,程序即可给出对应的n次Lagrange插值多项式lag[x]。 程序中变量说明: xi: 存放插值基点{x0,x1,...,xn} yi: 存放对应函数值{y0,y1,…,yn} lag[x]: 存放求出的n次Lagrange插值多项式Ln(x) 注: 语句lag[x_]=Simplify[p]用简化形式给出对应的n次Lagrange插值多项式。 1.4例题与实验 例1.给定数据表 x0123 y=f(x)13512 用Lagrange插值法求三次插值多项式,并给出函数f(x)在x=1.4的近似值。 解: 执行Lagrange插值程序后,在输入的两个窗口中按提示分别输入 {0,1,2,3}、{1,3,5,12},每次输入后用鼠标点击窗口的“OK”按扭,得如下插值函数: 6+22x-15x2+5x3 ----------------------- 6 所以得到三次插值多项式L3(x)=1+11x/3-5x2/2+5x3/6 接着键入: lag[1.4] 得输出: 3.52,因此f(x)在x=1.4的近似值为3.52,即f(1.4)3.52. 2.Newton插值 Newton插值是多项式插值的另一种表示形式,它在增加插值节点时具有灵活性,只要在原有的插值多项式中增加一项就得到新的插值函数。 2.1Newton插值构造过程: 为了使插值Newton多项式具有承袭性,令插值函数具有下列形式: 式中 称为Newton插值基函数。 为求出Nn(x),利用插值条件和差商,得出如下n次Newton插值多项式: 计算Newton插值多项式Nn(x)常用如下差商表: 2.2求Newton插值多项式算法: 1.输入n+1个插值点: (xi,yi),i=0,1,…,n 2.计算差商表 3.给出n次Newton插值多项式。 2.3求Newton插值多项式程序: Clear[newt,s,x]; xi=Input["xi="] yi=Input["yi="] n=Length[xi]; (*计算差商表*) f=Table[0,{n},{n}]; Do[f[[i,1]]=yi[[i]],{i,1,n}] Do[f[[i,j+1]]=(f[[i,j]]-f[[i+1,j]])/(xi[[i]]-xi[[i+j]]),{j,1,n-1},{i,1,n-j}] Print["差商表"] Do[Print[xi[[i]],"",f[[i]]],{i,1,n}] (*求Newton插值多项式*) fa=1; s=f[[1,1]]; Do[fa=(x-xi[[k]])*fa;s=s+fa*f[[1,k+1]],{k,1,n-1}] newt[x_]=s Simplify[%] 说明: 本程序用于求n次Newton插值多项式。 程序执行后,按要求通过键盘输入插值基点xi: {x0,x1,...,xn}和对应函数值yi: {y0,y1,…,yn}后,程序依次给出输入的数据表、计算出的差商表、Newton插值多项式、Newton插值多项式的简化形式。 程序中变量说明: xi: 存放插值基点{x0,x1,...,xn} yi: 存放对应函数值{y0,y1,…,yn} f: 存放函数值{y0,y1,…,yn}及所有差商 newt[x]: 存放求出的n次newton插值多项式Nn(x) 注: 1)语句f=Table[0,{n},{n}]用于产生一个nn的矩阵变元用于存放函数值{y0,y1,…,yn}及所有差商。 2)在Mathematica中有一个求n次插值多项式的命令,命令形式为: InterpolatingPolynomial[{{x01,y0},{x1,y1},{x2,y2},…,{xn,yn}},x] 它可以求过n+1个插值点{{x01,y0},{x1,y1},{x2,y2},…,{xn,yn}}的n次插值多项式Pn(x)。 2.4例题与实验 例2.给定数据表 x4.00024.01044.02334.0294 y0.60208170.60318770.60458240.6052404 1)计算差商表 2)用Newton插值法求三次插值多项式Nn(x) 3)求f(4.011)的近似值 解: 执行Newton插值程序后,在输入的两个窗口中按提示分别输入 {4.0002,4.0104,4.0233,4.0294}、{0.6020817,0.6031877,0.6045824,0.6052404}, 每次输入后用鼠标点击窗口的“OK”按扭,得如下插值函数: {4.0002,4.0104,4.0233,4.0294} {0.6020817,0.6031877,0.6045824,0.6052404} 差商表 4.0002{0.6020817,0.108431,-0.0136404,0.0211629} 4.0104{0.6031877,0.108116,-0.0130225,0} 4.0233{0.6045824,0.107869,0,0} 4.0294{0.6052404,0,0,0} 0.6020817+0.108431(-4.0002+x)-0.0136404(-4.0104+x)(-4.0002+x)+ 0.0211629(-4.0233+x)(-4.0104+x)(-4.0002+x) -1.41642+1.23926x-0.268313x2+0.0211629x3 于是我们得到本题的差商表: xiyif[,]f[,,]f[,,,] 4.00020.6020817,0.108431,-0.0136404,0.0211629 4.01040.6031877,0.108116,-0.0130225 4.02330.6045824,0.107869 4.02940.6052404 和三次插值多项式N3(x)=-1.41642+1.23926x-0.268313x2+0.0211629x3 接着键入: newt[4.011] 得输出0.603253,因此f(4.011)0.603253 例3.多项式插值的误差估计式中可以看到,当插值节点越多时误差会越小,这个结论正确吗? 通过实验说明该结论的正确性。 解: 考虑函数f(x)=(1+x2)-1在区间[-4,4]内选取不同个数的等距插值节点做观察,这里分别选[-4,4]内的9个和11个的等距节点来做实验,将对应的插值函数图与被插函数f(x)=(1+x2)-1画在一起做观察,为简单起见,这里用Mathematica命令做实验,对应命令为: In[1]: =u=Table[{x,(1+x^2)^-1},{x,-4,4}];(*采取f(x)在[-4,4]内的9个插值点 In[2]: =g=ListPlot[u,PlotStyle->PointSize[0.04]](*将散点图图形文件存放在变量g中 In[3]: =s=InterpolatingPolynomial[u,x];(*将插值函数存放在变量s中 In[4]: =t=Plot[{s,(1+x^2)^-1},{x,-4,4},PlotStyle->{{Thickness[0.005]},{Thickness[0.006]}}] (*将插值函数s与f(x)画在一起的图形文件存放在变量t中 In[5]: =Show[t,g](*将散点图,插值函数s,f(x)画在一个坐标系中 图1在[-4,4]中选9个等距节点的插值函数与被插函数图,粗线为被插函数图 In[6]: =u=Table[{x,(1+x^2)^-1},{x,-4,4,0.8}];(*采取f(x)在[-4,4]内的11插值点 In[7]: =g=ListPlot[u,PlotStyle->PointSize[0.04]] In[8]: =s=InterpolatingPolynomial[u,x]; In[9]: =t=Plot[{s,(1+x^2)^-1},{x,-4,4},PlotStyle->{{Thickness[0.005]},{Thickness[0.006]}}] In[10]: =Show[t,g] 图2在[-4,4]中选11个等距节点的插值函数与被插函数图 图中细的曲线是插值函数,粗的曲线是原来函数(被插函数)。 从图形上观察,说明增加插值节点不能保证使插值误差变小,本题图象可以看到,节点的增多得到的插值函数产生的误差在靠近端点的函数值不但没有减少反而增大了。 因此当插值节点越多时误差会越小,这个结论不正确。 这个实验也说明高次插值函数效果不好。 插值点个数增加,出现误差增大的现象称为Runge现象。 Runge现象的发现使人们知道了高次插值函数误差较大,这也是为什么实用中一般不使用高次多项式插值的原因。 3.分段线性插值 分段线性插值是最简单的分段插值,它在每个子区间[xi,xi+1](i=0,1,2,,n-1)上用直线段连接数据点构成的折线函数作为插值函数的。 分段线性插值函数具有计算简单,且有每个插值子区间趋于零时,分段线性插值函数可以克服Runge现象,且具有随着插值节点的增多,它可以是插值误差不断减小、一致逼近被插函数的特点。 3.1分段线性插值函数的构造过程: 在每个子区间[xi,xi+1](i=0,1,2,,n-1)上,用对应的两点: xxixi+1 yyiyi+1 做过此两点的直线: L(x)=k(x-xi)+yi 这里k=(yi+1-yi)/(xi+1-xi),然后将所有直线连起来即可。 显然这样得到的折线满足插值条件。 分段线性插值函数是一个分段函数。 3.2用分段线性插值函数做近似计算的算法: 1.输入n个插值点: (xi,yi),i=1,…,n 2.输入要近似计算的自变量点xa 3.寻找包含xa的小区间[xi,xi+1] 4.用[xi,xi+1]上的线性插值函数在xa处的值作为f(xa)的函数值 3.3用分段线性插值函数做近似计算的程序: Clear[x,a,b]; li[a_,b_,x_]: =(b[[2]]-a[[2]])/(b[[1]]-a[[1]])*(x-a[[1]])+a[[2]] xi=Input["xi="] yi=Input["yi="] xa=Input["xa="] n=Length[xi]; If[xa Do[If[xa>=xi[[k]],m=k],{k,1,n-1}]; Print["m=",m,"x=",xi[[m]]]; li[{xi[[m]],yi[[m]]},{xi[[m+1]],yi[[m+1]]},xa]] 说明: 本程序用分段线性插值做近似计算。 程序执行后,按要求通过键盘输入插值基点xi: {x1,...,xn}和对应函数值yi: {y1,…,yn}和要做近似计算的点xa后,程序将给出包含xa小区间[xi,xi+1]的下标i和xi,和函数f(xa)的近似值。 如果xa不在[x1,xn]内程序给出超限提示。 程序中变量说明: xi: 存放插值基点{x1,...,xn} yi: 存放对应函数值{y1,…,yn} xa: 存放要做近似计算的自变量值 m: 存放包含xa小区间[xi,xi+1]的下标i 注: 在Mathematica中有一个求分段线性插值函数的命令,命令形式为: Interpolation[{{x1,y1},{x2,y2},...,{xn,yn}},InterpolationOrder->1] 用如上Mathematica命令求出的分段线性插值函数没有给出具体的分段函数表达式,而是用 “InterpolatingFunction[{x1,xn},<>]”作为所求的分段插值函数,通常可以用 变量=Interpolation[{数据点集合}] 把所得的分段插值函数存放在变量中,如果要计算插值函数在某一点的如p点的值,只要输入“变量[p]”即可,如果要表示这个插值函数应该用“变量[x]”。 此外,命令 Interpolation[{{x1,y1},{x2,y2},...,{xn,yn}},InterpolationOrder->3] 可以给出更好的分段插值函数。 3.4例题与实验 例4.给定数据表 xi1234 yi0-5-63 1)用分段线性插值函数求函数f(x)在x=1.4的近似值 2)用Mathematica命令画出分段线性插值图形 解: 执行求分段线性插值函数程序后,在输入的两个窗口中按提示分别输入 {1,2,3,4}、{0,-5,-6,3}、1.4 每次输入后用鼠标点击窗口的“OK”按扭,得如下插值函数: m=1x=1 -2 此结果说明f(x)在x=1.4的近似值为2,它对应的小区间为[x1,x2]。 为完成第二个问题,键入命令: d=Interpolation[{{1,0},{2,-5},{3,-6},{4,3}},InterpolationOrder->1] Plot[d[x],{x,1,4}] 得输出如下: InterpolatingFunction[{1,4},<>] 图3例4的分段线性插值函数图形。 例5.在例3中,用分段插值函数代替n次多项式插值函数,观察插值节点增多时误差的变化情况。 解: 对函数f(x)=(1+x2)-1在区间[-4,4]内选取不同个数的等距插值节点做观察,这里分别选[-4,4]内的9个和21个的等距节点来做实验,将对应的插值函数图与被插函数f(x)=(1+x2)-1画在一起做观察,为简单起见,这里用Mathematica命令做实验,对应命令为: In[1]: =u=Table[{x,(1+x^2)^-1},{x,-4,4}];(*采取f(x)在[-4,4]内的9个插值点 In[2]: =g=ListPlot[u,PlotStyle->PointSize[0.04]](*将散点图图形文件存放在变量g中 In[3]: =s=Interpolation[u,InterpolationOrder->1];(*将线性插值函数存放在变量s中 In[4]: =t=Plot[{s[x],(1+x^2)^-1}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验名称 插值法资料 实验 名称 插值法 资料