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内置函数OCT详解
Nov 09 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
对Python 语音识别框架详解
Dec 24 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
python列表推导式入门学习解析
Dec 02 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
python 用struct模块解决黏包问题
Nov 07 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计算2点经纬度之间的距离代码
2013/08/12 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
python中字符串前面加r的作用
2015/06/04 Python
如何将python中的List转化成dictionary
2016/08/15 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python 实现兔子生兔子示例
2019/11/21 Python
Python 解析简单的XML数据
2020/07/24 Python
Python远程方法调用实现过程解析
2020/07/28 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
班级活动策划书
2014/02/06 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
民主生活会汇报材料
2014/12/15 职场文书
退休欢送会致辞
2015/07/31 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
小学大队长竞选稿
2015/11/20 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
Linux安装Docker详细教程
2022/07/07 Servers