前言
似乎上个暑假就玩过这玩意了,当时还感叹为什么中考前没学。
其实还挺简单的。
历史
这个就当故事看吧。
在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。拉格朗日插值法最早被英国数学家爱德华·华林于1779年发现,不久后(1783年)由莱昂哈德·欧拉再次发现。1795年,拉格朗日在其著作《师范学校数学基础教程》中发表了这个插值方法,从此他的名字就和这个方法联系在一起。
——百度百科
一般的拉格朗日插值法
有什么用
首先拉格朗日插值法是一个比较万用的插值法。
插值法指的是把一个多项式的点值表达变成插值表达(不会的去学fft)
然后一般我们会用到三种方法:
高斯消元
O
(
n
3
)
O(n^3)
O(n3)
拉格朗日插值
O
(
n
2
)
O(n^2)
O(n2)
牛顿插值(没学,好像解决了拉格朗日插值一个缺点)
定义
首先,给出k+1个二维平面上的点值。
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
…
…
(
x
k
,
y
k
)
(x_0,y_0),(x_1,y_1)……(x_k,y_k)
(x0,y0),(x1,y1)……(xk,yk)
这些点值表示的是要求的多项式在
x
i
x_i
xi时取值为
y
i
y_i
yi
然后这些理解起来可以看下面的图(转的)
解释一下就是里面点了四个点:
(
−
9
,
5
)
(
−
4
,
2
)
(
−
1
,
−
2
)
(
7
,
9
)
(-9, 5)(-4, 2)(-1,-2)(7,9)
(−9,5)(−4,2)(−1,−2)(7,9)
然后我们要找到一个多项式表示的形式穿过这些点,函数即为图中黑线。
至于会不会有多条的问题,科学家证明是不会的。(我不是科学家,所以我不费证明)
然后我们定义我们要求的这玩意:
运用拉格朗日公式所得的拉格朗日多项式为:
L
(
x
)
=
∑
i
=
0
k
y
i
∗
l
(
i
,
x
)
L(x)=\sum_{i=0}^ky_i*l(i,x)
L(x)=i=0∑kyi∗l(i,x)
其中
l
(
i
,
x
)
l(i,x)
l(i,x)为拉格朗日基本多项式或称插值基函数,似乎网上都把它写成
l
i
(
x
)
l_i(x)
li(x)的形式。但为了便于表达,我还是写成
l
(
i
,
x
)
l(i,x)
l(i,x)。它的表达式如下:
l
(
i
,
x
)
=
∏
j
=
0
,
j
!
=
i
k
x
−
x
j
x
i
−
x
j
l(i,x)=\prod_{j=0,j!=i}^k\frac{x-x_j}{x_i-x_j}
l(i,x)=j=0,j!=i∏kxi−xjx−xj
然后这样就可以将原来的点值表达变成插值表达了。
举例
举个栗子,来更好理解理解。
来到中考题:
给出三个点:(0,1)(2,4)(3,10)求二次函数表达式。
那么我们来用牛刀杀鸡吧。
l
(
0
,
x
)
=
(
x
−
2
)
(
x
−
3
)
(
0
−
2
)
(
0
−
3
)
=
x
2
−
5
x
+
6
6
l(0,x)=\frac{(x-2)(x-3)}{(0-2)(0-3)}=\frac{x^2-5x+6}6
l(0,x)=(0−2)(0−3)(x−2)(x−3)=6x2−5x+6
l
(
1
,
x
)
=
(
x
−
0
)
(
x
−
3
)
(
2
−
0
)
(
2
−
3
)
=
−
x
2
−
3
x
2
l(1,x)=\frac{(x-0)(x-3)}{(2-0)(2-3)}=-\frac{x^2-3x}2
l(1,x)=(2−0)(2−3)(x−0)(x−3)=−2x2−3x
l
(
2
,
x
)
=
(
x
−
0
)
(
x
−
2
)
(
3
−
0
)
(
3
−
2
)
=
x
2
−
2
x
3
l(2,x)=\frac{(x-0)(x-2)}{(3-0)(3-2)}=\frac{x^2-2x}3
l(2,x)=(3−0)(3−2)(x−0)(x−2)=3x2−2x
然后再上我们的多项式:
L
(
x
)
=
x
2
−
5
x
+
6
6
−
4
x
2
−
12
x
2
+
10
x
2
−
20
x
3
=
3
2
x
2
−
3
2
x
+
1
L(x)=\frac{x^2-5x+6}6-\frac{4x^2-12x}2+\frac{10x^2-20x}3=\frac3 2x^2-\frac 3 2x+1
L(x)=6x2−5x+6−24x2−12x+310x2−20x=23x2−23x+1
然后你中考就可以拿到一个很好看的分数了
x值连续的拉格朗日插值法
其实这个就基本是用前缀和后缀和优化一下。
没啥好讲的。
重心拉格朗日插值法
这个就看起来比较有用了。
加入题目要求的是变化性的改变多项式,也就是时不时多加入一个点进去的话。
那么原来的拉格朗日每次都要重新来一边(累)
这个就比较nb了,可以比较好地解决这个问题。
原式整合一下:
L
(
x
)
=
∑
i
=
0
k
y
i
∗
∏
j
=
0
,
j
!
=
i
k
x
−
x
j
x
i
−
x
j
L(x)=\sum_{i=0}^ky_i*\prod_{j=0,j!=i}^k\frac{x-x_j}{x_i-x_j}
L(x)=i=0∑kyi∗j=0,j!=i∏kxi−xjx−xj
我们设两个东东:
设
g
=
∏
i
=
0
k
x
−
x
[
i
]
g=\prod_{i=0}^kx-x[i]
g=∏i=0kx−x[i]
然后把这玩意儿拉出来,原式就变成:
L
(
x
)
=
g
∗
∑
i
=
0
k
∏
j
=
0
,
j
!
=
i
k
y
i
(
x
i
−
x
j
)
(
k
−
x
j
)
L(x)=g*\sum_{i=0}^k\prod_{j=0,j!=i}^k\frac{y_i}{(x_i-x_j)(k-x_j)}
L(x)=g∗i=0∑kj=0,j!=i∏k(xi−xj)(k−xj)yi
再设
h
=
∏
j
=
0
,
j
!
=
i
k
y
i
x
i
−
x
j
h=\prod_{j=0,j!=i}^k\frac{y_i}{x_i-x_j}
h=∏j=0,j!=ikxi−xjyi,变成:
L
(
x
)
=
g
∗
∑
i
=
0
k
h
k
−
x
j
L(x)=g*\sum_{i=0}^k\frac{h}{k-x_j}
L(x)=g∗i=0∑kk−xjh
所以我们每次如果要新插入一个数的时候,重新计算h即可。
复杂度就降为
O
(
n
)
O(n)
O(n)了。
应用
这玩意应用挺广的。
经典应用大概就是我们的自然数幂求和。
∑
i
=
1
n
i
k
\sum_{i=1}^ni^k
i=1∑nik
但是这玩意儿怎么变成多项式。
看看:
当k=1时,柿子表示为
n
∗
(
n
+
1
)
/
2
n*(n+1)/2
n∗(n+1)/2
当k=2时,柿子表示为
n
∗
(
n
+
1
)
∗
(
2
n
+
1
)
/
6
n*(n+1)*(2n+1)/6
n∗(n+1)∗(2n+1)/6
之后怎么样就不知道了。但这里有篇(看不懂的)论文有讲。
好东东
总之这玩意可以表示成一个关于n的k+1次多项式。
而且由于x是连续的,所以可以表示成前缀后缀加速一下。
然后就可以在
O
(
k
)
O(k)
O(k)的时间内解决。
例题?
jzoj6641. 【GDOI20205.20模拟】Sequence
参考资料
https://www.cnblogs.com/lbssxz/p/12079359.html
https://www.cnblogs.com/fengzhiyuan/p/8645246.html
https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html
https://www.cnblogs.com/zwfymqz/p/8253227.html