Python实现Newton和lagrange插值
生活随笔
收集整理的這篇文章主要介紹了
Python实现Newton和lagrange插值
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、介紹
Newton和lagrange插值:給出一組數(shù)據(jù)進行Newton和lagrange插值,同時將結(jié)果用plot呈現(xiàn)出來
1、首先是Lagrange插值:
根據(jù)插值的方法,先對每次的結(jié)果求積,在對結(jié)果求和,完成插值。
2、newton插值:
先要建立差商表,差商表的建立的時候,每次減去的x[0]都是對角的元素,因此需要注意。
二、實現(xiàn)
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import matplotlib.pyplot as plt import math# =================================================== lagrange插值 ================================================================= def lagrange(x_, y, a):"""獲取拉格朗日插值:param x_: x的列表值:param y: y的列表值:param a: 需要插值的數(shù):return: 返回插值結(jié)果"""ans = 0.0for 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 quotientdef get_corner(result):"""通過插值表獲取對角線元素:param result: 插值表的結(jié)果:return: 對角線元素"""link = []for i in range(len(result)):link.append(result[i][i])return linkdef newton(data_set, x_p, x_7):"""牛頓插值結(jié)果:param data_set: 求解的問題的對角線:param x_p: 輸入的值:param x_7: 原始的x的列表值:return: 牛頓插值結(jié)果"""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 += preturn 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.54x_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))三、結(jié)果
1、插值結(jié)果
2、畫圖結(jié)果
四、總結(jié)
Newton和lagrange可以參考一下數(shù)值分析的課本,根據(jù)課本的公式來進行插值分析。具體過程也在代碼中給出。
總結(jié)
以上是生活随笔為你收集整理的Python实现Newton和lagrange插值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python数据库添加时间
- 下一篇: python将文本转化成语音并播放