python实现各种插值法(数值分析)


Posted in Python onJuly 30, 2019

一维插值

插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条插值法

  • 拉格朗日插值多项式:当节点数n较大时,拉格朗日插值多项式的次数较高,可能出现不一致的收敛情况,而且计算复杂。随着样点增加,高次插值会带来误差的震动现象称为龙格现象。
  • 分段插值:虽然收敛,但光滑性较差。
  • 样条插值:样条插值是使用一种名为样条的特殊分段多项式进行插值的形式。由于样条插值可以使用低阶多项式样条实现较小的插值误差,这样就避免了使用高阶多项式所出现的龙格现象,所以样条插值得到了流行。
# -*-coding:utf-8 -*-
import numpy as np
from scipy import interpolate
import pylab as pl

x=np.linspace(0,10,11)
#x=[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
y=np.sin(x)
xnew=np.linspace(0,10,101)
pl.plot(x,y,"ro")

for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值方式
 #"nearest","zero"为阶梯插值
 #slinear 线性插值
 #"quadratic","cubic" 为2阶、3阶B样条曲线插值
 f=interpolate.interp1d(x,y,kind=kind)
 # ‘slinear', ‘quadratic' and ‘cubic' refer to a spline interpolation of first, second or third order)
 ynew=f(xnew)
 pl.plot(xnew,ynew,label=str(kind))
pl.legend(loc="lower right")
pl.show()

结果:

python实现各种插值法(数值分析)

二维插值

方法与一维数据插值类似,为二维样条插值。

# -*- coding: utf-8 -*-
"""
演示二维插值。
"""
import numpy as np
from scipy import interpolate
import pylab as pl
import matplotlib as mpl

def func(x, y):
 return (x+y)*np.exp(-5.0*(x**2 + y**2))

# X-Y轴分为15*15的网格
y,x= np.mgrid[-1:1:15j, -1:1:15j]

fvals = func(x,y) # 计算每个网格点上的函数值 15*15的值
print len(fvals[0])

#三次样条二维插值
newfunc = interpolate.interp2d(x, y, fvals, kind='cubic')

# 计算100*100的网格上的插值
xnew = np.linspace(-1,1,100)#x
ynew = np.linspace(-1,1,100)#y
fnew = newfunc(xnew, ynew)#仅仅是y值 100*100的值

# 绘图
# 为了更明显地比较插值前后的区别,使用关键字参数interpolation='nearest'
# 关闭imshow()内置的插值运算。
pl.subplot(121)
im1=pl.imshow(fvals, extent=[-1,1,-1,1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower")#pl.cm.jet
#extent=[-1,1,-1,1]为x,y范围 favals为
pl.colorbar(im1)

pl.subplot(122)
im2=pl.imshow(fnew, extent=[-1,1,-1,1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower")
pl.colorbar(im2)
pl.show()

python实现各种插值法(数值分析) 

左图为原始数据,右图为二维插值结果图。

二维插值的三维展示方法

# -*- coding: utf-8 -*-
"""
演示二维插值。
"""
# -*- coding: utf-8 -*-
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
from scipy import interpolate
import matplotlib.cm as cm
import matplotlib.pyplot as plt

def func(x, y):
 return (x+y)*np.exp(-5.0*(x**2 + y**2))

# X-Y轴分为20*20的网格
x = np.linspace(-1, 1, 20)
y = np.linspace(-1,1,20)
x, y = np.meshgrid(x, y)#20*20的网格数据

fvals = func(x,y) # 计算每个网格点上的函数值 15*15的值

fig = plt.figure(figsize=(9, 6))
#Draw sub-graph1
ax=plt.subplot(1, 2, 1,projection = '3d')
surf = ax.plot_surface(x, y, fvals, rstride=2, cstride=2, cmap=cm.coolwarm,linewidth=0.5, antialiased=True)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
plt.colorbar(surf, shrink=0.5, aspect=5)#标注

#二维插值
newfunc = interpolate.interp2d(x, y, fvals, kind='cubic')#newfunc为一个函数

# 计算100*100的网格上的插值
xnew = np.linspace(-1,1,100)#x
ynew = np.linspace(-1,1,100)#y
fnew = newfunc(xnew, ynew)#仅仅是y值 100*100的值 np.shape(fnew) is 100*100
xnew, ynew = np.meshgrid(xnew, ynew)
ax2=plt.subplot(1, 2, 2,projection = '3d')
surf2 = ax2.plot_surface(xnew, ynew, fnew, rstride=2, cstride=2, cmap=cm.coolwarm,linewidth=0.5, antialiased=True)
ax2.set_xlabel('xnew')
ax2.set_ylabel('ynew')
ax2.set_zlabel('fnew(x, y)')
plt.colorbar(surf2, shrink=0.5, aspect=5)#标注

plt.show()

python实现各种插值法(数值分析)

左图的二维数据集的函数值由于样本较少,会显得粗糙。而右图对二维样本数据进行三次样条插值,拟合得到更多数据点的样本值,绘图后图像明显光滑多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中Flask框架简单入门实例
Mar 21 Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Python中Threading用法详解
Dec 27 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
python3.4爬虫demo
Jan 22 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
python离线安装外部依赖包的实现
Feb 13 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
Django 通过JS实现ajax过程详解
Jul 30 #Python
django 微信网页授权认证api的步骤详解
Jul 30 #Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 #Python
python tkinter实现屏保程序
Jul 30 #Python
python pandas 时间日期的处理实现
Jul 30 #Python
Django 反向生成url实例详解
Jul 30 #Python
Python Pandas数据中对时间的操作
Jul 30 #Python
You might like
javascript实现的listview效果
2007/04/28 Javascript
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
Python是编译运行的验证方法
2015/01/30 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Python input函数使用实例解析
2019/11/22 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
生产车间班组长岗位职责
2014/01/06 职场文书
毕业寄语大全
2014/04/09 职场文书
一年级学生评语大全
2014/04/21 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
HAM-2000摩机图
2021/04/22 无线电
如何判断pytorch是否支持GPU加速
2021/06/01 Python