Sympy提取傅立叶级数系数

时间:2016-03-23 11:36:44

标签: python sympy

我正在使用sympy进行一些符号数学操作。

首先创建矩形脉冲序列的傅立叶级数表示(占空比<50%),然后尝试访问乘法因子,即标准傅立叶级数的a_nb_n

简而言之:

from sympy import fourier_series, pi, cos, sin
from sympy.abc import t
from sympy.functions.special.delta_functions import Heaviside
T = sy.symbols('T')
s = fourier_series(Heaviside(t) - Heaviside(t-1/4), (t, 0, 1))
s.truncate(3)

1/π*sin(2πt)+1/π*sin(4πt)+1/π*cos(2πt)+0.25

然后我想访问基函数的系数。在这种程度上,我认为我应该使用as_coefficient(expr)

这会在更简单的情况下产生预期结果:

g = 1/(pi*T)*sin(2*pi*t)
g.as_coefficient(sin(2*pi*t))

1/πT

但是,对于fourier_series返回的对象,这似乎不起作用:

a = s.truncate(3)
a.as_coefficient(sin(2*pi*t))

什么都不返回(甚至不是警告或消息)。

s.as_Add()s.as_Mul()等其他方法同时返回一个完整表达式,其中a_n与其sin(2*pi*n*t)词语绑定(或b_n与其对齐)

2 个答案:

答案 0 :(得分:1)

方法as_coefficient无法处理像2*sin(x)+3*cos(x)这样的术语总和:只有在给定的表达式(如sin(x))可以被分解出来时,它才会选择系数。因此,为了使用它,您需要将系列分成每个具有一个trig函数的块。这可以做到,但更改方法更容易:

  1. 使用s.truncate(None)获取该系列的生成器。
  2. 对于发生器产生的每个项,插入0以获得余弦系数,并插入间隔长度的1 /(4 * k)以获得正弦系数(此处k为指数)
  3. 这是有用的原因:在0时,正弦为0,余弦为1;长度的1/4,余弦为0,正弦为1。

    trig

    from sympy import fourier_series, pi, cos, sin
    from sympy.abc import t
    from sympy.functions.special.delta_functions import Heaviside
    s = fourier_series(Heaviside(t) - Heaviside(t-1/4), (t, 0, 1))
    iter = s.truncate(None)
    cosine_coeffs = []
    sine_coeffs = [0]       # there is no sine term for k = 0
    for k in range(0, 4):
        term = next(iter)
        cosine_coeffs.append(term.subs(t, 0))
        if k > 0:
            sine_coeffs.append(term.subs(t, 1/(4*k)))
    

    结果:

     cosine_coeffs = [0.250000000000000, 1/pi, 0, -1/(3*pi)]
    
     sine_coeffs = [0, 1/pi, 1/pi, 1/(3*pi)]
    

答案 1 :(得分:1)

sympy.series.fourier.FourierSeries的方法可为sympy.series.sequences.sequence对象提供一系列a0anbn的余弦和正弦项。

计算系列后

import sympy as sym
from sympy import fourier_series
from sympy.abc import t
from sympy.functions.special.delta_functions import Heaviside
s = fourier_series(Heaviside(t) - Heaviside(t-1/4), (t, 0, 1))

余弦系数可以通过

获得
s.a0
0.25

s.an

a_n cosine coefficients

对于正弦系数

s.bn

b_n sine coefficients

因此,为了生成s级数系数直到给定阶数的列表,假设有4个可以完成

def cosine_fourier_coeffs(fourierSeries, order):
    ### returns a list of fourier series cosine coefficients up to order
    out = []
    out.append(fourierSeries.a0)
    for i in range(1,order):
        out.append(fourierSeries.an.coeff(i).subs(t, 0 ) )
    return out

def sine_fourier_coeffs(fourierSeries, order):
    ### returns a list of fourier series sine coefficients up to order
    out = []
    for i in range(1,order):
        out.append(fourierSeries.bn.coeff(i).subs(t, 1/(4* i) ) )
    return out

cosine_fourier_coeffs(s, 4), sine_fourier_coeffs(s, 4)

将返回

([0.250000000000000, 1/pi, 0, -1/(3*pi)], [1/pi, 1/pi, 1/(3*pi)])