真.浅析拉格朗日插值法
拉格朗日插值法用来干什么
mmmm…,这个不好解释
形象的来说,就是给你一个函数
f
(
x
)
f(x)
f(x)(不知道函数是什么的自己查),这个函数你不知道是长什么样子的,然后告诉你这个函数的最高次数是
n
n
n,再给你
n
+
1
n+1
n+1数,以及这n+1个点每个的函数值也告诉你,让你求
f
(
k
)
f(k)
f(k),k可以为任何数
从数学角度来看待:
有一个函数
f
(
x
)
,
最高次数项为
n
已知
n
+
1
个数
x
0
,
x
1
,
x
2
.
.
.
x
n
,
和
f
(
x
0
)
,
f
(
x
1
)
.
.
.
.
f
(
x
n
)
求
f
(
k
)
有一个函数f(x),最高次数项为n\\ 已知n+1个数x_0,x_1,x_2...x_n,和f(x_0),f(x_1)....f(x_n)\\ 求f(k)
有一个函数f(x),最高次数项为n已知n+1个数x0,x1,x2...xn,和f(x0),f(x1)....f(xn)求f(k)
说实话,我敢称拉格朗日插值为数学读心术
拉格朗日插值怎么做
首先,我们先抛开拉格朗日插值法不谈,就只看题目,你的想法是什么?
一阶同学:?,二阶同学:?,三阶同学:?,长郡oj学生(周禹坤/姜元程/…):高斯消元!!!
没错,确实可以用高斯消元来解,问题是怎么解?
我们知道这个函数的最高次数项为
n
,
所以说这个函数可以写成如下形式
:
f
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
a
3
x
3
+
.
.
.
+
a
n
x
n
a
i
是
i
次项的系数
因此可以写出高斯消元组
a
0
+
a
1
x
0
+
a
2
x
0
2
+
a
3
x
0
3
+
.
.
.
+
a
n
x
0
n
=
f
(
x
0
)
a
0
+
a
1
x
1
+
a
2
x
1
2
+
a
3
x
1
3
+
.
.
.
+
a
n
x
1
n
=
f
(
x
1
)
.
.
.
a
0
+
a
1
x
n
+
a
2
x
n
2
+
a
3
x
n
3
+
.
.
.
+
a
n
x
n
n
=
f
(
x
n
)
把每个系数求出来之后,再将
k
带入进去,就可以得到
f
(
k
)
了
我们知道这个函数的最高次数项为n,所以说这个函数可以写成如下形式:\\ f(x)=a_0+a_1x+a_2x^2+a_3x^3+...+a_nx^n\\ a_i是i次项的系数\\ 因此可以写出高斯消元组\\ a_0+a_1x_0+a_2x_0^2+a_3x_0^3+...+a_nx_0^n=f(x_0)\\ a_0+a_1x_1+a_2x_1^2+a_3x_1^3+...+a_nx_1^n=f(x_1)\\ .\\ .\\ .\\ a_0+a_1x_n+a_2x_n^2+a_3x_n^3+...+a_nx_n^n=f(x_n)\\ 把每个系数求出来之后,再将k带入进去,就可以得到f(k)了
我们知道这个函数的最高次数项为n,所以说这个函数可以写成如下形式:f(x)=a0+a1x+a2x2+a3x3+...+anxnai是i次项的系数因此可以写出高斯消元组a0+a1x0+a2x02+a3x03+...+anx0n=f(x0)a0+a1x1+a2x12+a3x13+...+anx1n=f(x1)...a0+a1xn+a2xn2+a3xn3+...+anxnn=f(xn)把每个系数求出来之后,再将k带入进去,就可以得到f(k)了
我们想想这种方法的时间复杂度是多少?
O ( n 3 + n ) = O ( n 3 ) O(n^3+n)=O(n^3) O(n3+n)=O(n3)
可以看到复杂度特别的高,对于 n ≤ 1 0 3 n\le10^3 n≤103的数据就过不了了
那么我们再来看拉格朗日插值
定理一: n + 1 n+1 n+1个点,确定一个 n n n次多项式
所以说我们只要自己构造一个n次函数 g ( x ) g(x) g(x),他可以穿过那 n + 1 n+1 n+1个点,那么他就是 f ( x ) f(x) f(x)
那我们考虑如何构造。我们可以构造 n + 1 n+1 n+1个函数 f 0 ( x ) , f 1 ( x ) , f 2 ( x ) . . . f n ( x ) f_0(x),f_1(x),f_2(x)...f_n(x) f0(x),f1(x),f2(x)...fn(x)
构造要求: f i ( x ) , 当 x 为 x i 时 , f i ( x ) 为 1 , 当 x 为 x j ( j 不等于 i ) 时 f i ( x ) 为 0 , 其他情况后面再说 f_i(x),当x为x_i时,f_i(x)为1,当x为x_j(j不等于i)时f_i(x)为0,其他情况后面再说 fi(x),当x为xi时,fi(x)为1,当x为xj(j不等于i)时fi(x)为0,其他情况后面再说
先看当 x 为 x j ( j 不等于 i ) 时 f i ( x ) 为 0 这一条,我们知道 , 0 乘任何数都等于 0 ,可以考虑 f i ( x ) = ∏ j = 0 , j 不等于 i n ( x − x j ) , 这样子就满足了这一条 先看当x为x_j(j不等于i)时f_i(x)为0这一条,我们知道,0乘任何数都等于0,可以考虑f_i(x)=\prod_{j=0,j不等于i}^{n}(x-x_j),这样子就满足了这一条 先看当x为xj(j不等于i)时fi(x)为0这一条,我们知道,0乘任何数都等于0,可以考虑fi(x)=∏j=0,j不等于in(x−xj),这样子就满足了这一条
那么 f i ( x ) , 当 x 为 x i 时 , f i ( x ) 为 1 , 这条怎么和上条结合呢,哦,我们只需要在除以一个 ∏ j = 0 , j 不等于 i n ( x i − x j ) 就可以了 那么f_i(x),当x为x_i时,f_i(x)为1,这条怎么和上条结合呢,哦,我们只需要在除以一个\prod_{j=0,j不等于i}^{n}(x_i-x_j)就可以了 那么fi(x),当x为xi时,fi(x)为1,这条怎么和上条结合呢,哦,我们只需要在除以一个∏j=0,j不等于in(xi−xj)就可以了
所以总结下来,公式就是 f i ( x ) = ∏ j = 0 , j 不等于 i n ( x − x j ) ∏ j = 0 , j 不等于 i n ( x i − x j ) 所以总结下来,公式就是f_i(x)=\frac{\prod_{j=0,j不等于i}^{n}(x-x_j)}{\prod_{j=0,j不等于i}^{n}(x_i-x_j)} 所以总结下来,公式就是fi(x)=∏j=0,j不等于in(xi−xj)∏j=0,j不等于in(x−xj)
那么构造这些函数有什么用呢,我们看一下,如果将函数 f i ( x ) f_i(x) fi(x)去乘上一个 f ( x i ) f(x_i) f(xi),你就会发现这个函数 f ( x i ) f i ( x ) f(x_i)f_i(x) f(xi)fi(x)在 x = x i x=x_i x=xi时,函数值为 f ( x i ) f(x_i) f(xi), 当 x 为 x j ( j 不等于 i ) 时 f ( x i ) f i ( x ) 为 0 当x为x_j(j不等于i)时f(x_i)f_i(x)为0 当x为xj(j不等于i)时f(xi)fi(x)为0
将每个函数加起来,得到的最终结果就是原函数了
最终公式为 f ( x ) = ∑ i = 0 n f ( x i ) ∏ j = 0 , j 不等于 i n ( x − x j ) ∏ j = 0 , j 不等于 i n ( x i − x j ) 最终公式为f(x)=\sum_{i=0}^{n}f(x_i)\frac{\prod_{j=0,j不等于i}^{n}(x-x_j)}{\prod_{j=0,j不等于i}^{n}(x_i-x_j)} 最终公式为f(x)=∑i=0nf(xi)∏j=0,j不等于in(xi−xj)∏j=0,j不等于in(x−xj)