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

在Matplotlib中使用sum运算符绘制方波近似函数报错求助

解决方波傅里叶近似交互式绘图的维度不匹配问题

嘿,我来帮你搞定这个问题!你遇到的ValueError核心原因有几个,我一步步给你拆解并修正:

错误根源分析

  1. pi未定义:你直接用了pi,但Python本身没有这个内置常量,得用numpy里的np.pi
  2. 循环范围错误:range(1,n)当n=1时是空序列,sum后得到的是标量0,自然和长度为10的x数组维度不匹配;而且你要取前n个多项式项,应该用range(1, n+1)才能包含第n项
  3. 傅里叶系数计算可以简化:1 - cos(i*np.pi)其实等价于2当i是奇数,0当i是偶数,这意味着只有奇数项对近似有贡献,我们可以利用这点优化代码

修正后的完整代码

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (11,4)
plt.rcParams['figure.dpi'] = 150
from ipywidgets import interact
import ipywidgets as widgets

def plot_square_wave_approx(n):
    # 定义x轴数据,取0到2π更贴合方波的周期特性(你也可以保留0到10)
    x = np.arange(0, 2*np.pi, 0.01)
    # 初始化y为全0数组,和x维度完全一致
    y = np.zeros_like(x)
    
    for i in range(1, n+1):
        # 计算傅里叶级数的每一项并累加
        coeff = 2/(i * np.pi) * (1 - np.cos(i * np.pi))
        y += coeff * np.sin(i * x)
    
    # 绘制近似曲线,同时添加真实方波做对比(可选)
    plt.plot(x, y, label=f'前{n}项近似')
    plt.plot(x, np.sign(np.sin(x)), '--', label='真实方波')
    plt.ylim(-2, 2)
    plt.legend()
    plt.show()

# 设置滑块范围,方便调整n的取值
interact(plot_square_wave_approx, n=widgets.IntSlider(min=1, max=20, value=1))

关键修改点说明

  • 把pi替换成np.pi,确保常量正确引用
  • 用np.zeros_like(x)初始化y数组,保证和x维度完全一致,通过逐项累加避免sum导致的维度问题
  • 调整循环范围为range(1, n+1),确保n=1时也能计算第一项
  • 可选添加了真实方波的对比曲线,让你更直观看到近似效果
  • 把滑块改成IntSlider,支持自定义范围,交互体验更好

现在运行这段代码,拖动滑块就能看到随着n增大,近似曲线逐渐逼近方波的效果啦!

内容的提问来源于stack exchange,提问作者Lilanarus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:26:19