我正在使用sympy进行一些象征性的数学操作。
首先创建矩形脉冲序列的傅里叶级数表示(占空比< 50%),然后尝试访问乘法因子,即标准傅里叶级数的a_n和b_n。
简而言之:
import sympy as sy
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与其对偶)相关联。
发布于 2016-03-23 21:22:02
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)]发布于 2020-11-26 10:14:49
类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.a00.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)])https://stackoverflow.com/questions/36177131
复制相似问题