ML/DL/DS日記

主にデータサイエンス/統計、機械学習、深層学習、Python、数学、ビッグデータに関する知見。

『Pythonからはじめる数学入門』4章 SymPyで代数と式を計算する

f:id:kaeken:20171203090308p:plainPythonからはじめる数学入門』

4章 SymPyで代数と式を計算する

の解説です。

いままでは、数値計算でしたが、

xやyといった代数においては、

式の計算(symbolic math)が必要です。

Pythonでは、SymPyを使って式の計算をおこないます。

以下は、SymPyのリファレンスです。

SymPy

また、ブラウザ上で、SymPyの動作を確認できます。

SymPy Live

表示された数式を右クリックすると、Tex記法などに変換できます。

f:id:kaeken:20171203090224p:plain f:id:kaeken:20171203090308p:plain

4.1 式の記号と記号演算を定義する

SymPyでは、以下のとおり、記号を使って数式を表現します。

from sympy import Symbol
x = Symbol('x') #文字列xを用いてSymbolクラスのオブジェクトを作成
print(x + x + 1)

from sympy import symbols
x,y,z = symbols('x,y,z')
print((x+2)*(y+3)*(z+4))

結果

2*x + 1
(x + 2)*(y + 3)*(z + 4)

4.2 式を扱う

4.2.1 式の因数分解と展開

因数分解はfactor()を使い、展開はexpand()を使います。

from sympy import symbols
x,y = symbols('x,y')

from sympy import factor, expand
expr = x**2 - y**2

factors = factor(expr)
print('factors:{0}'.format(factors))

expand_result = expand(factors)
print('expand:{0}'.format(expand_result))

結果

factors:(x - y)*(x + y)
expand:x**2 - y**2

4.2.2 プリティプリント

式をみやすく出力したい場合は、pprint()を使います。

expr = x*x + 2*x*y + y*y
print('expr:{0}'.format(expr))

from sympy import pprint
pprint(expr, use_unicode=True)

結果

expr:x**2 + 2*x*y + y**2
 2            2
x  + 2⋅x⋅y + y 

4.2.3 値に代入する

式に値を代入するには、subs()を使います。

from sympy import symbols
x,y = symbols('x,y')
expr = x*x + x*y + x*y + y*y
res = expr.subs({x:1, y:2})
print(res)

結果

9

項の中の記号を別の式で表すこともできます。

from sympy import symbols
x,y = symbols('x,y')
expr = x*x + x*y + x*y + y*y
res = expr.subs({x:y-1})
print(res)

結果

y**2 + 2*y*(y - 1) + (y - 1)**2

4.2.4 文字列を数式に変換する

input()で入力された文字列を数式に変換する方法です。

from sympy import sympify
expr = input('input: ')
input: (入力した式)y**2 + 2*y*(y - 1) + (y - 1)**2
expr =sympify(expr)
print(2*expr)

結果

2*x**3 + 2*x**2 + 10*x

4.3 方程式を解く

4.3.1 2次方程式を解く

4.3.2 1変数を他の変数について解く

4.3.3 連立方程式を解く

4.4 SymPyを使ってプロットする

4.4.1 ユーザが入力した式をプロットする

4.4.2 複数の関数をプロットする