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)
获取该系列的生成器结果:
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)])