数学

計算で扱うライブラリのインポート文

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)