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