第1章 数学可视化
1.1 离散傅里叶变换和频域变换
傅里叶分析是对声音、图像等计算机数据进行分析和处理的**知识。本节我们通过合成声音、傅里叶分析和频谱处理等一系列操作,让读者对傅里叶分析的原理和应用有一个较为直观的理解。图1.1 显示了音频数据合成和在频域进行声调变换前后,声音和频谱的展示及对比。本节后续内容将遵循这个流程进行实操。
图1.1 通过在频域上处理音频数据改变声音
表1.1 中列出了文中使用的Python 程序库。这些程序库被众多用户熟知并广泛使用。截至2023 年3 月,表1.1 中的程序库均需要在Python 3.8或更高版本运行。建议读者用*新版本的Python 搭建运行环境,运行本文中的代码。
表1.1 本文使用的Python 程序库
1.1.1 傅里叶级数和离散傅里叶变换
如图1.1 所示,一般的波动信号可以分解为不同周期的正弦波的总和。求解一个波动信号包含哪些不同周期的正弦波(三角函数)的技术,称为傅里叶分析。本小节介绍傅里叶级数展开和离散傅里叶变换的基础知识,不对数学原理做过多展开。
1. 傅里叶级数
简单地说,傅里叶级数是用三角函数之和逼近一个函数。设函数?? (??) 的周期为?? ,它的傅里叶级数表达式如下:
(1.1)
式(1.1) 中的系数???? 和???? 称为傅里叶系数。将?? (??) 看作周期性声音信号,信号的*低频率,也就是基频,为1 / ?? 。傅里叶级数中sin 和cos 函数的自变量里出现的?? / ?? 可以看作基频的?? 倍,简称为倍频。
即使?? (??) 为非周期性函数,也可以对?? (??) 在[??? / 2, ?? / 2] 上定义的函数值进行周期延拓,从而应用傅里叶级数展开。
接下来用一段程序完成以下内容:
① 使用SymPy 求解任意函数的傅里叶级数展开。
② 验证函数?? (??) = ?? 的傅里叶级数展开可表示为三角函数的和。
③ 验证近似水平随着傅里叶级数展开式中项数的增加而增加。
2. 代码实现
程序1.1 使用SymPy 求解任意函数的傅里叶级数展开
1 from sympy import *
2 # 定义用于表达式的变量符号
3 x = symbols('x')
4 # 定义用于傅里叶级数展开的函数f(x) = x
5 f = x
6 # 求解傅里叶级数展开
7 s = fourier_series(f, (x, -pi, pi))
8 # 指定项数,求解级数展开的部分和
9 terms = (1, 5, 31)
10 ss = [s.truncate(n) for n in terms]
11 # 输出级数展开的表达式
12 for n, exp in zip(range(len(terms)), ss):
13 print(f'n = {terms[n]}时: ')
14 display(exp)
15 # 使用sympy 的绘图函数plot 绘制函数图形
16 p = plot(f, *ss, (x, -pi, pi), show = False, legend =True)
17 p[0].line_color = (0,0,0)
18 p[0].label = '$x$'
19 for i in range(len(terms)):
20 p[i+1].label = f'$n$ = {terms[i]}'
21 p.show()
程序1.1 展示了傅里叶级数展开的实现程序,下面解释程序1.1 中的关键步骤。
?第3行
3 x = symbols('x')
定义建立表达式所需的符号(变量),如果需要定义多个变量,则用
a, x = symbols('a, x')
其中,symbols() 函数的参数以一组空格分隔的字符串组成,字符串数量等于函数返回的变量元组(tuple)的长度。
?第5 行
5 f = x
定义需要展开的函数。函数的形式为?? (??) = ?? 时, 在Python 中记为f(x) = x;其他函数形式,例如?? (??) = ??(?? + 1)2,在Python 中记为f(x) =a*(x+1)**2。
? 第7 行
7 s = fourier_series(f, (x, -pi, pi))
使用SymPy 提供的fourier_series() 函数计算给定函数的傅里叶级数展开,有两个参数,一是被展开的函数,二是函数的自变量及其周期范围(x,-pi, pi),以Python 元组的形式给出。代码中的pi 为SymPy 预先定义的圆周率π的符号。
? 第9、10 行
9 terms = (1, 5, 31)
10 ss = [s.truncate(n) for n in terms]
用truncate() 函数截断傅里叶级数展开的表达式,以求得给定项数的部分和。第10 行的写法在Python 中称为列表推导式(list comprehension),是一种为列表中各个元素赋值的简洁写法。
? 第12~14 行
12 for n, exp in zip(range(len(terms)), ss):
13 print(f'n = {terms[n]} 时:')
14 display(exp)
将上述部分和公式的具体形式打印出来。
? 第16~21 行
16 p = plot(f, *ss, (x, -pi, pi), show = False, legend =True)
17 p[0].line_color = (0,0,0)
18 p[0].label = '$x$'
19 for i in range(len(terms)):
20 p[i+1].label = f'$n$ = {terms[i]}'
21 p.show()
使用SymPy 的plot() 函数绘制原来的函数以及每个部分和。plot() 函数的参数中包含要绘制的函数、自变量范围以及其他一些绘图选项。其中,16行的*ss 为Python 中展开列表的写法,将列表ss 中的元素展开,同前面的f 一并作为参数传递给plot 函数。
3. 运行结果
图1.2 和图1.3 展示了在Jupyter Notebook 中运行程序1.1 得到的结果。
图1.2 中,函数?? = ?? 的傅里叶展开式中只包含正弦函数。这是因为?? = ?? 是奇函
6 Python 实验编程:自然科学探究
数,其图像关于原点对称,所以其傅里叶展开式中所有余弦函数的系数为0。
图1.2 函数?? = ?? 的傅里叶展开式截断到不同项数的结果
图1.3 函数?? = ?? 及其傅里叶级数的部分和图像
从图1.3 可以看出,?? = 1 时,傅里叶级数逼近原来的函数?? = ?? 的程度甚微;?? 增加到31 时,除自变量范围的边缘?? = ±π 附近之外,其他部分已经很好地逼近了原来的函数。
利用式(1.1),容易求得函数?? (??) = ?? 的傅里叶级数通项公式为
第1章数学可视化1
1.1离散傅里叶变换和频域变换1
1.1.1傅里叶级数和离散傅里叶变换2
1.1.2体验声音的变化7
1.1.3小结15
1.2素数的可视化15
1.2.1素数的定义15
1.2.2用动画演示埃拉托斯特尼筛法15
1.2.3绘制素数螺旋20
1.2.4绘制不同形状的素数螺旋30
1.2.5小结32
延伸阅读欧拉素数生成多项式32
1.3圆周率计算和可视化33
1.3.1π值应该取到小数点后多少位?34
1.3.2高精度计算程序库——gmpy235
1.3.3π值的传统计算方法38
1.3.4π值的无穷级数算法47
延伸阅读1梅钦类公式的推导52
延伸阅读2高斯-勒让德算法54
第2章RSA加密算法和相关知识55
2.1计算*大公因数55
2.1.1RSA加密方法简介55
2.1.2通过素因数分解求解*大公因数56
2.1.3利用辗转相除法求解*大公因数60
2.1.4辗转相除法的可视化62
2.1.5扩展的辗转相除法69
延伸阅读1全体素数的生成函数72
延伸阅读2由三角函数组成旋转矩阵73
延伸阅读3从程序的递归调用联想到数学归纳法73
2.2用于互联网通信的公钥加密系统74
2.2.1对称密钥加密技术——恺撒密码75
2.2.2非对称密钥加密技术——RSA77
2.2.3文本加密的实现80
延伸阅读1密码学中常用的人名轶闻84
延伸阅读2RSA加密算法解密结果正确性的证明84
2.3RSA加密的应用86
2.3.1图像加密86
2.3.2数字签名95
延伸阅读1五边形五角星背后的数学106
延伸阅读2哈希碰撞概率的计算108
第3章通过微分方程描述自然109
3.1种群规模随时间演化的模拟109
3.1.1生态学的概念109
3.1.2种群规模建模的**案例110
3.1.3种群规模演化的Lotka-Volterra方程116
3.1.4求解Lotka-Volterra方程组121
3.1.5数值模型正确性的相关讨论123
3.2常见的自然现象和微分方程之间的联系125
3.2.1解析解示例1——物体的运动126
3.2.2解析解示例2——电容器充电的过程129
3.2.3数值计算的应用——蛋白质立体结构的运算132
3.2.4数值计算求解微分方程的原理134
3.2.5欧拉法求解微分方程的实践136
延伸阅读莱昂哈德 欧拉141
3.3微分方程的各种数值解法142
3.3.1欧拉法的回顾和分析142
3.3.2休恩法(Heun法)143
3.3.3中点法146
3.3.4古典四阶龙格-库塔法149
3.3.54种数值解法的对比153
延伸阅读函数的泰勒展开与数值解法的阶数153
3.4微分方程的辛欧拉法154
3.4.1单摆运动的精确方程155
3.4.2联立方程组的数值解法156
3.4.3代码实现和运行结果157
延伸阅读什么是“辛”?167
第4章航天中的物理170
4.1火箭升空背后的物理170
4.2火箭发动机的拉瓦尔喷管175
4.2.1拉瓦尔喷管的出口设计176
4.2.2复杂方程的数值解法——牛顿迭代法178
4.3万有引力和轨道运算183
4.3.1从万有引力定律到卫星运动方程184
4.3.2卫星轨道的相关参数187
4.3.3卫星运行轨迹的计算和可视化192
4.4多普勒效应的可视化202
4.4.1多普勒效应的原理和数学描述203
4.4.2多普勒频移的可视化205
4.4.3电磁波的多普勒频移216
温馨提示:请使用员工书屋的读者帐号和密码进行登录