2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

激突!フーリエ変換選手権!mathematica vs sympy vs maxima

Posted at

つまりmathematica vs sympy vs maxima vsダークライということです。わかりましたか?
ぼくはわかりません(💢半ギレ

さて、それはともかくこういう事をしたいわけです(まあなんでこんな事をしたいかはさておき…)。

\begin{align}
\mathcal{F} & = \int \left( \frac{\sin(k/n)}{k/n} \right)^n \cos(k r) \mathrm{d}k\\
& 0 < r < 1
\end{align}

ただし$n$は$n \geq 1$の整数。
で、自分の貧弱算数力じゃまともにやるのとか嫌だったから機械にやらせようと思ってsympyにやらせたかったんですが、どうにも上手く行かなかった。
最初に書いたのは(定数倍とかそのへんの細かいことはさておき)これ。

sympy

def Fourier(n):
    r = sym.symbols('r', positive = True, domain = sym.Interval(0, 1))
    k = sym.symbols('k', positive = True)
    F = sym.fourier_transform((sym.sin(k / n) / (k / n))**n, k, r)

これは、$n \leq 2$までなら答えを出してくれたのだが、$n \geq 3$になると正しく答えを出してくれなかった。
そんな馬鹿ななんでやねんと思いつつmaximaを試すワタクシ。

maxima

n: 3;
declare(r , alphabetic);
assume(r > 0);
assume(r < 1);
integrate((sin(k / n) / (k / n))^n * cos(k * r), k, -inf, inf);

これは、$n = 4$までは正しく動いた。
しかし、$n = 5$で何故か間違った?答えが帰ってきた。

まあ、なにかFourier変換をするという専用の関数があって、もしかするとそれを使えば正しく動くのかもしれない。
ちなみに、

assume(r > 0);
assume(r < 1);

のありなしでも挙動が違って、ますます不思議であった。

mathematica

と言ってもmathematicaは持っていないので、オンライン上で実行できるWolfram scriptを用いた。

n = 3
w = FourierTransform[(Sin[k/n]/(k/n))^n, k, r, FourierParameters -> {1, 1}]

これは正しく動いた。
さすがのmathematica様。

結論

mathematica様はとりあえず正しい答えを返してくれた。
この程度ならsympyでええやろと思ったんだけれど。

なにかsymyでこういう事をやるときのトリック的な事を知っている人、居たら教えて下さいお願いします何でもはしませんから!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?