将Mathematica傅里叶级数代码转换为Python的技术求助
将Mathematica傅里叶级数代码转换为Python
问题分析
你的Mathematica代码是计算方波的傅里叶级数前11项(n从0到10)的和,对应的通项公式是:
$$a_n = \frac{(-1)^n \cdot 4}{\pi(2n+1)}, \quad f_n(t) = a_n \cdot \cos((2n+1)t)$$
求和后绘制$t \in [-2\pi, 2\pi]$的图像。
你尝试的Python代码存在两个核心问题:
- 未定义变量
t:Python中需要先生成t的数值数组才能进行向量化计算 - 通项逻辑与原代码不符:原代码中是$2n+1$形式的奇数(n从0到10,对应1,3,...,21),而你的代码用了1到19的奇数,且系数的分母和符号逻辑错误
完整实现代码
import numpy as np import matplotlib.pyplot as plt # 生成t的取值范围:从-2π到2π,取1000个点保证绘图平滑 t = np.linspace(-2 * np.pi, 2 * np.pi, 1000) # 初始化求和结果为全0数组,与t的长度一致 f_sum = np.zeros_like(t) # 循环n从0到10,对应原Mathematica的求和范围 for n in range(0, 11): a_n = ((-1) ** n) * 4 / (np.pi * (2 * n + 1)) term = a_n * np.cos((2 * n + 1) * t) f_sum += term # 绘制图像 plt.figure(figsize=(10, 6)) plt.plot(t, f_sum, label='前11项傅里叶级数和') plt.xlabel('t') plt.ylabel('f(t)') plt.title('方波的傅里叶级数逼近') plt.grid(True) plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi], ['$-2\pi$', '$-\pi$', '$0$', '$\pi$', '$2\pi$']) plt.legend() plt.show()
代码说明
- 库导入:
numpy负责数值计算和数组操作,matplotlib.pyplot负责绘图 - t的生成:用
np.linspace生成均匀分布的t值,保证绘图的平滑性 - 求和逻辑:
- 初始化
f_sum为与t同长度的0数组,避免循环中变量未定义的问题 - 循环
n从0到10,严格对应原Mathematica的求和范围,计算每一项的系数和余弦项,累加到f_sum中
- 初始化
- 绘图优化:添加坐标轴标签、标题、网格,将x轴刻度替换为π相关的符号,提升可读性
效果说明
运行上述代码后,会得到与你提供的Mathematica绘图一致的方波逼近图像,随着项数增加,逼近效果会更接近理想方波。
内容的提问来源于stack exchange,提问作者J. O'connor
相关产品推荐
相关产品推荐

