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优化技巧之利用ctypes提高执行速度
Sep 11 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
如何使用Python标准库进行性能测试
Jun 25 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
django的model操作汇整详解
Jul 26 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
python高级特性简介
Aug 13 Python
Django路由层如何获取正确的url
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中防止SQL注入的最佳解决方法
2013/04/25 PHP
CI框架中zip类应用示例
2014/06/17 PHP
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
Python中的异常处理简明介绍
2015/04/13 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
Python单元测试简单示例
2018/07/03 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
主题实践活动总结
2014/05/08 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server
Oracle中日期的使用方法实例
2022/07/07 Oracle