计算n=2至10的傅里叶系数时遇IndexError:列表索引越界
傅里叶系数计算代码索引越界错误修正
问题描述
需要获取n取值为2到10时的锯齿波(width=0.5,即三角波)傅里叶系数,编写的Python代码运行时出现IndexError: list index out of range错误,无法定位原因。
错误原因分析
变量名冲突导致索引越界:
代码中先将x定义为np.linspace(-L,L,1000)的数组,随后在生成n的循环中,将x重新赋值为整数(最后一次循环后x=10)。后续循环中使用n[x]时,x=10超出了列表n的索引范围(n的长度为9,最大索引为8),直接触发索引越界错误。数组初始化错误:
np.zeros(n)的用法错误,np.zeros需要传入形状参数(整数或元组),而非列表,这会导致后续数组操作异常。循环逻辑错误:
循环for i in range(1,n[x]+1)完全偏离需求,目标是计算n=2到10的系数,而非从1到某个错误值的循环。后续变量复用冲突:
求和与绘图部分仍使用被覆盖的x(此时是整数10),而非最初的采样数组,会导致计算和绘图错误。
修正后的代码
import numpy as np import scipy.integrate as integrate from scipy.signal import sawtooth import matplotlib.pyplot as plt L = np.pi # 重命名采样数组,避免变量冲突 x_arr = np.linspace(-L, L, 1000) f = sawtooth(x_arr, width=0.5) # 直接生成n=2到10的列表,简化逻辑 n_list = list(range(2, 11)) print("n的取值列表:", n_list) # 根据n的长度初始化系数数组 an = np.zeros(len(n_list)) bn = np.zeros(len(n_list)) li = -L lf = L L1 = (lf - li) / 2 a0 = (1.0 / L1) * integrate.quad(lambda x: sawtooth(x, width=0.5), li, lf)[0] # 遍历n_list中的每个n值,计算对应系数 for idx, n_val in enumerate(n_list): an[idx] = (1.0 / L1) * integrate.quad( lambda x: sawtooth(x, width=0.5) * np.cos(n_val * np.pi * x / L1), li, lf )[0] bn[idx] = (1.0 / L1) * integrate.quad( lambda x: sawtooth(x, width=0.5) * np.sin(n_val * np.pi * x / L1), li, lf )[0] # 输出所有系数 print("傅里叶系数A_n =", an) print("傅里叶系数B_n =", bn) # 计算傅里叶级数拟合结果,使用正确的采样数组x_arr s = a0 * 0.5 + sum([ an[idx] * np.cos(n_val * np.pi * x_arr / L1) + bn[idx] * np.sin(n_val * np.pi * x_arr / L1) for idx, n_val in enumerate(n_list) ]) # 绘图 plt.plot(x_arr, s, label="傅里叶拟合") plt.plot(x_arr, f, label="原始三角波") plt.grid() plt.legend() plt.show()
关键修正点说明
- 重命名采样数组为
x_arr,彻底避免变量名冲突; - 用
list(range(2,11))直接生成n的取值列表,简化且不易出错; - 用
len(n_list)初始化系数数组,保证数组长度与n的数量匹配; - 用
enumerate遍历n的取值,同时获取索引和n值,准确对应系数数组的位置; - 求和与绘图部分使用
x_arr,确保基于采样数组计算和展示。
内容的提问来源于stack exchange,提问作者Eeshani Chakraborty
相关产品推荐
相关产品推荐

