つまり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でこういう事をやるときのトリック的な事を知っている人、居たら教えて下さいお願いします何でもはしませんから!