Python

Sympyの使い方

By 2022年4月10日No Comments

この記事ではSympyとは何か、Sympyを使ってどのような計算ができるかを解説していきます。

プログラミング初心者対象!Python入門セミナー

プログラミング初心者がPythonの初歩部分を突破するためのセミナーです。

Sympyとは

SympyはPythonライブラリの一つであり、因数分解や連立方程式、微分積分を計算したりすることができます。中でも特徴として、記号計算を行うことができます。記号計算とはどういうことなのか例を見てみましょう。

まずはsympyを使えるように環境を整えます。今回はcondaでインストールしました。

conda install sympy

sympyをimportすることから始めます。今回は比較のためnumpyもインストールします。Sympyとnumpyでは出力結果が異なります。

import sympy
import numpy as np

print(sympy.sqrt(2)**2)
# 2
# sympyでは2の2乗として2を出力しています。

print(np.sqrt(2)**2)
# 2.0000000000000004
# numpyでは2の近似値1.4142135623730951が2乗されています。

また、平方根同士の足し算や掛け算もできます。

print((sympy.sqrt(2)+sympy.sqrt(3))**2)
# (sqrt(2) + sqrt(3))**2     # 記号のまま計算

print(np.sqrt(2) + np.sqrt(3)**2)
# 4.414213562373095    # 近似値を計算

# sympyライブラリ内のsimplify()関数を使って数式を単純化することができます。
print(symplify((sympy.sqrt(2)+sympy.sqrt(3))**2))
# 2*sqrt(6) + 5

xを記号として定義するとx2+y3+1のような式をxの多項式として扱うことができます。記号の定義の仕方は以下のとおりです。

x = sympy.Symbol('x')
sympy.var('x')

y = sympy.Symbol('y')

変数を使って自由に数式を定義できます。

form = x**2 + y**3 + 1
print(form)
# x**2 + y**3 + 1

定義した式の変数に値を代入するときはsubs()メソッドを使います。第一引数に変数、第二引数に代入する値を指定します。

print(form.subs(x, 2))
# y**3 + 5

print(form.subs(x, y))
# y**3 + y**2 + 1

複数の変数に値を代入するときは、タプルのリストを引数に指定します。

print(form.subs([(x, 2), (y, 3)]))
# 32

数式同士で演算をすることもできます。

sympy.var('a b c') # このように複数の文字を記号として定義できます

form1 = a + b + c
form2 = 2 * a + 3 * b + 5 * c

print(form1 + form2)
# 3*a + 4*b + 6*c

sympy.Rational()の引数に分子と分母を渡すことで分数が定義でき、分数の計算もできます。

a = sympy.Rational(2, 7)
print(a)
# 2/7

b = sympy.Rational(4, 5)
print(b)
# 4/5

print(a + b)
# 38/35

式を展開するにはsympyライブラリのexpand()メソッドを使います。

form3 = (x + 2)**2
print(form3)
# (x + 2)**2

print(sympy.expand(form3))
# x**2 + 4*x + 4

sympy.var('a b c')

form4 = (a + 2)**2 * (b**2 + 5)* (c + 1)

print(sympy.expand(form4))
# a**2*b**2*c + a**2*b**2 + 5*a**2*c + 5*a**2 + 4*a*b**2*c + 4*a*b**2 + 20*a*c + 20*a + 4*b**2*c + 4*b**2 + 20*c + 20

因数分解するには、sympyライブラリのfactor()メソッドを使います。いくつかの例を示します。

print(sympy.factor(x**2 + 4*x + 4))
# (x + 2)**2

print(sympy.factor( a**2*b**2*c + a**2*b**2 + 5*a**2*c + 5*a**2 + 4*a*b**2*c + 4*a*b**2 + 20*a*c + 20*a + 4*b**2*c + 4*b**2 + 20*c + 20))
# (a + 2)**2*(b**2 + 5)*(c + 1)

複雑な多項式も因数分解できました。

方程式を解くには、sympyライブラリのsolve()メソッドを使います。solve()で()内の文字式=0とした場合の解が取得できます。

print(sympy.solve(x**2 + 4 * x + 4)) # 二次方程式(重解)
# [-2]

print(sympy.solve(x**3 - x**2 - x +1)) # 三次方程式(重解)
# [-1, 1]

連立方程式を解くときもsympy.solve()を使います。引数に式をリスト形式で指定します。

form5 = 2 * x + 3 * y -20
form6 = x - y

print(sympy.solve([form5, form6])) # 連立方程式を解く
# {x: 4, y: 4}

sympy.diff()メソッドを使って微分をすることもできます。積分をするにはsympy.integrate()メソッドを使います。

print(sympy.diff(x**4 + x**3 + x**2 + x +1)) # 微分
# 4*x**3 + 3*x**2 + 2*x + 1

print(sympy.integrate(4*x**3 + 3*x**2 + 2*x + 1)) # 積分
# x**4 + x**3 + x**2 + x

sympyには関数の定義もされています。三角関数はsympy.sin()、sympy.cos()、指数関数はsympy.exp()、対数関数はsympy.log()で定義され、微分や積分をすることもできます。

print(sympy.diff(sympy.sin(x))) # sin(x)を微分
# cos(x)

print(sympy.diff(sympy.cos(x))) # cos(x)を微分
# -sin()

print(sympy.diff(sympy.exp(x))) # exp(x)を微分
# exp()

print(sympy.diff(sympy.log(x))) # log(x)を微分
# 1/x

print(sympy.integrate(sympy.sin(x))) # sin(x)を積分
# -cos(x)

print(sympy.integrate(sympy.log(x))) # log(x)を積分
# x*log(x) -x

まとめ

今回はSympyの使い方について解説しました。Sympyを使って代数方程式の解や式展開を行うことができます。数学を行う際に便利なライブラリなのでぜひ使えるようになりましょう。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL