一、拉格朗日插值法
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.學習總結:
- reduce() 函式會對引數序列中元素進行累積。 語法: reduce(function, iterable[, initializer]) 例子: reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函式 結果:17