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 相关文章推荐
Phantomjs抓取渲染JS后的网页(Python代码)
May 13 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
Pandas 同元素多列去重的实例
Jul 03 Python
对Python信号处理模块signal详解
Jan 09 Python
Python3最长回文子串算法示例
Mar 04 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
python绘制随机网络图形示例
Nov 21 Python
如何利用python进行时间序列分析
Aug 04 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
python中PyQuery库用法分享
Jan 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分页函数
2006/07/08 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
实现前后端数据交互方法汇总
2015/04/07 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python反射的用法实例分析
2018/02/11 Python
详解Python 解压缩文件
2019/04/09 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
python 画函数曲线示例
2019/12/04 Python
通过实例解析Python调用json模块
2019/12/11 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
三维科技面试题
2013/07/27 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
大学生优秀团员事迹材料
2014/01/30 职场文书
同事吵架检讨书
2014/02/05 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
3的组成教学反思
2014/04/30 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
单位政审意见范文
2015/06/04 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
vue+echarts实现多条折线图
2022/03/21 Vue.js