Python 实现 傅里叶级数 对 函数拟合 并绘图

Python 实现 傅里叶级数 对 函数拟合 并绘图

好记性不如烂笔头

目录

傅里叶级数变换原理代码实现效果图

傅里叶级数变换原理

原理:待续…

傅里叶级数变换公式:

代码实现

本次实现的是符号函数在范围为(-pi,pi)区间的拟合,

注:若要实现其他函数的拟合,修改程序中 fx 的表达式即可

""" 傅里叶级数"""

import sympy as sym

import numpy as np

import matplotlib.pyplot as plt

N = 8 # 拟合的阶数

L = sym.pi # 周期的一半

n, x = sym.symbols('n x') # 创建符号

fx = sym.sign(x) # 创建符号表达式 即要进行傅里叶级数分解的函数, 这里采用的是 符号函数

a0 = (1/(2*L))*sym.integrate(fx, (x, -L, L))

an = (1/L)*sym.integrate(fx*sym.cos((n*sym.pi*x)/(L)), (x, -L, L))

bn = (1/L)*sym.integrate(fx*sym.sin((n*sym.pi*x)/(L)), (x, -L, L))

a = []

b = []

a.append(a0)

b.append(0)

for i in range(1, N):

a.append(an.subs(n, i))

b.append(bn.subs(n, i))

# 绘图 x轴范围设置

t = np.linspace(-2*np.pi, 2*np.pi, 256, endpoint=True)

Fx = a0

for i in range(1, N):

if a[i] == 0 and b[i] == 0:

continue

# 累加 计算 Fx

Fx = Fx + a[i]*sym.cos((i*sym.pi*x)/(L)) + b[i]*sym.sin((i*sym.pi*x)/(L))

# 绘图使用

y = []

for j in t:

y.append(Fx.subs(x, j))

plt.plot(t, y, linewidth=0.5*(10-j), label='N={}'.format(i))

# 打印输出 各项的系数 以及 傅里叶级数表达式

# print('an:', a)

# print('bn:', b)

print('Fx:',Fx)

# 设置 图像字体信息

img_font = {'family': 'Microsoft YaHei',

'size': 12,

'weight': 'bold',

}

# 图像显示设置

plt.legend(loc='upper right')

plt.title("傅里叶级数拟合符号函数", fontproperties=img_font)

plt.xlabel("x", fontproperties=img_font)

plt.ylabel("F(x)", fontproperties=img_font, rotation=360)

plt.grid(alpha=0.5)

plt.show()

程序输出结果:

Fx: 4*sin(x)/pi + 4*sin(3*x)/(3*pi) + 4*sin(5*x)/(5*pi) + 4*sin(7*x)/(7*pi)

效果图

N=8 时

N = 20 时:

相关文章