SymPy だけでは解けない積分
完全版は https://r-de-r.github.io/jupyterlab/pi.html
2019 の日付のある誰かのツイートで「Wi-fi パスワードを数式にするのが流行っている」とかあって,そこで示されているのが
だ。
SymPy でやれば簡単じゃないかと思って,やってみるとおやまあという結果だったので記事にしてみる。
using SymPy
@syms x
expression = (x^3 * cos(x/2) + 1/2) * sqrt(4-x^2)
expression |> println
sqrt(4 - x^2)*(x^3*cos(x/2) + 0.5)
なにはともあれ,やってみる。
a = integrate(expression, (x, -2, 2))
随分時間がかかって,出てきた答えが以下のようなもの。2 つの定積分の和という答えを出してもらっても困る。ちなみに,Integral という関数はない。integrate だ。
a |> println
1.0*Integral(1.0*x^3*sqrt(4 - x^2)*cos(x/2), (x, -2, 2)) + 1.0*Integral(0.5*sqrt(4 - x^2), (x, -2, 2))
前半部分をもう一度やってみる。
b = integrate(x^3*sqrt(4 - x^2)*cos(x/2), (x, -2, 2));
なんの進展もない結果が帰ってくる。後で対処する。
b |> println
Integral(x^3*sqrt(-(x - 2)*(x + 2))*cos(x/2), (x, -2, 2))
後半部分をやってみる。
c = integrate(0.5*sqrt(4 - x^2), (x, -2, 2))
こちらはすぐに,(1.0* というのは気に入らないが)きれいな答えが得られた。π だ。
c |> println
1.0*pi
さて,b の integrate(x^3 sqrt(-(x - 2) (x + 2)) * cos(x/2), (x, -2, 2)) だが。
b0 = integrate(x^3 * sqrt(-(x - 2) * (x + 2)) * cos(x/2), (x, 0, 2));
結局何も進展しない。
b0 |> println
Integral(x^3*sqrt(2 - x)*sqrt(x + 2)*cos(x/2), (x, 0, 2))
ここで,式をちゃんと見ると,う?奇関数(懐かしい用語)。
expression2 = x^3 * sqrt(4 - x^2) * cos(x/2)
expression2 |> println
x^3*sqrt(4 - x^2)*cos(x/2)
expression2(x => -x) |> println
-x^3*sqrt(4 - x^2)*cos(x/2)
奇関数でした。なので,a の第 1 項は 0 なので,a の答えは a の第 2 項の π ということになる。
やれやれ。
#####
R では,数値微分しかできないのでやってみる。
> y = function(x) (x^3 * cos(x/2) + 1/2) * sqrt(4-x^2)
> options(digits=16)
> integrate(y, -2, 2)
3.141592653589796 with absolute error < 2e-09
#####
WolframAlpha でやってみた。数値積分になるが。
※コメント投稿者のブログIDはブログ作成者のみに通知されます