如何在SymPy中计算半区间傅里叶级数(正弦级数示例)
在SymPy中计算半区间正弦傅里叶级数
要在SymPy中得到你手动推导的正弦级数,核心是要基于奇延拓后的函数在完整对称区间[-π, π]上计算傅里叶级数,而不是仅在[0, π]区间计算。以下是两种可行方案:
方案一:构造奇延拓函数并在对称区间计算
SymPy的fourier_series默认对[0, L]区间的函数做偶延拓生成余弦级数,若要得到正弦级数,需先将函数奇延拓到[-π, π],再在该对称区间上计算级数:
import sympy as sp x = sp.symbols('x', real=True) f = x * (sp.pi - x) # 构造奇延拓到[-π, π]的函数:x∈[-π,0)时取-f(-x),x∈[0,π]时取原函数 p = sp.Piecewise( (-(-x)*(sp.pi - (-x)), x < 0), (f, x >= 0) ) # 在[-π, π]区间计算傅里叶级数 ps = sp.fourier_series(p, (x, -sp.pi, sp.pi)) print(ps.truncate(4))
运行结果为:
8*sin(x)/pi + 8*sin(3*x)/(27*pi) + 8*sin(5*x)/(125*pi) + 8*sin(7*x)/(343*pi)
方案二:手动计算正弦级数系数
正弦级数的形式为$\sum_{n=1}^\infty b_n \sin(nx)$,其中系数$b_n = \frac{2}{\pi}\int_0^\pi f(x)\sin(nx)dx$,可直接用SymPy计算系数并构造级数:
import sympy as sp x, n = sp.symbols('x n', real=True, integer=True, positive=True) f = x * (sp.pi - x) # 计算正弦级数系数b_n b_n = (2/sp.pi) * sp.integrate(f * sp.sin(n*x), (x, 0, sp.pi)) b_n_simplified = sp.simplify(b_n) print("正弦级数系数b_n:", b_n_simplified) # 生成前4项级数 series = sp.Sum(b_n_simplified * sp.sin(n*x), (n, 1, 4)).doit() print("前4项正弦级数:", series)
运行后得到系数$b_n = \frac{8}{n^3\pi}$(n为奇数时),n为偶数时系数为0,最终级数结果与方案一一致。
为什么之前的方法无效?
你之前构造了奇延拓的Piecewise函数,但仍在[0, π]区间计算傅里叶级数。SymPy的fourier_series在[0, L]区间计算时,只会利用该区间内的函数值做偶延拓,完全忽略x<0的定义,因此得到的还是余弦级数。必须将计算区间扩展为对称的[-π, π],才能让SymPy识别函数的奇偶性,生成正弦级数。
内容的提问来源于stack exchange,提问作者xnx
相关产品推荐
相关产品推荐

