数与图(22)——傅里叶级数
高等数学课在我记忆力留下的最闪亮的部分叫做“傅里叶级数”,它同光学课上的“波粒二象性”共同构筑起我的世界观——这个世界上的万事万物无一不是由波组成。
文本在微积分及三角函数的基础上,讲解一个很特别的级数——傅里叶级数,它可以将任何类型的可积分函数在指定的区间内展开成三角函数的加和。一般写作
式⑴中用“~”代替“=”,说明右侧的展开式的值与左侧的函数值不一定完全相等。展开式中的系数可以根据求积分获得,其中
本文不讨论系数的由来,也不讨论函数可积分的判定,只讨论三个具体函数的展开式,并根据展开式绘制函数图形,观察随着展开项数的增加,展开式图形的变化。这三个函数分别为方波函数、一次函数及二次函数。
首先将《数与图(21)——三角函数》中的项目另存为“傅里叶级数”,然后修改按钮的名称和标签及按钮的显示文本,修改的结果如图1所示。
图1 修改项目中的组件名称及显示文本
在此基础上,我们依次讨论三个不同的函数,从方波函数开始。
一、方波函数
1、函数表达式
方波函数是周期函数,设其周期为360(度),则其在[-180, 180)上的表达式为
2、函数的原始图像
设⑶式中的E=5,则方波函数⑶的原始图像如图2所示。图中的虚线不是函数图像的组成部分,它们仅仅用来标记函数值的突变点。从函数的原始图像可以得出直观的判断:方波函数是可积分的,积分值就是红色实线下方的面积。
图2 方波函数的原始图像
3、方波函数的傅里叶展开形式
按照式⑵中给出的公式,可以求得方波函数傅里叶展开式各项的系数,并最终得到下面的展开式(这里略去系数求解过程)。
4、绘制方波展开式图像
根据⑷式编写一个有返回值的过程——方波函数。用循环语句来实现级数的求和,简直是太方便了,注意展开式中只有奇数项,奇数在数学中表示为2k-1,其中k=1,2,3…,方波函数过程的代码如图3所示。
图3 有返回值过程——方波函数
再创建一个无返回值过程——求方波函数坐标列表,代码如图4所示,这与此前项目中的求坐标列表过程类似,只是把其他函数替换为方波函数。
图4 无返回值过程——求方波函数坐标列表
然后编写按钮点击事件处理程序,代码如图5所示。
图5 方波按钮的点击事件处理程序
最后进行测试,结果如图6所示。
图6 测试结果:绘制方波展开式的图像
从测试结果中可以看出,当展开项数为10时(其实真正参与求和的项只有5个),图像在y=0的部分与y=E的部分均显示出锯齿形的波,随着展开项数的增大,锯齿波逐渐趋于平缓,当展开项数为200时,波形几乎趋于平直。
二、局部一次函数
1、函数表达式
我们要展开的不是完整的一次函数,而是一次函数的一部分,其函数表达式为
2、函数的原始图像
上面⑸式所对应的函数图像如图7所示。由图像可以直观地判断函数在[-π,π]上是可积分的。
图7 即将展开函数的原始图像
3、傅里叶展开式
由公式⑵可以求出函数⑸的傅里叶展开项系数,并最终得到其傅里叶展开式
4、绘制展开式图像
与绘制方波图像一样,首先根据⑹式创建一个有返回值过程——局部一次函数,代码如图8所示。有两点需要格外注意,一是在⑹式中x以弧度为单位,在计算正弦、余弦的函数值时,需要将弧度转化为角度。在《数与图(21)》中介绍过角度与弧度的关系:360(角度)=2π(弧度),由此导出
二是在⑹式中包含了两类通项——正弦通项及余弦通项,其中正弦项以“1”为增量,而余弦项以“2”为增量,而且全部是奇数项。
图8 有返回值过程——局部一次函数
再创建一个无返回值过程——求局部一次函数坐标列表,代码如图9所示。
图9 无返回值过程——求局部一次函数坐标列表
再编写一次函数按钮的点击事件处理程序,代码如图10所示。注意在调用求坐标列表过程时给参数赋值,参数的取值是-π及π,精确到小数点后两位。
图10 一次函数按钮的点击事件处理程序
最后进行测试,分别设展开项数为10、50及200,测试结果如图11所示。从图中可以观察到,随着展开项数的增加,图像越来越接近直线。
图11 测试结果:绘制局部一次函数展开式图像
三、局部二次函数
1、函数表达式
也就是说,我们要将函数f(x)=x2在区间[-1,1]上展开成傅里叶级数。
2、函数的原始图像
函数⑺在区间[-1,1]上的原始图像如图12所示。观察图像可以直观推断函数⑺在给定的区间内可积分。
图12 二次函数在[-1,1]上的原始图像
3、傅里叶展开式
根据系数公式⑵,可以求得二次函数在[-1,1]上的傅里叶展开式各项的系数,并最终得到下面的展开式。
4、绘制展开式图像
首先根据⑻式创建一个有返回值的过程——局部二次函数,代码如图13所示。
图13 有返回值过程——局部二次函数
再创建一个无返回值过程——求局部二次函数坐标列表,代码如图14所示。
图14 无返回值过程——求局部二次函数坐标列表
然后再编写二次函数按钮的点击事件处理程序,代码如图15所示。
图15 二次函数按钮的点击事件处理程序
最后进行测试,分别设展开项数为10、50、200,测试结果如图16所示。
图16 测试结果:绘制局部二次函数展开式图像
从图16中可以看到,当展开项数为10时,展开式图像的上部略显外翻,当展开项数为50时,图像形状已经非常接近二次函数的原始图像,与展开200项的图像几乎没有差别。
以上我们讨论了三种常见函数在特定区域内的傅里叶展开式,并依据展开式绘制了相应的图像,与函数的原始图像比较,你会发现,随着展开项数的增大,展开式图像趋近于原始图像,这说明展开式的函数值无限趋近于原始函数值。
这样的结果令人惊叹,在我第一次学习到这个知识时,就对它充满了好奇,并努力将这个结果泛化到哲学层面:三角函数具有波动的特性,频率相差整数倍的波,配合上适当的系数,可以表现任何类型的曲线,方波、直线、曲线,以及它们的任意组合,等等。那我们这个世界中千变万化的事物,岂不也是由某些不同频率的波叠加而成?
除了对于世界观的构建,傅里叶级数还提供了方法论上的指引。在实际生活中存在很多不规则的曲线,例如心电图。假如可以将心电图展开成傅里叶级数,那么每一项的系数(或系数之间的比例)就具有标志性的意义,或许与某些生理特征相关联,或许与某些疾病相关联,如此一来,在绘制心电图的同时,诊断结果就可以自动给出,这或许就是在不久的将来人工智能的一项重要应用。