用Python学《微积分B》(Fourier级数)

来源:互联网 发布:域名ip隐藏 编辑:程序博客网 时间:2024/06/02 23:21


  除了“幂级数”,另一类非常重要的函数项级数级数就是“三角(函数)级数”(trigonometric series)。《微积分B》第8-6节主要介绍:什么是三角级数?三角函数系的正交性?三角级数与Fourier级数的关系?函数如何进行Fourier级数展开?Fourier级数的收敛条件?正弦级数(余弦级数)与函数奇偶性的关系?一般周期函数的Fourier级数展开?


一、三角级数


  顾名思义,三角(函数)级数就是被加项为sine或cosine函数的一种函数项级数。从几何上来理解就是无穷多条sine或cosine曲线的叠加。
1,正弦函数
  sine函数是一种常见而简单的周期函数,典型的就是描述简谐振动(simple harmonic oscillation)的函数:

y=Asin(ωt+φ)

其中,周期 T=2πω
2,正弦级数
  对于比较复杂的周期函数,我们按照幂级数展开的思想,使用正项函数展开如下:
f(t)=A0+n=1Ansin(nωt+φ0)

注:幂级数展开式中的项是 x 的幂,即 xn ;而三角级数展开式中的项是 x 的倍数,即 nx 。这是因为,通过三角函数的幂和三角函数的倍角可以互相转换。也正因为如此,三角级数更易于计算,将“幂的关系”变为“倍数的关系”,这事实上就是一种“降维”
3,三角级数
  对上面的正弦级数进行如下变换
Ansin(nωt+φ0)=Ansin(φ0)cos(nωt)+Ancos(φ0)sin(nωt)

对常数项进行换元:
a02=A0,an=Ansin(φ0),bn=Ancos(φ0),ω=πl

其中,l=T2 是半周期
换元后可得
a02+n=1(ancosnπtl+bnsinnπtl)

这就是“三角级数”
πtl=x ,也可以写成如下形式
a02+n=1[ancos(nx)+bnsin(nx)]



二、三角函数系的正交性


1,三角函数系
  三角函数系简单来说就是构成三角级数的各个基本项,如下:

1,cos(x),sin(x),cos(2x),sin(2x),,cos(nx),sin(nx),

  对比幂级数的基本项
x0,x1,x2,x3,,xn,

  其实也很好理解,只不过三角函数系用倍角取代幂。此外,1=cos(0x)
2,正交性
  三角函数系的正交性(trigonometric orthogonality)指的就是上述三角函数基本项中的任意不同的两项的乘积在对称区间 [π,π] 上的积分等于零。如下:
ππcos(nx)dx=0,(n=1,2,3,...)

ππsin(nx)dx=0,(n=1,2,3,...)

ππsin(kx)cos(nx)dx=0,(k,n=1,2,3,...)

ππcos(kx)cos(nx)dx=0,(k,n=1,2,3,...,kn)

ππsin(kx)sin(nx)dx=0,(k,n=1,2,3,...,kn)

  此外,任意相同两项的乘积在对称区间 [π,π] 上的积分不等于零。如:
ππ12dx=2π,

ππsin2(nx)dx=π,ππcos2(nx)dx=π,(n=1,2,3,...)

注1:两个函数 f(x) 和 g(x) 在区间 [π,π]正交的一般定义是,它们的乘积的定积分等于零,即
ππf(x)g(x)dx=0

注2:三角函数系正交公式的证明要到了以下两个定积分,可以从面积的角度来直观地理解 —— x轴上方和x轴下方的面积相互抵消
ππsin(x)dx=0,ππcos(x)dx=0



三、Fourier级数


  幂级数的展开是借助于“Taylor公式”,而三角级数的展开则需要借助“Fourier级数”,不同的是“Taylor级数”是唯一的幂级数展开式,而“Fourier级数”不一定是唯一的三角级数展开式。(???)
  回顾“Taylor公式”的推导过程,先假设函数f(x)可以展开成一个多项式:

f(x)=C0+C1x+C2x2++Cnxn

  然后通过对上式在 x=a这一点进行逐级求导,来确定系数数列 {Cn} 与 导数数列 {f(n)(a)} 之间的关系。
  同样地,也可以这样来确定“Fourier级数”。
1,假设
  设f(x)是周期为 2π 的周期函数,且能展开成三角级数:
a02+n=1[ancos(nx)+bnsin(nx)]

  注意这个假设的两个条件 —— 周期函数和区间,后面将对这两个条件进行扩展。
2,逐项积分,求各个系数
  有趣的是,“Taylor公式”推导时是求导,这里是积分。三角函数积分,很容易想到要利用“三角函数系的正交性”来简化运算。
1)第一次积分
ππf(x)dx=ππa02dx+n=1[anππcos(nx)dx+bnππsin(nx)dx]

  根据三角函数系的正交性,很明显,后面部分的积分都为零,故有
a0=1πππf(x)dx

2)求 an
ππf(x)cos(nx)dx=a02ππcos(nx)dx+k=1[akππcos(kx)cos(nx)dx+bkππsin(kx)cos(nx)dx]

  根据三角函数系的正交性,消去积分为零的项,故有
an=1πππf(x)cos(nx)dx,(n=1,2,3,...)

3)同理可求 bn
bn=1πππf(x)sin(nx)dx,(n=1,2,3,...)

  此外,需要注意的是,当 n = 0 时,an=a0,这个公式可以统一
an=1πππf(x)cos(nx)dx,(n=0,1,2,3,...)

3,总结和扩展
  想象一下,如果一个函数既可以展开成幂级数,也可以展开成Fourier级数,那么这两种展开式有没有什么联系呢?
  答案是:有的!这就要用到Euler公式。
  将 x=eiθ 代入
f(x)=C0+C1x+C2x2++Cnxn

  可得
f(x)=C0+C1eiθ+C2ei2θ++Cneinθ

  代入Euler公式
f(x)=C0+C1[cos(θ)+isin(θ)]+C2[cos(2θ)+isin(2θ)]++Cn[cos(nθ)+isin(nθ)]

  写成和式
f(x)=C0++n=1Cn[cos(nθ)+isin(nθ)]

  这也是“三角级数”,事实上,它是“复Fourier级数”


四、奇拓展与偶拓展


1,正弦级数与余弦级数
  上面已推导:通过积分的方法,可以求出Fourier级数的各个系数

an=1πππf(x)cos(nx)dx,(n=0,1,2,3,...)

bn=1πππf(x)sin(nx)dx,(n=1,2,3,...)

  仔细观察这个两个公式,你会得到两个有趣的发现:
1)如果f(x)为奇函数,an 中积分恒等于零,而 bn 中的积分不等于零;
2)如果f(x)为偶函数,bn 中积分恒等于零,而 an 中的积分不等于零;
  也就是说:f(x)为奇函数时,它的Fourier级数中只剩下正弦项,即“正弦级数”;f(x)为偶函数时,它的Fourier级数中只剩下余弦项,即“余弦级数”。
2,周期拓展
  前面我们在推导Fourier级数时,作了两个假设,即“设f(x)是周期为 2π 的周期函数”,现在我们破除其中一个“假设”:f(x)不是周期函数。
  先看一个简单的:f(x)是区间 [π,π]上的函数。
  我们回想一下函数项级数的几何意义 —— “无穷多条曲线叠加”,如下图。很明显,它在每一小段(区间)内,还是“无穷多条曲线小段的叠加”。

%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltx = np.linspace(-3 * np.pi, 3 * np.pi, 1024)y0 = 0.5 * np.ones(x.size) y1 = 0.673 * np.cos(x);y2 = -0.212 * np.cos(3 * x)y3 = 0.127 * np.cos(5 * x)y = y0 + y1 + y2 + y3plt.plot(x, y0, 'g:')plt.plot(x, y1, 'y:')plt.plot(x, y2, 'm:')plt.plot(x, y3, 'c:')plt.plot(x, y, 'r')plt.show()


这里写图片描述

  逆向思维一下:我想像有一个周期为 2π 的周期函数g(x),它在区间 [π,π]上与f(x)重合。根据上面的结论,g(x)可以展开成Fourier级数,那么在区间 [π,π] 上g(x)这条曲线仍然是同样的哪些“无穷多条曲线的叠加”。
  换句话说,f(x)也可以展开成与周期函数g(x)相同的Fourier级数,只是展开后再截取,即把区间限定在 [π,π]上 。这种展开方法就叫周期拓展。
3,半周期
  再深入一步:f(x)只是是区间 [0,π]上的函数呢?
  很简单,我们再进行周期拓展之前,先进行一次对称区间的扩展 —— 在区间 [π,0] 上为f(x)生成一个镜像。然后按上面的方法进行周期拓展,再Fourier级数展开,最后截取的时候,只截取 区间 [0,π] 的部分即可。
  需要注意的是:生成镜像的方法有两种 —— 奇函数镜像和偶函数镜像。举个例子来说明吧。
例: f(x),x(0,π)
这个函数可以有“正弦级数展开”(奇拓展)和“余弦级数展开”(偶拓展)两种Fourier级数展开式,如下图

%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltx0 = np.arange(-3 * np.pi, -np.pi, 0.01)x1 = np.arange(-np.pi, np.pi, 0.01)x2 = np.arange(np.pi, 3 * np.pi, 0.01)y0 = x0 + 2 * np.piy1 = x1y2 = x2 - 2 * np.pit = np.array([-3 * np.pi, -2 * np.pi, -np.pi, -np.pi, 0, np.pi, np.pi, 2 * np.pi, 3 *np.pi])y = np.array([-np.pi, 0, np.pi, -np.pi, 0, np.pi, -np.pi, 0, np.pi])fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(9, 4))axes[0].plot(x0,y0, 'g')axes[0].plot(x1,y1, 'g')axes[0].plot(x2,y2, 'g')axes[0].plot(t, y, 'ko', markerfacecolor='none')axes[0].grid()axes[1].plot(x0,abs(y0), 'g')axes[1].plot(x1,abs(y1), 'g')axes[1].plot(x2,abs(y2), 'g')axes[1].plot(t, abs(y), 'ko', markerfacecolor='none')axes[1].grid()plt.show()


这里写图片描述

  如上图所示,左边是奇拓展,右边是偶拓展。
1)正弦级数展开

f(x)=n=1bnsin(nx)=n=1(1)n2nsin(nx),x(0,π)

2)余弦级数展开
f(x)=a02+n=1ansin(nx)=π2+k=1(4π)1(2k+1)2cos(2k+1)x,x(0,π)



五、一般周期函数的Fourier级数


  前面我们在推导Fourier级数时,作了两个假设,即“设f(x)是周期为 2π 的周期函数”,现在我们破除另一个“假设”:f(x)的周期不是 2π ,而是一般的周期 T=2l
1,周期变换
  前面对于非周期函数我们用的方法是“周期拓展”,现在对于一般周期,我们用“周期换元” —— 它本质上是一种坐标系变换

2lx2πtx=lπt

  则有 f(x)=f(lπt)=φ(t)
φ(t)=a02+n=1[ancos(nt)+bnsin(nt)]

2,新的Fourier系数
  将 t=πlx 代入,可得
an=1πππφ(t)cos(nt)dt=1lllf(x)cos(nπxl)dx,(n=0,1,2,3,...)

bn=1πππφ(t)sin(nt)dt=1lllf(x)sin(nπxl)dt,(n=1,2,3,...)



六、Dirichlet收敛定理


  Dirichlet收敛定理是一个关于Fourier级数收敛性判断的充分条件。内容如下:
  f(x)在 [π,π]fx)Fourier
1)连续点

a02+n=1[ancos(nx0)+bnsin(nx0)]=f(x0)

2)间断点
a02+n=1[ancos(nx0)+bnsin(nx0)]=12[f(x00)+f(x0+0)]

注1:这里说的是点收敛,不是一致收敛
注2:这个收敛的条件比幂级数收敛的条件宽泛得多。

阅读全文
0 0