傅里叶变换Sympy无响应?

3

sympy能否快速计算傅里叶变换,或者我需要使用其他软件?因为我试过很多方法。虽然我在python和Sympy方面缺乏经验,但是否有更快的方法用python进行这些傅里叶变换呢?

  1. (a +j \ omega) / (4a^2 + (a+j \ omega)^2) ) 我尝试了如下代码:
    from sympy import poly, pi, I, pow
    from sympy.abc import a,f, n, k
    n = poly(a**2 + t**2)
    k = t / n
    fourier_transform(k , t, 2*pi*f)

我收到了以下信息: enter image description here 这是来自Python 3.9 shell的另一个示例: enter image description here 那么实际结果呢?

1
未经评估的结果意味着SymPy没有计算特定傅里叶变换的算法。 - asmeurer
@asmeurer 那这不是我的代码的问题?sympy只是无法计算它? - tonythestark
1
是的,没错。不幸的是,SymPy在计算涉及到delta函数的傅里叶变换时还不是很好。 - asmeurer
1个回答

1

1

目前,如果傅里叶变换返回一个PieceWise表达式,它会抛出异常并返回一个未求值的表达式。因此,SymPy可以进行积分,只是形式不太好看。这是手动积分后的结果。

enter image description here

如果您想得到这种答案,您可以自己使用此函数来实现。
def my_fourier_transform(f, t, s):
    return integrate(f*exp(-2*S.Pi*I*t*s), (t, -oo, oo)).simplify()

可以看到,长条件中有arg(a)arg(s),它们应该分别是sign(a)sign(s)(假设它们是实值的)。在Wolfram Alpha中进行类似的操作后,我认为这是一个正确的结果。只是不太好看。
但我发现了一个小技巧。如果SymPy难以简化某些内容,通常给它更强的假设是解决问题的方法,如果你的主要目标仅仅是获得答案。很多时候,即使假设不成立,答案仍然是正确的。所以我们让变量为正数。
请注意,如下面的注释所述,SymPy对变换的处理方式与Wolfram Alpha不同。这就是为什么我的第三个参数不同的原因。
from sympy import *
a, s, t = symbols('a s t', positive=True)
f = t / (a**2 + t**2)
# Wolfram computes integral(f(t)*exp(I*t*w))
# SymPy computes integral(f(t)*exp(-2*pi*I*s*t))
# So w = -2*pi*s
print(fourier_transform(f, t, -s))
# I*pi*exp(-2*pi*a*s)

2

如果我错了,请纠正我,但根据维基百科:

enter image description here

因此,Dirac Delta的傅里叶变换为1。

3

使用上述定义的my_fourier_transfrom函数,我们得到:

enter image description here

第一个条件始终为假。这可能是SymPy失败的原因,因为这个积分发散。我认为这是因为它无法确定它是oo-oo还是zoo

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