插值法
预备知识
我们希望通过插值去用易于计算的函数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+1−xi
f(x)在xi处的二阶差商为
f[xi,xi+1,xi+2]=f[xi,xi+1]−f[xi+1,xi+2]xi+2−xi
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+1−xi=f(xi)xi−xi+1+f(xi+1)xi+1−xi
我们同样有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]xi−xi+2=f(xi+1)−f(xi)xi+1−xi−f(xi+2)−f(xi+1)xi+2−xi+1xi−xi+2=f(xi)(xi−xi+1)(xi−xi+2)+f(xi+1)(xi+1−xi)(xi+1−xi+2)+f(xi+2)(xi+2−xi)(xi+2−xi+1)
从这个形式就可以看出来没有差商的排列次序是没有意义的。
不等距节点下的牛顿基本差商公式
由一阶差商的定义,我们可以得到
f[x0,x]=f(x)−f(x0)x−x0f[x1,x0,x]=f[x1,x0]−f[x0,x]x1−xf[x2,x1,x0,x]=f[x2,x1,x0]−f[x1,x0,x]x2−xf[x3,x2,x1,x0,x]=f[x3,x2,x1,x0]−f[x2,x1,x0,x]x3−x⋮f[xn,xn−1,⋯,x0,x]=f[xn,xn−1,⋯,x0]−f[xn−1,⋯,x0,x]xn−x
这个式子可以写成(将上面依次展开,记住我们的目的我们希望表达出f(x))
f(x)=f(x0)+f[x0,x](x−x0)(代入f[x0,x]=f[x1,x0]+f[x1,x0,x](x−x1))=f(x0)+f[x1,x0](x−x0)+f[x1,x0,x](x−x1)(x−x0)(代入f[x1,x0,x]=f[x2,x1,x0]+f[x2,x1,x0,x](x−x2))=f(x0)+f[x1,x0](x−x0)+f[x2,x1,x0](x−x1)(x−x0)+f[x2,x1,x0,x](x−x2)(x−x1)(x−x0)(代入f[x2,x1,x0,x]=f[x3,x2,x1,x0]+f[x3,x2,x1,x0,x](x−x3))⋮=f(x0)+f[x1,x0](x−x0)+f[x2,x1,x0](x−x1)(x−x0)+⋯+f[xn,xn−1,⋯,x0,x](x−xn)(x−xn−1)⋯(x−x0)=n∑i=0f[xi,xi−1,⋯,x0]i−1∏j=0(x−xj)+f[xn,xn−1,⋯,x0,x]n∏j=0(x−xj)
在上式中,我们令Pn(x)=f[xn,xn−1,⋯,x0]∏i−1j=0(x−xj),令Rn(x)=f[xn,xn−1,⋯,x0,x]∏nj=0(x−xj),那么我们有
f(x)=Pn(x)+Rn(x)
其中Pn(x)称为牛顿基本差商公式,Rn(x)称为牛顿基本差商公式的余式。
由上面公式我们容易看出,当x取x0,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](x−1)+f[1,4,9](x−1)(x−4)=1+0.33333(x−1)−0.01667(x−1)(x−4)
代入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,xn−1,⋯,x0,x]=f(n+1)(ξ)(n+1)!
Rn(x)=f[xn,xn−1,⋯,x0,x]n∏j=0(x−xj)=f(n+1)(ξ)(n+1)!n∏j=0(x−xj)
对于上面的例子,我们有
f(x)=√xf(1)(x)=12√xf(2)(x)=−14x3/2f(3)(x)=38x5/2
可知f(3)(x)单调递减,则有f(3)(x)≤f(3)(1)=38,则有
|R2(x)|≤38|2∏j=0(x−xj)|=38|(x−1)(x−4)(x−9)|
则有|R2(7)|≤13.5,这显然不符合我们余式估计的要求,我们需要更多的值或者方法来估计余式。
3/8 * (7-1)*(7-4)*(7-9)
-13.5
事后估计误差法
在上面中我们选取的牛顿差商公式为Pn(x),插值节点为x0,x1,⋯,xn,
Pn(x)=n∑i=0f[xi,xi+1,⋯,xn]i−1∏j=0(x−xj)Rn(x)=f[xn,xn−1,⋯,x0,x]n∏j=0(x−xj)
若我们选取的插值节点为x1,⋯,xn+1,则有
P(1)n(x)=n+1∑i=1f[xi,xi+1,⋯,xn+1]i−1∏j=1(x−xj)R(1)n(x)=f[xn+1,xn,⋯,x1,x]n+1∏j=1(x−xj)
则两个余式的比值为
Rn(x)R(1)n(x)=f[xn,xn−1,⋯,x0,x]∏nj=0(x−xj)f[xn+1,xn,⋯,x1,x]∏n+1j=1(x−xj)=f[xn,xn−1,⋯,x0,x]f[xn+1,xn,⋯,x1,x]∗∏nj=0(x−xj)∏n+1j=1(x−xj)=f[xn,xn−1,⋯,x0,x]f[xn+1,xn,⋯,x1,x]∗x−x0x−xn+1
因为f[xn,xn−1,⋯,x0,x]和f[xn+1,xn,⋯,x1,x]都是关于x的高阶差商,我们这里认为它们的值是几乎相等的,再者我们有R(1)n(x)=f(x)−P(1)n(x)=Pn(x)+Rn(x)−P(1)n(x),则有
Rn(x)R(1)n(x)=Rn(x)Rn(x)+Pn(x)−P(1)n(x)=x−x0x−xn+1⇒(x−x0)Rn(x)+(x−x0)(Pn(x)−P(1)n(x))=(x−xn+1)Rn(x)⇒(x0−xn+1)Rn(x)=(x−x0)(Pn(x)−P(1)n(x))⇒Rn(x)=x−x0x0−xn+1(Pn(x)−P(1)n(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(7−4)−0.00808(7−4)(7−9)=2.64848
余式估计: 由f(x)=√x,我们有f(3)(x)=38x−52,在区间[4,9]上,f(3)(x)的最大值为384−52=0.01171875,所以有
R2(7)=f[4,9,6.25](7−4)(7−9)(7−6.25)=f(3)(ξ)3!(7−4)(7−9)(7−6.25)≤0.011718756(7−4)(7−9)(7−6.25)=−0.0087890625
事后估计法:
P(1)2(7)=3+0.18182(7−9)+0.00744(7−9)(7−6.25)=2.64752R2(7)=7−44−4.84∗(P2(7)−P(1)2(7))=−0.00343
由事后估计法得到的余式近似0.5∗10−2,P2(7)的值可舍入为2.65,所以√7≈2.65。
差分
在不等距节点的基础上我们特殊化,假如x0,x1,⋯,xn是等距的,即xi−xi−1=h,则称为等距节点,其每一个节点对应的值为y0,y1,⋯,yn,我们称为差分,记为yi=f(xi),则称
Δyi−1=yi−yi−1=f(xi)−f(xi−1)\quad(1)(1)称为一阶差分,例如Δy0=y1−y0Δ2yi−2=Δyi−1−Δyi−2=f(xi)−2f(xi−1)+f(xi−2)\quad(2)(2)称为二阶差分,例如Δ2y0=Δy1−Δy0Δ3yi−3=Δ2yi−2−Δ2yi−3=f(xi)−3f(xi−1)+3f(xi−2)−f(xi−3)\quad(3)(3)称为三阶差分,例如Δ3y0=Δ2y1−Δ2y0
注:其系数我们发现其实和二项式展开式很相像的,我们不妨写一下二项式展开式来对比
⎡⎢
⎢⎣(a−b)1=a−b→Δyi−1=f(xi)−f(xi−1)(a−b)2=a2−2ab+b2→Δ2yi−2=f(xi)−2f(xi−1)+f(xi−2)(a−b)3=a3−3a2b+3ab2−b3→Δ3yi−3=f(xi)−3f(xi−1)+3f(xi−2)−f(xi−3)⎤⎥
⎥⎦
则我们可以得到xi=x0+ih,yi=f(x0+ih),则有(用差分表示差商)
f[x0,x1]=f(x1)−f(x0)x1−x0=y1−y0h=Δy0hf[x0,x1,x2]=f[x1,x2]−f[x0,x1]x2−x0=Δy1−Δy02h=Δ2y02h2f[x0,x1,x2,x3]=f[x1,x2,x3]−f[x0,x1,x2]x3−x0=Δ2y1−Δ2y03h=Δ3y06h3⋮f[x0,x1,⋯,xn]=f[x1,x2,⋯,xn]−f[x0,x1,⋯,xn−1]xn−x0=Δny0n!hn
牛顿基本差商公式为:
f(x)=Pn(x)+Rn(x)Pn(x)=n∑i=0f[x0,x1,⋯,xi]i−1∏j=0(x−xj)Rn(x)=f[x0,x1,⋯,xn,x]n∏j=0(x−xj)
用差分代替差商,我们得到牛顿前向插值公式:
Pn(x)=y0+Δy0h(x−x0)+Δ2y02h2(x−x0)(x−x1)+Δ3y06h3(x−x0)(x−x1)(x−x2)+⋯+Δny0n!hn(x−x0)(x−x1)⋯(x−xn−1)=y0+n∑i=1Δiy0i!hii−1∏j=0(x−xj)
令t=x−x0h,则有
Pn(x)=y0+Δy0t+Δ2y02t(t−1)+Δ3y06t(t−1)(t−2)+⋯+Δny0n!t(t−1)⋯(t−n+1)=y0+n∑i=1Δiy0i!t(t−1)⋯(t−i+1)=y0+c1tΔy0+c2tΔ2y0+c3tΔ3y0+⋯+cntΔny0
其中cit=t(t−1)⋯(t−i+1)i!,称为牛顿基本差商的系数。
牛顿前向插值公式的余项为
Rn(x)=f[x0,x1,⋯,xn,x]n∏j=0(x−xj)=f[x0,x1,⋯,xn,x]n∏j=0(x−x0−jh)=f(n+1)(ξ)(n+1)!hn+1n∏j=0(t−j)
同理由差商表最后一行可得牛顿后向插值公式:
Pn(x)=yn+Δyn−1h(x−xn)+Δ2yn−22h2(x−xn)(x−xn−1)+Δ3yn−36h3(x−xn)(x−xn−1)(x−xn−2)+⋯+Δny0n!hn(x−xn)(x−xn−1)⋯(x−x1)=yn+n∑i=1Δiyn−ii!hii−1∏j=0(x−xn−j)
令t=x−xnh,则有
Pn(x)=yn+Δyn−1t+Δ2yn−22t(t+1)+Δ3yn−36t(t+1)(t+2)+⋯+Δny0n!t(t+1)⋯(t+n−1)=yn+n∑i=1Δiyn−ii!t(t+1)⋯(t+i−1)=yn+c1tΔyn−1+c2t+1Δ2yn−2+c3t+2Δ3yn−3+⋯+cnt+n−1Δny0
其中cit与上面的相同(课件中明显写错了)。
牛顿后向插值公式的余项为
Rn(x)=f[x0,x1,⋯,xn,x]n∏j=0(x−xj)注意到这里是从后往前减的xj=xn−jh=f[x0,x1,⋯,xn,x]n∏j=0(x−xn+jh)=f(n+1)(ξ)(n+1)!hn+1n∏j=0(t+j)
斯梯林插值公式
斯梯林插值公式是牛顿插值公式的一种推广,它的基本思想是将插值点分成两组,分别用牛顿插值公式求出两组的插值多项式,然后将两个多项式相加得到斯梯林插值公式。
这里认为只要记住下面两幅图即可,推导过程略;



不等距节点下的拉格朗日插值公式
推导
在上面知识的基础上,我们设x为x0,x1,⋯,xn这个插值区间中的任意一个点,则有
由上面证明顺序性的类似结论,我们可以得到
f[x0,x]=f(x)−f(x0)x−x0=f(x0)x0−x+f(x)x−x0f[x0,x1,x]=f(x0)(x0−x1)(x0−x)+f(x1)(x1−x0)(x1−x)+f(x)(x−x0)(x−x1)f[x0,x1,x2,x]=f(x0)(x0−x1)(x0−x2)(x0−x)+f(x1)(x1−x0)(x1−x2)(x1−x)+f(x2)(x2−x0)(x2−x1)(x2−x)+f(x)(x−x0)(x−x1)(x−x2)f[x0,x1,⋯,xn,x]=n∑i=0f(xi)(xi−x)∏nj=0,j≠i(xi−xj)+f(x)∏nj=0(x−xj)
我们将上式同乘以(x−x0)(x−x1)⋯(x−xn),(即∏nj=0(x−xj)),则有
f[x0,x1,⋯,xn,x]n∏j=0(x−xj)=n∑i=0f(xi)∗∏nj=0(x−xj)(xi−x)∏nj=0,j≠i(xi−xj)+f(x)
移项一下我们有
f(x)=−n∑i=0f(xi)∗∏nj=0(x−xj)(xi−x)∏nj=0,j≠i(xi−xj)+f[x0,x1,⋯,xn,x]n∏j=0(x−xj)=n∑i=0f(xi)∗∏nj=0,j≠i(x−xj)∏nj=0,j≠i(xi−xj)+f[x0,x1,⋯,xn,x]n∏j=0(x−xj)
在上式中,我们令Ln(x)=∑ni=0∏nj=0,j≠i(x−xj)∏nj=0,j≠i(xi−xj)f(xi), Rn(x)=f[x0,x1,⋯,xn,x]∏nj=0(x−xj),则有
f(x)=Ln(x)+Rn(x)
其中的Ln(x)称为拉格朗日插值公式,Rn(x)就是其余项。
其它还有诸如下面的一些插值方法,课本上的写的也很详细,这里就不再赘述了。(主要是好多式子!!!)
- 等距节点下的拉格朗日插值公式
- 反向插值
- 埃尔米特插值
- 多元函数的插值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人