拉格朗日插值数学原理:
根据数学知识,对于平面上已知的n个点(无两点在一条直线上)可以找到一个 n-1 次多项式:
y=a0+a1x+a2x2+...+an−1xn−1
为了进行根据新的x, 求出对应的 y值,需要求出上式中的系数 a0,a1,a2....an−1
因为n个点(x1,y1),(x2,y2)...(xn,yn)在以上多项式上,代入每个点,得
y1=a0+a1x1+a2x21+...+an−1xn−11
y2=a0+a1x2+a2x22+...+an−1xn−12
......
yn=a0+a1xn+a2x2n+...+an−1xn−1n
以上方程组中,n个方程,n个未知数a0,a1...an−1,所以方程可解,可以利用线性代数中的行列式求解。
解出的拉格朗日插值多项式为:
L(x)=y1(x−x2)(x−x3)...(x−xn)(x1−x2)(x1−x3)...(x1−xn)+y2(x−x1)(x−x3)...(x−xn)(x2−x1)(x2−x3)...(x2−xn)+......
+yn(x−x1)(x−x2)...(x−xn−1)(xn−x2)(xn−x3)...(xn−xn−1)
=∑i=0nyi∏j=0,j≠ix−xixi−xj
实例:
假设一个2次多项行式f, 按照前面的介绍,取三个点为
l0(3)=(x−6)(x−9)(3−6)(3−9)
l1(6)=(x−3)(x−9)(6−3)(6−9)
l2(9)=(x−3)(x−6)(9−3)(9−6)
L(x)=f(3)l0(3)+f(6)l1(6)+f(9)l2(9)
=10(x−6)(x−9)(3−6)(3−9)+8(x−3)(x−9)(6−3)(6−9)+4(x−3)(x−6)(9−3)(9−6)
=−x2+3x+909
插值f(10)=209
python 实现
y=a0+a1x+a2x2
from scipy.interpolate import lagrange
x = [3, 6, 9]
y = [10, 8, 4]
lagrange(x,y)
#poly1d([ -0.11111111, 0.33333333, 10. ])
以上 lagrange(x,y) 的输出值 poly1d([−0.11111111,0.33333333,10.]) 值的是多项式的三个系数
即: a0=−0.11111,a1=0.3333333,a2=10.
如果要进行插值操作,可以:
lagrange(x, y)(10)
# 2.222222