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内置的字符串处理函数整理
Jan 29 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
Python内置函数 next的具体使用方法
Nov 24 Python
Django视图和URL配置详解
Jan 31 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
Python3.7 新特性之dataclass装饰器
May 27 Python
Python 类的魔法属性用法实例分析
Nov 21 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Python使用Pandas库常见操作详解
Jan 16 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
python全面解析接口返回数据
Feb 12 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
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
JavaScript修改css样式style
2008/04/15 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
使用javascript插入样式
2016/03/14 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
python redis 批量设置过期key过程解析
2019/11/26 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
高校生生产实习自我鉴定
2013/09/21 职场文书
酒吧员工的岗位职责
2013/11/26 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
见习报告的格式
2014/10/31 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python