You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

排查方向参考:

  1. 傅里叶级数计算逻辑错误:
    标准周期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列表。

  2. 数据存储与读取问题:
    打开生成的.dat文件,检查每行是否是一个x对应一个f值。如果f列表长度和x不一致,zip(x, f)会截断或错位数据,导致图形异常。

  3. 简化测试验证:
    将n_loop设为极小值(比如N=3、x取5个点),手动计算1-2个x对应的级数和,和程序输出对比,快速定位是计算逻辑还是存储/绘图环节出错。

内容的提问来源于stack exchange,提问作者art cut sky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:33:34