python - 傅里叶变换 Sympy 什么都不做?
问题描述
sympy 是否能够快速计算傅立叶变换,还是我需要其他软件?因为我尝试了很多东西。不过,我对 python 和 Sympy 非常缺乏经验。有没有更快的方法来用 python 进行这些傅里叶变换?
- (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)
解决方案
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
。
推荐阅读
- r - 在 R 中使用 pagedown 将 HTML 转换为 pdf
- c++ - 使用 C++ 创建一个计算器
- c# - 虽然字符串的最大大小约为 0.75GB,但 Visual Studio 显示 5GB 的使用和运行内存,为什么会有差异?
- c - 使用 Visual Studio Code 运行构建命令
- c++ - 在 C++ 中自己的变量更改
- java - 如何在 FlatFileItemReader 中使用 @JoinColumn 属性(实体)映射 CSV 字段 - Spring Batch
- azure-devops - 使用策略不适用于 AzureRmWebAppDeployment@4
- android-studio - 如何在我的 Android Studio 中克隆 Flutter Gallery 项目?
- discrete-mathematics - 我真的不知道如何开始这个问题
- java - 完成时重新启动 CountDownTimer 比使用按钮重置慢