前言
- 本文是傅立叶及其python应用系列的第一篇文章
- 对应的仓库地址为https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series
介绍
- 本篇文章将要介绍一个非常小众的
scipy
函数:simpson. 这个函数的一大功能就是可以对离散数据积分
。 - 之所以要介绍这个函数,是因为要开始写关于
傅立叶主题
的文章了,因为离散数据积分在傅立叶计算中非常重要,而在python中能做离散数据积分的、现成的函数,也就是只有这个函数了。 - 傅立叶变换和离散数据积分有什么关系?本篇先不解释他们的关系,后面我会渐近的介绍所有相关的内容。暂时还不需要知道他们是什么关系。
- 从一个简单的物理小知识入手,逐步的带你走进傅立叶的世界~
例子
有一天,小胡骑车,在0秒的时候,他的速度是0m/s,在1秒的时候,他的速度是0.45m/s,,,,依次类推,小胡把他每一秒的自行车速度都记下来了。还画了一个图:
上面的图应该都很熟悉,这就是高中物理里面学习的时间-速度
变化曲线图。
- 虽然我们是每隔一秒记录了一次速度,但是我们这个时间依然是不连续的,而且也不可能连续,有办法把0.00001s、0.00002s、0.00003s等每一个瞬间速度都记下来么?不可能!
- 我们只能大概的记录下每一秒的速度,然后做等效:每一秒的、最开始的、速度 默认为这个秒时间段内的平均速度。
- 既然
时间-速度
变化曲线图都给我们了,其实,我们基于物理意义也就知道了:曲线下和x轴组成的面积其实就是行驶的路程。而求这个面积其实就是一个积分过程。
上方的阴影面积就是行驶的路程了。
到这里应该就大概了解了什么叫离散数据积分
- 现实世界是连续的,但是我们没有办法把每一刻的速度都记录下来,因此记录的都是离散的点
- 基于离散的点,求积分,就是离散数据积分,比如上面的基于
时间-速度
变化曲线图求总路程等。
代码
认识了离散数据求积分,那么怎么求是重点了。其实使用scipy.integrate.simpson
就可以非常简单的计算出来。
simpson
需要起码需要两个参数:
y
:也就是因变量,比如上面的速度,对应的就是y;x
:也就是自变量,比如上面的时间,对应的就是x;
需要注意的是,一定不要搞反了!simpson
需要的第一个参数是y
,y
在前和x
在后!!!血的教训,因为我搞反了,导致傅立叶计算的都不对😭,找了半天bug,才发现这个错误
# 导入包
from scipy.integrate import simpson
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt # 数据部分
# 数据来自于matlab doc
vel = np.array([0, 0.45, 1.79, 4.02, 7.15, 11.18, 16.09, 21.90, 29.05, 29.05,
29.05, 29.05, 29.05, 22.42, 17.9, 17.9, 17.9, 17.9, 14.34, 11.01,
8.9, 6.54, 2.03, 0.55, 0])
time = np.arange(vel.shape[0])# 求积分部分
simpson(vel, time)
# > 344.7933333333334
- 上面的数据是来自matlab的doc文档。
- 求积分就那个一个函数,把对应的
y
、x
按照顺序传递进去就行了。 - 最终我们大概行驶了约344.7米。
参考资料
- 本文用到的几个截图,包括数据,是来自于matlab官方文档,参考链接为: https://ww2.mathworks.cn/help/matlab/math/integration-of-numeric-data.html
scipy.integrate.simpson
链接为:https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.simpson.html#scipy.integrate.simpson
代码
傅立叶及其python应用所有的代码和数据全部都免费共享!
- 代码所在文件夹为:https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series
- 代码文件为
01
开头的ipynb
格式文件