數值分析Python實現系列—— 一、拉格朗日插值法

Y先生發表於2019-05-11

一、拉格朗日插值法

1.原理:

拉格朗日插值法:給定n個觀測值(xk,yk)找到一組(n個)基函式 lk(x)  , 使得L(x) 為這組基函式的線性組合,並且使得L(x)是經過這些點的多項式

我們發現其中的一種找發是  :  滿足這樣線性組合的係數 是 觀測值yk (n個)

滿足這樣線性組合的基函式形如:

2.Python實現:

思路:

1.觀察發現基函式的分母與x無關,是觀測值x的組合,可以先計算出來,留著以後用

2.每一個預測值先計算分子,再把每一個分子乘以每一個預測值,除以每一個分母,最終加和

3.使用matplotlib裡的plot展示結果,藍色點為觀測值,紅色點為預測值

 1 import matplotlib.pyplot as plt
 2 from functools import reduce
 3 # % matplotlib inline (jupyter notebook使用者建議開啟)
 4 
 5 
 6 def lagrange():
 7     points = eval(input("輸入一個包含2個以上座標的列表:"))
 8     pre = eval(input("輸入預測值列表:"))
 9     length = len(points)
10     result = []
11     # l_k_den用於儲存每一個基函式的分母數值(在計算不同預測值時可以共用)
12     l_k_den = [reduce(lambda x, y: x * y, [num[0] - i[0] for i in points if i[0] != num[0]]) for num in points]
13     for number in pre:
14         # l_k_num用於儲存每一個基函式的分子數值(每一個預測值都不一樣)
15         l_k_num = [reduce(lambda x, y: x * y, [number - i[0] for i in points if i[0] != one[0]]) for one in points]
16         result.append(sum([l_k_num[i] * points[i][1] / l_k_den[i] for i in range(length)]))
17     plt.plot([i[0]for i in points], [i[1] for i in points], 'b*')
18     plt.plot(pre, result, 'r*')
19     plt.show() # pycharm使用者建議使用
20 
21 
22 lagrange()

 

 3.效果展示:

Pycharm:

輸入:

輸出:

jupyter中:

輸入輸出:

4.學習總結:

  1. reduce() 函式會對引數序列中元素進行累積。 語法: reduce(function, iterable[, initializer])  例子: reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函式 結果:17

相關文章