sympy의 기본적인 사용법

sympy를 사용해봅시다.

  • 고등학교 때 많이 풀었던 최소값/최대값 문제가 생각나시는지 모르겠네요. 그때는 수학 정말 잘했는데 지금은 거의 수포자간지라….아무튼. 그때 극한값을 구하려면 미분을 했었어야 했습니다. 파이썬에서도 방정식을 세우고, 미분/적분 등을 계산할 수 있을까요?

basic.

  • 사실 다음의 아주 간단한 것들만 정리했습니다. 더 할 수 있기는 한데, 일단 이정도만 알고 나중에 필요하다고 판단될 때, 더 정리하는 게 좋을 것 같아요.
    • 방정식 해 구하기
    • 미분/적분
import sympy
import numpy as np 
import matplotlib.pyplot as plt

# Juypter 노트북에서 수학식의 LaTeX 표현을 위해 필요함, 하지만 markdown에서 변환하는 것이 귀찮아서 나는 무시. 
# sympy.init_printing(use_latex='mathjax')

# basic
x, y, z, dx = sympy.symbols("x y z dx")
f = sympy.exp(x) + x*y
print(f)
# function에 2개 이상의 symbol이 있기 때문에, 편미분만 가능합니다. 
print("differentiation: {}, integration of diff: {}".format(
    sympy.diff(f, x), sympy.integrate(sympy.diff(f, x), x)
))

f = (x-2)*x*(x+2)
f_diff = sympy.diff(f, x)
f_diff_diff = sympy.diff(f_diff, x)
print('solution set')
print("-------")
print("solution set: {}".format(sympy.solve(f))) #단 필요에 따라, datatype을 바꾸어주는 것이 필요함 
print("solution set: {}".format(sympy.solve(f_diff)))
print("-------")
"""
- 방정식에 값을 넣어서 계산해줄 때는 subs와 evalf를 사용 
    - subs: 특정 symbol에 값을 넣어줌. 물론 값뿐만 아니라 다른 변수의 조합으로 넣어도 상관없음 
    - evalf: 그 값을 float 결과로 변환
"""
print()
print("diff value by limit")
print("-------")
for a in sympy.solve(f_diff):
    print("a: {}".format(a))
    print(f_diff.subs(x, a).evalf())
    # x를 x+dx로 바꿔주고, dx가 0으로 갈때의 diff 값을 limit를 사용해서 계산하려 한다. 
    diff_by_limit = sympy.limit((f.subs(x, x+dx) - f.subs(x, x))/ (x+dx - x), dx, 0.000001)
    print(diff_by_limit.subs(x, a).evalf())
    print("-------")
    
print("integration")
print(sympy.integrate(f))
print(sympy.integrate(sympy.diff(f)))
x*y + exp(x)
differentiation: y + exp(x), integration of diff: x*y + exp(x)
solution set
-------
solution set: [-2, 0, 2]
solution set: [-2*sqrt(3)/3, 2*sqrt(3)/3]
-------

diff value by limit
-------
a: -2*sqrt(3)/3
0.e-124
-3.46341600341902e-6
-------
a: 2*sqrt(3)/3
0.e-124
3.46335198795942e-6
-------
integration
x**4/4 - 2*x**2
x**3 - 4*x

wrap-up

  • 이전에 이미 numpytensorflow를 사용해본 적이 있는 파이썬 유저의 경우 sympy의 작동방식이 꽤 익숙할 수 있다.
    • 예를 들어. np.sqrt ==> sympy.sqrt, np.exp ==> sympy.sqrt의 방식에서 두 라이브러리는 아마도 많은 부분을 공유한다는 것을 알 수 있고,
    • xsymbol로 표현되고, x+y의 경우는 일종의 computation graph로 표현되고 정리되는 것은 tensorflow와 유사하다.
  • graphviz를 이용해서, computation graph를 dot language로 표현할 수도 있다. 하지만 귀찮아서 그것까지는 하지 않았다고 한다 하하핫.
  • sympy의 결과로 나온 값은 numpy의 datatype과 다릅니다. float 등을 통해서 간단하게라도 변환해주는 것이 필요합니다.
  • 미분방정식을 푸는 것까지 커버되기는 하는데, 제가 그쪽까지는 관심이가 없어서 하하하핫. 나중에 필요할때 하겠습니다. 이 재밌는 공부를 왜 예전에는 그렇게 게을리했을까!! 왜!! 과거의 나 개새끼야!!

reference

댓글남기기