SymPy로 대수 연산 해보기
SymPy란?
대수 연산의 라이브러리입니다.
Symbolic적인 연산(문자를 수치로서가 아니라 그대로 계산하는 연산)을 가능하게 합니다.
SymPy로 할 수있는 일
이전 준비
ModuleNotFoundError
가 나오면 pip install sympy
하십시오.import sympy as sy
# Jupyter Notebook上で、レンダリングされた結果を表示する
sy.init_printing()
출력 결과의 예:
$$x^{3}+3 x^{2} y + 3 x y^{2} + y^{3}$$
sy.init_printing
설정에 따라 다양한 형식으로 연산 결과를 표시 할 수 있습니다.참고 자료
렌더링하지 않고 latex 코드를 출력하는 경우
# 第一引数: レンダリングしない
# str_printer: 出力結果をsy.latexでラップして、latex出力に変換する
sy.init_printing(False, str_printer=lambda x: sy.latex(x))
출력 결과의 예: x^{3} + 3 x^{2} y + 3 x y^{2} + y^{3}
이렇게 설정하면 Jupyter Notebook의 출력이 모두 latex 코드로 변환됩니다.
논문이나 리포트 등에 붙여넣는 경우, 처음에는 렌더링 결과를 보면서 코드를 수정하고, 마지막은 latex 출력하는 것이 편리할 것 같네요.
덧붙여서
sy.latex
함수는 수식을 latex 출력하는 함수입니다.렌더링을 원하지 않는 경우
sy.init_printing(False)
출력 결과의 예: x*3 + 3*x2*y + 3*x*y2 + y*3
이것은 Python 문법으로 출력하고 싶을 때 사용합니다. 이것을 이대로 복사하면 SymPy에서 사용할 수 있습니다.
기본 사용법
기호 정의
# シンボルを定義
a = sy.Symbol("a")
a
$$a$$
# 複数のシンボルを同時に定義
x, y = sy.symbols("x y")
# LaTexの記法を使える(raw文字列にしないとエスケープ文字と認識する)
theta, gamma = sy.symbols(r"\theta \gamma")
theta, gamma
$$\left(\theta,\\gamma\right)$$
# 正の実数として定義
r = sy.Symbol("r", positive=True)
# 実数として定義
q = sy.Symbol("q", real=True)
문자 정보를 주지 않으면 매우 일반적인 복소수로 계산할 수 있으므로 가능한 한 정보를 제공하도록합시다.
기본 연산
a**2 + x - theta
$$-\theta + a^{2} + x$$
a**2 / a
$$a$$
(x + y)**3
$$\left(x + y\right)^{3}$$
표현식 확장 등
f = (x + y)**3
f.expand()
$$x^{3}+3 x^{2} y + 3 x y^{2} + y^{3}$$
# x^2の係数
f.expand().coeff(x, n=2)
$$3 y$$
미분과 극한
f = sy.sin(x)/x
f.limit(x, 0)
$$1$$
# xで偏微分
f = 3 * x**2 * y + x * y**2
f.diff(x)
$$6 x y + y^{2}$$
대입(심볼도 대입할 수 있다)
# y に a**2 を代入
f.subs([(y, a**2)])
$$a^{4}x+3 a^{2}x^{2}$$
NumPy를 ufunc로 변환
심볼릭 표현을 NumPy의 ufunc로 변환할 수 있습니다.
이것은 상당히 편리합니다.
심볼릭 계산을 한 후 수치 계산을 간단하게 할 수 있습니다.
x, a, b, c = sy.symbols("x a b c")
f = a * x**2 + b * x + c
f
$$a x^{2} + b x + c$$
# 4引数を持つ関数を定義
args = (x, a, b, c)
func = sy.lambdify(args, f, "numpy")
func
는 4 변수 함수입니다.
다만, $a$, $b$, $c$ 를 고정하면 2차 함수가 되는군요.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 実際に数値を代入(ufuncとして振る舞い、ベクトル演算が可能)
xx = np.linspace(0, 1)
plt.plot(xx, func(xx, 1, -0.5, 0))
plt.show()
방정식을 풀다
eq = sy.Eq(2*x + 5*y, -1)
$$2 x + 5 y = -1$$
sy.solve(eq, x)
$$-\frac{5 y}{2} -\frac{1}{2}$$
요약
Jupyter Notebook에서의 출력 방법과 기본적인 사용법을 소개했습니다.
SymPy를 사용하면 대수 연산을 기계 파워를 사용하여 건간 계산할 수 있습니다.
지금까지 케어리스 미스에 겁을 먹으면서 계산하고 있던 복잡한 계산도, SymPy로 검산할 수 있게 되거나 인간에서는 도저히 할 수 없는 계산도 할 수 있기 때문에, 여러가지 가능성이 퍼지네요.
행렬 연산 등은 그 밖에도 기사를 쓰고 싶습니다.
참고 자료
# シンボルを定義
a = sy.Symbol("a")
a
# 複数のシンボルを同時に定義
x, y = sy.symbols("x y")
# LaTexの記法を使える(raw文字列にしないとエスケープ文字と認識する)
theta, gamma = sy.symbols(r"\theta \gamma")
theta, gamma
# 正の実数として定義
r = sy.Symbol("r", positive=True)
# 実数として定義
q = sy.Symbol("q", real=True)
a**2 + x - theta
a**2 / a
(x + y)**3
f = (x + y)**3
f.expand()
# x^2の係数
f.expand().coeff(x, n=2)
f = sy.sin(x)/x
f.limit(x, 0)
# xで偏微分
f = 3 * x**2 * y + x * y**2
f.diff(x)
# y に a**2 を代入
f.subs([(y, a**2)])
x, a, b, c = sy.symbols("x a b c")
f = a * x**2 + b * x + c
f
# 4引数を持つ関数を定義
args = (x, a, b, c)
func = sy.lambdify(args, f, "numpy")
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 実際に数値を代入(ufuncとして振る舞い、ベクトル演算が可能)
xx = np.linspace(0, 1)
plt.plot(xx, func(xx, 1, -0.5, 0))
plt.show()
eq = sy.Eq(2*x + 5*y, -1)
sy.solve(eq, x)
Jupyter Notebook에서의 출력 방법과 기본적인 사용법을 소개했습니다.
SymPy를 사용하면 대수 연산을 기계 파워를 사용하여 건간 계산할 수 있습니다.
지금까지 케어리스 미스에 겁을 먹으면서 계산하고 있던 복잡한 계산도, SymPy로 검산할 수 있게 되거나 인간에서는 도저히 할 수 없는 계산도 할 수 있기 때문에, 여러가지 가능성이 퍼지네요.
행렬 연산 등은 그 밖에도 기사를 쓰고 싶습니다.
참고 자료
Sympy+Jupyter로 최강의 계산기 환경 만들기
Reference
이 문제에 관하여(SymPy로 대수 연산 해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zawawahoge/items/1be137a8147902a5e6cb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)