好记性不如烂笔头
目录
傅里叶级数变换原理代码实现效果图
傅里叶级数变换原理
原理:待续…
傅里叶级数变换公式:
代码实现
本次实现的是符号函数在范围为(-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 时: