【Python】Sympyで対数や三角関数を記号処理して方程式を解いてみた!

Pythonには数式を記号のまま計算処理することができるライブラリが存在します。それがSympyです。今日はその使い方の概要をご紹介します。こちらで紹介しているSympyの使い方も参考にしてみてください。

 

目次

  • Sympyでできること
  • 変数の定義の仕方
  • exp・log・sin・cos等の使い方
  • 方程式・連立方程式の解き方
  • まとめ

 

Sympyでできること

Sympyは様々な数学記号をそのまま記号として用いることができます。主にできることとしては次の3つが挙げられます。

  • 数値ではなく記号入りの解が得られる
  • 三角関数や指数関数を扱える
  • 方程式などが解ける

中でも1番目が最も大きな利点だと思います。例えば何かの式からルート(根号)などの入ったような近似でなく正確に表現される形で解を得たいというときは往々にしてあると思います。そのほかにも微分や積分といった少し煩雑な処理も数行で書けてしまうというのも魅力の1つではないでしょうか。

 

変数の定義の仕方

変数は以下のように定義します。

import sympy as sp
x = sp.Symbol('x')

試しにxを用いて式を作ってみましょう。一度xを定義したのでこれ以降xを変数として書き込むことができます。

expr = x+1
print(expr)
#x + 1

次にこのexprの式中のxに変数を代入してみましょう。subs(変数,代入値)を用いて変数を代入します。

print(expr.subs(x, 1))
#2

出力が2となっていることからxに1が代入されていることが分かると思います。次に式の展開と因数分解をやってみたいと思います。それぞれexpand(式)とfactor(式)を用います。

expr = (x+1)**2
#展開
expr_ex = sp.expand(expr)
print(expr_ex)
#因数分解
expr_factor = sp.factor(expr_ex)
print(expr_factor)

それぞれ以下のような結果が出力されたかと思います。

$$x^2+2x+1$$$$(x+1)^2$$

他にも微分・積分はそれぞれdiff(式,対象の変数)、integrate(式,対象の変数)を使ってできます。

sp.diff(expr,x)
sp.integrate(expr,x)

結果は$$2x+2$$$$\frac{x^3}{3}+x^2+x$$になります。

 

exp・log・sin・cos等の使い方

次に数学でよく見る指数・対数や三角関数の使い方について簡単にご紹介します。使い方はとても直観的で例えばsinであればsin(変数)とすることで用いれます。

#三角関数
print(sp.cos(x),sp.sin(x),sp.tan(x))
#指数関数
print(sp.exp(x))
#対数関数
print(sp.log(x))
 #cos(x) sin(x) tan(x) #exp(x) #log(x)

他にも虚数や円周率なども次のように用いれます。

print(sp.I,sp.pi,sp.E)
#I pi E

また、このpiを用いて度をラジアンに、ラジアンを度に変換することもできます。

Rational(60, 180)*pi
float((pi/3) * 180/pi)

結果はそれぞれ\(\frac{\pi}{3}\)、\(60.0\)になります。

方程式・連立方程式の解き方

方程式はsolve(式)を用いて解くことができます。特に3次方程式をsolveを用いて解く方法を【Python】3次方程式をSympy・カルダノの公式・DKA法で解いてみた!にまとめているので参考にしてみてください。なお答えはリストとして返ってきます。

expr = (x+1)**2
print(sp.solve(expr))
#[-1]

また、右辺を特定の値にして特定の変数について解きたい場合は以下のようにします。

print(sp.solve(Eq((x+1)**2, 0), x))
#[-1]

連立方程式を解く場合は以下のようにsolveの引数に2つの式を代入します。

x = sp.Symbol('x')
y = sp.Symbol('y')
expr1 = x * 2 + y - 1
expr2 = x + y * 3 + 2
print(sp.solve((expr1, expr2)))
#{x: 1, y: -1}

また\(y=x^2+3x-2\)のような式を解いた場合ルート記号の入った答えが返されますが、実際に数値解を得たいというときは.evalf()を使うと良いでしょう。

y = x**2 + 3*x -2
ans = sp.solve(y)
for i in ans:
    print(i.evalf())
#0.561552812808830
#-3.56155281280883

まとめ

今回はSympyの基本的な使い方についてご紹介しました。他にも色んな数学処理ができるので気になった方はぜひ使ってみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA