Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 傅里叶级数系数的辛提取_Python_Sympy - Fatal编程技术网

Python 傅里叶级数系数的辛提取

Python 傅里叶级数系数的辛提取,python,sympy,Python,Sympy,我正在使用sympy进行一些符号数学运算 首先创建矩形脉冲序列的傅里叶级数表示(占空比

我正在使用
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
然后我想访问基函数的系数。在这个程度上,我认为我应该使用
作为_系数(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
与其对偶项相关联)。

as_系数
无法处理像
2*sin(x*cos(x)+这样的项之和
:仅当给定表达式(如
sin(x)
)可以分解时,它才会选择系数。因此,为了使用它,您需要将序列分成块,每个块都有一个trig函数。这是可以做到的,但改变方法更容易:

  • 使用
    s.truncate(None)
    获取该系列的生成器
  • 对于生成器生成的每个项,插入0得到余弦系数,插入间隔长度的1/(4*k)得到正弦系数(这里k是索引)
  • 其工作原理是:0时,正弦为0,余弦为1;在长度的1/4处,余弦为0,正弦为1


    结果:

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

    symphy.series.fourier.fourier.forierseries
    具有提供带有序列余弦和正弦项的
    symphy.series.sequence
    对象的方法:
    a0
    an
    bn

    在通过

    将sympy作为sym导入
    从辛输入傅里叶级数
    从sympy.abc进口
    从sympy.functions.special.delta_函数导入Heaviside
    s=fourier_级数(Heaviside(t)-Heaviside(t-1/4),(t,0,1))
    
    余弦系数可通过以下方式获得:

    s.a0
    

    s.an
    

    对于正弦系数

    s.bn
    

    所以,为了生成一个给定顺序的
    s
    系列系数列表,假设4可以用

    def余弦fourier系数(fourier级数,顺序):
    ###返回傅里叶级数余弦系数的列表,最大顺序为
    out=[]
    out.append(fourierSeries.a0)
    对于范围内的i(1,顺序):
    out.append(fourierSeries.an.coeff(i).subs(t,0))
    返回
    def正弦傅里叶系数(四阶级数):
    ###返回傅里叶级数正弦系数的列表,最多为
    out=[]
    对于范围内的i(1,顺序):
    out.append(fourierSeries.bn.coeff(i).subs(t,1/(4*i)))
    返回
    余弦傅里叶系数(s,4),正弦傅里叶系数(s,4)
    
    那会回来的

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

    哇,看起来很酷!我需要讨论的东西很少,第一个是迭代器概念,我很少使用它。我得出了一个部分结论,为了得到我的系数,我应该“更深一层”说:
    a=s.truncate(3);m=a.args[1];m、 正如您所指出的那样,最终得到我的系数是很麻烦的,我无法找到一种自动化的方法来处理一般情况。也许在理解迭代器之后,我会给它第二次机会,以获得学习效果;)关于问题中的代码,sy.符号('T')中的“sy”是什么?有一个
    导入符号sy
    暗示。为了清晰起见,我现在编辑了原文。谢谢
    0.25
    
    ([0.250000000000000, 1/pi, 0, -1/(3*pi)], [1/pi, 1/pi, 1/(3*pi)])