Python嵌套循环实现方波傅里叶级数谐波函数绘图异常排查
傅里叶级数绘制方波异常排查求助
- 首次发帖,没法插内嵌图,抱歉。
- 我想用嵌套循环结合matplotlib,通过傅里叶级数绘制方波。方波采用傅里叶级数形式实现:输入
n_loop参数控制级数项数N,同时控制x在[-π, π]区间的采样粒度,生成.dat文件存储数据后绘图。 - 程序能正常运行,但画出来的图形和预期不符,我怀疑是
f的追加/累加方式出了问题。 - 附上我的代码,当前输出是持续偏移的异常曲线,预期是趋近方波的锯齿状曲线。
import numpy as np import matplotlib.pyplot as plt n_loop = 100 # 控制级数项数N和x采样粒度 N = n_loop x = np.linspace(-np.pi, np.pi, n_loop) f = [] for xi in x: # 此处可能存在累加逻辑错误 for k in range(N): term = (4/np.pi) * np.sin((2*k+1)*xi) / (2*k+1) f.append(term) # 错误:直接追加每一项而非累加后存储单个值 # 写入.dat文件 with open('square_wave.dat', 'w') as fout: for xi, fi in zip(x, f): fout.write(f"{xi} {fi}\n") # 绘图 data = np.loadtxt('square_wave.dat') plt.plot(data[:,0], data[:,1]) plt.show()
排查方向参考:
傅里叶级数计算逻辑错误:
标准周期2π、幅值1的方波傅里叶级数为 $f(x) = \frac{4}{\pi}\sum_{k=0}^{N-1}\frac{\sin((2k+1)x)}{2k+1}$。你的代码直接将每一项追加到f列表,导致f长度是n_loop*N,和x的长度不匹配,绘图时数据错位。正确做法是:对每个x先初始化累加变量(如f_val = 0),循环k累加所有项后,再将f_val追加到f列表。数据存储与读取问题:
打开生成的.dat文件,检查每行是否是一个x对应一个f值。如果f列表长度和x不一致,zip(x, f)会截断或错位数据,导致图形异常。简化测试验证:
将n_loop设为极小值(比如N=3、x取5个点),手动计算1-2个x对应的级数和,和程序输出对比,快速定位是计算逻辑还是存储/绘图环节出错。
内容的提问来源于stack exchange,提问作者art cut sky
相关产品推荐
相关产品推荐

