用傅里叶级数表示复平面上的图形

设图形为时间的函数 f ( t ) = a ( t ) + i b ( t ) f(t) = a(t) + i b(t) f(t)=a(t)+ib(t) (a(t)和b(t)为时间的函数)
f(t)为闭环曲线或者有限的曲线
f(t)为闭环曲线时,随着时间t的增加,f(t)在曲线上转圈圈。
f(t)为有限的曲线时,随着时间t的增加,f(t)会从曲线头部走到尾部,然后跳到头部从新走起
显然以上两种情况下f(t)都是时间t下的周期函数,可以由傅里叶级数表示

设f(t)为周期为1的函数,(0,1)为f(t)的一个周期区间
则傅里叶级数的指数形式:
f ( t ) = c − n e − i 2 π n t + ⋯ + c − 2 e − i 4 π t + c − 1 e − i 2 π t + c 0 + + c 1 e i 2 π t + c 2 e i 4 π t + ⋯ + c n e i 2 π n t f(t)=c_{-n}e^{-i2\pi nt}+\cdots +c_{-2}e^{-i4\pi t}+c_{-1}e^{-i2\pi t}+c_{0}++c_{1}e^{i2\pi t}+c_{2}e^{i4\pi t}+\cdots +c_{n}e^{i2\pi nt} f(t)=cnei2πnt++c2ei4πt+c1ei2πt+c0++c1ei2πt+c2ei4πt++cnei2πnt
其中:
c n = ∫ 0 1 f ( t ) e − i 2 π n t d t c_n=\int_0^1 f(t)e^{-i2\pi nt}dt cn=01f(t)ei2πntdt
c n c_n cn为f(t)傅里叶级数的各项系数,由f(t)可确定唯一一组 c n c_n cn
由于f(t)是复数函数,则 c n c_n cn可以由复数表示 c n = a n + i b n c_n=a_n+ib_n cn=an+ibn ( a n , b n a_n,b_n an,bn为常数)

综上,知道图形的函数表达式就可以求出图形的各项傅里叶系数,然后带入傅里叶级数表达式就可以得到图形的傅里叶级数,只要系数 c n c_n cn求得足够多,傅里叶级数就可以表示任何复杂图形

以下是用傅里叶级数表示一个正方形的python代码:

import numpy as np
import turtle as tl


def f_t(N,l):  #定义函数图形,N为取样次数
    n=N/4  #这里直接生成一个复平面上的正方形
    dl=l/int(n) #边被分的最小单元
    f_t=[[0,0] for x in range(4*int(n))] #存储函数坐标的实部与虚部
    for i in range(int(n)):
        f_t[i]=([i*dl,0])
        f_t[i+int(n)]=([l,i*dl])
        f_t[i+2*int(n)]=([l-i*dl,l])
        f_t[i+3*int(n)]=([0,l-i*dl])
    print("函数分割完毕")
    return f_t
        
def c_n(f_t,M):  #求出傅里叶级数的系数cn,M为求取傅里叶系数给个数
    m=M/2 #正负系数各有m个
    N=len(f_t) #f_t的长度,及取样次数
    dt=1/N  #以1/N代替积分算子0.
    c_n=[[0,0] for x in range(2*int(m)+1)] #存储c_n的实部与虚部
    for i in range(-int(m),int(m)+1): #加上一个初始系数c0
        re=0     #暂存c_n的实部
        im=0     #暂存c_n的虚部
        for j in range(N):
            t=dt*j
            re+=(f_t[j][0]*np.cos(2*np.pi*i*t)+f_t[j][1]*np.sin(2*np.pi*i*t))*dt  #实部积分
            im+=(f_t[j][1]*np.cos(2*np.pi*i*t)-f_t[j][0]*np.sin(2*np.pi*i*t))*dt  #虚部积分
        c_n[i+int(m)]=[re,im]
    print("傅里叶系数生成完毕")
    return c_n

if __name__ == '__main__':
    N = 10000  #函数份数
    l = 500 #正方形边长
    
    M = 200  #系数个数
    m = M/2
    c_n=c_n(f_t(N,l),M) #获取f_t对应傅里叶级数的系数c_n
    
    tl.setup(2000,1000)
    tl.penup()
    tl.pensize(2) # 画笔粗细
    
    x = [0] * M
    y = [0] * M
    for t in range(N+1):
        for i in range(-int(m),int(m)+1):
            x[i] = c_n[i+int(m)][0] * np.cos(2 * i * np.pi * t / N) - c_n[i+int(m)][1] * np.sin(2 * i * np.pi * t / N)
            y[i] = c_n[i+int(m)][0] * np.sin(2 * i * np.pi * t / N) + c_n[i+int(m)][1] * np.cos(2 * i * np.pi * t / N)
            
        tl.goto(int(sum(x))-800,int(sum(y))-400) # 正负可以控制图形的左右镜像,上下镜像,乘除可以控制缩放
        tl.pendown()
    
    
    #直接画出来的图形
    tl.penup()
    f_t=f_t(N,l)
    for t in range(N):
        tl.goto(int(f_t[t][0]),int(f_t[t][1])-400)
        tl.pendown()
    tl.done() 

你可能感兴趣的:(python,傅立叶分析)