拉格朗日插值法小结

插值就是找一个多项式过几个已知的点。

使用待定系数法+高斯消元可以做到O(n3) O ( n 3 )。这显然不是最优解,不然标签就是高斯消元了= =

下面介绍拉格朗日插值法。
我们考虑一个多项式函数f(x) f ( x ),其中f(xi)=yi f ( x i ) = y i。再考虑一个一个多项式g(x) g ( x ),其中g(xi)=zi g ( x i ) = z i。他们的和函数h(x) h ( x ),即这两个多项式的和,可以表示成h(xi)=yi+zi h ( x i ) = y i + z i

那么,举个例子,如果我们找到一个多项式y=k1x+b1 y = k 1 x + b 1(1,3)(2,0) ( 1 , 3 ) 和 ( 2 , 0 ),还有一个多项式y=k2x+b2 y = k 2 x + b 2(1,0)(2,1) ( 1 , 0 ) 和 ( 2 , 1 ),把这两个多项式加起来,就可以的到一个过(1,3)(2,1) ( 1 , 3 ) 和 ( 2 , 1 )的多项式。

假如我们要为n个点做一个n-1次多项式,设这n个点为(xi,yi) ( x i , y i ),这个多项式可以看做n个下面的函数的和。其中,第i i个多项式函数fi除了在fi(xi)=yi f i ( x i ) = y i外,其他的位置取值都为0,即fi(xj)=0(ij) f i ( x j ) = 0 ( i ≠ j )

大家应该学过二次函数的零点式,即

f(x)=a(xx1)(xx2) f ( x ) = a ( x − x 1 ) ( x − x 2 )

显然在 f(x)=0 f ( x ) = 0时,必有 x1,x2 x 1 , x 2两解。推而广之,一个有n个顶点的n次多项式可以写为,
f(x)=a(xx1)(xx2)(xxn) f ( x ) = a ( x − x 1 ) ( x − x 2 ) … … ( x − x n )

那么插值用的第i个多项式可写作为

fi(x)=aij(xxj) f i ( x ) = a ∏ i ≠ j ( x − x j )

又有fi(xi)=yi f i ( x i ) = y i,带入xi x i,可得

a=yiij(xixj) a = y i ∏ i ≠ j ( x i − x j )

所以

fi(x)=yiij(xxj)ij(xixj) f i ( x ) = y i ∗ ∏ i ≠ j ( x − x j ) ∏ i ≠ j ( x i − x j )

所以,插值总式为,

f(x)=i=1nyiij(xxj)ij(xixj) f ( x ) = ∑ i = 1 n y i ∗ ∏ i ≠ j ( x − x j ) ∏ i ≠ j ( x i − x j )

也可以写作,

f(x)=i=1naij(xxj) f ( x ) = ∑ i = 1 n a ∗ ∏ i ≠ j ( x − x j )

显然这时候预处理a aO(n2),求一次值也要O(n2) O ( n 2 )

如果我们先预处理出D=ni=1(xxi) D = ∏ i = 1 n ( x − x i )Dxxi=ij(xxj) D x − x i = ∏ i ≠ j ( x − x j ),就可以O(n) O ( n )求值。

假如xi x i为等差数列,那么也可以通过预处理阶乘跑出 ij(xixj) ∏ i ≠ j ( x i − x j ),从而做到O(n) O ( n )插值,O(n) O ( n )求值。

也就是告诉我们,当xi x i可以由我们定的时候,显然要按顺序算啦。


版权声明:本文为liangzihao1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。