Sympyによる代数計算

代数計算や微分積分、微分方程式まで代数的に解いてくれます。

http://docs.sympy.org/latest/index.html

代数計算は、代数として使う記号を定義して計算させるだけなので直感的に利用 できるかと思います。

計算例

sympy.symbols()で代数計算する定数変数を定義します。微分方程式を解くと きは、sympy.Function()で関数を定義し、sympy.Eq()で微分方程式の左辺と右 辺を定義します。微分方程式を定義したらsympy.dsolve()で解いてもらいます。

数式は、sympy.latex()に渡せばlatex形式で出力することもできます。

arithmetic.py
import sympy as sy

x, y = sy.symbols("x, y")

def output(ans, latex=True):
    if latex is True:
        print(sy.latex(ans))
    else:
        print(ans)

# 因数分解
output(sy.factor(x**2 - 2*x - 15))

# 微分
output(sy.diff(x**2 - 2*x - 15))

# 積分
output(sy.integrate(x**2 - 2*x - 15))

# 定積分
output(sy.integrate(x**2 - 2*x - 15, (x, 0, 10)))

# 行列計算
# 2x2の行列を定義
a, b, c, d = sy.symbols("a, b, c, d")
A = sy.Matrix([[a, b], [c, d]])
B = sy.Matrix([[1, 2], [3, -1]])

# 行列式
output(sy.det(A))

# 行列積
output(A*B)

# 逆行列
output(A.inv())

# 微分方程式
# 2次の化学反応
c = sy.Function('c')
k, t, D = sy.symbols('k, t, D', positive=True)
eq = sy.Eq(c(t).diff(t), -k*c(t))
ans = sy.dsolve(eq, c(t))
output(ans)

# 2次の化学反応
eq = sy.Eq(c(t).diff(t), -k*c(t)**2)
ans = sy.dsolve(eq, c(t))
output(ans)

# ポテンシャル場のない1次元シュレディンガー方程式
L, E = sy.symbols('psi, E')
psi = sy.Function('x')
eq = sy.Eq(psi(x).diff(x, x), -E*psi(x))
ans = sy.dsolve(eq, psi(x))
output(ans)

出力結果は、次のような式になります。

因数分解

\[\left(x - 5\right) \left(x + 3\right)\]

微分

\[2 x - 2\]

積分

\[\frac{x^{3}}{3} - x^{2} - 15 x\]

定積分

\[\frac{250}{3}\]

行列式

\[a d - b c\]

行列積

\[\begin{split}\left[\begin{matrix}a + 3 b & 2 a - b\\c + 3 d & 2 c - d\end{matrix}\right]\end{split}\]

逆行列

\[\begin{split}\left[\begin{matrix}\frac{d}{a d - b c} & - \frac{b}{a d - b c}\\- \frac{c}{a d - b c} & \frac{a}{a d - b c}\end{matrix}\right]\end{split}\]

1次の化学反応の微分方程式の解

\[c{\left (t \right )} = C_{1} e^{- k t}\]

2次の化学反応の微分方程式の解

\[c{\left (t \right )} = \frac{1}{C_{1} + k t}\]

ポテンシャル場のない1次元シュレディンガー方程式の解

\begin{equation*} x{\left (x \right )} = C_{1} e^{- x \sqrt{- E}} + C_{2} e^{x \sqrt{- E}} \end{equation*}