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模拟登陆Tom邮箱示例分享
Jan 13 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
带你认识Django
Jan 15 Python
详解Python sys.argv使用方法
May 10 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python在不同条件下的输入与输出
Feb 13 Python
python如何变换环境
Jul 21 Python
浅析pandas随机排列与随机抽样
Jan 22 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
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
jquery 问答知识整理
2010/02/11 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
让python在hadoop上跑起来
2016/01/27 Python
python代码过长的换行方法
2018/07/19 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
python虚拟环境完美部署教程
2019/08/06 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
python如何构建mock接口服务
2021/01/28 Python
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
了解AppleTalk协议吗
2014/04/01 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
购房协议书范本
2014/10/02 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
详解python的异常捕获
2022/03/03 Python
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python