首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段PYTHON的傅里叶级数

分段PYTHON的傅里叶级数
EN

Stack Overflow用户
提问于 2018-06-10 18:56:05
回答 1查看 1.3K关注 0票数 3

我试着找出傅里叶级数

使用simpy like:

代码语言:javascript
复制
p = Piecewise((sin(t), 0 < t),(sin(t), t < pi), (0 , pi < t), (0, t < 2*pi))
fs = fourier_series(p, (t, 0, 2*pi)).truncate(8)

但它似乎不起作用。它被卡在*(循环?)中。有什么办法可以解决这个问题吗?也许是另一种选择?非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 00:41:31

经过一两秒钟的延迟,我得到了:

代码语言:javascript
复制
In [55]: fourier_series(p,(t,0,2*pi))
Out[55]: FourierSeries(Piecewise((sin(t), (t > 0) | (t < pi)), (0, (pi < t) | (t < 2*pi))), (t, 0, 2*pi), (0, SeqFormula(Piecewise((0, Eq(_n, -1) | Eq(_n, 1)), (cos(2*_n*pi)/(_n**2 - 1) - 1/(_n**2 - 1), True))*cos(_n*t)/pi, (_n, 1, oo)), SeqFormula(Piecewise((-pi, Eq(_n, -1)), (pi, Eq(_n, 1)), (sin(2*_n*pi)/(_n**2 - 1), True))*sin(_n*t)/pi, (_n, 1, oo))))

这只是设置而已。

_.truncate(8)花费的时间太长了。那一定是在做评估。

不同的截断效果更好吗?我没有看到任何其他控件。

.truncate(1)返回sin(t).truncate(2)挂起。将这个简单的sin(t)与一个平坦的细分市场混合在一起,肯定是建立了一个分析上很难的困难案例。但我对这方面的数学有点生疏。

在寻找numpy的傅立叶级数时,我发现:

How to calculate a Fourier series in Numpy?

对于定义在(0,pi) fs1 = fourier_series(p, (t, 0, pi))上的FS

代码语言:javascript
复制
In [5]: fs1.truncate(1)
Out[5]: 2/pi
In [6]: fs1.truncate(2)
Out[6]: -4*cos(2*t)/(3*pi) + 2/pi
In [7]: fs1.truncate(3)
Out[7]: -4*cos(2*t)/(3*pi) - 4*cos(4*t)/(15*pi) + 2/pi
In [8]: fs1.truncate(4)
Out[8]: -4*cos(2*t)/(3*pi) - 4*cos(4*t)/(15*pi) - 4*cos(6*t)/(35*pi) + 2/pi
In [9]: fs1.truncate(5)
Out[9]: -4*cos(2*t)/(3*pi) - 4*cos(4*t)/(15*pi) - 4*cos(6*t)/(35*pi) - 4*cos(8*t)/(63*pi) + 2/pi

哪个图(以numpy为单位)与预期一致:

Fourier Series表中,我找到了一个整流正弦波的公式(用numpy表示):

代码语言:javascript
复制
z8 = 1/pi + 1/2*sin(t)-2/pi*np.sum([cos(2*i*t)/(4*i**2-1) for i in range(1,8)],axis=0)

这有一个类似的cos系列术语,但增加了sin术语。对我来说,这意味着你可以将这一半罪近似为a*sin(t)+b(sin(2*t))的和(或类似的东西)。我想,有一些数学课本或论文探讨了像sympy那样推导傅立叶级数的困难。你看过Mathworld链接了吗?

整流半正弦与整流全正弦的FS比较

半正弦:

代码语言:javascript
复制
In [434]: z3 = 1/pi + 1/2*sin(t)-2/pi*np.sum([cos(2*i*t)/(4*i**2-1) for i in range(1,3)],axis=0)

全正弦:

代码语言:javascript
复制
In [435]: w3 = 1/pi -2/pi*np.sum([cos(2*i*t)/(4*i**2-1) for i in range(1,3)],axis=0)

In [438]: plt.plot(t,sin(t)/2)
In [439]: plt.plot(t,w3)
In [440]: plt.plot(t,z3)
In [441]: plt.plot(t,w3+sin(t)/2)  # full sine + sine/2 == half sine

我可以想象将这样的洞察力转换回sympy,以一种不会花费太长时间(或可能挂起)的方式重新定义周期函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50782952

复制
相关文章

相似问题

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