我正在使用sympy
进行一些符号数学操作。
首先创建矩形脉冲序列的傅立叶级数表示(占空比<50%),然后尝试访问乘法因子,即标准傅立叶级数的a_n
和b_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
与其对齐)
答案 0 :(得分:1)
方法as_coefficient
无法处理像2*sin(x)+3*cos(x)
这样的术语总和:只有在给定的表达式(如sin(x)
)可以被分解出来时,它才会选择系数。因此,为了使用它,您需要将系列分成每个具有一个trig函数的块。这可以做到,但更改方法更容易:
s.truncate(None)
获取该系列的生成器。这是有用的原因:在0时,正弦为0,余弦为1;长度的1/4,余弦为0,正弦为1。
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
对象提供一系列a0
,an
和bn
的余弦和正弦项。
计算系列后
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
对于正弦系数
s.bn
因此,为了生成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)])