
計算で扱うライブラリのインポート文
import numpy as np import sympy as sym import math
SymPy
数学の変数や因数分解、微分などができるライブラリ。
import sympy as sym
割り算の値を分数で返す | Rational()
sym.Rational() で割った場合は分数で返ってくる。
import sympy as sym print( 8 / 5 ) # 1.6 print(sym.Rational(8,5)) # 8/5
変数(シンボル)の定義
import sympy as sym # シンボル(変数)の定義 y = sym.symbols('y') # 複数同時に定義 x, a, b = sym.symbols('x, a, b') # 式の定義 f = 3*(x+2)**2 + 5 print(f) # 3*(x + 2)**2 + 5
定義したシンボルの型 : sympy.core.symbol.Symbol
単数の Symbol だけ頭文字が大文字。
Symbol() | 1つのみの変数を作る。返り値を受け取る変数が必要。 |
symbols() | 複数の変数を作る。 返り値を受け取る変数が必要。 単体の変数作成にも使えるので、こっち覚えとけばよさそう。 |
var() | 返り値を受け取る変数が必要ない。関数内で使うときバッティングに注意。 トップレベルだと var を使ったほうが楽。 |
値の代入 | .subs ( シンボル名, 値 )
.subs ( シンボル名, 値 ) で値を代入できる。
import sympy as sym # シンボル(変数)の定義 y = sym.symbols('y') # 複数同時に定義 x, a, b = sym.symbols('x, a, b') # 式の定義 f = 3*(x+2)**2 + 5 # 値の代入 f.subs(x, 1)
複数同時に代入する
.subs( [ ( シンボル名, 値 ) , ( シンボル名, 値 ) ] )
で複数同時に代入できる。
import sympy as sym x, y = sym.symbols("x, y") f = 3 * ( x+2 ) ** 2 + 5 * y # 複数同時に入れて計算する print(f.subs([(x, 1), (y, 2)]))
シンボルを文字列へ変換 | .name
import sympy as sym x = sym.symbols("x") print(type(x)) #-> <class 'sympy.core.symbol.Symbol'> print(x.name) #-> x print(type(x.name)) #-> <class 'str'>
その他の型の文字列変換
core 型はそのまま str()
で文字列変換できる。
core.numbers.Integer
import sympy as sym x = sym.symbols("x") f = 5*x + 6 coeff = f.coeff(x,0) print(coeff) #-> 6 print(type(coeff)) #-> <class 'sympy.core.numbers.Integer'> print(type(str(coeff))) #-> <class 'str'>
core.mul.Mul
import sympy as sym x, y = sym.symbols("x, y") f = 5*x + 6*y coeff = f.coeff(x,0) print(coeff) #-> 6*y print(type(coeff)) #-> <class 'sympy.core.mul.Mul'> print(str(coeff)) #-> 6*y print(type(str(coeff))) #-> <class 'str'>
core.add.Add
import sympy as sym x, y = sym.symbols("x, y") f = 5*x + 6*y + 5 coeff = f.coeff(x,0) print(coeff) #-> 6*y + 5 print(type(coeff)) #-> <class 'sympy.core.add.Add'> print(str(coeff)) #-> 6*y + 5 print(type(str(coeff))) #-> <class 'str'>
数式の簡略化 | simplify()
import sympy as sym a, b, c, d, x, y = sym.symbols("a, b, c, d, x, y") f = a**5 + 2*b*d + 4*x*a*b + 3*d*a*d / d**2 simple = sym.simplify(f) print(simple) # a**5 + 4*a*b*x + 3*a + 2*b*d
係数の取得 | coeff()
import sympy as sym a = sym.symbols("a") f = 4 * (a **5) print(f.coeff(a, 5)) # 4 | a^5 の係数を取得
次数の取得 | degree
import sympy as sym a = sym.symbols("a") f = 4 * (a **5) print(sym.degree(f, a)) # 5
方程式 | .solve ( 式, 求めたい値)
\(ax+b=0\) の \(x\) についての方程式
import sympy as sym x, a, b = sym.symbols('x, a, b') f = a * x + b # sym.solve( 式, 求めたい変数 ) val = sym.solve (f, x) print(val) # [-b/a]
解の公式
$$\LARGE
x = \frac{-b + \sqrt{b^2}-4ac}{2a}\\
\\
\LARGE x = \frac{-b - \sqrt{b^2}-4ac}{2a}
$$
# これで上記の解の公式が python コードででてくる x, a, b, c = sym.symbols('x, a, b, c') val = sym.solve (a*x**2 +b*x + c, x) print(val)
展開 / 因数分解
展開 | .expand ( 式 )
import sympy as sym x = sym.symbols('x') f = 3 * ( x+2 ) ** 2 + 5 # 式の展開 print(sym.expand(f)) # 3*x**2 + 12*x + 17
因数分解 | .factor ( 式 )
import sympy as sym x, b = sym.symbols('x, b') f = x * b + x + b + 1 # 式の展開 print(sym.factor(f)) # (b + 1)*(x + 1)
平方根 | .root ( 値や式 )
$$\LARGE \sqrt{x}$$
# SymPy func = sym.root(x, 2)
その他の書き方
$$\LARGE \sqrt{\sqrt{x}} \,=\, x^\frac{1}{4}\,= \,x^{0.25}$$
print(sym.root(sym.root(x, 2), 2)) # -> x**(1/4)
絶対値 | .abs ( 値や式 )
$$\LARGE |x|$$
# 組み込み関数 abs = abs(x) # math abs = math.fabs(x) # numpy abs = numpy.abs(x)
微分
微分はグラフの拡大。
導関数 | .diff ( 式 )
$$\LARGE f' = \lim_{h \to 0} \frac{f (x + h) - f(x)}{h}$$
fomula = 4*x**2 # 微分 fomula _diff = sym.diff(fomula)