2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シンボリック計算

Last updated at Posted at 2023-12-06

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

因数分解したり,方程式(連立方程式)を解いたり,微分積分を計算したりすることができる便利ツール.

SymPyのインストール

ターミナル/コマンドプロンプトを開いて入力.

$ pip install sympy

基本的な使い方

変数と式の定義

symbolic.py
import sympy as sp

# 方程式(シンボリック式)の中での変数は,シンボリック変数と呼ばれ,
## 通常の(コード内に書かれた)変数とは別に扱われる
x = sp.Symbol('x')    # シンボリック変数 x
y = sp.Symbol('y')    # シンボリック変数 y
expr = x**2 + y + 1   # シンボリック式 expr

# # 定数は通常通り変数を使って記述してもよい
# a = 2
# b = 1
# c = 1
# expr = x**a + b*y + c
print(expr)

どちらもx**2 + y + 1を返す.

変数に値を代入&式を計算

symbolic.py
import sympy as sp

# 方程式(シンボリック式)の中での変数は,シンボリック変数と呼ばれ,
## 通常の(コード内に書かれた)変数とは別に扱われる
x = sp.Symbol('x')    # シンボリック変数 x
y = sp.Symbol('y')    # シンボリック変数 y
expr = x**2 + y + 1   # シンボリック式 expr

# # 定数は通常通り変数を使って記述してもよい
# a = 2
# b = 1
# c = 1
# expr = x**a + b*y + c
print(expr)

# シンボリック式の変数(シンボリック変数)に
## 好きな値を代入
print(expr.subs(x,1))   # x=1を代入
print(expr.subs(x,y))   # x=yを代入
# x, y の2変数に値を代入するときは,
## subs()の引数にタプルで入力
p = expr.subs([(x,1),(y,2)])    # x=1, y=2を代入
print(p)

このときの出力は以下

x**2 + y + 1
y + 2
y**2 + y + 1
4

式の展開と因数分解

symbolic.py
import sympy as sp

# 式の展開と因数分解
x = sp.Symbol('x')    # シンボリック変数 x
# 式の展開
before = (x+1)**2
after = sp.expand(before)
print(after)
# 式の因数分解
# before2 = x**2 + 2*x + 1
before2 = after
after2 = sp.factor(before2)
print(after2)

出力は以下

x**2 + 2*x + 1
(x + 1)**2

(連立)方程式を解く

solve()メソッドを用いる.()内の値は,式=0が成り立つようなを入力する.
連立方程式を解く際,引数はリストでもタプルでもどちらでもよい(代入の時の引数は必ずタプル)

symbolic.py
import sympy as sp

# 式の展開と因数分解
x = sp.Symbol('x')    # シンボリック変数 x
y = sp.Symbol('y')    # シンボリック変数 y
expr = x**2 + y + 1   # シンボリック式 expr

# 式の展開
before = (x+1)**2
# 方程式を解く
print(sp.solve(before))     # (x+1)**2=0を解く
print(sp.solve(x**2 + x + 1)) # x**2+x+1=0を解く
print(sp.solve(expr, x))    # xについて解く
print(sp.solve(expr, y))    # yについて解く
# 連立方程式を解く
expr1 = 3 * x + 5 * y - 29
expr2 = x + y - 7
print(sp.solve([expr1, expr2]))     # 関係式をリストorタプルで引数に入力

この時の出力は以下となり,ちゃんと解けている.ただし,√はsqrt(),虚数iIで表示される.

[-1]
[-1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]
[-sqrt(-y - 1), sqrt(-y - 1)]
[-x**2 - 1]
{x: 3, y: 4}
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?