博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python实现Newton和lagrange插值
阅读量:4568 次
发布时间:2019-06-08

本文共 2747 字,大约阅读时间需要 9 分钟。

一、介绍

Newton和lagrange插值:给出一组数据进行Newton和lagrange插值,同时将结果用plot呈现出来
1、首先是Lagrange插值:
根据插值的方法,先对每次的结果求积,在对结果求和,完成插值。
2、newton插值:
先要建立差商表,差商表的建立的时候,每次减去的x[0]都是对角的元素,因此需要注意。
二、实现

import matplotlib.pyplot as pltimport 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 quotientdef get_corner(result):    """    通过插值表获取对角线元素    :param result: 插值表的结果    :return: 对角线元素    """    link = []    for i in range(len(result)):        link.append(result[i][i])    return linkdef 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

 

三、结果

1、插值结果
2、画图结果

四、总结
Newton和lagrange可以参考一下数值分析的课本,根据课本的公式来进行插值分析。具体过程也在代码中给出。

转载于:https://www.cnblogs.com/future-dream/p/10921998.html

你可能感兴趣的文章
树状数组
查看>>
【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
查看>>
多任务--进程 及 进程间通信
查看>>
多线程/多进程+QProgressBar实现进度条
查看>>
多任务(进程)案例----- 拷贝文件夹
查看>>
Kotlin的快速入门
查看>>
底层原理
查看>>
21. Merge Two Sorted Lists
查看>>
创建数组
查看>>
dict使用
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>
[c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
查看>>
[转载,感觉写的非常详细]DUBBO配置方式详解
查看>>
linux Valgrind使用说明-内存泄漏
查看>>
Android在Eclipse上的环境配置
查看>>
面向对象(五)
查看>>
android平台下使用点九PNG技术
查看>>