Python绘制余弦交替级数定义函数遇ValueError错误求解决
问题分析与解决
错误原因
- 数组维度不匹配:你定义的
func=np.zeros(n)是长度为n的一维数组,但每次循环计算的np.cos((2*count + 1)*input)/(2*count + 1)是和输入x同长度的numpy数组(因为x是数组,numpy会做广播运算),把一个数组赋值给单个数组元素就会触发ValueError。 - 符号错误:原级数是交替正负的(
+cos(x)/1 -cos(3x)/3 +cos(5x)/5...),你的代码没处理符号,计算结果会偏离目标函数。 - 返回值格式错误:最终需要返回和
x同长度的函数值数组,而不是存储每一项的二维数组,否则plt.plot无法正确绘图。
修正后的代码
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 4*np.pi, .01) def cos_series(input_x, n_terms): # 初始化和输入x同长度的零数组,用于累加每一项 func = np.zeros_like(input_x) for count in range(n_terms): k = 2 * count + 1 # 处理交替符号:第count项(从0开始)的符号是(-1)^count sign = (-1) ** count # 计算当前项并累加 func += sign * (4 / np.pi) * (np.cos(k * input_x) / k) return func # 绘制前20项的级数近似 plt.plot(x, cos_series(x, 20)) plt.title('Fourier Series Approximation') plt.xlabel('x') plt.ylabel('f(x)') plt.show()
关键修改说明
- 用
np.zeros_like(input_x)初始化结果数组,保证维度和输入x一致,能直接累加每一项的数组结果。 - 添加
sign = (-1) ** count处理交替符号,匹配原级数的正负规则。 - 改用
for循环更简洁(也可以保留while,但for range(n_terms)更符合Python习惯),每次循环把当前项加到结果数组上,最终返回完整的函数值数组。
运行修正后的代码就能正确绘制出目标级数的近似曲线,随着n_terms增大,曲线会逐渐逼近方波函数(这个级数其实是方波的傅里叶余弦展开)。
内容的提问来源于stack exchange,提问作者Lucas Emiliano Bosteels
相关产品推荐
相关产品推荐

