我试图找到傅立叶系列
像simpy一样:
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)
但它似乎不起作用。它被卡在*(循环?)。有什么方法可以解决这个问题吗?也许是另类?非常感谢
答案 0 :(得分:3)
我得到了,延迟了一两秒:
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:
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
表示)来表示纠正的正弦波:
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与整流正弦进行比较
半正弦: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)
全正弦:
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
,以不花太长时间(或可能挂起)的方式重新定义周期函数。