1. 程式人生 > >數值分析Python實現系列—— 一、拉格朗日插值法

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

spa [] matplot rabl func 例子 imp 基函數 tools

一、拉格朗日插值法

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

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