插值法
已知函数
y
=
f
(
k
)
y=f(k)
y=f(k),它很难求
但如果已知
y
=
f
(
k
)
y=f(k)
y=f(k)过
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
.
.
.
,
(
x
n
,
y
n
)
(x_0,y_0),(x_1,y_1),...,(x_n,y_n)
(x0,y0),(x1,y1),...,(xn,yn)这
n
+
1
n+1
n+1个点,我们就可以构造一个多项式
y
=
g
(
k
)
y=g(k)
y=g(k)使
g
(
x
i
)
=
y
i
(
i
∈
[
0
,
n
]
)
g(x_i)=y_i(i\in[0,n])
g(xi)=yi(i∈[0,n])
也可以说是构造一个函数
y
=
g
(
k
)
y=g(k)
y=g(k)使
y
y
y经过平面上所有
n
+
1
n+1
n+1个点
那么对于一个数
i
(
i
≠
x
0
,
x
1
,
.
.
.
,
x
n
)
i(i≠x_0,x_1,...,x_n)
i(i̸=x0,x1,...,xn),可以用
g
(
i
)
g(i)
g(i)的值作为准确值
f
(
i
)
f(i)
f(i)的近似值
这就是插值法
拉格朗日插值法
原理
如果
y
=
f
(
k
)
=
∑
i
=
0
n
a
i
k
i
y=f(k)=\sum^n_{i=0}a_ik^i
y=f(k)=∑i=0naiki,我们可以把
n
+
1
n+1
n+1个
x
,
y
x,y
x,y代入,得到
n
+
1
n+1
n+1条方程
解方程组,高斯消元
O
(
n
3
)
O(n^3)
O(n3)求出每一项的系数
但其实不一定非得这么做
假设现在有三个点
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
x
0
≠
x
1
≠
x
2
(x_0,y_0),(x_1,y_1),(x_2,y_2),x_0≠x_1≠x_2
(x0,y0),(x1,y1),(x2,y2),x0̸=x1̸=x2
不解方程组,求一条同时经过三点的函数
y
=
f
(
k
)
y=f(k)
y=f(k) (可能是一条抛物线或一条直线)
不考虑三点共线,我们就把它看做一条抛物线来解
而拉格朗日(Lagrange) 认为
f
(
n
)
f(n)
f(n)可以通过三条抛物线相加得到
-
函数 y = f 0 ( k ) y=f_0(k) y=f0(k),过 ( x 0 , 1 ) , ( x 1 , 0 ) , ( x 2 , 0 ) (x_0,1),(x_1,0),(x_2,0) (x0,1),(x1,0),(x2,0)三点
-
函数 y = f 1 ( k ) y=f_1(k) y=f1(k),过 ( x 0 , 0 ) , ( x 1 , 1 ) , ( x 2 , 0 ) (x_0,0),(x_1,1),(x_2,0) (x0,0),(x1,1),(x2,0)三点
-
函数 y = f 2 ( k ) y=f_2(k) y=f2(k),过 ( x 0 , 0 ) , ( x 1 , 0 ) , ( x 2 , 1 ) (x_0,0),(x_1,0),(x_2,1) (x0,0),(x1,0),(x2,1)三点
为什么非得是这样的三个函数呢?
因为把三条函数各乘上
y
0
,
y
1
,
y
2
y_0,y_1,y_2
y0,y1,y2,会有美妙的性质
-
函数 y = y 0 f 0 ( k ) y=y_0f_0(k) y=y0f0(k),过 ( x 0 , y 0 ) , ( x 1 , 0 ) , ( x 2 , 0 ) (x_0,y_0),(x_1,0),(x_2,0) (x0,y0),(x1,0),(x2,0)三点
-
函数 y = y 1 f 1 ( k ) y=y_1f_1(k) y=y1f1(k),过 ( x 0 , 0 ) , ( x 1 , y 1 ) , ( x 2 , 0 ) (x_0,0),(x_1,y_1),(x_2,0) (x0,0),(x1,y1),(x2,0)三点
-
函数 y = y 2 f 2 ( k ) y=y_2f_2(k) y=y2f2(k),过 ( x 0 , 0 ) , ( x 1 , 0 ) , ( x 2 , y 2 ) (x_0,0),(x_1,0),(x_2,y_2) (x0,0),(x1,0),(x2,y2)三点
那么把
y
0
f
0
(
k
)
,
y
1
f
1
(
k
)
y_0f_0(k),y_1f_1(k)
y0f0(k),y1f1(k)和
y
2
f
2
(
k
)
y_2f_2(k)
y2f2(k)加起来,最终的函数不就同时过三点了
所以
f
(
k
)
=
y
0
f
0
(
k
)
+
y
1
f
1
(
k
)
+
y
2
f
2
(
k
)
f(k)=y_0f_0(k)+y_1f_1(k)+y_2f_2(k)
f(k)=y0f0(k)+y1f1(k)+y2f2(k)
对于为什么可以这么构造这东西,有一篇知乎说得还好,可以去看一下
构造
构造哪一个先都是一样的,所以我们只考虑构造
f
0
(
k
)
f_0(k)
f0(k)
明显,我们可以这样来构造
f
0
(
k
)
=
(
k
−
x
1
)
(
k
−
x
2
)
(
x
0
−
x
1
)
(
x
0
−
x
2
)
f_0(k)={{(k-x_1)(k-x_2)}\over{(x_0-x_1)(x_0-x_2)}}
f0(k)=(x0−x1)(x0−x2)(k−x1)(k−x2)
把
k
=
x
0
k=x_0
k=x0代入,值为
1
1
1;把
k
=
x
1
k=x_1
k=x1或
k
=
x
2
k=x_2
k=x2代入,值都为
0
0
0
加上剩下的两个函数放在一起也可以这么写
f
i
(
k
)
=
∏
i
≠
j
0
≤
j
≤
n
k
−
x
j
x
i
−
x
j
=
∏
i
≠
j
0
≤
j
≤
n
(
k
−
x
j
)
∏
i
≠
j
0
≤
j
≤
n
(
x
i
−
x
j
)
f_i(k)=\prod^{0≤j≤n}_{i≠j}{{k-x_j}\over{x_i-x_j}}={\prod^{0≤j≤n}_{i≠j}{(k-x_j)}\over\prod^{0≤j≤n}_{i≠j}{(x_i-x_j)}}
fi(k)=i̸=j∏0≤j≤nxi−xjk−xj=∏i̸=j0≤j≤n(xi−xj)∏i̸=j0≤j≤n(k−xj)
最终的
f
(
k
)
f(k)
f(k),就变成了
f
(
k
)
=
∑
i
=
0
n
y
i
∗
∏
i
≠
j
0
≤
j
≤
n
(
k
−
x
j
)
∏
i
≠
j
0
≤
j
≤
n
(
x
i
−
x
j
)
f(k)=\sum^{n}_{i=0}y_i*{\prod^{0≤j≤n}_{i≠j}{(k-x_j)}\over\prod^{0≤j≤n}_{i≠j}{(x_i-x_j)}}
f(k)=i=0∑nyi∗∏i̸=j0≤j≤n(xi−xj)∏i̸=j0≤j≤n(k−xj)