Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

sympyで「... = ...」の式を「... = 0」の式にする方法

sympyで「… = …」の式を「… = 0」の式にする方法を記載します。

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]

以上です。