[備忘録] Sympy.rewrite()で指数関数⇆三角関数の表記書き換え


タイトルにもある通り個人的な備忘録としての記事です。
明らかな誤りなどありましたらご指摘頂けると大変助かります。

Sympyについて

SymPy 1.5 documentation

SympyはPython上で記号計算を行うことができるライブラリで、紙のノートとペンを使って式を変形して方程式の解を求めるような流れをプログラム上で行うことができます。
学術書や技術書等で解説される理論の導出過程を追って学習する際や、便宜上必要な数式を用意する必要がある際等に重宝するのではないかと思い注目しています。

Sympy.rewrite()

sympy.core.basic.Basic.rewrite
このメソッドは、指定した関数を別の形の関数に表現し直す際に使用します。
波動とか複素関数などの計算過程で指数関数⇆三角関数の式変形をよく行うと思いますが、式簡略化のsympy.simplify()等と組み合わせて使うと便利そうです。

例題

次式の複素関数wについて実部と虚部に分ける場面を考えます。(U, αは定数)
$$
w = U e^{-i \alpha } \tag{1}
$$
式(1)に対して、
$$ u = Re[w],  v = -Im[w] $$
とおき、式(1)を次式のように表現することにします。
$$
w = u - iv \tag{2}
$$
この式(2)のu, vを求めます。

式(1)に対して、次式のオイラーの公式(Euler's formula)を用いて、指数関数を実数項と虚数項の和として書き換えます。
$$
e^{i \theta } = \cos{\theta} + i\sin{\theta} \tag{3}
$$
式(3)を式(1)に適用して、
$$
w = U (\cos{\alpha} - i\sin{\alpha}) \tag{4}
$$
したがって、
$$
u = Re\left[w\right]=U\cos{\alpha},$$$$v = -Im\left[w\right]=U\sin{\alpha}
$$

Sympyで記述する

# ライブラリとモジュールのインポート
import sympy as sp
from sympy import * 

# 定数U, α用の記号を定義
U, alpha = symbols('U alpha')

# 関数wを定義
w = Function("w")
w = U*exp(-I*alpha)

表示

print(w)  # wを文字で表示
w         # wを数式の書体で表示

結果

ここで三角関数(sin, cos)を用いて表現し直すために、rewrite()を用います。

w.rewrite(exp, sin, cos)

結果

また、expand()を用いると、式を展開することができます。

expand(w.rewrite(exp, sin, cos))

結果

更に、re()を用いると式の実部と虚部を明示してくれます。

re(expand(w.rewrite(exp, sin, cos)))

結果

まとめ

私は手計算による計算ミスが多いので、それをPythonに代行させられないかと思ったのがきっかけでSympyと出会いました。(執筆時点でまだ出会って3日間ほどですが...)
計算過程の各部における検算や、例題の自炊などにも使えそうなので、学生時代に出会っておけば色々と捗っただろうなと染み染み思いました。
学習ノートも嵩張る紙のノートじゃなくてJupyter使って.ipynbに書いてGithubで管理すれば学習過程も記録できますし、こうして記事の草稿にも使いまわせるので便利ですね。
手書きノートアプリのNotability等も(どちらかというと講演会とかの図入りメモ取り用)あるのですが、結局計算ミスで詰まる課題があったので、Sympyのようなライブラリの存在は助かります。
今後もっと扱いに慣れていこうと思います。