python 一维二维插值实例


Posted in Python onApril 22, 2020

一维插值

插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条插值法。

拉格朗日插值多项式:当节点数n较大时,拉格朗日插值多项式的次数较高,可能出现不一致的收敛情况,而且计算复杂。随着样点增加,高次插值会带来误差的震动现象称为龙格现象。

分段插值:虽然收敛,但光滑性较差。

样条插值:样条插值是使用一种名为样条的特殊分段多项式进行插值的形式。由于样条插值可以使用低阶多项式样条实现较小的插值误差,这样就避免了使用高阶多项式所出现的龙格现象,所以样条插值得到了流行。

在CODE上查看代码片派生到我的代码片

#!/usr/bin/env python 
# -*-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 一维二维插值实例

二维插值

方法与一维数据插值类似,为二维样条插值。

在CODE上查看代码片派生到我的代码片

# -*- 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 一维二维插值实例

左图为原始数据,右图为二维插值结果图。

二维插值的三维展示方法

在CODE上查看代码片派生到我的代码片

# -*- 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中对Dataframe二维查表插值的实现方法

今天在计算风力发电机捕捉风能功率的时候,需要对叶片扫略面积内的风能做个功率效率折减,即Cp系数,Cp的定义如下,即实际利用的风能与输入风能的比例

python 一维二维插值实例

输入风能是空气密度与风速的函数,可以直接计算:

python 一维二维插值实例

那么实际得到的能力是Pin与Cp的乘积。

python 一维二维插值实例

Cp通常是一个二维表,横坐标是TSR(叶尖速与风速的比值),纵坐标是PITCH Angle(桨叶角)。风机的运行数据中是包含风速 ,转速以及桨叶角信息的,并且通过直接读入到DataFrame,那么就需要根据TSR与PA对Cp查表并且插值得到Cp。主要用到scipy.interpolate.interp2d创建插值函数并查表,另外Dataframe不能直接用插值函数,这里做了个for循环分行插值查表。

from scipy.interpolate import interp2d
df_rotormap = pd.read_csv('filepath',header = None) #读取Cp表
x = np.array(df_rotormap.iloc[:,0].dropna()) #Cp表的X坐标是TSR
y = np.array(df_rotormap.iloc[:,1]) #Cp表的Y坐标是pitch angle
z = np.array(df_rotormap.iloc[:,2:]) #Cp表的具体值,y行x列

rho = 1.225 #kg/m3
s = (141/2)**2*np.pi #m2
df_cal['TSR'] = df_cal['发电机转速(PDM1)']/148*141*np.pi/60/df_cal['风速']

func_new = interp2d(x,y,z,kind = 'linear') #定义二维表插值函数,选择线性插值

cp_list = []
for i in range(df_cal.shape[0]):
 cp = float(func_new(df_cal['TSR'][i],df_cal['1号桨叶角度'][i])) #输入X,Y坐标, 输出插值计算的Cp
 cp_list.append(cp)

df_cal['cp'] = cp_list #把Cp放回到Dataframe中去

df_cal['air_power'] = 0.5*rho*s*df_cal['风速']**3*df_cal['cp']

以上这篇python 一维二维插值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python字符串处理之count()方法的使用
May 18 Python
python Django批量导入不重复数据
Mar 25 Python
python处理xml文件的方法小结
May 02 Python
python通过opencv实现批量剪切图片
Nov 13 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
Numpy一维线性插值函数的用法
Apr 22 #Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 #Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 #Python
Jupyter Notebook折叠输出的内容实例
Apr 22 #Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 #Python
django使用JWT保存用户登录信息
Apr 22 #Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 #Python
You might like
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
destoon官方标签大全
2014/06/20 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
js css自定义分页效果
2017/02/24 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python super()函数的基本使用
2020/09/10 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
经贸日语毕业生自荐信
2013/11/03 职场文书
计算机软件个人的自荐信范文
2013/12/01 职场文书
cf搞笑广告词
2014/03/14 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL