数值分析实验之拉格朗日插值法

拉格朗日插值法

摘要

在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。拉格朗日插值法最早被英国数学家爱德华·华林于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+1xkyk+1yk(xxk)
两点式: 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+1xkxk+1x+yk+1xk+1xkxxk
由两点式可以看出, 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)=xkxk+1xxk+1,lk+1(x)=xk+1xkxxk线性组合得到的,其系数为 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} lk1, 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} yk1),( 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)=(xkxk1)(xkxk+1)(xxk1)(xxk+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+1xk1)(xk+1xk)(xxk1)(xxk)进而得到二次线性插值多项式 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)=yk1lk1(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=0nyklk(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)=(45)(46)(x5)(x6)

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)=(54)(56)(x4)(x6)

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)=(64)(65)(x4)(x5)

然后应用拉格朗日插值法,就可以得到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(x228x+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)))
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值