ラグランジュ補間とニュートン補間の実装

スプライン補間をやりたかったのですが、
まだできたラグランジュ補間とニュートン補間を行いました。
以下のサイトを参考にしました。
"補間法(ラグランジュ補間とスプライン補間)"
解説はまた今度(くるのか?)

#-*- coding:utf-8 -*-
#ラグランジュ補間
import matplotlib.pyplot as plt

def lagrange(x, y, n, t):
	s = 0.0
	for i in xrange(n):
		p = y[i]
		for j in xrange(n):
			if i != j:
				p = p * (t - x[j]) / (x[i] - x[j])
		s = s + p
	return s

def main():
	x = [0.1, 2.1, 4.0, 5.9, 7.1, 9.2]
	y = [3.0, 5.5, 21.0, 52.0, 26.0, 3.0]
	E = [ i / 10. for i in xrange(93)]
	plt.plot(x, y, 'r*')
	
	F = [lagrange(x, y, 6, t) for t in E]
	plt.plot(E, F)

	plt.show()
	
if __name__ == "__main__":
	main()
#-*- coding:utf -*-
#ニュートン補間
import matplotlib.pyplot as plt

def newton(x, y, n, t):
	flag = 1
	a = [0 for i in xrange(100)]
	w = [0 for i in xrange(100)]
	if flag == 1:
		for i in xrange(n):
			w[ i ] = y[ i ]
			for j in reversed(xrange(0,i)):
				w[ j ] = (w[j + 1] - w[j])/(x[i] - x[j])
			a[i] = w[0]
		flag =-1
	s = a[n - 1]
	for i in reversed(xrange(0, n-1)):
		s = s * (t-x[i]) + a[i]
	return s
	
def main():
	x = [0.1, 2.1, 4.0, 5.9, 7.1, 9.2]
	y = [3.0, 5.5, 21.0, 52.0, 26.0, 3.0]
	E = [ i / 10.for i in xrange(93)]
	plt.plot(x, y, 'r*')
	
	F = [newton(x, y, len(x), t) for t in E]
	plt.plot(E, F)

	plt.show()
	
if __name__ == "__main__":
	main()

#ラグランジュ補間

#ニュートン補間