Python实现Newton和lagrange插值

一、介绍
Newton和lagrange插值:给出一组数据进行Newton和lagrange插值,同时将结果用plot呈现出来
1、首先是Lagrange插值:
根据插值的方法,先对每次的结果求积,在对结果求和,完成插值。

2、newton插值:
先要建立差商表,差商表的建立的时候,每次减去的x[0]都是对角的元素,因此需要注意。

二、实现

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))

三、结果
1、插值结果

2、画图结果

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

原文地址:https://www.cnblogs.com/future-dream/p/10921998.html

时间: 2024-10-11 10:03:51

Python实现Newton和lagrange插值的相关文章

lagrange插值

1.插值函数 %%n次插值多项式 %%X是插值节点,n是插值多项式次数,若已知函数表达式则attribute为0,未知函数表达式但已知函数值时为1 function IPn = Interpolation_polynomials_of_degree_n(X,Y,precision,attribute) global MAX;global m;global n;global i; X = sort(X); [m,n] = size(X);MAX = max([m,n]);error = []; i

Python与数值计算方法

3 插值与曲线拟合 Interpolation and Curve Fitting 给定n+1个数据点(xi,yi), i = 0,1,2,…,n,评估y(x). 3.1 介绍(introduction) 离散数据集,或者形如下面的表格,常常在技术计算中用到,数据源可能来自于实验观察或者数值计算. 3.2 多项式插值(Polynomial Interpolation)插值和曲线拟合存在差别.对于插值,我们通过数据拟合一条曲线,在拟合过程中,我们潜在假设数据是精确的和独特的:对于曲线拟合,使用的数

NYOJ 178 找规律(Lagrange插值公式)

链接:click here 题意: 描述 大家一定见过这种题目:给你一些数请找出这些数之间的规律,写出下一个满足该规律的数. 比如:2 5 10 17 26,则可以看出这些数符合n*n+1这个通项公式,则下一个数为37. 这种通项公式不只一个,所以答案是不唯一的.但如果已知了N个数,且已知其通项公式是一个次数小于N的多项式,则答案就唯一确定了. 现在给你一个数列,请找出规律并求出其下一个数为多少? 输入 第一行是一个整数T表示测试数据的组数(T<=20) 每组测试数据的第一行是一个整数N(1<

OpenCASCADE Interpolation - Lagrange

OpenCASCADE Interpolation - Lagrange [email protected] Abstract. Power basis polynomial is the most simple polynomial function. It also be called power series. OpenCASCADE provides basic computation functions for polynomial functions, such as evaluat

回归、插值、逼近、拟合的区别

http://blog.sina.com.cn/s/blog_731140ed0101bozs.html 1回归一般指线性回归,是求最小二乘解的过程.在求回归前,已经假设所有型值点同时满足某一曲线方程,计算只要求出该方程的系数 2多项式插值:用一个多项式来近似代替数据列表函数,并要求多项式通过列表函数中给定的数据点.(插值曲线要经过型值点.) 3多项式逼近:为复杂函数寻找近似替代多项式函数,其误差在某种度量意义下最小.(逼近只要求曲线接近型值点,符合型值点趋势.) 4多项式拟合:在插值问题中考虑

非线性方程(组):一维非线性方程(二)插值迭代方法 [MATLAB]

一般而言,方程没有能够普遍求解的silver bullet,但是有几类方程的求解方法已经非常清晰确凿了,比如线性方程.二次方程或一次分式.一次方程可以直接通过四则运算反解出答案,二次方程的求根公式也给出了只需要四则运算和开根号的符号表达式.而一次分式的分子即为一次函数.更多的方程并没有普适的符号表达式,但通过用便于求零点的函数模仿.代替之也可以估计零点的位置.插值方法可以实现这一思路. 插值迭代方法包括割线法.二次插值法等多项式插值方法,反插法以及线性分式插值法等等,其核心是用几个点及其函数值信

计算方法简介

简介: 计算方法又称“数值分析”.是为各种数学问题的数值解答研究提供最有效的算法. 笔记: 1误差与原则 (1)误差种类:模型误差.观测误差.截断误差和舍入误差. (2)法则: (a)加减运算:近似数加减时,把其中小数位数较多的数四舍五入,使其比小数位数最少的数多一位小数,计算保留的小数位数与原近似数最小数位数最少者相同. (b)乘除运算:近似数乘除时,各因子保留位数应比小数位数最少的数多一位小数,计算保留的小数位数与原近似数最小数位数最少者位数至多少一位. (c)乘方与开方运算:近似数乘方与开

2018年秋季学期课表

李理论基础I.II 课程编码:011D9101Z﹡ 课时:80 学分:4.00 课程属性:其它 主讲教师:聂思安 教学目的要求李群和李代数(Lie group and Lie algebra)是在1874年由挪威数学家SophusLie为研究微分方程的对称性而引进的.后经过E. Cartan 和H. Weyl等人的努力,李的理论已成了微分几何的重要研究工具并发展成完整的代数理论.上世纪初,人们发现了李群和李代数在量子物理起重要作用.如今,它在诸如微分几何.偏微分方程.拓扑.数论.控制论.代数编码

[施工中]良心数论.

/* Copyright: xjjppm Author: xjjppm Date: 08-08-17 11:36 Description: Number Theory */ #include <map> #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> inline int input() { char c=getchar();int x=0,a=