[数值分析]插值法😥

插值法

预备知识

我们希望通过插值去用易于计算的函数p(x)来近似一个复杂的函数f(x),使得

f(x)p(x)

这里的“近似”是指,f(x)p(x)x的某些点上的值相等,如x0,x1,,xn,这些点称为插值点。我们希望p(x)在这些点上的值与f(x)的值相等,即

f(xi)=p(xi),i=0,1,,n

其中,xi称为插值节点,p(xi)=f(xi)称为插值条件。

什么是差商

f(x)xi处的零阶差商为

f[xi]=f(xi)

f(x)xi处的一阶差商为

f[xi,xi+1]=f(xi+1)f(xi)xi+1xi

f(x)xi处的二阶差商为

f[xi,xi+1,xi+2]=f[xi,xi+1]f[xi+1,xi+2]xi+2xi

xi f[xi] f[xi,xi+1] f[xi,xi+1,xi+2] f[xi,xi+1,xi+2,xi+3]
x0 f(x0)
x1 f(x1) f[x0,x1]
x2 f(x2) f[x1,x2] f[x0,x1,x2]
x3 f(x3) f[x2,x3] f[x1,x2,x3] f[x0,x1,x2,x3]

注:差商有个特性是和排列次序无关,例如f[xi,xi+1]=f[xi+1,xi],下面展开一下;

f[xi,xi+1]=f(xi+1)f(xi)xi+1xi=f(xi)xixi+1+f(xi+1)xi+1xi

我们同样有f[xi,xi+1,xi+2]=f[xi+2,xi+1,xi],下面展开一下;

f[xi,xi+1,xi+2]=f[xi,xi+1]f[xi+1,xi+2]xixi+2=f(xi+1)f(xi)xi+1xif(xi+2)f(xi+1)xi+2xi+1xixi+2=f(xi)(xixi+1)(xixi+2)+f(xi+1)(xi+1xi)(xi+1xi+2)+f(xi+2)(xi+2xi)(xi+2xi+1)

从这个形式就可以看出来没有差商的排列次序是没有意义的。

不等距节点下的牛顿基本差商公式

由一阶差商的定义,我们可以得到

f[x0,x]=f(x)f(x0)xx0f[x1,x0,x]=f[x1,x0]f[x0,x]x1xf[x2,x1,x0,x]=f[x2,x1,x0]f[x1,x0,x]x2xf[x3,x2,x1,x0,x]=f[x3,x2,x1,x0]f[x2,x1,x0,x]x3xf[xn,xn1,,x0,x]=f[xn,xn1,,x0]f[xn1,,x0,x]xnx

这个式子可以写成(将上面依次展开,记住我们的目的我们希望表达出f(x))

f(x)=f(x0)+f[x0,x](xx0)(f[x0,x]=f[x1,x0]+f[x1,x0,x](xx1))=f(x0)+f[x1,x0](xx0)+f[x1,x0,x](xx1)(xx0)(f[x1,x0,x]=f[x2,x1,x0]+f[x2,x1,x0,x](xx2))=f(x0)+f[x1,x0](xx0)+f[x2,x1,x0](xx1)(xx0)+f[x2,x1,x0,x](xx2)(xx1)(xx0)(f[x2,x1,x0,x]=f[x3,x2,x1,x0]+f[x3,x2,x1,x0,x](xx3))=f(x0)+f[x1,x0](xx0)+f[x2,x1,x0](xx1)(xx0)++f[xn,xn1,,x0,x](xxn)(xxn1)(xx0)=i=0nf[xi,xi1,,x0]j=0i1(xxj)+f[xn,xn1,,x0,x]j=0n(xxj)

在上式中,我们令Pn(x)=f[xn,xn1,,x0]j=0i1(xxj),令Rn(x)=f[xn,xn1,,x0,x]j=0n(xxj),那么我们有

f(x)=Pn(x)+Rn(x)

其中Pn(x)称为牛顿基本差商公式,Rn(x)称为牛顿基本差商公式的余式。

由上面公式我们容易看出,当xx0,x1,,xn时,Rn(x)即为0,Pn(x)即为f(x)

简单例子

已知x=1,4,9的平方根值,试求7的值。

解:由上面的公式我们有差商表如下(差商可以在每一列居中)

xi f(xi) f[xi,xi+1] f[xi,xi+1,xi+2]
1 1
4 2 0.33333
9 3 0.2 -0.01667

则差商公式为

P2(x)=f[1]+f[1,4](x1)+f[1,4,9](x1)(x4)=1+0.33333(x1)0.01667(x1)(x4)

代入x=7,则有P2(7)=2.69992 ,即7=2.69992

f = lambda x : 1 + 0.33333*(x - 1) - 0.01667*(x - 1)*(x - 4)
f(7)
2.6999199999999997

余式估计

由拉格朗日中值定理容易证明,在x0,x1,,xn上的存在ξ使得f[x0,x1,,xn]=f(n)(ξ)n!,则有f[xn,xn1,,x0,x]=f(n+1)(ξ)(n+1)!

Rn(x)=f[xn,xn1,,x0,x]j=0n(xxj)=f(n+1)(ξ)(n+1)!j=0n(xxj)

对于上面的例子,我们有

f(x)=xf(1)(x)=12xf(2)(x)=14x3/2f(3)(x)=38x5/2

可知f(3)(x)单调递减,则有f(3)(x)f(3)(1)=38,则有

|R2(x)|38|j=02(xxj)|=38|(x1)(x4)(x9)|

则有|R2(7)|13.5,这显然不符合我们余式估计的要求,我们需要更多的值或者方法来估计余式。

3/8 * (7-1)*(7-4)*(7-9)
-13.5

事后估计误差法

在上面中我们选取的牛顿差商公式为Pn(x),插值节点为x0,x1,,xn

Pn(x)=i=0nf[xi,xi+1,,xn]j=0i1(xxj)Rn(x)=f[xn,xn1,,x0,x]j=0n(xxj)

若我们选取的插值节点为x1,,xn+1,则有

Pn(1)(x)=i=1n+1f[xi,xi+1,,xn+1]j=1i1(xxj)Rn(1)(x)=f[xn+1,xn,,x1,x]j=1n+1(xxj)

则两个余式的比值为

Rn(x)Rn(1)(x)=f[xn,xn1,,x0,x]j=0n(xxj)f[xn+1,xn,,x1,x]j=1n+1(xxj)=f[xn,xn1,,x0,x]f[xn+1,xn,,x1,x]j=0n(xxj)j=1n+1(xxj)=f[xn,xn1,,x0,x]f[xn+1,xn,,x1,x]xx0xxn+1

因为f[xn,xn1,,x0,x]f[xn+1,xn,,x1,x]都是关于x的高阶差商,我们这里认为它们的值是几乎相等的,再者我们有Rn(1)(x)=f(x)Pn(1)(x)=Pn(x)+Rn(x)Pn(1)(x),则有

Rn(x)Rn(1)(x)=Rn(x)Rn(x)+Pn(x)Pn(1)(x)=xx0xxn+1(xx0)Rn(x)+(xx0)(Pn(x)Pn(1)(x))=(xxn+1)Rn(x)(x0xn+1)Rn(x)=(xx0)(Pn(x)Pn(1)(x))Rn(x)=xx0x0xn+1(Pn(x)Pn(1)(x))

简单例子2

已知x0=4,x1=9,x2=6.25,x4=4.84,求7的值。

解:由于x0=4,x1=9,x2=6.25,x4=4.84,所以我们可以用牛顿插值公式求出P2(7)

差商表如下:

x f(x) f[xi,xi+1] f[xi,xi+1,xi+2]
4 2
9 3 0.2
6.25 2.5 0.18182 -0.00808
4.84 2.2 0.21277 -0.00744

P2(7)=2+0.2(74)0.00808(74)(79)=2.64848

余式估计: 由f(x)=x,我们有f(3)(x)=38x52,在区间[4,9]上,f(3)(x)的最大值为38452=0.01171875,所以有

R2(7)=f[4,9,6.25](74)(79)(76.25)=f(3)(ξ)3!(74)(79)(76.25)0.011718756(74)(79)(76.25)=0.0087890625

事后估计法:

P2(1)(7)=3+0.18182(79)+0.00744(79)(76.25)=2.64752R2(7)=7444.84(P2(7)P2(1)(7))=0.00343

由事后估计法得到的余式近似0.5102P2(7)的值可舍入为2.65,所以72.65

差分

在不等距节点的基础上我们特殊化,假如x0,x1,,xn是等距的,即xixi1=h,则称为等距节点,其每一个节点对应的值为y0,y1,,yn,我们称为差分,记为yi=f(xi),则称

Δyi1=yiyi1=f(xi)f(xi1)\quad(1)(1)称为一阶差分,例如Δy0=y1y0Δ2yi2=Δyi1Δyi2=f(xi)2f(xi1)+f(xi2)\quad(2)(2)称为二阶差分,例如Δ2y0=Δy1Δy0Δ3yi3=Δ2yi2Δ2yi3=f(xi)3f(xi1)+3f(xi2)f(xi3)\quad(3)(3)称为三阶差分,例如Δ3y0=Δ2y1Δ2y0

注:其系数我们发现其实和二项式展开式很相像的,我们不妨写一下二项式展开式来对比

[(ab)1=abΔyi1=f(xi)f(xi1)(ab)2=a22ab+b2Δ2yi2=f(xi)2f(xi1)+f(xi2)(ab)3=a33a2b+3ab2b3Δ3yi3=f(xi)3f(xi1)+3f(xi2)f(xi3)]

则我们可以得到xi=x0+ihyi=f(x0+ih),则有(用差分表示差商)

f[x0,x1]=f(x1)f(x0)x1x0=y1y0h=Δy0hf[x0,x1,x2]=f[x1,x2]f[x0,x1]x2x0=Δy1Δy02h=Δ2y02h2f[x0,x1,x2,x3]=f[x1,x2,x3]f[x0,x1,x2]x3x0=Δ2y1Δ2y03h=Δ3y06h3f[x0,x1,,xn]=f[x1,x2,,xn]f[x0,x1,,xn1]xnx0=Δny0n!hn

牛顿基本差商公式为:

f(x)=Pn(x)+Rn(x)Pn(x)=i=0nf[x0,x1,,xi]j=0i1(xxj)Rn(x)=f[x0,x1,,xn,x]j=0n(xxj)

用差分代替差商,我们得到牛顿前向插值公式:

Pn(x)=y0+Δy0h(xx0)+Δ2y02h2(xx0)(xx1)+Δ3y06h3(xx0)(xx1)(xx2)++Δny0n!hn(xx0)(xx1)(xxn1)=y0+i=1nΔiy0i!hij=0i1(xxj)

t=xx0h,则有

Pn(x)=y0+Δy0t+Δ2y02t(t1)+Δ3y06t(t1)(t2)++Δny0n!t(t1)(tn+1)=y0+i=1nΔiy0i!t(t1)(ti+1)=y0+ct1Δy0+ct2Δ2y0+ct3Δ3y0++ctnΔny0

其中cti=t(t1)(ti+1)i!,称为牛顿基本差商的系数。

牛顿前向插值公式的余项为

Rn(x)=f[x0,x1,,xn,x]j=0n(xxj)=f[x0,x1,,xn,x]j=0n(xx0jh)=f(n+1)(ξ)(n+1)!hn+1j=0n(tj)

同理由差商表最后一行可得牛顿后向插值公式:

Pn(x)=yn+Δyn1h(xxn)+Δ2yn22h2(xxn)(xxn1)+Δ3yn36h3(xxn)(xxn1)(xxn2)++Δny0n!hn(xxn)(xxn1)(xx1)=yn+i=1nΔiynii!hij=0i1(xxnj)

t=xxnh,则有

Pn(x)=yn+Δyn1t+Δ2yn22t(t+1)+Δ3yn36t(t+1)(t+2)++Δny0n!t(t+1)(t+n1)=yn+i=1nΔiynii!t(t+1)(t+i1)=yn+ct1Δyn1+ct+12Δ2yn2+ct+23Δ3yn3++ct+n1nΔny0

其中cti与上面的相同(课件中明显写错了)。

牛顿后向插值公式的余项为

Rn(x)=f[x0,x1,,xn,x]j=0n(xxj)注意到这里是从后往前减的xj=xnjh=f[x0,x1,,xn,x]j=0n(xxn+jh)=f(n+1)(ξ)(n+1)!hn+1j=0n(t+j)

斯梯林插值公式

斯梯林插值公式是牛顿插值公式的一种推广,它的基本思想是将插值点分成两组,分别用牛顿插值公式求出两组的插值多项式,然后将两个多项式相加得到斯梯林插值公式。

这里认为只要记住下面两幅图即可,推导过程略;



不等距节点下的拉格朗日插值公式

推导

在上面知识的基础上,我们设xx0,x1,,xn这个插值区间中的任意一个点,则有

由上面证明顺序性的类似结论,我们可以得到

f[x0,x]=f(x)f(x0)xx0=f(x0)x0x+f(x)xx0f[x0,x1,x]=f(x0)(x0x1)(x0x)+f(x1)(x1x0)(x1x)+f(x)(xx0)(xx1)f[x0,x1,x2,x]=f(x0)(x0x1)(x0x2)(x0x)+f(x1)(x1x0)(x1x2)(x1x)+f(x2)(x2x0)(x2x1)(x2x)+f(x)(xx0)(xx1)(xx2)f[x0,x1,,xn,x]=i=0nf(xi)(xix)j=0,jin(xixj)+f(x)j=0n(xxj)

我们将上式同乘以(xx0)(xx1)(xxn),(即j=0n(xxj)),则有

f[x0,x1,,xn,x]j=0n(xxj)=i=0nf(xi)j=0n(xxj)(xix)j=0,jin(xixj)+f(x)

移项一下我们有

f(x)=i=0nf(xi)j=0n(xxj)(xix)j=0,jin(xixj)+f[x0,x1,,xn,x]j=0n(xxj)=i=0nf(xi)j=0,jin(xxj)j=0,jin(xixj)+f[x0,x1,,xn,x]j=0n(xxj)

在上式中,我们令Ln(x)=i=0nj=0,jin(xxj)j=0,jin(xixj)f(xi), Rn(x)=f[x0,x1,,xn,x]j=0n(xxj),则有

f(x)=Ln(x)+Rn(x)

其中的Ln(x)称为拉格朗日插值公式,Rn(x)就是其余项。

其它还有诸如下面的一些插值方法,课本上的写的也很详细,这里就不再赘述了。(主要是好多式子!!!)

  • 等距节点下的拉格朗日插值公式
  • 反向插值
  • 埃尔米特插值
  • 多元函数的插值
posted @   Link_kingdom  阅读(491)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示