为什么sympy不能简化导数的傅里叶变换?

4
我们知道导数的傅里叶变换为:

Fourier transform of a derivative

其中,k是傅里叶变量。这里有解释

我的问题是,为什么sympy不使用这个知识?例如:

from sympy import Function, symbols, fourier_transform, Derivative

f = Function('f')
x, k= symbols('x, k')

G = fourier_transform(Derivative(f(x), x, x) + f(x), x, k)
print(G)

这将打印

FourierTransform(f(x), x, k) + FourierTransform(Derivative(f(x), x, x), x, k)

但我期望它能够打印出来(乘以某些2 pi i的因子)。
FourierTransform(f(x), x, k) + k**2 FourierTransform(f(x), x, k)

有没有一种方法可以告诉sympy,因为我期望f(x) -> 0随着x趋近无穷大而进行简化?

如果没有,那么最干净的替换方式是什么?

1个回答

4

Sympy没有实现这个功能的简单原因是还未被实现。目前的解决方法是,手动用乘法替换导数的FourierTransform

from sympy import Wild, FourierTransform, Derivative
a, b, c = symbols('a b c', cls=Wild)
G.replace(
    FourierTransform(Derivative(a, b, b), b, c),
    c**2 * FourierTransform(a, b, c)
)

据我所知,Sympy没有提供匹配任意数量参数的模式,因此您无法使用单个模式匹配Derivative(f(x), x)Derivative(f(x), x, x)Derivative(f(x), x, x, x)等。您可以通过使用replace()函数的函数-函数形式来解决这个问题,但如果您知道所处理的导数阶数,可能更简单的方法就是明确地输入那么多个b,就像我在示例中所做的那样。请注意,保留了HTML标签。

谢谢你的回答!这个方法可行,但有一个小问题,就是replace函数不能原地修改,所以我需要额外添加一个G = ...(比看起来要花更长时间才能想到)。感谢你指出它仍然需要实现,如果我最终在我的项目中使用它,我可能会提交一个PR来实现这个功能。 - tBuLi
当然,我不想假设您是否想将替换的结果分配给 G。很抱歉我没有澄清这一点。如果您能正确实现导数的FT,我相信Sympy社区会非常感激 - 但我想它还没有被完成的原因是它有些棘手!祝你好运;-) - David Z

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