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 相关文章推荐
在Django中编写模版节点及注册标签的方法
Jul 20 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
python @property的用法及含义全面解析
Feb 01 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
Python内置函数reversed()用法分析
Mar 20 Python
python安装本地whl的实例步骤
Oct 12 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
详解Python中下划线的5种含义
Jul 15 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 CURL用法的深入分析
2013/06/09 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
smarty简单入门实例
2014/11/28 PHP
php中session与cookie的比较
2015/01/27 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
django使用html模板减少代码代码解析
2017/12/12 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
Django框架封装外部函数示例
2019/05/28 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
pandas-resample按时间聚合实例
2019/12/27 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
小学生班会演讲稿
2014/01/09 职场文书
给男朋友的道歉信
2014/01/12 职场文书
迎国庆演讲稿
2014/09/05 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书