首页 > 解决方案 > 傅里叶变换 Sympy 什么都不做?

问题描述

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)

我收到这条消息: 在此处输入图像描述

另一个来自 Python 3.9 shell 的例子: 在此处输入图像描述 那么实际结果呢?

标签: pythonpython-3.xfftsympy

解决方案


1

目前,如果傅里叶变换返回一个PieceWise表达式,它就会大惊小怪,而是返回一个未计算的表达式。所以 SymPy 可以做积分,只是它的形式不是很好。这是手动集成后的结果。

在此处输入图像描述

如果您想要这种答案,您可以自己使用此功能来获得此结果。

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

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

在此处输入图像描述

所以 Dirac Delta 的傅里叶变换为 1。

3

使用my_fourier_transfrom上面的定义,我们得到

在此处输入图像描述

第一个条件总是错误的。这可能是 SymPy 的失败,因为这个积分是发散的。我认为这是因为它无法决定它oo-oo还是zoo


推荐阅读