数値分析実験のラグランジュ補間法

9471 ワード

ラグランジュ補間法
サマリ
数値解析では,ラグランジュ補間法はフランスの18世紀の数学者ジョセフ・ラグランジュによって命名された多項式補間法である.多くの実際の問題では、ある内在的なつながりや法則を関数で表すが、多くの関数は実験と観測でしか理解できない.実際のある物理量を観測し、いくつかの異なる場所で相応の観測値を得ると、ラグランジュ補間法は多項式を見つけることができ、各観測の点で観測した値をちょうど取ることができる.このような多項式をラグランジュ(補間)多項式と呼ぶ.数学的には,ラグランジュ補間法は2次元平面上のいくつかの既知の点を適切に通過する多項式関数を与えることができる.ラグランジュ補間法はイギリスの数学者エドワード・ウォーリンによって1779年に発見された[1].やがて(1783年)レオンハド・オーラによって再び発見された.1795年、ラグランジュは著書「師範学校数学基礎教程」でこの補間方法を発表し、それから彼の名前はこの方法と結びついた.
リニア補間(Linear Interpolation)
補間多項式P(x)=a 0+a 1 x+....+a n x n P(x) = a_0 + a_1x +....+ a_nx^n P(x)=a0​+a1​x+....+an xn,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)L 1(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=L 1(x)の幾何学的意味は、2点(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)L 1(x)の式は、点斜式:L 1(x)=y k+y k+1−y k x k+1−x k(x−x)L_1(x) = y_k +\frac{y_{k+1} - y_k}{x_{k+1} - x_k}(x−x_k)L 1(x)=yk+xk+1−xk yk+1−yk(x−xk)二点式:L 1(x)=yk+xk+1−xk+1−xk+yk+1 x−xk+1−xk+1−xk+1−xk+1−xk 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}L 1(x)=yk+xk+1−xk xk+1−x+yk+1 xk+1−xk−xk−xkは2点式からL 1(x)L_1(x)L 1(x)は2つの線形関数lk(x)=x−x k+1 x−k−x k+1,lk+1(x)=x−x−x−k x+1−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+1 x−xk+1,lk+1(x)=xk+1−xk−xk−xkの線形組合せから得られ,その係数はy ky_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)L 1(x)=yk lk(x)+yk+1 lk+1(x)n=2のとき,基底関数によりL 2(x)L_を求めることができる2(x)L 2(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)L 2(x)は、(x k 1 x_{k 1}xk 1,y k−1 y_{k−1}yk−1),(x k x_k xk,y k y_k),(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−k−1)(x−x−x−k−k−1)(x−x−x−x−k+1)(x−x−x+k+1)(x−x−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−xk−1)(x−xk−xk−1)(x−x−xk−xk)を得て、二次線形補間多項式L 2(x)=y k−1(x)=k−1 l k−1(x)+y k l k(x)+y k+k+1 l k+k+k+1(x)+k+k+1 l k+k+1(k+1(x 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−1​lk−1​(x)+yk​lk​(x)+yk+1​lk+1​(x)
ラグランジュ補間多項式
ある多項式関数について定義すると、所与のk+1個の取値点が既知である:(x 0,y 0 x_0,y_0 x 0,y 0),…,(x k,y k x_k,y_k,y)ここでx j x_j xjは引数の位置に対応し,y j y_j yjは関数のこの位置での取値に対応する.任意の2つの異なるxjが互いに異なると仮定すると、ラグランジュ補間式を適用して得られるラグランジュ補間多項式は、L(x)=Σk=0 ny kl k(x)L(x)=sum_である.{k=0}^{n}{y_kl_k(x)}L(x)=k=0Σnyk lk(x)ここでl k(x)l_k(x)lk(x)はラグランジュのn次補間基底関数の例である.ある二次多項式関数fがあると仮定し、f(4)=10 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(6)=1 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_x(x)=p(x)=f(4)l 0(x)+f(5)l 1(x)+f(6)l 2(x)計算結果p(x)=1 4(x)=1 4(x 2−28 x+136)p(x)=frac{ 1}{4}(x^2−28 x+136)p(x)=41(x 2−28 x+136)p(x)=41(x 2−28 x+136)このときx=18を代入すれば必要な値を求めることができる:f(18)=p(18)=p(18)=−11 f(18)=p(18)=−11 f(18)=p(18)=−11 f(18(18)=p(18)=p(18)=11 f(18(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)))