python实现

样条插值在MATLB中有自带的库,在python中也有,位于scipy库中,具体定义如下:

scipy官方文档:

class scipy.interpolate.interp1d(x, y, kind='linear', axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)

上为定义,下为参数解释:

  • interp1d ,scipy.interpolate包里有很多的模块可以实现对一些已知的点进行插值,即找到一个合适的函数,例如模块 interp1d。当得到插值函数后便可用这个插值函数计算其他xj对应的的yj值了,这也就是插值的意义所在。
from scipy.interpolate import interp1d
import numpy as npnoise = np.random.normal(0, 0.1, 100)
x = np.linspace(0, 10, 100)
y = np.sin(x) + noise
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')
print x[10], np.sin(x[10]), y[10], f(x[10]), f2(x[10])
print x[11], np.sin(x[11]), y[11], f(x[11]), f2(x[11])
xm = (x[10] + x[11]) / 2
print xm, np.sin(xm), (y[10] + y[11]) / 2, f(xm), f2(xm)
print f
xnew = np.linspace(0, 10, 40)
import matplotlib.pyplot as plt
plt.plot(x,y,'o',xnew,f(xnew),'-', xnew, f2(xnew),'--', xnew, np.sin(xnew),linewidth=2)
plt.legend(['data', 'linear', 'cubic', "$cos(x)$"], loc='best')
plt.show()

上为参考文档的代码片,其中介绍了如何使用该库的插值函数,运行结果如下:

该函数可以直接输入一个一维数组,并返回一位数组所对应的一维数组结果。按照此特性,我对原题的点进行了拟合尝试:

x=np.array([0,45,75,105,135,165,225,255])
y=np.array([0,20,60,60,20,-60,-100,20])
xi=np.arange(0,max(x),0.1)
xc=x[:8]
yc=y[:8]
f = interp1d(xc,yc, kind = 2)
ff = interp1d(x,y,kind = 3)
plt.plot(f(xi),xi,'g',label='2 derivative')
plt.plot(ff(xi),xi,'m',label='3 derivative')plt.xlim(-135,75)
plt.ylim(0,260)
plt.plot(y,x,'kx')
plt.xlabel('y')
plt.ylabel('x')
plt.title('Spline interpolation')
plt.legend()
plt.show()

下图为所给的点集:

​所给点的坐标显示

下图为拟合结果:

拟合后的图像

绿色的是二次样条插值,紫色的是三次样条插值。

很明显,在这两个插值函数中,开头这个部分有明显的区别,并且从曲率的角度看,二次样条插值明显优于三次样条插值。

但是由于自带库的样条插值函数并没有给我们输入参数的机会,查阅资料,在计算机插值拟合时,数值计算软件如Matlab都把非扭结边界条件作为默认的边界条件。

所以理论上来说,我们在给定特定的点后无法将边界条件作为输入条件进行更改。

那么,能不能通过加入适当的点使得曲率减小呢?

通过加入新的系列点集,使得插值函数的曲率减小,能不能采取梯度下降的方法寻找新点的最佳坐标?

我经过尝试,发现当我加入新的点之后,会导致其他部分的插值函数也发生变化(必然。。),所以加入点的做法并不太适合,需要考虑的问题变得更加复杂了。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1dx=np.array([0,45,75,105,135,165,225,255,202.7])
y=np.array([0,20,60,60,20,-60,-100,20,-106.2])
xi=np.arange(0,max(x),0.1)
xc=x[:8]
yc=y[:8]
f = interp1d(xc,yc, kind = 3)
ff = interp1d(x,y,kind = 3)
for i in range(len(x)-1):x_i=np.linspace(x[i],x[i+1],4)# x_=np.arange(x[i],x[i+1],0.1)y_i=f(x_i)fi=np.polyfit(x_i,y_i,3)fi_np=np.poly1d(fi)y_i_new=ff(x_i)fi_new=np.polyfit(x_i,y_i_new,3)fi_new_np=np.poly1d(fi_new)# fi_yi=fi_np(x_)# plt.plot(fi_yi,x_,'b')print('第',i+1,'段表达式')print(fi_np,'fx')print(fi_new_np,'fx_new')
# print(f._kind)
plt.plot(f(xi),xi,'g',label='Original derivative')
plt.plot(ff(xi),xi,'m',label='New derivative')plt.xlim(-135,75)
plt.ylim(0,260)
plt.plot(y,x,'kx')
plt.xlabel('y')
plt.ylabel('x')
plt.title('Spline interpolation')
plt.legend()
plt.show()

加入了一个新点(202.7,-106.2),效果图如下:

发现其他部分的拟合差别对比并不明显,但是当我们分析各段的解析式:

我们会发现每个解析式都会发生变化,所以相应的曲率也会发生改变,由此来看,插入点的方法并不适用。

所以我决定自己来写样条插值的程序。

python样条插值(二)相关推荐

  1. 看例子,学 Python(二)

    看例子,学 Python(二) 看例子,学 Python(一) 看例子,学 Python(三) 模块 文件 mymath.py 定义了函数 fib 和 fac,mymath.py 就是一个模块. A ...

  2. python生成二维码、动态二维码 和 而二维码解析

    python生成二维码.动态二维码 和 而二维码解析(8-20190129) 文章目录: 一.二维码介绍 二. 就是为了好玩所以想搞一下二维码,"好玩",少年醒醒,不要骗自己啦,起 ...

  3. 初学Python(二)——数组

    初学Python(二)--数组 初学Python,主要整理一些学习到的知识点,这次是数组. # -*- coding:utf-8 -*- list = [2.0,3.0,4.0] #计算list长度 ...

  4. python可以使用二维元组吗_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...

    怎么去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  5. 互联网 4 大发明之二维码,你如何使用 Python 生成二维码?

    阅读文本大概需要 8 分钟. 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国青年投票选出中国的"新四大发明 ...

  6. [Python图像处理] 二十八.OpenCV快速实现人脸检测及视频中的人脸

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  7. [Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)

    八年前,我正是通过学习OpenGL和C++,通过做"采蘑菇的小矮人"游戏,慢慢走上并爱上了编程.回过头来,我希望通过Python和OpenGL分享一些有趣的知识,提升您的编程兴趣, ...

  8. 据说这是熟练掌握python的爷们_dongbei 是一门基于 Python 3 二次开发的东北方言编程语言...

    dongbei - 东北方言编程语言 学编程,就整东北浪! 体格咋地 扫码关注原作者微信公众号"老万故事会": 引言 dongbei是啥?它是一门以东北方言词汇为基本关键字的以人为 ...

  9. Python实现二叉搜索树的删除功能

    Python实现二叉搜索树的删除功能 二叉搜索树(二叉查找树,Binary Search Tree)又称为排序二叉树.有序二叉树. 二叉搜索树的实现可以参考:https://blog.csdn.net ...

  10. Python实现二叉搜索树

    Python实现二叉搜索树 二叉搜索树(二叉查找树,Binary Search Tree)是一种特殊的二叉树,又称为排序二叉树.有序二叉树. 二叉搜索树具有如下特性: 1. 如果二叉树的左子树不为空, ...

最新文章

  1. mysql中检索以名字_【MySQL必知必会】第四章 检索数据
  2. C# 字符,字符串和文本处理。
  3. Windows域环境下部署ISA Server 2006防火墙(二)
  4. python中circle函数的用法,python画圆运用了什么函数
  5. 用Python写一个简单的监控系统
  6. Spring源码学习笔记:经典设计模式之观察者模式
  7. 操作系统试验-Nachos系统调用实现
  8. iOS 开发 XMPP即时通讯项目开发(仿微信)-详解之XMPP入门
  9. MATLAB求解三角函数
  10. word 插入表格,位置不在最左边
  11. java调用import了第三方库的python脚本为啥就是出不来结果嘞
  12. 前端开发学习笔记(一):HTML
  13. 腾讯视频弹幕屏蔽js
  14. 显微镜C接口_壁虎支架、AI相机、手机镜头、便携显微镜,十一旅行有它们更精彩...
  15. 证书类型、自签CA证书、https双向认证(一篇就懂系列)
  16. Excel根据名字批量插入图片
  17. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
  18. P2455 [SDOI2006]线性方程组
  19. 特征面提取相关文献阅读笔记(1)上篇
  20. 震惊!!C++居然可以发出声音!

热门文章

  1. 用overleaf 写 计算机学报 格式的论文
  2. 计算机组装与系统维护技术,计算机组装与系统维护技术.pdf
  3. HTML课程导航作业,北大青年课程导航.html
  4. 大容量网盘才是王道?看看坚果云这类的小容量网盘的生存之道
  5. vue设置LED字体
  6. 伪原创工具,AI采集伪原创,内容伪原创工具
  7. 微信开放平台Android常见问题
  8. Android 计算视频的fps
  9. Oracle+ogg-00664,OGG采用NET8方式读取ASM中日志报OGG-00664(ORA-12162),配置如下:
  10. Java语言实现冒泡排序