数值计算——牛顿插值法
牛顿插值法
相关知识:拉格朗日插值。
一般牛顿插值
①考虑两个点的情况, f 1 ( x ) = f ( x 0 ) + k 1 ( x − x 0 ) f_1(x)=f(x_0)+k_1(x-x_0) f1(x)=f(x0)+k1(x−x0),带入 ( x 1 , f ( x 1 ) ) (x_1,f(x_1)) (x1,f(x1)),得
k 1 = f ( x 1 ) − f ( x 0 ) x 1 − x 0 ∴ f 1 ( x ) = f ( x 0 ) + f ( x 1 ) − f ( x 0 ) x 1 − x 0 ( x − x 0 ) k_1=\frac{f(x_1)-f(x_0)}{x_1-x_0}\\ \therefore f_1(x)=f(x_0)+\frac{f(x_1)-f(x_0)}{x_1-x_0}(x-x_0) k1=x1−x0f(x1)−f(x0)∴f1(x)=f(x0)+x1−x0f(x1)−f(x0)(x−x0)
②考虑三个点的情况, f 2 ( x ) = f 1 ( x ) + k 2 ( x − x 0 ) ( x − x 1 ) f_2(x)=f_1(x)+k_2(x-x_0)(x-x_1) f2(x)=f1(x)+k2(x−x0)(x−x1),带入 ( x 2 , f ( x 2 ) ) (x_2,f(x_2)) (x2,f(x2)),得
k 2 = f ( x 2 ) − f 1 ( x 2 ) ( x 2 − x 0 ) ( x 2 − x 1 ) = [ f ( x 2 ) − f ( x 0 ) ] − [ f ( x 1 ) − f ( x 0 ) x 1 − x 0 ( x 2 − x 0 ) ] ( x 2 − x 0 ) ( x 2 − x 1 ) = [ f ( x 2 ) − f ( x 0 ) ] ( x 1 − x 0 ) − [ f ( x 1 ) − f ( x 0 ) ] ( x 2 − x 0 ) ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 1 − x 0 ) = [ f ( x 2 ) − f ( x 1 ) ] ( x 1 − x 0 ) − [ f ( x 1 ) − f ( x 0 ) ] ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 1 − x 0 ) = f ( x 2 ) − f ( x 1 ) x 2 − x 1 − f ( x 1 ) − f ( x 0 ) x 1 − x 0 x 2 − x 0 ∴ f 2 ( x ) = f ( x 0 ) + f ( x 1 ) − f ( x 0 ) x 1 − x 0 ( x − x 0 ) + f ( x 2 ) − f ( x 1 ) x 2 − x 1 − f ( x 1 ) − f ( x 0 ) x 1 − x 0 x 2 − x 0 ( x − x 0 ) ( x − x 1 ) \begin{aligned}k_2&=\frac{f(x_2)-f_1(x_2)}{(x_2-x_0)(x_2-x_1)}\\ &=\frac{[f(x_2)-f(x_0)]-[\frac{f(x_1)-f(x_0)}{x_1-x_0}(x_2-x_0)]}{(x_2-x_0)(x_2-x_1)}\\ &=\frac{[f(x_2)-f(x_0)](x_1-x_0)-[f(x_1)-f(x_0)](x_2-x_0)}{(x_2-x_0)(x_2-x_1)(x_1-x_0)}\\ &=\frac{[f(x_2)-f(x_1)](x_1-x_0)-[f(x_1)-f(x_0)](x_2-x_1)}{(x_2-x_0)(x_2-x_1)(x_1-x_0)}\\ &=\frac{\frac{f(x_2)-f(x_1)}{x_2-x_1}-\frac{f(x_1)-f(x_0)}{x_1-x_0}}{x_2-x_0} \end{aligned}\\ \therefore f_2(x)=f(x_0)+\frac{f(x_1)-f(x_0)}{x_1-x_0}(x-x_0)+\frac{\frac{f(x_2)-f(x_1)}{x_2-x_1}-\frac{f(x_1)-f(x_0)}{x_1-x_0}}{x_2-x_0}(x-x_0)(x-x_1) k2=(x2−x0)(x2−x1)f(x2)−f1(x2)=(x2−x0)(x2−x1)[f(x2)−f(x0)]−[x1−x0f(x1)−f(x0)(x2−x0)]=(x2−x0)(x2−x1)(x1−x0)[f(x2)−f(x0)](x1−x0)−[f(x1)−f(x0)](x2−x0)=(x2−x0)(x2−x1)(x1−x0)[f(x2)−f(x1)](x1−x0)−[f(x1)−f(x0)](x2−x1)=x2−x0x2−x1f(x2)−f(x1)−x1−x0f(x1)−f(x0)∴f2(x)=f(x0)+x1−x0f(x1)−f(x0)(x−x0)+x2−x0x2−x1f(x2)−f(x1)−x1−x0f(x1)−f(x0)(x−x0)(x−x1)
我们定义
f [ x 0 , x 1 ] = f ( x 1 ) − f ( x 0 ) x 1 − x 0 f [ x 0 , x 1 , x 2 ] = f [ x 1 , x 2 ] − f [ x 0 , x 1 ] x 2 − x 0 . . . f [ x 0 , x 1 , . . . , x k ] = f [ x 1 , x 2 , . . . , x k ] − f [ x 0 , x 1 , . . . , x k − 1 ] x k − x 0 \begin{aligned}&f[x_0,x_1]=\frac{f(x_1)-f(x_0)}{x_1-x_0}\\ &f[x_0,x_1,x_2]=\frac{f[x_1,x_2]-f[x_0,x_1]}{x_2-x_0}\\ &...\\ &f[x_0,x_1,...,x_k]=\frac{f[x_1,x_2,...,x_k]-f[x_0,x_1,...,x_{k-1}]}{x_k-x_0} \end{aligned} f[x0,x1]=x1−x0f(x1)−f(x0)f[x0,x1,x2]=x2−x0f[x1,x2]−f[x0,x1]...f[x0,x1,...,xk]=xk−x0f[x1,x2,...,xk]−f[x0,x1,...,xk−1]
其中 f [ x 0 , x 1 ] f[x_0,x_1] f[x0,x1]为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) (x_0,f(x_0)),(x_1,f(x_1)) (x0,f(x0)),(x1,f(x1))的一阶差商,
f [ x 0 , x 1 , x 2 ] f[x_0,x_1,x_2] f[x0,x1,x2]为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) , ( x 2 , f ( x 2 ) ) (x_0,f(x_0)),(x_1,f(x_1)),(x_2,f(x_2)) (x0,f(x0)),(x1,f(x1)),(x2,f(x2))的二阶差商,
…
f [ x 0 , x 1 , . . . , x k ] f[x_0,x_1,...,x_k] f[x0,x1,...,xk]为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) , . . . , ( x k , f ( x k ) ) (x_0,f(x_0)),(x_1,f(x_1)),...,(x_k,f(x_k)) (x0,f(x0)),(x1,f(x1)),...,(xk,f(xk))的 k k k阶差商。
归纳一下,得
∴ f [ x 0 , x 1 , . . . , x k ] = ∑ i = 0 k f ( x i ) ∏ j = 0 , j ≠ i k ( x i − x j ) ∴ f ( 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 1 , . . . , x k ] ( x − x 0 ) ( x − x 1 ) . . . ( x − x k − 1 ) \therefore f[x_0,x_1,...,x_k]=\sum_{i=0}^{k}\frac{f(x_i)}{\prod_{j=0,j\not =i}^{k}(x_i-x_j)}\\ \therefore f(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_1,...,x_k](x-x_0)(x-x_1)...(x-x_{k-1}) ∴f[x0,x1,...,xk]=i=0∑k∏j=0,j=ik(xi−xj)f(xi)∴f(x)=f(x0)+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+...+f[x0,x1,...,xk](x−x0)(x−x1)...(x−xk−1)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define mod 998244353
using namespace std;
int n;
LL k;
struct node{LL x,y;} a[2010];
LL times[2010][2010],delta[2010];
LL dg(LL x,LL k)
{
if(!k) return 1;
LL op=dg(x,k>>1);
if(k&1) return op*op%mod*x%mod; else return op*op%mod;
}
LL inv(LL x)
{
return dg(x,mod-2);
}
void init()
{
for(int i=0;i<n;i++)
{
if(i) times[i][0]=(a[i].x-a[0].x+mod)%mod; else times[i][0]=1;
for(int j=1;j<n;j++)
if(i!=j) times[i][j]=times[i][j-1]*((a[i].x-a[j].x+mod)%mod)%mod; else times[i][j]=times[i][j-1];
}
for(int i=1;i<n;i++)
for(int j=0;j<=i;j++)
delta[i]=(delta[i]+a[j].y*inv(times[j][i])%mod)%mod;
}
LL newton(LL k)
{
LL ans=a[0].y,tmp=1;
for(int i=1;i<n;i++)
{
tmp=(tmp*((k-a[i-1].x+mod)%mod))%mod;
ans=(ans+delta[i]*tmp%mod)%mod;
}
return ans;
}
int main()
{
scanf("%d %lld",&n,&k);
for(int i=0;i<n;i++)
scanf("%lld %lld",&a[i].x,&a[i].y);
init();
printf("%lld",newton(k));
}
等间距牛顿插值
规定取点的间距为固定值 Δ x \Delta x Δx,即满足 x 1 = x 0 + Δ x , x 2 = x 1 + Δ x , . . . , x k = x k − 1 + Δ x x_1=x_0+\Delta x,x_2=x_1+\Delta x,...,x_k=x_{k-1}+\Delta x x1=x0+Δx,x2=x1+Δx,...,xk=xk−1+Δx。
我们定义
Δ f ( x 0 ) = f ( x 0 + Δ x ) − f ( x 0 ) Δ 2 f ( x 0 ) = Δ f ( x 0 + Δ x ) − Δ f ( x 0 ) . . . Δ k f ( x 0 ) = Δ k − 1 f ( x 0 + Δ x ) − Δ k − 1 f ( x 0 ) \begin{aligned}&\Delta f(x_0)=f(x_0+\Delta x)-f(x_0)\\ &\Delta^2 f(x_0)=\Delta f(x_0+\Delta x)-\Delta f(x_0)\\ &...\\ &\Delta^kf(x_0)=\Delta^{k-1}f(x_0+\Delta x)-\Delta ^{k-1}f(x_0) \end{aligned} Δf(x0)=f(x0+Δx)−f(x0)Δ2f(x0)=Δf(x0+Δx)−Δf(x0)...Δkf(x0)=Δk−1f(x0+Δx)−Δk−1f(x0)
其中 Δ f ( x 0 ) \Delta f(x_0) Δf(x0)为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))的一阶向前差分,
Δ 2 f ( x 0 ) \Delta^2 f(x_0) Δ2f(x0)为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))的二阶向前差分,
…
Δ k f ( x 0 ) \Delta^k f(x_0) Δkf(x0)为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))的 k k k阶向前差分。
∴ f 1 ( x ) = f ( x 0 ) + Δ f ( x 0 ) Δ x ( x − x 0 ) f 2 ( x ) = f ( x 0 ) + Δ f ( x 0 ) Δ x ( x − x 0 ) + Δ 2 f ( x 0 ) 2 Δ 2 x ( x − x 0 ) ( x − x 1 ) . . . f k ( x ) = f ( x 0 ) + Δ f ( x 0 ) Δ x ( x − x 0 ) + Δ 2 f ( x 0 ) 2 Δ 2 x ( x − x 0 ) ( x − x 1 ) + . . . + Δ k f ( x 0 ) k ! Δ k x ( x − x 0 ) ( x − x 1 ) . . . ( x − x k − 1 ) \begin{aligned} \therefore &f_1(x)=f(x_0)+\frac{\Delta f(x_0)}{\Delta x}(x-x_0)\\ &f_2(x)=f(x_0)+\frac{\Delta f(x_0)}{\Delta x}(x-x_0)+\frac{\Delta^2f(x_0)}{2\Delta^2 x}(x-x_0)(x-x_1)\\ &...\\ &f_k(x)=f(x_0)+\frac{\Delta f(x_0)}{\Delta x}(x-x_0)+\frac{\Delta^2f(x_0)}{2\Delta^2 x}(x-x_0)(x-x_1)+...+\frac{\Delta^kf(x_0)}{k!\Delta^k x}(x-x_0)(x-x_1)...(x-x_{k-1}) \end{aligned} ∴f1(x)=f(x0)+ΔxΔf(x0)(x−x0)f2(x)=f(x0)+ΔxΔf(x0)(x−x0)+2Δ2xΔ2f(x0)(x−x0)(x−x1)...fk(x)=f(x0)+ΔxΔf(x0)(x−x0)+2Δ2xΔ2f(x0)(x−x0)(x−x1)+...+k!ΔkxΔkf(x0)(x−x0)(x−x1)...(x−xk−1)
证明同差商。
若 Δ x → 0 \Delta x\rightarrow0 Δx→0,因此 Δ x 0 = Δ x 1 = . . . = Δ x k \Delta x_0=\Delta x_1=...=\Delta x_k Δx0=Δx1=...=Δxk,则有
f 1 ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f 2 ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) 2 . . . f k ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . + f ( k ) ( x 0 ) k ! ( x − x 0 ) k \begin{aligned} &f_1(x)=f(x_0)+f'(x_0)(x-x_0)\\ &f_2(x)=f(x_0)+f'(x_0)(x-x_0)+f''(x_0)(x-x_0)^2\\ &...\\ &f_k(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+...+\frac{f^{(k)}(x_0)}{k!}(x-x_0)^k \end{aligned} f1(x)=f(x0)+f′(x0)(x−x0)f2(x)=f(x0)+f′(x0)(x−x0)+f′′(x0)(x−x0)2...fk(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+...+k!f(k)(x0)(x−x0)k
正是泰勒展开从 1 1 1到 k k k阶的展开式。
而在此意义下,牛顿差值的误差 R k ( x ) = f ( k + 1 ) ( ξ ) ( k + 1 ) ! ( x − x 0 ) k + 1 ( x 0 < ξ < x ) R_k(x)=\frac{f^{(k+1)}(\xi)}{(k+1)!}(x-x_0)^{k+1}(x_0<\xi<x) Rk(x)=(k+1)!f(k+1)(ξ)(x−x0)k+1(x0<ξ<x)也正是泰勒展开的拉格朗日余项。
也就是说,严格意义上, f ( x ) = f k ( x ) + R k ( x ) f(x)=f_k(x)+R_k(x) f(x)=fk(x)+Rk(x),但是在一般计算时不会考虑 R k ( x ) R_k(x) Rk(x),因此我们一般认为 f ( x ) = f k ( x ) f(x)=f_k(x) f(x)=fk(x)。
牛顿向前&向后插值
无论是向前插值还是向后插值,都是等间距的插值。
向前插值
其实上面讲的等间距插值就是用的向前插值。
令 h = Δ x , x = x 0 + h n h=\Delta x,x=x_0+hn h=Δx,x=x0+hn,有 x − x 0 = h n , x − x 1 = h ( n − 1 ) , . . . , x − x k − 1 = h ( n − k + 1 ) x-x_0=hn,x-x_1=h(n-1),...,x-x_{k-1}=h(n-k+1) x−x0=hn,x−x1=h(n−1),...,x−xk−1=h(n−k+1),上面的式子变为
f 1 ( x ) = f ( x 0 ) + Δ f ( x 0 ) h h n f 2 ( x ) = f ( x 0 ) + Δ f ( x 0 ) h h n + Δ 2 f ( x 0 ) 2 h 2 h n ⋅ h ( n − 1 ) . . . f k ( x ) = f ( x 0 ) + Δ f ( x 0 ) h h n + Δ 2 f ( x 0 ) 2 h 2 h n ⋅ h ( n − 1 ) + . . . + Δ k f ( x 0 ) k ! h k h n ⋅ h ( n − 1 ) ⋅ . . . ⋅ h ( n − k + 1 ) \begin{aligned} &f_1(x)=f(x_0)+\frac{\Delta f(x_0)}{h}hn\\ &f_2(x)=f(x_0)+\frac{\Delta f(x_0)}{h}hn+\frac{\Delta^2f(x_0)}{2h^2}hn\cdot h(n-1)\\ &...\\ &f_k(x)=f(x_0)+\frac{\Delta f(x_0)}{h}hn+\frac{\Delta^2f(x_0)}{2h^2}hn\cdot h(n-1)+...+\frac{\Delta^kf(x_0)}{k!h^k}hn\cdot h(n-1)\cdot...\cdot h(n-k+1) \end{aligned} f1(x)=f(x0)+hΔf(x0)hnf2(x)=f(x0)+hΔf(x0)hn+2h2Δ2f(x0)hn⋅h(n−1)...fk(x)=f(x0)+hΔf(x0)hn+2h2Δ2f(x0)hn⋅h(n−1)+...+k!hkΔkf(x0)hn⋅h(n−1)⋅...⋅h(n−k+1)
化简一下,得
f 1 ( x ) = f ( x 0 ) + n 1 Δ f ( x 0 ) f 2 ( x ) = f ( x 0 ) + n 1 Δ f ( x 0 ) + n ( n − 1 ) 2 Δ 2 f ( x 0 ) . . . f k ( x ) = f ( x 0 ) + n 1 Δ f ( x 0 ) + n ( n − 1 ) 2 Δ 2 f ( x 0 ) + . . . + n ( n − 1 ) . . . ( n − k + 1 ) k ! Δ k f ( x 0 ) \begin{aligned} &f_1(x)=f(x_0)+\frac{n}{1}\Delta f(x_0)\\ &f_2(x)=f(x_0)+\frac{n}{1}\Delta f(x_0)+\frac{n(n-1)}{2}\Delta^2f(x_0)\\ &...\\ &f_k(x)=f(x_0)+\frac{n}{1}\Delta f(x_0)+\frac{n(n-1)}{2}\Delta^2f(x_0)+...+\frac{n(n-1)...(n-k+1)}{k!}\Delta^kf(x_0)\end{aligned} f1(x)=f(x0)+1nΔf(x0)f2(x)=f(x0)+1nΔf(x0)+2n(n−1)Δ2f(x0)...fk(x)=f(x0)+1nΔf(x0)+2n(n−1)Δ2f(x0)+...+k!n(n−1)...(n−k+1)Δkf(x0)
这就是前插公式。
其余项
R k ( x ) = n ( n − 1 ) . . . ( n − k ) ( k + 1 ) ! h k + 1 f k + 1 ( ξ ) , ξ ∈ ( x 0 , x k ) R_k(x)=\frac{n(n-1)...(n-k)}{(k+1)!}h^{k+1}f^{k+1}(\xi),\xi∈(x_0,x_k) Rk(x)=(k+1)!n(n−1)...(n−k)hk+1fk+1(ξ),ξ∈(x0,xk)
向后插值
同理,我们定义 ∇ f ( x 0 ) \nabla f(x_0) ∇f(x0)为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))的一阶向后差分,
∇ 2 f ( x 0 ) \nabla^2 f(x_0) ∇2f(x0)为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))的二阶向后差分,
…
∇ k f ( x 0 ) \nabla^k f(x_0) ∇kf(x0)为 f ( x ) f(x) f(x)在 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))的 k k k阶向后差分。
∇ f ( x 0 ) = f ( x ) − f ( x 0 − Δ x ) ∇ 2 f ( x 0 ) = ∇ f ( x 0 ) − ∇ f ( x 0 − Δ x ) . . . ∇ k f ( x 0 ) = ∇ k − 1 f ( x 0 ) − ∇ k − 1 f ( x 0 − Δ x ) \begin{aligned}&\nabla f(x_0)=f(x)-f(x_0-\Delta x)\\ &\nabla^2 f(x_0)=\nabla f(x_0)-\nabla f(x_0-\Delta x)\\ &...\\ &\nabla^kf(x_0)=\nabla^{k-1}f(x_0)-\nabla^{k-1}f(x_0-\Delta x) \end{aligned} ∇f(x0)=f(x)−f(x0−Δx)∇2f(x0)=∇f(x0)−∇f(x0−Δx)...∇kf(x0)=∇k−1f(x0)−∇k−1f(x0−Δx)
同理,令 h = Δ x , x = x 0 + h n h=\Delta x,x=x_0+hn h=Δx,x=x0+hn,有 x − x 0 = h n , x − x 1 = h ( n − 1 ) , . . . , x − x k − 1 = h ( n − k + 1 ) x-x_0=hn,x-x_1=h(n-1),...,x-x_{k-1}=h(n-k+1) x−x0=hn,x−x1=h(n−1),...,x−xk−1=h(n−k+1)。
后插公式如下:
f 1 ( x ) = f ( x 0 ) + n 1 Δ f ( x 0 ) f 2 ( x ) = f ( x 0 ) + n 1 Δ f ( x 0 ) + n ( n + 1 ) 2 Δ 2 f ( x 0 ) . . . f k ( x ) = f ( x 0 ) + n 1 Δ f ( x 0 ) + n ( n + 1 ) 2 Δ 2 f ( x 0 ) + . . . + n ( n + 1 ) . . . ( n + k − 1 ) k ! Δ k f ( x 0 ) \begin{aligned} &f_1(x)=f(x_0)+\frac{n}{1}\Delta f(x_0)\\ &f_2(x)=f(x_0)+\frac{n}{1}\Delta f(x_0)+\frac{n(n+1)}{2}\Delta^2f(x_0)\\ &...\\ &f_k(x)=f(x_0)+\frac{n}{1}\Delta f(x_0)+\frac{n(n+1)}{2}\Delta^2f(x_0)+...+\frac{n(n+1)...(n+k-1)}{k!}\Delta^kf(x_0)\end{aligned} f1(x)=f(x0)+1nΔf(x0)f2(x)=f(x0)+1nΔf(x0)+2n(n+1)Δ2f(x0)...fk(x)=f(x0)+1nΔf(x0)+2n(n+1)Δ2f(x0)+...+k!n(n+1)...(n+k−1)Δkf(x0)
其余项
R k ( x ) = n ( n + 1 ) . . . ( n + k ) ( k + 1 ) ! h k + 1 f k + 1 ( ξ ) , ξ ∈ ( x 0 , x k ) R_k(x)=\frac{n(n+1)...(n+k)}{(k+1)!}h^{k+1}f^{k+1}(\xi),\xi∈(x_0,x_k) Rk(x)=(k+1)!n(n+1)...(n+k)hk+1fk+1(ξ),ξ∈(x0,xk)
更多推荐


所有评论(0)