拉格朗日插值法
摘要
在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。拉格朗日插值法最早被英国数学家爱德华·华林于1779年发现[1],不久后(1783年)由莱昂哈德·欧拉再次发现。1795年,拉格朗日在其著作《师范学校数学基础教程》中发表了这个插值方法,从此他的名字就和这个方法联系在一起
线性插值
对于插值多项式
P
(
x
)
=
a
0
+
a
1
x
+
.
.
.
.
+
a
n
x
n
P(x) = a_0 + a_1x +....+ a_nx^n
P(x)=a0+a1x+....+anxn,对于n = 1时,假定区间[
x
k
,
x
k
+
1
x_k,x_{k+1}
xk,xk+1]及端点
y
k
=
f
(
x
k
)
,
y
k
+
1
=
f
(
x
k
+
1
)
y_k = f(x_k),y_{k+1} = f(x_{k+1})
yk=f(xk),yk+1=f(xk+1)要求线性插值多项式
L
1
(
x
k
)
L_1(x_k)
L1(xk),使它满足
L
1
(
x
k
)
=
y
k
,
L
1
(
x
k
+
1
)
=
y
k
+
1
L_1(x_k) = y_k, L_1(x_{k+1}) = y_{k+1}
L1(xk)=yk,L1(xk+1)=yk+1.
y
=
L
1
(
x
)
y = L_1(x)
y=L1(x)的几何意义就是通过两点(
x
k
,
y
k
x_k, y_k
xk,yk),(
x
k
+
1
,
y
k
+
1
x_{k+1}, y_{k+1}
xk+1,yk+1)的直线,
L
1
(
x
)
L_1(x)
L1(x)的表达式如下:
点斜式:
L
1
(
x
)
=
y
k
+
y
k
+
1
−
y
k
x
k
+
1
−
x
k
(
x
−
x
k
)
L_1(x) = y_k + \frac{y_{k+1} - y_k}{x_{k+1} - x_k}(x - x_k)
L1(x)=yk+xk+1−xkyk+1−yk(x−xk)
两点式:
L
1
(
x
)
=
y
k
+
x
k
+
1
−
x
x
k
+
1
−
x
k
+
y
k
+
1
x
−
x
k
x
k
+
1
−
x
k
L_1(x) = y_k +\frac{x_{k+1} - x}{x_{k+1} - x_k} + y_{k+1}\frac{x - x_k}{x_{k+1} - x_k}
L1(x)=yk+xk+1−xkxk+1−x+yk+1xk+1−xkx−xk
由两点式可以看出,
L
1
(
x
)
L_1(x)
L1(x)是由两个线性函数
l
k
(
x
)
=
x
−
x
k
+
1
x
k
−
x
k
+
1
,
l
k
+
1
(
x
)
=
x
−
x
k
x
k
+
1
−
x
k
l_k(x) = \frac{x - x_{k+1}}{x_k - x_{k+1}}, l_{k+1}(x) = \frac{x - x_k}{x_{k+1} - x_k}
lk(x)=xk−xk+1x−xk+1,lk+1(x)=xk+1−xkx−xk线性组合得到的,其系数为
y
k
y_k
yk及
y
k
+
1
y_{k+1}
yk+1,即
L
1
(
x
)
=
y
k
l
k
(
x
)
+
y
k
+
1
l
k
+
1
(
x
)
L_1(x) = y_kl_k(x) + y_{k+1}l_{k+1}(x)
L1(x)=yklk(x)+yk+1lk+1(x)
当n = 2时,我们可以通过基函数可以求得
L
2
(
x
)
L_2(x)
L2(x)的表达式,此时基函数为
l
k
−
1
l_{k-1}
lk−1,
l
k
l_k
lk和
l
k
+
1
l_{k+1}
lk+1,我们知道
L
2
(
x
)
L_2(x)
L2(x)通过(
x
k
1
x_{k1}
xk1,
y
k
−
1
y_{k-1}
yk−1),(
x
k
x_k
xk,
y
k
y_k
yk),(
x
k
+
1
x_{k+1}
xk+1,
y
k
+
1
y_{k+1}
yk+1),由此可以得出二次插值基函数的表达式
l
k
(
x
)
=
(
x
−
x
k
−
1
)
(
x
−
x
k
+
1
)
(
x
k
−
x
k
−
1
)
(
x
k
−
x
k
+
1
)
l_k(x) = \frac{(x - x_{k-1})(x - x_{k+1})}{(x_k - x_{k-1})(x_k - x_{k+1})}
lk(x)=(xk−xk−1)(xk−xk+1)(x−xk−1)(x−xk+1)
l
k
+
1
(
x
)
=
(
x
−
x
k
−
1
)
(
x
−
x
k
)
(
x
k
+
1
−
x
k
−
1
)
(
x
k
+
1
−
x
k
)
l_{k+1}(x) = \frac{(x - x_{k-1})(x - x_k)}{(x_{k+1} - x_{k-1})(x_{k+1} - x_k)}
lk+1(x)=(xk+1−xk−1)(xk+1−xk)(x−xk−1)(x−xk)进而得到二次线性插值多项式
L
2
(
x
)
=
y
k
−
1
l
k
−
1
(
x
)
+
y
k
l
k
(
x
)
+
y
k
+
1
l
k
+
1
(
x
)
L_2(x) = y_{k-1}l_{k-1}(x) + y_kl_k(x) + y_{k+1}l_{k+1}(x)
L2(x)=yk−1lk−1(x)+yklk(x)+yk+1lk+1(x)
拉格朗日插值多项式
定义
对某个多项式函数,已知有给定的k + 1个取值点:(
x
0
,
y
0
x_0,y_0
x0,y0),…,(
x
k
,
y
k
x_k,y_k
xk,yk)其中
x
j
x_j
xj对应着自变量的位置,而
y
j
y_j
yj对应着函数在这个位置的取值。假设任意两个不同的xj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
L
(
x
)
=
∑
k
=
0
n
y
k
l
k
(
x
)
L(x) = \sum_{k = 0}^{n}{y_kl_k(x)}
L(x)=k=0∑nyklk(x)
其中
l
k
(
x
)
l_k(x)
lk(x)为拉格朗日的n次插值基函数
范例
假设有某个二次多项式函数f,已知它在三个点上的取值为:
f
(
4
)
=
10
f(4) = 10
f(4)=10
f
(
5
)
=
5.25
f(5) = 5.25
f(5)=5.25
f
(
6
)
=
1
f(6) = 1
f(6)=1试求
f
(
18
)
f(18)
f(18)的值。首先写出每个拉格朗日基本多项式:
l 0 ( x ) = ( x − 5 ) ( x − 6 ) ( 4 − 5 ) ( 4 − 6 ) l_{0}(x)=\frac{(x-5)(x-6)}{(4-5)(4-6)} l0(x)=(4−5)(4−6)(x−5)(x−6)
l 1 ( x ) = ( x − 4 ) ( x − 6 ) ( 5 − 4 ) ( 5 − 6 ) l_{1}(x)=\frac{(x-4)(x-6)}{(5-4)(5-6)} l1(x)=(5−4)(5−6)(x−4)(x−6)
l 2 ( x ) = ( x − 4 ) ( x − 5 ) ( 6 − 4 ) ( 6 − 5 ) l_{2}(x)=\frac{(x-4)(x-5)}{(6-4)(6-5)} l2(x)=(6−4)(6−5)(x−4)(x−5)
然后应用拉格朗日插值法,就可以得到p的表达式(p为函数f的插值多项式函数):
p
(
x
)
=
f
(
4
)
l
0
(
x
)
+
f
(
5
)
l
1
(
x
)
+
f
(
6
)
l
2
(
x
)
p(x) = f(4)l_0(x) + f(5)l_1(x) + f(6)l_2(x)
p(x)=f(4)l0(x)+f(5)l1(x)+f(6)l2(x)计算后的结果是
p
(
x
)
=
1
4
(
x
2
−
28
x
+
136
)
p(x) = \frac{1}{4}(x^2 - 28x + 136)
p(x)=41(x2−28x+136)
此时代入x = 18就可以求出所需要的值:
f
(
18
)
=
p
(
18
)
=
−
11
f(18) = p(18) = -11
f(18)=p(18)=−11
#输入插值基函数的次数n
n = int(input("Enter the number of interpolation:"))
#计算拉格朗日多项式结果
def l_k(X, Y, x):
L = 0.0
for i in range(len(Y)):
l_k = Y[i]
for j in range(len(Y)):
if i != j:
#n次插值基函数
l_k *= (x - X[j]) / (X[i] - X[j])
L += l_k
return L
#输入自变量向量列表X,和因变量列表Y
for i in range(n):
X.append(float(input("Enter the independent variable X{}:".format(i))))
Y.append(float(input("Enter the dependent variable Y{}:".format(i))))
i += 1
print("X = {}".format(X))
print("Y = {}".format(Y))
x = float(input("Enter the value of the independent variable of the dependent variable x:"))
print("The value of Y({}) = {}".format(x, l_k(X, Y, x)))