lagrange 插值实现

import  numpy as np #数值运算
import sympy
import matplotlib.pyplot as pltclass LagrangeInterpolation:"""拉格朗日插值"""def __init__(self,x,y):"""拉格朗日必要参数的初始化以及健壮性的检测:param x: 已知数据x坐标点:param y: yi知数据y坐标点"""self.x=np.asarray(x,dtype=np.float)self.y=np.asarray(y,dtype=np.float)# 类型转换,数据结构采用arrayif len(self.x)>1 and len(self.x) == len(self.y):self.n = len(self.x) #已知离散数据点的个数else:raise ValueError("插值数据(x,y)维度不匹配!")self.polynomial = None #最终的插值多项式,符号表示self.poly_coefficient = None#最终插值多项式的系数向量,幂次从高到底self.coefficient_order =None#对应多项式系数的阶次self.y0 =None# 所求插值点的值,单个值或向量def fit_interp(self):"""核心算法:生成拉格朗日多项式:return:"""t =sympy.Symbol("t")#定义符号变量self.polynomial=0.0#插值多项式实例化for i in range(self.n):#针对每个数据点构造插值基函数basis_fun=self.y[i] #插值基函数for j in range(i):basis_fun *=(t-self.x[j])/(self.x[i]-self.x[j])for j in range(i+1,self.n):basis_fun *= (t - self.x[j]) / (self.x[i] - self.x[j])self.polynomial+=basis_fun  #插值多项式累加#插值多项式特征self.polynomial=sympy.expand(self.polynomial)#多项式展开polynomial = sympy.Poly(self.polynomial,t)#根据多项式构造多项式对象self.poly_coefficient = polynomial.coeffs() #获取多项式系数self.coefficient_order=polynomial.monoms() #获取多项式系数对应阶次# print(self.polynomial)def cal_interp_x0(self,x0):"""计算所给定的插值点的数值,即插值:param x0: 所求插值的x坐标:return:"""x0 = np.asarray(x0,dtype=np.float)n0 = len(x0)# 插值点个数y_0=np.zeros(n0) #存储插值点x0所对应的插值t = self.polynomial.free_symbols.pop() #返回值是集合,获取插值多项式的自由变量for i in range(n0):y_0[i] = self.polynomial.evalf(subs={t:x0[i]})# 用x0替换多项式中的tself.y0 = y_0return  y_0def plt_interpolation(self,x0=None,y0=None):"""可视化插值图像和所求的插值点:return:"""plt.figure(figsize=(8,6))plt.plot(self.x,self.y,"ro",label = "Interpolation base points")xi = np.linspace(min(self.x),max(self.x),100) #模拟100个值yi = self.cal_interp_x0(xi)plt.plot(xi,yi,"b--",label = "Interpolation polynomisl")if x0 is not None and y0 is not None:plt.plot(x0, y0, "g*", label="Interpolation point values")plt.legend()plt.xlabel("x",fontdict={"fontsize":12})plt.ylabel("y", fontdict={"fontsize": 12})plt.title("Lagrange interpolation polynomial and values",fontdict={"fontsize":14})plt.grid(ls=":")plt.show()

主函数如下:

if __name__ == "__main__":x0 = np.array([34,23,45,150])x = np.linspace(0,180,4,endpoint=True)y=np.array([0,0.45,3.6,12.15])lag_interp = LagrangeInterpolation(x=x,y=y)lag_interp.fit_interp()print("拉格朗日多项式如下:")print(lag_interp.polynomial)print("拉格朗日多项式系数和对应阶次:")print(lag_interp.poly_coefficient)print(lag_interp.coefficient_order)y0 = lag_interp.cal_interp_x0(x0)print("所求插值点的值是:",y0)print(lag_interp.y0)lag_interp.plt_interpolation(x0,y0)

结果如下:


龙格现象:

函数f(x) = 1/(1+x*x)

def fun(x):"""龙格函数:param x: 标量 向量 矩阵:return:"""return 1/(1+x**2)

主函数:

if __name__ =="__main__":plt.figure(figsize=(8,6))for n in range(3,12,2):x=np.linspace(-5,5,n,endpoint=True)y=fun(x) #向量化运算量,不需要循环lag_interp = LagrangeInterpolation(x,y)lag_interp.fit_interp()xi = np.linspace(-5,5,100,endpoint=True)yi= lag_interp.cal_interp_x0(xi)plt.plot(xi,yi,lw=0.7,label="n=%d"%(n-1))plt.plot(xi,fun(xi),'k-',label=r"$\frac{data_lagrange}{data_lagrange+x^{2}}\qquad$")plt.xlabel("x",fontdict={"fontsize":12})plt.ylabel("y",fontdict={"fontsize":12})plt.title("Runge phenomenon of lagrange interpolation of different orders",fontdict={"fontsize":14})plt.legend()plt.show()

lagrange 插值实现和龙格现象相关推荐

  1. 拉格朗日插值和牛顿插值的龙格现象

    文章目录 一.实验目的 二.实验设备信息 三.实验内容 (一)拉格朗日插值多项式 (二)牛顿插值多项式 四.实验步骤 (一)拉格朗日插值函数实现 (二)牛顿插值函数实现 (三)观察拉格朗日插值和牛顿插 ...

  2. 什么是龙格现象(Runge phenomenon)?如何避免龙格现象?

    在<计算方法>和<计算机图形学基础>中讲到插值(线性插值.抛物线插值.高次lagrang插值)的拟合度,在三种自由曲线的图形中,是上升趋势,我们总以为次数越高精度越高,实际上, ...

  3. 解决龙格现象matlab,matlab实现Lagrange多项式插值观察龙格现象

    Matlab进行Lagrange多项式插值 拉格朗日插值法对函数y=1./(1+25*x.^2)在区间[-1,1]进行5次.10次.15次插值观察龙格现象 主程序 1.拉格朗日 function [c ...

  4. 插值中产生的龙格现象

    龙格现象在深度学习中,叫做"过拟合".我个人认为,本质的原因在于对训练数据的刻画太精细了,使得拟合函数把数据的的误差也给刻画进去了,那肯定是错的啊.很难理解吗? 插值中产生的龙格现 ...

  5. 拉格朗日插值验证龙格现象python

    拉格朗日(Lagrange)插值原理 拉格朗日(Lagrange)插值公式的基本思想是把的构造问题转化为 n+1 个插值基函数 .很多人可能觉得样本数据越多,得到的插值数据会越精确,这样想法是不正确的 ...

  6. MATLAB编写拉格朗日插值与龙格现象

    插值与龙格现象 在区间[-1,1]上对函数 ,选取不同的插值节点构造插值多项式,比较他们的误差. (1) 取等距节点,n=5,10,15,20. (2) 取节点 ,k=0,1,2,-n:分别取n=5, ...

  7. 龙格现象 matlab,拉格朗日插值龙格现象的matlab实现

    拉格朗日插值龙格现象的MATLAB实现 姓名:袁宽 学号:201430210065 专业:电气工程 题目:对于函数f(x) 1, 5 x 5进行拉格朗日插值.n 10,按等距节点求分21 x 段线性插 ...

  8. matlab插值龙格实验,实验二 拉格朗日插值龙格现象.doc

    实验二 拉格朗日插值龙格现象 汕 头 大 学 实 验 报 告 学院: 工学院 系: 计算机系 专业: 计算机科学与技术 年级: 2010 姓名: 林金正 学号: 2010101032 完成实验时间: ...

  9. 插值MATLAB实现(牛顿差商、插值误差、龙格现象、切比雪夫插值)

    牛顿差商 function [c,y] = newtondd(a,b,x) n=length(a); for i=1:nv(i,1)=b(i); end for j=2:nfor i=1:n-j+1v ...

最新文章

  1. linux dd命令制作u盘启动_制做linux启动U盘
  2. python元组的定义方式_序列之元组详解
  3. 算法------------搜索二维矩阵
  4. 前端(三)——HTML之表单
  5. AOSCP4.1.2 红米Note 4X 2017/10/13 非官方 稳定发布
  6. ASP.NET生成静态页面方法大全(1)
  7. asp python 定时任务_Ubuntu使用crontab定时执行python脚本
  8. OpenShift 4 之Service Mesh教程(5)- 断路器Circuit Breaker
  9. 52)PHP,加了单例模式的数据库代码
  10. 如何获取Android移动终端设备唯一ID
  11. win2003额外域控制器升级到主域控制器
  12. 金融量化之华泰多因子估值类显著性和IC值计算
  13. 程序员的算法趣题 python3 - (4)
  14. 基础算法练习200题07、编框
  15. 差分 线宽 线距_需要做阻抗的信号线时应该怎样计算线宽、线距规则?
  16. 手机拍照及简单的图片压缩
  17. 阿里云服务器购买搭建过程
  18. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.26
  19. 论文笔记:Reasoning about Entailment with Neural Attention
  20. 华清远见重庆中心——HTML和CSS基础阶段技术总汇

热门文章

  1. AVD Nexus_5X_API_P is already running. If that is not the case, delete the files at ...
  2. Android谷歌推送
  3. tf24: GANs—生成明星脸
  4. 码农深耕 - 35岁的程序员何去何从?
  5. RecyclerView与CardView的使用
  6. (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  7. 图卷积神经网络 | Python实现基于GCN-GRU图卷积门控循环单元网络模型
  8. 高等工程热力学复习04
  9. 模拟电子技术-模拟集成电路
  10. java :工资计算