首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sympy提取傅里叶级数系数

Sympy提取傅里叶级数系数
EN

Stack Overflow用户
提问于 2016-03-23 11:36:44
回答 2查看 3.6K关注 0票数 4

我正在使用sympy进行一些象征性的数学操作。

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

简而言之:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
g = 1/(pi*T)*sin(2*pi*t)
g.as_coefficient(sin(2*pi*t))

1/πT

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

代码语言:javascript
复制
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与其对偶)相关联。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 21:22:02

as_coefficient方法不能处理像2*sin(x)+3*cos(x)这样的项之和:只有当给定的表达式(如sin(x))可以被计算出来时,它才能选择系数。因此,为了使用它,您需要将这个系列分割成块,每个块都有一个trig函数。这是可以做到的,但是更改方法更容易:

  1. 使用s.truncate(None)为该系列获得一个生成器。
  2. 对于发电机产生的每一个项,插头0以求余弦系数,塞1/(4*k)为间隔长度以求正弦系数(这里k为指数)。

工作原理:在0,正弦为0,余弦为1;长度为1/4时,余弦为0,正弦为1。

代码语言:javascript
复制
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)))

结果:

代码语言:javascript
复制
 cosine_coeffs = [0.250000000000000, 1/pi, 0, -1/(3*pi)]

 sine_coeffs = [0, 1/pi, 1/pi, 1/(3*pi)]
票数 2
EN

Stack Overflow用户

发布于 2020-11-26 10:14:49

sympy.series.fourier.FourierSeries具有向sympy.series.sequences.sequence对象提供本系列的余弦和正弦项的方法:a0anbn

在计算完这个系列之后

代码语言:javascript
复制
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))

余弦系数可由

代码语言:javascript
复制
s.a0
代码语言:javascript
复制
0.25

代码语言:javascript
复制
s.an

对于正弦系数

代码语言:javascript
复制
s.bn

因此,为了在给定的顺序下生成s级数系数的列表,假设4可以用

代码语言:javascript
复制
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)

会回来的

代码语言:javascript
复制
([0.250000000000000, 1/pi, 0, -1/(3*pi)], [1/pi, 1/pi, 1/(3*pi)])
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36177131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档