在Sympy中对三角函数进行傅里叶变换会返回意外的结果。

9

我认为Sympy在计算三角函数的傅里叶变换时存在误差。例如:

from sympy import fourier_transform, sin
from sympy.abc import x, k
print fourier_transform(sin(x), x, k)

期望的答案通过Mathematica计算

enter image description here

但是Sympy返回0。有时这个函数可以很好地工作,因为fourier_transform(Heaviside(t)*cos(t),t,omega)fourier_transform(Heaviside(t)*sin(t),t,omega)会返回正确的答案。我认为Sympy可能使用拉普拉斯变换来计算傅里叶变换。

嗯,sin的傅里叶变换是一系列的delta函数之和。可能Sympy在表示delta函数时会有困难。还要注意,对于我来说,sympy.fourier_transform('Heaviside(t)', 't', 'omega')得到的是-I/(2*pi*omega),而在Mathematica中,FourierTransform[HeavisideTheta[t], t, w]得到的是I/(Sqrt[2 \[Pi]] w) + Sqrt[\[Pi]/2] DiracDelta[w](所以sympy也在这里丢失了一个delta函数)。 - senshin
这样做非常奇怪,因为sympy确实有delta函数DiracDelta - Kattern
2个回答

6

SymPy通过计算积分来计算傅里叶变换。我认为这是一个漏洞,所以请随时提交问题


@kattern 你应该提供一个问题链接,这样我们就可以根据状态进行更新。 - Hooked
@Hooked 很棒的想法,问题链接为https://github.com/sympy/sympy/issues/2803。 - Kattern

3
您可以在转换例程中添加noconds=False,以查找转换积分收敛的条件。正如asmeurer所说,我们确实计算了定义积分,因此您永远不会看到出现delta函数的情况。对于cos的傅里叶变换,这些条件是一种复杂的方式来表达“从不”,不幸的是sympy无法识别。 (即算法说“如果blah,则积分为零”,而blah从不成立。)
对于阶跃函数的傅里叶变换,条件似乎表明,如果z具有负参数(角度),且不太大,则此方法有效。请注意,这确实是变换积分收敛的时候(因为您需要在正实数上拾取一个下降的指数项)。我没有时间思考这种情况的计算是否正确。

我也看到了这个选项,但对我来说,我希望fourier_transform返回DiracDelta函数而不是一个有条件的零。 - Kattern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接