sympyで「… = …」の式を「… = 0」の式にする方法を記載します。
Table of Contents
1 行いたいこと
まず、行いたいことを明確にします。例えば、以下の式があったとします。
a = b
上記の式の両辺から b を引く(b を左辺に移項する)と以下のようになります。
a - b = 0
今回行いたいことは、上記のように両辺から右辺の式を引く、または左辺の式を引くことにより「… = 0」の式を作成することです。
2 解決策
以下が解決策です。まず、 a = b を表す等式を作成する方法は以下になります。
from sympy import Symbol, Eq a = Symbol('a') b = Symbol('b') left = a right = b e = Eq(left, right) print(e)
Eq(a, b)
上記は、a と b を表す Symbol オブジェクトを left, right 変数に格納しています。a = b を表す等式を変数 e に格納するということを行っています。等式の作成には sympy.Eq 関数を使用しています。
両辺から右辺の式を引き算すれば「… = 0」の式になります。これを、sympy で書くと以下になります。
# 両辺から右辺の式 right を引く e2 = Eq(left - right, right - right) # 上記プログラムは以下と同じ e2 = Eq(left - right, 0) print(e2)
Eq(a - b, 0)
sympyで「… = …」の式を「… = 0」の式にする方法の説明は以上です。物足りないので練習問題を追加しておきます。
3 練習問題
練習として以下を解くことにします。
3.1 【問 1】
問:
以下の等式を移項して「... = 0」の等式にするにはどうすれば良いでしょうか? a = (b - 1.08614074 * a)**2
答え:
# Symbol の定義 a = Symbol('a') b = Symbol('b') # 右辺、左辺の定義 left = a right = (b - 1.08614074 * a)**2 # (変形前)等式の定義 e = Eq(left, right) print("変形前: ", e) # (変形後)等式の定義 e2 = Eq(left - right, 0) print("変形後: ", e2)
変形前: Eq(a, (-1.08614074*a + b)**2) 変形後: Eq(a - (-1.08614074*a + b)**2, 0)
3.2 【問 2】
問:
【問 1】の式を b について解く(b = f(a) の形に変形する)にはどうす れば良いでしょうか? ※式を解くには sympy.solve 関数を使用します。第一引数に等式を指定します。 【問 1】のソースコードの e, e2 どちらを使用しても問題ありません)第二引 数にどのSymbolについて解くかを指定します。戻り値は要素が解のリストです。
答え:
from sympy import solve # sympy.solve 関数を使用して b について解く answer = solve(e, b) # 上記プログラムは以下と同じ answer = solve(e2, b) print(answer)
[-sqrt(a) + 1.08614074*a, sqrt(a) + 1.08614074*a]
以上です。