Python で微分積分などの記号計算をする場合は,以下のように必要なパッケージを import します。(弘大 JupyterHub では必要なパッケージはインストール済みです。)
セルをクリックして,上のメニューから「▶︎ Run」をクリックするか,Shift キーを押しながら Enter キー(Return キー)を押すと実行します。
from sympy.abc import *
from sympy import *
# SymPy Plotting Backends (SPB): グラフを描く際に利用
from spb import *
# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']
不定積分
微分の逆演算としての不定積分。
微分は与えられた関数から,その導関数を求める。(不定)積分とは,導関数が与えられたときに,微分する前のもとの関数を求めること。その意味で,微分の逆演算。
導関数が求められている全ての初等関数は,逆演算としての不定積分を行なうと初等関数を使って表すことができる。
以下の不定積分では,積分定数は省略されて出力される。
SymPy では不定積分は以下のように書きます。
$\displaystyle \int f(x) dx = $ integrate(f(x), x)
べき関数
$\displaystyle \int x^p\, dx$ の積分。
# とっとと答えを知りたい場合は...
integrate(x**p, x)
# 何を計算するかを表示させてから実行する場合は...
Eq(Integral(x**p, x),
Integral(x**p, x).doit())
指数関数
$\displaystyle \int e^x\, dx$ の積分。
Eq(Integral(exp(x), x),
Integral(exp(x), x).doit())
原始関数が自然対数になる例
$\displaystyle \int \frac{1}{x}\, dx = \log |x|$ となるはずですが…
Eq(Integral(1/x, x),
Integral(1/x, x).doit())
SymPy の積分では $\log$ の中身の絶対値を省略する傾向にある。
三角関数の不定積分
Eq(Integral(cos(x), x),
Integral(cos(x), x).doit())
Eq(Integral(sin(x), x),
Integral(sin(x), x).doit())
Eq(Integral(1/cos(x)**2, x),
Integral(1/cos(x)**2, x).doit())
# simplify すれば tan(x) に
Eq(integrate(1/cos(x)**2, x),
integrate(1/cos(x)**2, x).simplify())
原始関数が逆三角関数になる例
Eq(Integral(1/sqrt(1-x**2), x),
Integral(1/sqrt(1-x**2), x).doit())
$$- \int \frac{1}{\sqrt{1-x^2}}\, dx = \cos^{-1} x$$となりそうですが…
Eq(Integral(-1/sqrt(1-x**2), x),
Integral(-1/sqrt(1-x**2), x).doit())
実は
$$\cos^{-1} x + \sin^{-1} x = \frac{\pi}{2}$$という関係があったので,
$$- \sin^{-1} x = \cos^{-1} x + \frac{\pi}{2}$$
$\cos^{-1} x$ と $- \sin^{-1} x$ の違い $\displaystyle \frac{\pi}{2}$ は積分定数の中に含まれてしまいます。
# 不定積分の答えを acos(x) を使って書き直すと...
Eq(Integral(-1/sqrt(1-x**2), x),
integrate(-1/sqrt(1-x**2), x).rewrite(acos))
定積分
SymPy では定積分は以下のように書きます。
$\displaystyle \int_a^b f(x)\, dx = $ integrate(f(x), (x, a, b))
置換積分
置換積分の項で例としてあげている不定積分:$\displaystyle\ \ \int \frac{\log x}{x} \, dx$
integrate(log(x)/x, x)
簡単な場合だと integrate()
で積分できてしまう。これを敢えて置換積分しているのが以下の例。
まず,不定積分を int1
として定義。
int1 = Integral(log(x)/x, x)
int1
int1
の中身を .transform(log(x), t)
によって $\log x \Rightarrow t$ という変数に置換する。
int2 = int1.transform(log(x), t)
int2
上式ではさらに $\log \left(e^t\right) = t$ となるはずだが,そこはほっておいて .doit()
で実際に積分を実行させる。
int2.doit()
最後に .subs(t, log(x))
によって $t$ をもとの $\log x$ で表すと…
int2.doit().subs(t, log(x))
部分積分
部分積分の例としてあげている $\displaystyle \int \log x \, dx$ も,特に問題なく積分できてしまいます。
Eq(Integral(log(x), x),
Integral(log(x), x).doit())
逆三角関数の積分
問:
逆三角関数や逆双曲線関数の微分はやったけど,逆三角関数や逆双曲線関数の積分はどうなるの?
答:
部分積分してください。基本的に逆三角関数や逆双曲線関数の微分がわかれば,積分もできます。
Eq(Integral(asin(x), x),
Integral(asin(x), x).doit())
Eq(Integral(acos(x), x),
Integral(acos(x), x).doit())
Eq(Integral(atan(x), x),
Integral(atan(x), x).doit())
逆双曲線関数の積分
Eq(Integral(asinh(x), x),
Integral(asinh(x), x).doit())
本稿執筆時点では,SymPy ではなぜか $\cosh^{-1} x$ の積分ができない。バグ?
integrate(acosh(x), x)
しかたがないので,まずは人力で部分積分の形にします。
\begin{eqnarray}
\int \operatorname{acosh}{x}\, dx &=&
x \operatorname{acosh}{x} – \int x \frac{d}{dx} \operatorname{acosh}{x} \,dx
\end{eqnarray}
$\operatorname{acosh}{x}$ の微分は,SymPy では…
diff(acosh(x), x)
SymPy はどうもこの手の積分が苦手のようです。
Integral(x/(sqrt(x-1)*sqrt(x+1)), x)
分母を以下のように書き換えると簡単に答えをだします。
Eq(Integral(x/(sqrt(x**2-1)), x),
Integral(x/(sqrt(x**2-1)), x).doit())
ということで,結局…
Eq(Integral(acosh(x), x),
x * acosh(x) - integrate(x/(sqrt(x**2-1)), x))
Eq(Integral(atanh(x), x),
integrate(atanh(x), x))
これでもいいですが,$\displaystyle\int \operatorname{atan}{\left(x \right)}\, dx$ との対応がわかりやすい形にしてみます。
まずは人力で部分積分の形にして…
\begin{eqnarray}
\int \operatorname{atanh}{\left(x \right)}\, dx &=&
x \operatorname{atanh}{\left(x \right)} – \int x \frac{d}{dx}\operatorname{atanh}{\left(x \right)}\,dx
\end{eqnarray}
$\operatorname{atanh}{\left(x \right)}$ の微分は SymPy では…
diff(atanh(x), x)
Eq(Integral(atanh(x), x),
x* atanh(x) - integrate(x/(1-x**2), x))
惜しい! $\operatorname{atanh}{\left(x \right)}$ の $x$ のとりうる範囲は $-1 < x < 1$ なので,最後の $\log$ の項は
$\displaystyle \int \operatorname{atanh}{\left(x \right)}\, dx = x \operatorname{atanh}{\left(x \right)} + \frac{\log{\left(1-x^{2} \right)}}{2}$
と書くべきだよねぇ。
有理関数の積分
$$f(x) = \frac{2 x^3 + 3 x^2 – 2 x – 1}{x^2 + x – 2}$$
のように $\displaystyle \frac{\mbox{多項式}}{\mbox{多項式}}$ の形になっている関数を有理関数という。
有理関数を積分する際は,部分分数に分解してから積分する。
SymPy では特に気にせず integrate()
で積分できてしまう。
f = (2 * x**3 + 3 * x**2 - 2 * x - 1)/(x**2 + x - 2)
f
integrate(f, x)
部分分数に分解
上記のように,SymPy では特に部分分数に分解しなくても積分てきでしまうのであるが,そこをあえて apart()
関数で部分分数に分解してみる。
af = apart(f)
af
部分分数に分解することで,以下のような積分をすればいいのだなぁと理解できる。
\begin{eqnarray}
\int f(x) dx &=&
\int (2x+1) dx + \frac{1}{3} \int \frac{dx}{x+2} + \frac{2}{3}\int \frac{dx}{x-1} \\
&=& x^2 + x + \frac{1}{3} \log(x+2) + \frac{2}{3} \log(x-1)
\end{eqnarray}
Eq(Integral(af, x),
Integral(af, x).doit())
$\sin x, \cos x$ の有理関数の積分
たとえば,$\displaystyle \frac{(\sin x)^2}{1 + \cos x + 2 \sin x}$ のような, $\sin x$ と $\cos x$ の有理関数の形の関数の積分。
教科書的には $\displaystyle \tan \frac{x}{2} \equiv t$ という変数変換をして置換積分すればよいということになっている。
練習問題 1
$\displaystyle \int \frac{1}{\cos x} \,dx$
これはそのままの形で integrate()
できる。
ans1 = integrate(1/cos(x), x)
Eq(Integral(1/cos(x), x), ans1)
教育的見地から置換積分でもやってみる。
$\displaystyle \tan \frac{x}{2} \equiv t$ とおいて…
int1 = Integral(1/cos(x), x)
int2 = int1.transform(tan(x/2), t).trigsimp()
int2
これは(被積分関数を部分分数に分解すれば)簡単に積分できて…
ans = int2.doit()
ans
最後に $t$ を $\displaystyle \tan \frac{x}{2}$ に戻して…
ans2 = ans.subs(t, tan(x/2))
ans2
というわけで,一見表示の異なる原始関数が得られた。(絶対値を省略しているけど。)
\begin{eqnarray}
\int \frac{1}{\cos{\left(x \right)}}\, dx &=&
\frac{1}{2}\log\frac{1+\sin x}{1-\sin x} \\
&=& \log\left|\frac{1+\tan \frac{x}{2}}{1-\tan \frac{x}{2}} \right|
\end{eqnarray}
これらが同等であることを示しておいてください。
ヒント:たとえば $ \sin x = 2 \sin\frac{x}{2} \cos\frac{x}{2}$ を使うとか。
練習問題 2
$\displaystyle\int \frac{a – b \cos\phi}{a^2 + b^2 -2 a b \cos \phi} d\phi$
a = Symbol('a', positive = True)
b = Symbol('b', positive = True)
var('phi')
int1 = Integral((a-b*cos(phi))/(a**2 + b**2 - 2*a*b*cos(phi)), phi)
int1
int1.doit()
いちおう積分はできているようだが,虚数単位 $i$ が現れていて意味不明。
セオリーに従って $\displaystyle \tan \frac{\phi}{2} \equiv t$ とおいて…
int2 = int1.transform(tan(phi/2), t).trigsimp()
int2
被積分関数を部分分数に分解してみる。
ft = diff(int2, t).apart(t)
ft
それぞれの項を積分してみる。
term1 = 1/a/(t**2+1)
Eq(Integral(term1, t) + Integral((ft-term1), t),
integrate(term1, t) +integrate((ft-term1), t).simplify())
かなりすっきりしてきた。最後に $t$ を $\displaystyle \tan \frac{\phi}{2}$ に戻して…
ans = integrate(term1, t) +integrate((ft-term1), t).simplify()
ans.subs(t, tan(phi/2))
練習問題 3
$\displaystyle\int \frac{a – b \cos\theta}{\left(a^2 + b^2 -2 a b \cos \theta\right)^{\frac{3}{2}}} \sin\theta\, d\theta$
var('theta')
int1 = Integral(
(a-b*cos(theta))/(sqrt(a**2+b**2-2*a*b*cos(theta)))**3*sin(theta), theta)
int1
integrate()
で積分できます。
int1.doit().factor()
あえて置換積分でやってみると,$u \equiv \cos\theta$ とおいて…
無理関数の積分
例 1
$\displaystyle \int \frac{dx}{x \sqrt{x+1}}$
SymPy ではそのまま integrate()
できます。
integrate(1/(x*sqrt(x+1)), x)
$\log$ であらわすと…
integrate(1/(x*sqrt(x+1)), x).rewrite(log)
これをあえて $\sqrt{x+1} = t$ とおいて置換積分してみると…
int1 = Integral(1/(x*sqrt(x+1)), x)
int1
int2 = int1.transform(sqrt(x+1), t)
int2
ans = int2.doit()
ans
最後に $t$ をもとの $\sqrt{x+1}$ に戻してやって…
ans.subs(t, sqrt(x+1))
SymPy はあいからわず $\log$ の中身の絶対値を省略しています。
例 2
$\displaystyle \int \frac{dx}{\sqrt{x^2+1}}$
これもすぐ integrate()
できてしまいます。
integrate(1/sqrt(x**2 + 1), x)
$\log$ であらわすと…
_.rewrite(log)
ヒントに従って,あえてこれを置換積分してみます。$x + \sqrt{x^2 + 1} \equiv t\ (>0)$ とおくと…
int1 = Integral(1/sqrt(x**2 + 1), x)
int1
# t は正であると宣言
t = Symbol('t', positive = True)
int2 = int1.transform(x+sqrt(x**2+1), t)
int2
被積分関数はもっと簡単になりますよねぇ。
# 被積分関数を ft として取り出す
ft = diff(int2, t)
ft.simplify()
# 2乗して簡単化して平方根をとる
ft = sqrt(simplify(ft**2))
ft
ans = integrate(ft, t)
ans
$t$ をもとの変数 $x + \sqrt{x^2 + 1}$ になおすと…
ans.subs(t, x+sqrt(x**2+1))
例 3
$\displaystyle \int \sqrt{x^2+1} dx$
これも integrate()
できてしまいます。
integrate(sqrt(x**2 + 1), x)
$\log$ であらわすと…
_.rewrite(log)
ヒントにしたがって,これをあえて置換積分でやってみる。$x+\sqrt{x^2+1} \equiv t$ とおいて…
int1 = Integral(sqrt(x**2 + 1), x)
int1
# t は正であると宣言
t = Symbol('t', positive = True)
int2 = int1.transform(x+sqrt(x**2+1), t)
int2.simplify()
被積分関数はもっと簡単になりますよねぇ。
# 被積分関数を ft として取り出す
ft = diff(int2.simplify(), t)
ft
factor(ft**2)
# 2乗して簡単化して平方根をとる
ft = sqrt(factor(ft**2))
ft.apart()
ans = integrate(ft.apart(), t)
Eq(Integral(ft.apart(), t), ans)
$t$ をもとの変数 $x+\sqrt{x^2+1}$ に戻して…
ans.subs(t, x+sqrt(x**2+1))
… う〜ん。なかなかまとめてくれませんねぇ。
練習問題 1
$\displaystyle \int \frac{dx}{x \sqrt{x-1}}$
直接 integrate()
すると…
integrate(1/(x*sqrt(x-1)), x)
題意から $x>1$ だから,2行目が答えなんだろうけど,積分定数分の不定性をのぞいて
$\displaystyle 2 \operatorname{acos} \left(\frac{1}{\sqrt{x}}\right)$ と書いたほうがよろしいかと思う。
SymPy, ちょっと残念。
置換積分でやると,$\sqrt{x-1} \equiv t$ とおいて…
int1 = Integral(1/(x*sqrt(x-1)), x)
int1
int2 = int1.transform(sqrt(x-1), t)
int2
ans = int2.doit()
ans
ans.subs(t, sqrt(x-1))
この答えが直接 integrate()
で求めた $\displaystyle 2 \operatorname{acos}{\left(\frac{1}{\sqrt{x}}\right)}$ と同等,すなわち
$$\tan^{-1} \sqrt{x-1} = \cos^{-1} \frac{1}{\sqrt{x}}$$
であることを確認してみる。$\tan^{-1}$ の式を $\cos^{-1}$ を使って書き直すと…
Eq(atan(sqrt(x-1)),
atan(sqrt(x-1)).rewrite(acos))
Eq(acos(1/sqrt(x)),
acos(1/sqrt(x)).rewrite(atan))
SymPy は平方根同士のかけ算が苦手のようである。
$$\sqrt{x} \sqrt{1 – \frac{1}{{x}}} = \sqrt{x-1}$$
だよねぇ。
練習問題 2
$\displaystyle \int \frac{\sqrt{x}}{\sqrt{1-x}} dx$
integrate(sqrt(x)/sqrt(1-x), x)
題意から $0 \leq x < 1$ なので2行目が答えなんだけど,これも置換積分で別途計算してみる。
$\displaystyle \frac{\sqrt{x}}{\sqrt{1-x}} \equiv t$ とおいて…
int1 = Integral(sqrt(x)/sqrt(1-x), x)
int1
t = Symbol('t', positive = True)
int2 = int1.transform(sqrt(x)/sqrt(1-x), t)
int2
# 被積分関数を ft としてとる
ft = diff(int2, t)
# 2乗して簡単化して平方根をとる
ft = sqrt((ft**2).simplify())
ft
ans = integrate(ft, t)
ans
ans.subs(t, sqrt(x)/sqrt(1-x)).simplify()
人間の目では,
$\displaystyle \operatorname{atan}{\left(\frac{\sqrt{x}}{\sqrt{1 – x}} \right)} – \sqrt{x}\sqrt{1-x}$
としたほうが見やすいかも。
練習問題 3
$\displaystyle \int \frac{\sqrt{x}}{\sqrt{1-x^3}} dx$
integrate(sqrt(x)/sqrt(1-x**3), x)
題意から $|x^3| < 1$ なので2行目が答え。
ちなみに,$y = \sin^{-1} x^{3/2}$ とおくと,
\begin{eqnarray}
x^{\frac{3}{2}} &=& \sin y \\
\tan y &=& \frac{\sin y}{\cos y} \\
&=& \frac{\sin y}{\sqrt{1-\sin^2 y}} \\
&=& \frac{x^{\frac{3}{2}}}{\sqrt{1-x^{3}}} \\
\therefore\ \ y &=& \tan^{-1} \frac{\sqrt{x^3}}{\sqrt{1-x^{3}}}
\end{eqnarray}
練習問題 4
$\displaystyle \int \frac{1}{\left(a^2 +x^2\right)^{\frac{3}{2}}} dx$
integrate(1/sqrt(a**2 + x**2)**3, x)
広義の積分
SymPy では無限大 $\infty$ は oo
(アルファベットのオーの小文字2つ) です。
練習問題 1
$\displaystyle \int_{-\infty}^{\infty} \frac{1}{(a^2 + x^2)^{\frac{3}{2}}} dx$
a = Symbol('a', positive = True)
Eq(Integral(1/sqrt(a**2 + x**2)**3, (x, -oo, oo)),
Integral(1/sqrt(a**2 + x**2)**3, (x, -oo, oo)).doit())
練習問題 2
$\displaystyle \int_{-\infty}^{\infty} \frac{1}{a^2 + x^2} dx$
Eq(Integral(1/(a**2+x**2), (x, -oo, oo)),
Integral(1/(a**2+x**2), (x, -oo, oo)).doit())
いくつかの応用
いくつかの応用の項の例題。
円の面積
$\displaystyle x^2 + y^2 = r^2$ より $y = \sqrt{r^2 – x^2}$(円の上半分)。 ここで $r$ は円の半径で $r > 0$
円の面積 $S$ は,$y = \sqrt{r^2 – x^2}$ と $x$ 軸で囲まれる部分の面積を求めて2倍すればよい。
$\displaystyle S = 2 \int_{-r}^r y\, dx$
r = Symbol('r', positive = True)
y = sqrt(r**2 - x**2)
Eq(Integral(2*y, (x, -r, r)),
Integral(2*y, (x, -r, r)).doit())
円周
$\displaystyle L = 2 \int_{-r}^r \sqrt{1 + \left(\frac{dy}{dx}\right)^2}\, dx$
dydx = diff(y, x)
dydx
Eq(2*Integral(sqrt(1+dydx**2), (x, -r, r)),
2*Integral(sqrt(1+dydx**2), (x, -r, r)).doit())
球の表面積
$\displaystyle S = \int_{-r}^r 2\pi y \sqrt{1 + \left(\frac{dy}{dx}\right)^2}\, dx$
SymPy は平方根があるこの手の積分が苦手らしいので,被積分関数を簡単化してから計算する。
int1 = Integral(2*pi*y*sqrt(1+diff(y,x)**2), x)
int1
fx = diff(int1, x)
fx
# 被積分関数を2乗して簡単化して平方根をとる
fx = sqrt((fx**2).simplify())
fx
integrate(fx, (x, -r, r))
球の体積
$\displaystyle V = \int_{-r}^r \pi y^2\, dx$
integrate(pi*y**2, (x, -r, r))