note.nkmk.me

Python, SymPyの使い方(因数分解、方程式、微分積分など)

Date: 2017-05-21 / Modified: 2018-04-02 / tags: Python, SymPy, 算数・数学

SymPyは代数計算(数式処理)を行うPythonのライブラリ。

因数分解したり、方程式(連立方程式)を解いたり、微分積分を計算したりすることができる。

ここでは、SymPyの基本的な使い方として、

  • インストール
  • 変数、式を定義: sympy.symbol()
  • 変数に値を代入: subs()メソッド
  • 式の展開: sympy.expand()
  • 因数分解: sympy.factor()
  • 方程式を解く: sympy.solve()
  • 連立方程式を解く: sympy.solve()
  • 微分: sympy.diff()
  • 積分: sympy.integrate()
  • 三角関数、指数関数、対数関数などを使う

について、サンプルコードとともに説明する。

スポンサーリンク

SymPyのインストール

pipでインストールできる。(環境によってはpip3

$ pip install sympy

Anacondaにも入っている。これからPythonの環境を構築するのであれば、WindowsだとAnacondaをインストールするのが楽かもしれない。以下の公式サイトからAnacondaのインストーラーがダウンロードできる。

変数、式を定義: sympy.symbol()

変数は以下のようにsympy.symbol()で定義する。

import sympy

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

print(type(x))
# <class 'sympy.core.symbol.Symbol'>

その変数を使って自由に数式を定義できる。四則演算(+, -, *, /)、べき乗(**)などの演算子はPython標準のものを使う。

expr = x**2 + y + 1

print(expr)
# x**2 + y + 1

変数の名称とsympy.symbol()の引数に渡す文字列は違っていてもいいが、分かりにくくなるだけなので、同じものにしておいたほうが無難。

z = sympy.Symbol('ZZZZ')

expr_z = z**2 + 3 * z

print(expr_z)
# ZZZZ**2 + 3*ZZZZ

変数に値を代入: subs()メソッド

定義した式の変数に値を代入したい場合はsubs()メソッドを使う。

第一引数に対象の変数、第二引数に代入する値を指定する。

数値を代入したり、ほかの変数を代入したりできる。

print(expr)
# x**2 + y + 1

print(expr.subs(x, 1))
# y + 2

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

複数の変数に値を代入する場合は、(変数, 代入する値)のタプルのリストを引数に指定する。

print(expr.subs([(x, 1), (y, 2)]))
# 4

式の展開: sympy.expand()

式を定義しただけだと自動的に展開されたりはしない。

expr = (x + 1)**2

print(expr)
# (x + 1)**2

式を展開したい場合はsympy.expand()を使う。

expr_ex = sympy.expand(expr)

print(expr_ex)
# x**2 + 2*x + 1

因数分解: sympy.factor()

因数分解したい場合はsympy.factor()を使う。

いくつか例を示す。変数が複数あってもよい。

print(expr_ex)
# x**2 + 2*x + 1

expr_factor = sympy.factor(expr_ex)

print(expr_factor)
# (x + 1)**2

print(sympy.factor(x**3 - x**2 - 3 * x + 3))
# (x - 1)*(x**2 - 3)

print(sympy.factor(x * y + x + y + 1))
# (x + 1)*(y + 1)

方程式を解く: sympy.solve()

方程式を解く(方程式の解を取得する)場合はsympy.solve()を使う。

sympy.solve(式)式 = 0とした場合の解が取得できる。

平方根(ルート)はsqrt、虚数単位はIで表される。(sqrtはsquare rootの略)

print(sympy.solve(x**2 - 3 * x + 2))
# [1, 2]

print(sympy.solve(x**2 + x + 1))
# [-1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]

複数の変数を含む式において、任意の変数に対して解を取得することもできる。第二引数に対象の変数を指定する。

expr = x + y**2 - 4

print(sympy.solve(expr, x))
# [-y**2 + 4]

print(sympy.solve(expr, y))
# [-sqrt(-x + 4), sqrt(-x + 4)]

連立方程式を解く: sympy.solve()

連立方程式を解く場合もsympy.solve()を使う。

複数の式を含むリスト(またはタプル)をsympy.solve()の引数に指定すればOK。

expr1 = 3 * x + 5 * y - 29
expr2 = x + y - 7

print(sympy.solve([expr1, expr2]))
# {x: 3, y: 4}

微分: sympy.diff()

式の微分をするにはsympy.diff()を使う。

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

複数の変数を含む式において、任意の変数に対して微分することもできる。第二引数に対象の変数を指定する。

expr = x**3 + y**2 - y

print(sympy.diff(expr, x))
# 3*x**2

print(sympy.diff(expr, y))
# 2*y - 1

積分: sympy.integrate()

式の積分をするにはsympy.integrate()を使う。

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

三角関数、指数関数、対数関数などを使う

三角関数、指数関数、対数関数などはsympy.sin(), sympy.exp(), sympy.log()のように定義されている。

微分や積分も可能。

print(sympy.diff(sympy.cos(x)))
# -sin(x)

print(sympy.diff(sympy.exp(x)))
# exp(x)

print(sympy.diff(sympy.log(x)))
# 1/x

print(sympy.integrate(sympy.cos(x)))
# sin(x)

print(sympy.integrate(sympy.exp(x)))
# exp(x)

print(sympy.integrate(sympy.log(x)))
# x*log(x) - x

いちいちsympy.をつけるのが面倒な場合は、以下のように各関数をimportしておけばよい。

import sympy
from sympy import sin, exp

x = sympy.Symbol('x')

print(sympy.diff(sin(x)))
# cos(x)

print(sympy.diff(exp(x)))
# exp(x)

from sympy import *とすればすべての関数がsympy.なしで使えるが、import *は何がimportされるか分からないので、Pythonのコーディング規約PEP8では推奨されていない。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事