• 对某个多项式函数有已知的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、原理 2、涉及的Python库 3、例子

1、原理
对某个多项式函数有已知的k+1个点，假设任意两个不同的都互不相同，那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为：

L

(

x

)

=

∑

j

=

0

k

y

j

ℓ

j

(

x

)

L(x)=\sum_{j=0}^{k} y_{j} \ell_{j}(x)

其中每个

ℓ

j

(

x

)

\ell_{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)}

例如：当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}

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实现 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

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实现的拉格朗日插值法。分享给大家供大家参考，具体如下： 拉格朗日插值简单介绍 拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。 许多实际问题中都用函数来...
• 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章拉格朗日通用...
• #拉格朗日插值代码 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

...

python 订阅