精华内容
下载资源
问答
  • 拉格朗日插值法python实现

    千次阅读 2021-01-03 14:11:26
    对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为: L(x)=∑j=0kyjℓj(x) L(x)=\sum_{j=0}^{k} y_{j} \ell_{j}(x) L(x)=j=0∑k​yj​ℓj​(x...

    1、原理

    对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
    L ( x ) = ∑ j = 0 k y j ℓ j ( x ) L(x)=\sum_{j=0}^{k} y_{j} \ell_{j}(x) L(x)=j=0kyjj(x)
    其中每个 ℓ j ( x ) \ell_{j}(x) j(x)为拉格朗日基本多项式(或称插值基函数),其表达式为:
    ℓ j ( x ) = ∏ i = 0 , i ≠ j k x − x i x j − x i = ( x − x 0 ) ( x j − x 0 ) ⋯ ( x − x j − 1 ) ( x j − x j − 1 ) ( x − x j + 1 ) ( x j − x j + 1 ) ⋯ ( x − x k ) ( x j − x k ) \ell_{j}(x)=\prod_{i=0, i \neq j}^{k} \frac{x-x_{i}}{x_{j}-x_{i}}=\frac{\left(x-x_{0}\right)}{\left(x_{j}-x_{0}\right)} \cdots \frac{\left(x-x_{j-1}\right)}{\left(x_{j}-x_{j-1}\right)} \frac{\left(x-x_{j+1}\right)}{\left(x_{j}-x_{j+1}\right)} \cdots \frac{\left(x-x_{k}\right)}{\left(x_{j}-x_{k}\right)} j(x)=i=0,i=jkxjxixxi=(xjx0)(xx0)(xjxj1)(xxj1)(xjxj+1)(xxj+1)(xjxk)(xxk)
    例如:当k=3时,上面的公式变为:
    f ( x ) = ( x − x 1 ) ( x − x 2 ) ( x − x 3 ) ( x 0 − x 1 ) ( x 0 − x 2 ) ( x 0 − x 3 ) y 0 + ( x − x 0 ) ( x − x 2 ) ( x − x 3 ) ( x 1 − x 0 ) ( x 1 − x 2 ) ( x 1 − x 3 ) y 1 + ( x − x 0 ) ( x − x 1 ) ( x − x 3 ) ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 2 − x 3 ) y 2 + ( x − x 0 ) ( x − x 1 ) ( x − x 2 ) ( x 3 − x 0 ) ( x 3 − x 1 ) ( x 3 − x 2 ) y 3 f(x)=\frac{\left(x-x_{1}\right)\left(x-x_{2}\right)\left(x-x_{3}\right)}{\left(x_{0}-x_{1}\right)\left(x_{0}-x_{2}\right)\left(x_{0}-x_{3}\right)} y_{0}+\frac{\left(x-x_{0}\right)\left(x-x_{2}\right)\left(x-x_{3}\right)}{\left(x_{1}-x_{0}\right)\left(x_{1}-x_{2}\right)\left(x_{1}-x_{3}\right)} y_{1}+\frac{\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{3}\right)}{\left(x_{2}-x_{0}\right)\left(x_{2}-x_{1}\right)\left(x_{2}-x_{3}\right)} y_{2}+\frac{\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{2}\right)}{\left(x_{3}-x_{0}\right)\left(x_{3}-x_{1}\right)\left(x_{3}-x_{2}\right)} y_{3} f(x)=(x0x1)(x0x2)(x0x3)(xx1)(xx2)(xx3)y0+(x1x0)(x1x2)(x1x3)(xx0)(xx2)(xx3)y1+(x2x0)(x2x1)(x2x3)(xx0)(xx1)(xx3)y2+(x3x0)(x3x1)(x3x2)(xx0)(xx1)(xx2)y3

    2、涉及的Python库

    主要依赖于scipy

    from scipy.interplotate import lagrange
    

    直接调用lagrange(x,y)这个函数即可,返回 一个对象。参数x,y分别是对应各个点的x值和y值:例如

    (1,2) (3,5) (5,9)这三个点的x,y分别是: x =[1,3,5]y =[2, 5, 9]
    a = lagrange(x,y),直接输出该对象,就能看到插值的函数。

    利用该对象,能得到很多特性。具体参见:https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.poly1d.html+https://docs.scipy.org/doc/scipy-1.0.0/reference/generated/scipy.interpolate.lagrange.html

    继续上面的例子:

    • a.order得到阶
    • a[]得到系数
    • a()得到对应函数值
    • 此外可以对其进行加减乘除运算

    3、例子

    from scipy.interpolate import lagrange
    x=[1,2,3,4,7]
    y=[5,7,10,3,9]
    a=lagrange(x,y)
    print('插值函数\n',a)
    print('\n==============================\n插值函数的阶数',a.order)
    print('\n==============================\nx=1对应函数y值{},\nx=2对应函数y值{},\nx=3对应函数y值{}'.format(a(1),a(2),a(3)))
    print('\n==============================\n常数项系数{},\n二阶项系数{},\n三阶项系数{}'.format(a[0],a[2],a[3]))
    

    在这里插入图片描述
    尝试同时输出多个y值

    x=[1,2,3,4,7]
    a(x)
    

    在这里插入图片描述

    参考:
    http://liao.cpython.org/scipy11/

    展开全文
  • 拉格朗日插值Python代码,用于处理Excel中数据缺失。简单的算法
  • 拉格朗日插值法python实现与应用

    万次阅读 2018-08-15 16:24:11
    一、拉格朗日插值公式的一般形式 其中: ...二、拉格朗日插值法python实现 import numpy as np def lagrange(x, w): M = len(x) p = 0.0 for j in xrange(M): pt = w[j] for k in xrange...

    一、拉格朗日插值公式的一般形式

    这里写图片描述
    其中:这里写图片描述
    例如:当n=4时,上面的公式可简化为:

    这里写图片描述

    二、拉格朗日插值法的python实现

    import numpy as np
    def lagrange(x, w):
        M = len(x)
        p = 0.0
        for j in xrange(M):
            pt = w[j]
            for k in xrange(M):
                if k == j:
                    continue
                fac = x[j]-x[k]
                pt *= np.poly1d([1.0, -x[k]])/fac
            p += pt
        return p

    三、应用

    核心代码(省去数据处理环节):

    def ployinterp_column(s, n, k=5):
        y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))]
        y = y[y.notnull()]
        return lagrange(y.index, list(y))(n)
    
    def lagrange(x, w):
        M = len(x)
        p = 0.0
        for j in xrange(M):
            pt = w[j]
            for k in xrange(M):
                if k == j:
                    continue
                fac = x[j]-x[k]
                pt *= np.poly1d([1.0, -x[k]])/fac
            p += pt
        return p
    
    df_aqi_hour = pd.read_csv('newfile1.txt',sep='\s+',names=aqi_index)
    for i in xrange(len(df_aqi_hour)):
        if (df_aqi_hour['aqi'].isnull())[i]:
            df_aqi_hour['aqi'][i] = ployinterp_column(df_aqi_hour['aqi'], i)

    四、插值结果
    1.数据个别缺失时的插值结果
    插值前数据:
    这里写图片描述
    插值后的数据:
    这里写图片描述

    2.数据大面积缺失时的插值结果
    插值前数据:
    这里写图片描述
    插值后数据:
    这里写图片描述

    数据大面积缺失时,拉格朗日的插值结果很差。

    展开全文
  • print('拉格朗日插值法:') """ 10 拉格朗日插值法:(曲线差值法) 1.定义:找到一个在点xj取值为1,而在其他点取值都是0的多项式Lj(x)。这样,多项式在该点取值是yi,然后其他点取值都是0 2.差值基函数:拉格朗日...
    import matplotlib.pyplot as plot
    import numpy as np
    print('拉格朗日插值法:')
    """
    10
    拉格朗日插值法:(曲线差值法)
    1.定义:找到一个在点xj取值为1,而在其他点取值都是0的多项式Lj(x)。这样,多项式在该点取值是yi,然后其他点取值都是0
    2.差值基函数:拉格朗日基本多项式,在一个点取1,其他点取值为0.作为系数的取值
    3.拉格朗日插值法和牛顿差值法结果是一样的,只是不同的表示形式
    4.两者的互相推导:一阶实现
    5.两种方式优缺点分析:
     ①牛顿差值法:
     一个差值点有误差会导致整个结果有偏差
     当多项式的次数很高时,数值不稳,会产生龙格现象
     解决:分段样条
    
    """
    print('127,已知f(x)的观测数据:')
    print('x=[1,2,3,4]')
    print('f(x)=[0,-5,-6,3]')
    print('构造插值多项式:')
    
    print('----------------------------------------------------------------------------')
    
    X=[1,3,2]#创建x列表存储数据x值
    Y=[1,2,-1]#创建y列表存储数据的y值
    A=[1,1,1]#创建存储系数的列表
    
    def save(n):#声明和存储函数 n代表列表存储的数据个数
        global X,Y,A #全局变量声明需要注意
        X=[[]for i in range(n)]
        Y=[[]for j in range(n)]
        A=[[]for m in range(n)]
        print('输入',n,'对(x,y):')
        for k in range(n):
            X[k]=int(input())
            Y[k]=int(input())
            A[k]=1
            plot.scatter(X[k], Y[k], c='m')#画点
    
    
    
    
    def result(q,n):#计算系数函数 n代表存入数据的个数 x代表外部传入的数值
        for i in range(n):
            for j in range(n):
                if(j!=i):
                    A[i]= ((q-X[j])/(X[i]-X[j]))*A[i]
        sum = 0
        for i in range(n):
            sum=sum+A[i]*Y[i]
        return sum
    
    
    def draw():#显示类表存储情况
        print('X=',X)
        print('Y=',Y)
        print('A=',A)
    
    
    save(4)
    print(result(1**(1),4))
    draw()
    
    x = 0
    plot.title("Lagrange polynomial Method") #图形标题
    x = np.linspace(0,6)
    plot.xlim(0,6)# 固定坐标
    plot.ylim(-10,10)
    
    plot.plot(x,x**3-4*x**2+3)
    plot.show()
    """
    测试结果:
    拉格朗日插值法:
    127,已知f(x)的观测数据:
    x=[1,2,3,4]
    f(x)=[0,-5,-6,3]
    构造插值多项式:
    ----------------------------------------------------------------------------
    输入 4 对(x,y):
    1
    0
    2
    -5
    3
    -6
    4
    3
    0.0
    X= [1, 2, 3, 4]
    Y= [0, -5, -6, 3]
    A= [1.0, 0.0, -0.0, 0.0]
    
    Process finished with exit code 0
    
    """

    这里写图片描述

    展开全文
  • #两点拉格朗日线性插值,一次插值多项式 x_list = [1, 3] y_list = [1, 2] #所要求的插值x的值 x = 1.5 l_0 = (x - x_list[1]) / (x_list[0] - x_list[1]) l_1 = (x - x_list[0]) / (x_list[1] - x_list[0]) P = l...

    线性插值和抛物线插值

    在这里插入图片描述
    在这里插入图片描述

    #两点拉格朗日线性插值,一次插值多项式
    x_list = [1, 3]
    y_list = [1, 2]
    #所要求的插值x的值
    x = 1.5
    
    l_0 = (x - x_list[1]) / (x_list[0] - x_list[1])
    l_1 = (x - x_list[0]) / (x_list[1] - x_list[0])
    
    P = l_0 * y_list[0] + l_1 * y_list[1]
    print(P)
    

    结果:

    1.25
    
    #两点拉格朗日线性插值,一次插值多项式
    x_list = [100, 121]
    y_list = [10, 11]
    #所要求的插值x的值
    x = 115
    
    l_0 = (x - x_list[1]) / (x_list[0] - x_list[1])
    l_1 = (x - x_list[0]) / (x_list[1] - x_list[0])
    
    P = l_0 * y_list[0] + l_1 * y_list[1]
    print(P)
    

    结果:

    10.714285714285715
    

    在这里插入图片描述
    在这里插入图片描述

    #三点拉格朗日抛物线插值
    x_list = [1, 3, 2]
    y_list = [1, 2, -1]
    #所要求的插值x的值
    x = 1.5
    
    l_0 = ((x - x_list[1]) * (x - x_list[2])) / ((x_list[0] - x_list[1]) * (x_list[0] - x_list[2]))
    l_1 = ((x - x_list[0]) * (x - x_list[2])) / ((x_list[1] - x_list[0]) * (x_list[1] - x_list[2]))
    l_2 = ((x - x_list[0]) * (x - x_list[1])) / ((x_list[2] - x_list[0]) * (x_list[2] - x_list[1]))
    
    P = l_0 * y_list[0] + l_1 * y_list[1] + l_2 * y_list[2]
    print(P)
    

    结果:

    -0.625
    
    #三点拉格朗日抛物线插值
    x_list = [100, 121, 144]
    y_list = [10, 11, 12]
    #所要求的插值x的值
    x = 115
    
    l_0 = ((x - x_list[1]) * (x - x_list[2])) / ((x_list[0] - x_list[1]) * (x_list[0] - x_list[2]))
    l_1 = ((x - x_list[0]) * (x - x_list[2])) / ((x_list[1] - x_list[0]) * (x_list[1] - x_list[2]))
    l_2 = ((x - x_list[0]) * (x - x_list[1])) / ((x_list[2] - x_list[0]) * (x_list[2] - x_list[1]))
    
    P = l_0 * y_list[0] + l_1 * y_list[1] + l_2 * y_list[2]
    print(P)
    

    结果:

    10.722755505364201
    

    基函数和拉格朗日插值公式

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #拉格朗日插值多项式
    from sympy import *
    x = Symbol('x')
    x_list = [0, 1, 2]
    y_list = [1, 2, 3]
    l_list = []
    for i in range(len(x_list)):
        X, Y = 1, 1
        for j in range(len(y_list)):
            if i == j:
                pass
            else:
                X = X * (x - x_list[j])
                Y = Y * (x_list[i] - x_list[j])
        l = expand(X / Y)   #扩展代数表达式
        l_list.append(l)
    P = 0
    for k in range(len(y_list)):
        P += l_list[k] * y_list[k]
    print(P)
    

    结果:

    x + 1
    
    #拉格朗日插值多项式
    from sympy import *
    x = Symbol('x')
    x_list = [1, 2, 3, 4]
    y_list = [0, -5, -6, 3]
    l_list = []
    for i in range(len(x_list)):
        X, Y = 1, 1
        for j in range(len(y_list)):
            if i == j:
                pass
            else:
                X = X * (x - x_list[j])
                Y = Y * (x_list[i] - x_list[j])
        l = expand(X / Y)   #扩展代数表达式
        l_list.append(l)
    P = 0
    for k in range(len(y_list)):
        P += l_list[k] * y_list[k]
    print(P)
    

    结果:

    x**3 - 4*x**2 + 3
    

    迭代插值

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #拉格朗日插值多项式
    from sympy import *
    
    x = 50
    x_list = [45, 60, 30, 90, 0]
    def f(a):
        f = sin(a/180*pi)
        return f.evalf()
    
    n = len(x_list)
    P = 0
    for i in range(n):
        X, Y = 1, 1
        for j in range(n):
            if i == j:
                pass
            else:
                X = X * (x - x_list[j])
                Y = Y * (x_list[i] - x_list[j])
        P += X/Y*f(x_list[i])
    print(P)
    

    结果:

    0.766025943265555
    
    #拉格朗日插值多项式
    from sympy import *
    
    x = 1/2
    x_list = [-2, -1, 0, 1, 2]
    def f(a):
        f = 3**a
        return f
    
    n = len(x_list)
    P = 0
    for i in range(n):
        X, Y = 1, 1
        for j in range(n):
            if i == j:
                pass
            else:
                X = X * (x - x_list[j])
                Y = Y * (x_list[i] - x_list[j])
        P += X/Y*f(x_list[i])
    print(P)
    

    结果:

    1.7083333333333335
    
    展开全文
  • 本文实例讲述了Python实现的拉格朗日插值法。分享给大家供大家参考,具体如下: 拉格朗日插值简单介绍 拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。 许多实际问题中都用函数来...
  • 拉格朗日插值法-Python

    2018-12-04 17:22:02
    from scipy.interpolate import lagrange #导入拉格朗日插值函数 inputfile = 'G:/py/data/data.xls' #销量数据路径 outputfile = 'G:/py/tmp/data2.xls' #输出数据路径 data = pd.rea...
  • 运用拉格朗日插值法给空缺数据进行插值,通过调用scipy中的lagrange实现
  • 方法一:拉格朗日插值法 x = [0.85] #需要计算函数近似值的x x0 = [0.40,0.55,0.65,0.80,0.90] y = [0.41075,0.57815,0.69675,0.88811,1.02652] m = len(x0) #给的函数值的个数 print(x) print(x0) print(y) print(n...
  • 本文网址: ...3.1拉格朗日插值的基本思想 3.2 拉格朗日基函数 3.3拉格朗日插值函数 3.3 拉格朗日2点插值公式拆解 3.4拉格朗日3点插值公式 3.5 拉格朗日插值的优缺点 第4章拉格朗日通用...
  • Python实现的拉格朗日插值法

    千次阅读 2020-03-27 00:40:11
    #拉格朗日插值代码 import pandas as pd #导入数据分析库Pandas from scipy.interpolate import lagrange #导入拉格朗日插值函数 inputfile = 'catering_sale.xls' #销量数据路径 data = pd.read_excel(inputfile) #...
  • from scipy.interpolate import lagrange # 导入拉格朗日插值函数 #销量数据路径 inputfile=‘D:\data.xls’ #输出数据路径 outputfile=‘D:\CorrectData.xls’ data=pd.read_excel(inputfile) #读入数据 data[u’X1...
  • 拉格朗日插值法python

    万次阅读 多人点赞 2018-01-12 12:02:22
    一、插值  设函数y=f(x)在区间[a,b]上连续,给定n+1个点  a≤x0≤b  已知,f(xk)=yk(k=0,1....n),在函数类P中寻找一个函数Φ(x)。作为f(x)的近似表达式,使满足:  Φ(xk)=f(xk)=yk, k=0,1,2,3,4....n (2)...
  • 拉格朗日插值法代码实现 其他数据预处理方法 缺失值处理 处理缺失值常用的办法可分为三类:删除记录、数据插补、不处理。 其中常见的数据插补法有: 如果通过删除小部分的数据就可以达到既定的目标,且不会...
  • 插值法的伟大作用我就不说了。。。。 那么贴代码?...1. 已有的数据样本被称之为 “插值节点” ...2. 对于特定插值节点,它所对应的插值函数是必定存在且唯一的(关于这个的证明我暂时不说了...3. 拉格朗日插值法依赖...
  • 本篇为数值分析课程代码实现-拉格朗日插值法的实现 仅供参考 配置环境 Python3.6 matplotlib numpy # -*- coding: utf-8 -*- """ Created on Tue Dec 4 21:04:35 2018 拉格朗日插值 @author: hhuaf """ import...
  • 拉格朗日插值代码python实现(不掉包) 今天我们来讲一下,使用拉格朗日插值公式进行插值,通过python实现 那么拉格朗日插值公式是什么样的呢? 百度百科定义如下: 当然如果你没有看懂的话,可以再去查询一些相关...
  • 下面即为拉格朗日插值法的一个实例 我将文件上传到,我的资源当中了,可以直接下载,运行 import pandas as pd from scipy.interpolate import lagrange #导入拉格朗日插值函数## #缺失值处理——拉格朗日插值法 ...
  • 在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量...
  • Python插值法(1)————拉格朗日插值多项式 Python插值法(2)————牛顿插值多项式 Python插值法(3)————hermite插值多项式(拉格朗日型) Python插值法(4)————hermite插值多项式(牛顿型)
  • 有关书中4-1用拉格朗日法进行插补,会有几处warning和报错, 网上大部分小伙伴都在解决过滤异常值的告警问题,其实真正有问题的是这里: 仅针对课本里出现的问题,正常的索引都是从0开始,但是当n<k的时候,索引就...
  • 拉格朗日插值法存在于 python 的scipy库中,接下来的部分分为以下步骤进行: 找出 dataframe中的异常值 将空值进行统一处理,用None 或者 np.nan来替换异常值 用拉格朗日法进行科学的插值处理 将异常值变成空值np....
  • 主要介绍了python实现各种插值法(数值分析),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 题目: 代码: #预测点 pre_points = list(map(float, input("请...#构造插值点,为等差数列 input_points = list(range(-5, 6)) #预测点的值 result = [] def fx(x): return 1 / (1 + x * x) #拉格朗日差值...
  • 一、拉格朗日插值法 1.原理: 拉格朗日插值法:给定n个观测值(xk,yk)找到一组(n个)基函数 lk(x) , 使得L(x) 为这组基函数的线性组合, 并且使得L(x)是经过这些点的多项式 我们发现其中的一种找发是 : 满足这样...
  • 关于拉格朗日插值算法的定义可以查看维基百科拉格朗日插值法。 这里直接上代码,当前代码不是最优算法 class Algorithm: @staticmethod def LagrangeInterpolation(): grid_x = np.array([4, 5, 6]) # the ...
  • 已知y=cosx,0
  • 1. 拉个朗日插值法 1.1 程序 #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import time #print(plt.__file__ ) def lagrange(X, Y, xx): """拉格朗日插值...
  • 拉格朗日插值及其画图 1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 912
精华内容 364
关键字:

拉格朗日插值法python

python 订阅