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 yield使用方法示例
Dec 04 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
python实现机器学习之元线性回归
Sep 06 Python
Django获取该数据的上一条和下一条方法
Aug 12 Python
基于Python fminunc 的替代方法
Feb 29 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
python 数据库查询返回list或tuple实例
May 15 Python
python 常见的排序算法实现汇总
Aug 21 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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
php学习之function的用法
2012/07/14 PHP
php判断表是否存在的方法
2015/06/18 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
Python基类函数的重载与调用实例分析
2015/01/12 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
python如何获取apk的packagename和activity
2020/01/10 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
中专三年学习的个人自我评价
2013/12/12 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
副处级干部考察材料
2014/05/17 职场文书
党支部意见范文
2015/06/02 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle