Python實現Newton和lagrange插值

1、介紹
Newton和lagrange插值:給出一組數據進行Newton和lagrange插值,同時將結果用plot呈現出來
一、首先是Lagrange插值:
根據插值的方法,先對每次的結果求積,在對結果求和,完成插值。

二、newton插值:
先要創建差商表,差商表的創建的時候,每次減去的x[0]都是對角的元素,所以須要注意。

2、實現node

import matplotlib.pyplot as plt import math # =================================================== lagrange插值 ================================================================= def lagrange(x_, y, a): """ 獲取拉格朗日插值 :param x_: x的列表值 :param y: y的列表值 :param a: 須要插值的數 :return: 返回插值結果 """ ans = 0.0 for i in range(len(y)): t_ = y[i] for j in range(len(y)): if i != j: t_ *= (a - x_[j]) / (x_[i] - x_[j]) ans += t_ return ans # =================================================== newton插值 ================================================================= def table(x_, y): """ 獲取牛頓插值表 :param x_: x列表的值 :param y: y列表的值 :return: 返回插值表 """ quotient = [[0] * len(x_) for _ in range(len(x_))] for n_ in range(len(x_)): quotient[n_][0] = y[n_] for i in range(1, len(x_)): for j in range(i, len(x_)): # j - i 肯定了對角線的元素 quotient[j][i] = (quotient[j][i - 1] - quotient[j - 1][i - 1]) / (x_[j] - x_[j - i]) return quotient def get_corner(result): """ 經過插值表獲取對角線元素 :param result: 插值表的結果 :return: 對角線元素 """ link = [] for i in range(len(result)): link.append(result[i][i]) return link def newton(data_set, x_p, x_7): """ 牛頓插值結果 :param data_set: 求解的問題的對角線 :param x_p: 輸入的值 :param x_7: 原始的x的列表值 :return: 牛頓插值結果 """ result = data_set[0] for i in range(1, len(data_set)): p = data_set[i] for j in range(i): p *= (x_p - x_7[j]) result += p return result # ============================================================== 畫圖 ===================================================== def draw_picture(x_list, y_list, node): plt.title("newton") plt.xlabel("x") plt.ylabel("y") # plt.plot(x_list, y_list, color="red") for i in range(len(x_list)): plt.scatter(x_list[i], y_list[i], color="purple", linewidths=2) plt.scatter(node[0], node[1], color="blue", linewidth=2) plt.show() if __name__ == '__main__': x = 0.54 x_1 = [0.4, 0.5, 0.6, 0.7, 0.8] y_1 = [-0.9163, -0.6931, -0.5108, -0.3567, -0.2231] middle = table(x_1, y_1) n = get_corner(middle) newton = newton(n, x, x_1) lagrange = lagrange(x_1, y_1, 0.54) print("真值:{}".format(math.log(0.54, math.e))) print("拉格朗日插值:{}".format(lagrange)) print("牛頓插值:{}".format(newton)) # 畫圖 draw_picture(x_1, y_1, (x, newton))
View Code

 

3、結果
一、插值結果


二、畫圖結果
app


4、總結
Newton和lagrange能夠參考一下數值分析的課本,根據課本的公式來進行插值分析。具體過程也在代碼中給出。ide

相關文章
相關標籤/搜索