python插值计算

一维插值

常规用法

【参考文章】
python实现各种插值法(数值分析)
python scipy样条插值函数大全(interpolate里interpld函数)
Python:插值interpolate模块
示例代码

# -*-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范围
如何使scipy.interpolate给出超出输入范围的外推结果?

在interpolate下设置bounds_error和fill_value

bounds_error:布尔值,可选
如果为True,则任何时候尝试对x范围之外的值进行插值都会引发ValueError(需要进行插值)。如果为False,则为边界值分配fill_value。fill_value默认情况下返回Nan,如果采用外推则设置fill_value=“extrapolate”。

import numpy as np
from scipy import interpolate

x = np.arange(0,10)
y = np.exp(-x/3.0)
f = interpolate.interp1d(x, y, bounds_error=False,fill_value="extrapolate")

print(f(9),np.exp(-9/3),f(9)-np.exp(-9/3))  
#0.049787068367863944 0.049787068367863944 0.0
print(f(11),np.exp(-11/3),f(11)-np.exp(-11/3)) 
#0.049787068367863944 0.025561533206507402 0.024225535161356542

由于外推部分是线性外推,所以对于非线性函数会有些许误差。
当然fill_value也可以是具体的值,比如0,或者边界值y[-1](但要注意设置边界值的话可能出现左侧溢出却返回右侧边界值的情况,此时应做相应处理,或者采用下面的interp函数。

采用interp

interp是将左侧和右侧的边界值直接作为超出范围的部分,而且使用格式与interpolate有些不同

import numpy as np
from scipy import interp

x = np.arange(0,10)
y = np.exp(-x/3.0)
interp([9,10],x, y)  #两个插值返回结果相同

自编外推插值函数

参考文章 如何使scipy.interpolate给出超出输入范围的外推结果?

单变量插值UnivariateSpline

参考文章 Python:插值interpolate模块
UnivariateSpline可以外插值
调用方式如下:

UnivariateSpline(x,y,w=None,bbox=[None,None],k=3,s=None)
  • x,y是X-Y坐标数组
  • w是每个数据点的权重值
  • k为样条曲线的阶数
  • s为平滑参数。
  • s=0,样条曲线强制通过所有数据点
  • s>0,满足 ∑ ( w ( y − spline ⁡ ( x ) ) ) 2 ≤ s \sum(w(y-\operatorname{spline}(x)))^{2} \leq s (w(yspline(x)))2s

s=0强制通过所有数据点的外插值

from scipy import interpolate
import numpy as np
x1=np.linspace(0,10,20)
y1=np.sin(x1)

sx1=np.linspace(0,12,100)
func1=interpolate.UnivariateSpline(x1,y1,s=0)#强制通过所有点
sy1=func1(sx1)

import matplotlib.pyplot as plt
plt.plot(x1,y1,'o')
plt.plot(sx1,sy1)
plt.show()

在这里插入图片描述
也就插值到(0,12),范围再大就不行了,毕竟插值的专长不在于预测

s>0:不强制通过所有点

import numpy as np
from scipy import interpolate
x2=np.linspace(0,20,200)
y2=np.sin(x2)+np.random.normal(loc=0,scale=1,size=len(x2))*0.2

sx2=np.linspace(0,22,2000)
func2=interpolate.UnivariateSpline(x2,y2,s=8)
sy2=func2(sx2)

import matplotlib.pyplot as plt
plt.plot(x2,y2,'.')
plt.plot(sx2,sy2)
plt.show()

在这里插入图片描述

多维插值

常见用法

后面几个例子中其实比较麻烦的不是插值算法,而是生成数据,而自己常遇到的情况是数表都已经准备好了,直接插值就可以了。
比如拿到一个二维数表z,横坐标就是x索引,纵坐标就是y索引,进而直接用 interp2d 就可以了。

官方文档:scipy.interpolate.interp2d

from scipy import interpolate
f = interpolate.interp2d(x, y, z, kind='linear', copy=True, bounds_error=False, fill_value=None)  # 首先定义插值函数
z1 = f(x1,y1)   # 如果想插值得到 (x1,y1) 处的新数据,则带入f即可

interp2d()

二维插值仍然参考文章 如何使scipy.interpolate给出超出输入范围的外推结果?
使用的函数为interp2d()

scipy.interpolate.interp2d(x, y, z, kind='linear', copy=True, bounds_error=False, fill_value=None)

其中kind为可选项,包括{‘linear’, ‘cubic’, ‘quintic’},默认是‘linear’。

这里有几个注意事项:

  • The minimum number of data points required along the interpolation axis is (k+1)**2, with k=1 for linear, k=3 for cubic and k=5 for quintic interpolation.
  • The interpolator is constructed by bisplrep, with a smoothing factor of 0. If more control over smoothing is needed, bisplrep should be used directly.
  • The coordinates of the data points to interpolate xnew and ynew have to be sorted by ascending order. interp2d is legacy and is not recommended for use in new code. New code should use RegularGridInterpolator instead.

基本用法

例1

import numpy as np 
def func(x,y): 
    return (x+y)*np.exp(-5*(x**2+y**2)) 
x = np.linspace(-1,1,15)
y = np.linspace(-1,1,20)
xx,yy = np.mgrid[-1:1:20j,-1:1:15j]      # 注意这里维度的先后顺序和x、y相反,j代表数据个数
z = func(xx,yy)

from scipy import interpolate
func_inter = interpolate.interp2d(x,y,z,kind='cubic')

xnew = np.linspace(-1,1,100)
ynew = np.linspace(-1,1,100)
znew = func_inter(xnew,ynew)     #xnew, ynew是一维的,输出znew是二维的
xnew,ynew = np.mgrid[-1:1:100j,-1:1:100j]   #统一变成二维,便于下一步画图

import mpl_toolkits.mplot3d
import matplotlib.pyplot as plt
ax=plt.subplot(111,projection='3d')
ax.plot_surface(xnew,ynew,znew)
ax.scatter(xx,yy,z,c='r',marker='^')
plt.show()

mgrid和meshgrid生成数据的不同

首先注意,mgrid生成的是等差数列,这直接限制了其应用范围,而meshgrid可以是任意数组。
关于两个的用法与区别,可参见 https://blog.csdn.net/gsgbgxp/article/details/129534233

例1
使用 mgrid

import numpy as np
from scipy import interpolate

x = np.linspace(-5.01, 5.01, 30)
y = np.linspace(-5.01, 5.01, 40)
xx, yy = np.mgrid[-5.01:5.01:40j,-5.01:5.01:30j] 
z = np.sin(xx**2+yy**3)
f = interpolate.interp2d(x, y, z, kind='cubic')

import matplotlib.pyplot as plt

xnew = np.arange(-5.01, 5.01, 1e-2)
ynew = np.arange(-5.01, 5.01, 1e-2)
znew = f(xnew, ynew)

plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-')
plt.show()

运行结果为
在这里插入图片描述

例2
使用 meshgrid

import numpy as np
from scipy import interpolate

x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.15)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**3)
f = interpolate.interp2d(x, y, z, kind='cubic')

import matplotlib.pyplot as plt

xnew = np.arange(-5.01, 5.01, 1e-2)
ynew = np.arange(-5.01, 5.01, 1e-2)
znew = f(xnew, ynew)

plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-')
plt.show()

运行结果为
在这里插入图片描述
例3
发现上面两个例子运行结果不一样,这和mgrid与meshgrid之间的逻辑差别有关。如果想要得到一样的结果,可以修改例2中的z函数表达式。

import numpy as np
from scipy import interpolate

x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.15)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**3+yy**2)
f = interpolate.interp2d(x, y, z, kind='cubic')

import matplotlib.pyplot as plt

xnew = np.arange(-5.01, 5.01, 1e-2)
ynew = np.arange(-5.01, 5.01, 1e-2)
znew = f(xnew, ynew)

plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-')
plt.show()

运行结果为
在这里插入图片描述

生成间隔不均匀的数据并插值

mgrid只能生成间隔均匀的数据,因此需要采用meshgrid

# 如果x和y间隔不均匀-meshgrid形式

import numpy as np
from scipy import interpolate

x_start = 0
x_stop  = 5
x_num   = 10
x_base  = 1.5
y_start = 0
y_stop  = 5
y_num   = 10
y_base  = 1.5

x = np.logspace(x_start,x_stop,x_num,base=x_base)    # logspace生成等比数列,底为base
y = np.logspace(y_start,y_stop,y_num,base=y_base)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**3)
f = interpolate.interp2d(x, y, z, kind='cubic')

import matplotlib.pyplot as plt

xnew = np.arange(x_base**x_start,x_base**x_stop, 1e-2)
ynew = np.arange(y_base**y_start,y_base**y_stop, 1e-2)
znew = f(xnew, ynew)

plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-')
plt.show()

运行结果为
在这里插入图片描述

二维插值Rbf()

Rbf的优点是,排列可以无序,可以不是等距的网格

step1:随机生成点,并计算函数值

import numpy as np
def func(x,y):
    return (x+y)*np.exp(-5*(x**2+y**2))

x=np.random.uniform(low=-1,high=1,size=100)
y=np.random.uniform(low=-1,high=1,size=100)
z=func(x,y)

step2:插值

from scipy import  interpolate
func=interpolate.Rbf(x,y,z,function='multiquadric')
xnew,ynew=np.mgrid[-1:1:100j,-1:1:100j]
znew=func(xnew,ynew)#输入输出都是二维

step3:画图

import mpl_toolkits.mplot3d
import matplotlib.pyplot as plt
ax=plt.subplot(111,projection='3d')
ax.plot_surface(xnew,ynew,znew)
ax.scatter(x,y,z,c='r',marker='^')
plt.show()

官方推荐函数:interpn 与 RegularGridInterpolator

还没详细研究,如果将来用到高维插值的话再看吧。
官方文档

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第 1 章 软件包的安装和介绍....................1 1.1 Python 简介......................................1 1.2 安装软件包......................................2 1.2.1 Python(x,y)..................................... 2 1.2.2 Enthought Python Distribution (EPD)............................................. 3 1.3 方便的开发工具..............................3 1.3.1 IPython........................................... 4 1.3.2 Spyder............................................ 8 1.3.3 Wing IDE 101..............................12 1.4 函数库介绍....................................13 1.4.1 数值计算库.................................13 1.4.2 符号计算库.................................14 1.4.3 界面设计.....................................14 1.4.4 绘图与可视化 .............................14 1.4.5 图像处理和计算机视觉..............15 第 2 章 NumPy——快速处理数据.......... 16 2.1 ndarray 对象...................................16 2.1.1 创建数组.....................................16 2.1.2 存取元素.....................................21 2.1.3 多维数组.....................................24 2.1.4 结构数组.....................................29 2.1.5 内存结构.....................................32 2.2 ufunc 运算......................................35 2.2.1 四则运算.....................................37 2.2.2 比较和布尔运算 .........................39 2.2.3 自定义 ufunc 函数 ......................40 2.2.4 广播.............................................42 2.2.5 ufunc 函数的方法.......................46 2.3 多维数组的下标存取....................48 2.3.1 下标对象.....................................48 2.3.2 整数数组作为下标.....................49 2.3.3 一个复杂的例子.........................51 2.3.4 布尔数组作为下标.....................53 2.4 庞大的函数库 ............................... 54 2.4.1 求和、平均值、方差.................54 2.4.2 最值和排序.................................55 2.4.3 多项式函数.................................57 2.4.4 分段函数.....................................60 2.4.5 统计函数.....................................62 2.5 线性代数 ....................................... 65 2.5.1 各种乘积运算.............................65 2.5.2 解线性方程组.............................67 2.6 掩码数组 ....................................... 69 2.7 文件存取 ....................................... 72 2.8 内存映射数组 ............................... 75 第 3 章 SciPy——数值计算库.................79 3.1 常数和特殊函数 ........................... 79 3.2 优化——optimize .......................... 81 3.2.1 最小二乘拟合.............................81 3.2.2 函数最小值.................................84 3.2.3 非线性方程组求解.....................86 3.3 插值——interpolate ....................... 88 3.3.1 B 样条曲线插值..........................88 3.3.2 外推和 Spline 拟合.....................90 3.3.3 二维插值.....................................91 3.4 数值积分——integrate .................. 93 3.4.1 球的体积.....................................93 3.4.2 解常微分方程组.........................95 3.5 信号处理——signal....................... 97 欢迎加入非盈利Python学习交流编程QQ群783462347,群里免费提供500+本Python书籍! VIII Python 科学计算 目 录 3.5.1 中值滤波.....................................97 3.5.2 滤波器设计.................................98 3.6 图像处理——ndimage .................100 3.6.1 膨胀和腐蚀...............................101 3.6.2 Hit 和 Miss.................................102 3.7 统计——stats................................105 3.7.1 连续和离散概率分布................105 3.7.2 二项、泊松、伽玛分布............108 3.8 嵌入 C 语言程序——weave ........112 第 4 章 SymPy——符号运算好帮手 .... 115 4.1 从例子开始..................................115 4.1.1 封面上的经典公式....................115 4.1.2 球体体积...................................117 4.2 数学表达式..................................119 4.2.1 符号...........................................119 4.2.2 数值...........................................121 4.2.3 运算符和函数 ...........................122 4.3 符号运算......................................125 4.3.1 表达式变换和化简....................125 4.3.2 方程...........................................128 4.3.3 微分...........................................129 4.3.4 微分方程...................................130 4.3.5 积分...........................................131 4.4 其他功能......................................133 4.4.1 平面几何...................................133 4.4.2 绘图...........................................135 第 5 章 matplotlib——绘制精美 的图表..................................... 139 5.1 快速绘图......................................139 5.1.1 使用 pyplot 模块绘图...............139 5.1.2 以面向对象方式绘图................142 5.1.3 配置属性...................................143 5.1.4 绘制多个子图 ...........................145 5.1.5 配置文件...................................147 5.1.6 在图表中显示中文....................149 5.2 Artist 对象 ................................... 152 5.2.1 Artist 对象的属性.....................154 5.2.2 Figure 容器................................155 5.2.3 Axes 容器..................................156 5.2.4 Axis 容器...................................159 5.2.5 Artist 对象的关系.....................163 5.3 坐标变换和注释 ......................... 164 5.3.1 4 种坐标系................................167 5.3.2 坐标变换的步骤.......................169 5.3.3 制作阴影效果...........................173 5.3.4 添加注释...................................174 5.4 绘图函数简介 ............................. 177 5.4.1 对数坐标图...............................177 5.4.2 极坐标图...................................178 5.4.3 柱状图.......................................179 5.4.4 散列图.......................................180 5.4.5 图像...........................................181 5.4.6 等值线图...................................184 5.4.7 三维绘图...................................187 第 6 章 Traits——为 Python 添加类型 定义.........................................190 6.1 开发背景 ..................................... 190 6.2 Trait 属性的功能......................... 192 6.3 Trait 类型对象............................. 196 6.4 Trait 的元数据............................. 198 6.5 预定义的 Trait 类型.................... 200 6.6 Property 属性............................... 204 6.7 Trait 属性监听............................. 206 6.8 Event 和 Button 属性.................. 210 6.9 Trait 属性的从属关系................. 211 6.10 动态添加 Trait 属性.................. 213 6.11 创建自己的 Trait 类型.............. 215 6.11.1 从 TraitType 继承.................215 6.11.2 使用 Trait()............................217 6.11.3 定义 TraitHandler 类.............219 欢迎加入非盈利Python学习交流编程QQ群783462347,群里免费提供500+本Python书籍! IX 目 录 第 7 章 TraitsUI——轻松制作用户 界面......................................... 221 7.1 默认界面......................................221 7.2 用 View 定义界面........................222 7.2.1 外部视图和内部视图................222 7.2.2 多模型视图...............................226 7.2.3 Group 对象................................228 7.2.4 配置视图...................................231 7.3 用 Handler 控制界面和模型 .......232 7.3.1 用 Handler 处理事件.................233 7.3.2 Controller 和 UIInfo 对象..........237 7.3.3 响应 Trait 属性的事件..............238 7.4 属性编辑器..................................240 7.4.1 编辑器演示程序 .......................241 7.4.2 对象编辑器...............................243 7.4.3 字符串列表编辑器....................248 7.4.4 对象列表编辑器 .......................250 7.5 菜单、工具条和状态栏..............252 7.6 设计自己的编辑器......................255 7.6.1 Trait 编辑器的工作原理...........255 7.6.2 制作 matplotlib 的编辑器.........259 7.6.3 CSV 数据绘图工具...................262 第 8 章 Chaco——交互式图表............. 264 8.1 面向脚本绘图..............................264 8.2 面向应用绘图..............................265 8.2.1 多条曲线...................................267 8.2.2 Plot 对象的结构........................271 8.2.3 编辑绘图属性 ...........................275 8.2.4 容器(Container).........................276 8.3 添加交互工具..............................279 8.3.1 平移和缩放...............................279 8.3.2 选取范围...................................282 8.3.3 选取数据点...............................284 8.3.4 套索工具...................................287 8.4 二次开发......................................289 8.4.1 用 Kiva 库在数组上绘图..........290 8.4.2 Enable 库的组件.......................292 8.4.3 设计圆形选择工具...................297 8.4.4 制作动画演示...........................301 第 9 章 TVTK——数据的三维可视化....303 9.1 流水线(Pipeline).......................... 304 9.1.1 显示圆锥...................................304 9.1.2 用 ivtk 观察流水线...................307 9.2 数据集(Dataset)........................... 313 9.2.1 ImageData..................................313 9.2.2 RectilinearGrid...........................318 9.2.3 StructuredGrid............................319 9.2.4 PolyData ....................................321 9.3 可视化实例 ................................. 324 9.3.1 切面...........................................325 9.3.2 等值面.......................................330 9.3.3 流线...........................................333 9.4 TVTK 的改进.............................. 337 9.4.1 TVTK 的基本用法....................338 9.4.2 Trait 属性...................................339 9.4.3 序列化(Pickling)........................339 9.4.4 集合迭代...................................340 9.4.5 数组操作...................................341 第 10 章 Mayavi——更方便的可视化....343 10.1 用 mlab 快速绘图 ..................... 343 10.1.1 点和线...................................343 10.1.2 Mayavi 的流水线..................345 10.1.3 二维图像的可视化...............348 10.1.4 网格面...................................352 10.1.5 修改和控制流水线...............356 10.1.6 标量场...................................358 10.1.7 矢量场...................................361 10.2 Mayavi 和 TVTK 之间 的关系....................................... 363 10.2.1 显示 TVTK 流水线..............363 10.2.2 两条流水线之间的关系.......365 欢迎加入非盈利Python学习交流编程QQ群783462347,群里免费提供500+本Python书籍! X Python 科学计算 目 录 10.3 Mayavi 应用程序.......................367 10.3.1 操作流水线...........................368 10.3.2 命令行和对象浏览器...........371 10.4 将 Mayavi 嵌入到界面中..........374 第 11 章 VPython——制作 3D 演示 动画 ...................................... 378 11.1 场景、物体和照相机................378 11.1.1 控制场景窗口.......................380 11.1.2 控制照相机...........................383 11.1.3 模型的属性...........................384 11.1.4 三维模型...............................387 11.2 制作动画演示............................390 11.2.1 简单动画...............................390 11.2.2 盒子中反弹的球...................391 11.3 与场景交互................................393 11.3.1 响应键盘事件.......................394 11.3.2 响应鼠标事件.......................394 11.4 用界面控制场景........................397 11.5 创建复杂模型............................400 11.5.1 faces()的用法........................400 11.5.2 读入模型数据.......................402 第 12 章 OpenCV——图像处理和计算机 视觉 ...................................... 408 12.1 存储图像数据的 Mat 对象........409 12.1.1 Mat 对象和 NumPy 数组.....410 12.1.2 像素点类型...........................414 12.1.3 其他数据类型.......................415 12.1.4 Vector 类型...........................417 12.1.5 在图像上绘图.......................418 12.2 图像处理....................................421 12.2.1 二维卷积...............................421 12.2.2 形态学运算...........................424 12.2.3 填充——floodFill..................426 12.2.4 去瑕疵——inpaint.................427 12.3 图像变换....................................428 12.3.1 几何变换...............................428 12.3.2 重映射——remap..................430 12.3.3 直方图统计...........................433 12.3.4 二维离散傅立叶变换...........437 12.4 图像识别 ................................... 440 12.4.1 用霍夫变换检测直线 和圆.......................................440 12.4.2 图像分割...............................444 12.4.3 用 SURF 进行特征匹配.......450 第 13 章 数据和文件 ............................453 13.1 声音的输入输出 ....................... 453 13.1.1 读写 WAV 文件...................453 13.1.2 用 pyAudio 播放和录音.......456 13.2 视频的输入输出 ....................... 459 13.2.1 读写视频文件.......................459 13.2.2 安装视频编码.......................464 13.3 读写 HDF5 文件....................... 465 13.4 读写 Excel 文件 ........................ 469 13.4.1 写 Excel 文件........................469 13.4.2 读 Excel 文件........................471 第 14 章 数字信号系统.........................473 14.1 FIR 和 IIR 滤波器..................... 473 14.2 FIR 滤波器设计........................ 477 14.2.1 用 firwin()设计滤波器..........479 14.2.2 用 remez()设计滤波器..........481 14.2.3 滤波器的级联.......................483 14.3 IIR 滤波器设计......................... 485 14.3.1 巴特沃斯低通滤波器...........485 14.3.2 双线性变换...........................487 14.3.3 滤波器的频带转换...............490 14.4 数字滤波器的频率响应 ........... 494 14.5 二次均衡滤波器设计工具 ....... 497 14.6 零相位滤波器 ........................... 500 14.7 重取样 ....................................... 501 欢迎加入非盈利Python学习交流编程QQ群783462347,群里免费提供500+本Python书籍! XI 目 录 第 15 章 频域信号处理........................ 505 15.1 FFT 演示程序............................505 15.1.1 FFT 知识复习.......................505 15.1.2 合成时域信号.......................509 15.1.3 三角波 FFT 演示程序..........511 15.2 观察信号的频谱........................512 15.2.1 窗函数...................................515 15.2.2 频谱平均...............................517 15.2.3 谱图.......................................519 15.3 卷积运算....................................522 15.3.1 快速卷积...............................522 15.3.2 分段运算...............................524 15.4 信号处理....................................526 15.4.1 基本框架...............................527 15.4.2 频域滤波器...........................528 15.4.3 频率变调处理.......................530 15.4.4 用谱图差减法降噪...............531 15.5 Hilbert 变换................................532 第 16 章 用 C 语言提高计算效率......... 537 16.1 用 ctypes 调用 DLL 库..............537 16.2 用 Weave 嵌入 C++程序...........541 16.2.1 Weave 的工作原理...............541 16.2.2 处理 NumPy 数组.................543 16.2.3 使用 blitz()提速.....................546 16.2.4 扩展模块...............................548 16.3 用 Cython 将 Python 编译 成 C............................................549 16.3.1 编译 Cython 程序.................549 16.3.2 提高计算效率.......................550 16.3.3 快速访问 NumPy 数组.........553 16.4 用 SWIG 创建扩展模块............555 16.4.1 SWIG 的调用方法 和实例 ..................................555 16.4.2 SWIG 基础............................558 16.4.3 SWIG 处理 NumPy 数组......566 第 17 章 自适应滤波器.........................571 17.1 自适应滤波器简介 ................... 571 17.1.1 系统识别...............................571 17.1.2 信号预测...............................572 17.1.3 信号均衡...............................572 17.2 NLMS 计算公式....................... 573 17.3 用 NumPy 实现 NLMS 算法.... 575 17.3.1 系统辨识模拟.......................577 17.3.2 信号均衡模拟.......................579 17.3.3 卷积逆运算...........................581 17.4 用 C 语言加速 NLMS 运算...... 583 17.4.1 用 SWIG 编写扩展模块.......583 17.4.2 用 Weave 嵌入 C++程序......586 第 18 章 单摆和双摆模拟.....................588 18.1 单摆模拟 ................................... 588 18.1.1 小角度时的摆动周期...........589 18.1.2 大角度时的摆动周期...........590 18.2 双摆模拟 ................................... 592 18.2.1 公式推导...............................592 18.2.2 微分方程的数值解...............595 18.2.3 动画演示...............................598 第 19 章 分形几何................................599 19.1 Mandelbrot 集合........................ 599 19.1.1 使用 NumPy 加速计算.........601 19.1.2 使用 Weave 加速计算..........603 19.1.3 连续的逃逸时间...................604 19.1.4 Mandelbrot 演示程序 ...........605 19.2 迭代函数系统(IFS)................... 606 19.2.1 二维仿射变换.......................610 19.2.2 迭代函数系统设计器...........610 19.3 L-System 分形........................... 613 19.4 分形山脉 ................................... 616 19.4.1 一维中点移位法...................616 19.4.2 二维中点移位法...................618 19.4.3 菱形方形算法.......................619
期权波动率是指市场对某个股票或指数在未来一段时间内的波动程度的预期。插值法是一种常用的计算期权波动率的方法,其基本思想是根据已知的期权价格和市场上其他期权的价格,来推断出期权隐含的波动率。 在Python中,可以使用scipy库中的optimize模块中的curve_fit函数来进行插值计算。具体步骤如下: 1.导入需要的库: ```python import numpy as np from scipy.optimize import curve_fit ``` 2.构造计算期权波动率的函数: ```python def black_scholes_call(S, K, T, r, sigma): d1 = (np.log(S/K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) call_price = S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2) return call_price def implied_volatility(S, K, T, r, C): """ S: 标的资产价格 K: 行权价格 T: 剩余期限 r: 无风险利率 C: 期权市场价格 """ init_vol = 0.2 # 初始化波动率 try: sigma = curve_fit(lambda x, sigma: black_scholes_call(S, K, T, r, sigma) - C, xdata=None, ydata=C, p0=init_vol, bounds=(0, np.inf))[0][0] return sigma except: return np.nan ``` 3.使用数据进行测试: ```python S = 100 # 标的资产价格 K = 100 # 行权价格 T = 1 # 剩余期限 r = 0.05 # 无风险利率 # 假设市场上有如下的期权价格 call_prices = [10.45, 8.40, 6.40, 4.45, 2.65] implied_vols = [] for call_price in call_prices: implied_vol = implied_volatility(S, K, T, r, call_price) implied_vols.append(implied_vol) print(implied_vols) ``` 输出结果为: ```python [0.19999999999999998, 0.3, 0.3999999999999999, 0.5, 0.6] ``` 其中,implied_vols列表中的元素即为根据已知期权价格计算得到的期权波动率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值