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']
高階導関数
$f(x)$ を $x$ で $n$ 階微分する例。SymPy では diff(f(x), x, n)
のように書きます。
例:
$$\frac{d^2}{dx^2} \sin x = \cdots$$
# 手っ取り早く答えを知りたいときは...
diff(sin(x), x, 2)
# 何を計算するかを表示させてから実行する場合は...
Eq(Derivative(sin(x), x, 2),
diff(sin(x), x, 2))
テイラー展開
テイラー展開は series()
関数を使います。
指数関数のテイラー展開
$f(x) = e^x$ の $x = 0$ のまわりに $x^5$ までテイラー展開する例。5次までの展開なのになぜ 6
かと悩むかもしれないが,これが Python の流儀らしい。
$x^0$ から数えて 6 番目までだから 6
とか,5
は 6
未満なので 6
と書くとか,各自納得する方法で覚えておく。
f = exp(x)
series(f, x, 0, 6)
$O(x^6)$ は $x^6$ 以上の高次の項という意味。
ちなみに,この式で $x=1$ とおくと
$$ e = \sum_{k=0}^{\infty} \frac{1}{k!}$$ となり,この級数展開を使ってネイピア数 $e$ の近似値を求めることができる。
例として,$\displaystyle \sum_{k=0}^{10} \frac{1}{k!}$ の計算。SymPy では階乗 $k!$ は factorial(k)
です。
# 手っ取り早く総和の答えを知りたいときは...
summation(1/factorial(k), (k, 0, 10))
# 何を計算するかを表示させてから実行する場合は...
Eq(Sum(1/factorial(k), (k, 0, 10)),
Sum(1/factorial(k), (k, 0, 10)).doit())
# 浮動小数点数で表示
float(summation(1/factorial(k), (k, 0, 10)))
# ネイピア数と比較
float(E)
三角関数のテイラー展開
$f(x) = \sin x$ の $x = 0$ のまわりのテイラー展開は
\begin{eqnarray}
\sin x &=& f(0) + f'(0)\, x + \frac{f”(0)}{2!}\,x^2 + \frac{f”'(0)}{3!}\,x^3 +\cdots \\
&=& \sin 0 + \cos 0 \cdot x + \frac{-\sin 0}{2!}\,x^2 + \frac{-\cos 0}{3!}\,x^3 + \cdots \\
&=& x – \frac{x^3}{3!} + \frac{x^5}{5!} – \frac{x^7}{7!} + \cdots\\
&=& \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!}\,x^{2n+1}
\end{eqnarray}
series(sin(x), x, 0, 8)
# 階乗の確認
factorial(3), factorial(5), factorial(7)
$f(x) = \cos x$ の $x = 0$ のまわりのテイラー展開は
\begin{eqnarray}
\cos x &=& f(0) + f'(x)\, x + \frac{f”(0)}{2!}\,x^2 + \frac{f”'(0)}{3!}\,x^3 +\cdots \\
&=& \cos 0 – \sin 0 \cdot x + \frac{-\cos 0}{2!}\,x^2 + \frac{\sin 0}{3!}\,x^3 + \cdots \\
&=& 1 – \frac{x^2}{2!} + \frac{x^4}{4!} – \frac{x^6}{6!} + \cdots\\
&=& \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n)!}\,x^{2n}
\end{eqnarray}
series(cos(x), x, 0, 7)
# 階乗の確認
factorial(2), factorial(4), factorial(6)
参考:テイラー展開した関数のグラフ
$f(x) = e^x$ のテイラー展開
.removeO()
で高次の項を取りのぞいて「普通の」関数にしてから plot()
します。
expt1 = series(exp(x), x, 0, 2).removeO()
expt2 = series(exp(x), x, 0, 3).removeO()
expt3 = series(exp(x), x, 0, 4).removeO()
expt1, expt2, expt3
plot(exp(x), expt3, expt2, expt1, (x, -2, 2));
$f(x) = \sin x$ のテイラー展開
sint1 = series(sin(x), x, 0, 2).removeO()
sint3 = series(sin(x), x, 0, 4).removeO()
sint5 = series(sin(x), x, 0, 6).removeO()
sint1, sint3, sint5
plot(sin(x), sint5, sint3, sint1, (x, -pi, pi));
テイラー展開の次数を上げていくと,$|x| < 1$ の範囲では,もとの関数に近づいていくようすがわかります。
人類の至宝:オイラーの公式
オイラーの公式を確認するために,指数関数 $e^{i x}$ を .rewrite(cos)
をつけて三角関数で書き直してみます。SymPy では虚数単位 $i$ は I
です。
from sympy import pi, E, I
Eq(exp(I*x),
exp(I*x).rewrite(cos))
逆に,三角関数を指数関数を使って表してみます。
cos(x).rewrite(exp)
sin(x).rewrite(exp)
以上のことから
\begin{eqnarray}
\cos x &=& \frac{e^{ix} + e^{-ix}}{2} \\
\sin x &=& \frac{e^{ix} – e^{-ix}}{2 i}
\end{eqnarray}
であることが確認できます。
オイラーの等式
$$e^{i\pi} + 1 = 0$$
オイラーの等式のどこがすごいかというと,
- 可能における単位元ゼロ $0$ と乗法における単位元 $1$ という整数のもっとも基本となる数
- 無理数の代表選手,ネイピア数 $e$ と円周率 $\pi$
- そして虚数単位 $i$
という,いずれ名だたる役者達が,加法,乗法および冪乗によって見事に結び付けられているということ!
E**(I * pi) + 1 == 0
三角関数と双曲線関数の関係
三角関数と双曲線関数は,ただまぎらわしいほどに似た表記なだけでなく,アイで結ばれた密接な関係であることを確認する。
cosh(I*x)
sinh(I*x)
cos(I*x)
sin(I*x)
… ということで以下のことが確認できた。
\begin{eqnarray}
\cosh i x &=& \cos x \\
\sinh i x &=& i \sin x \\
\cos i x &=& \cosh x \\
\sin i x &=& i \sinh x
\end{eqnarray}
逆三角関数と逆双曲線関数の関係
逆三角関数と逆双曲線関数もまた,ただまぎらわしいほどに似た表記なだけでなく,アイで結ばれた密接な関係であることを確認する。
asin(I*x)
atan(I*x)
acos(I*x)
… ということで以下のことが確認できた。
\begin{eqnarray}
\sin^{-1} i x &=& i \sinh^{-1} x \\
\tan^{-1} i x &=& i \tanh^{-1} x \\
\cos^{-1} i x &=& – i \sinh^{-1} x + \frac{\pi}{2}
\end{eqnarray}
最後の $\displaystyle \frac{\pi}{2}$ が何かしっくりこないが,これは以下の関係から理解できる。
$$\cos^{-1} x + \sin^{-1} x = \frac{\pi}{2}$$
SymPy でも確認しておく。
Eq(acos(x) + asin(x),
acos(x) + asin(x).rewrite(acos))