안녕하세요. "알고 쓰자" 시리즈의 새로운 파이썬 라이브러리를 소개해드리겠습니다. 바로 Sympy입니다!! Symbolic Python의 준말이죠. 기호(symbolic) 기반 수학 라이브러리라고 보시면 될 거 같습니다. 수학 라이브러리인것을 알겠는데 "기호"라는 단어가 조금 생소할 수 있을 거 같습니다.
일단, 저희가 일상생활에서 $y = x^{2}$라는 함수를 미분한다고 가정하겠습니다. 그러면 저희는 $y^{'} = 2x$라는 답을 바로 낼 수 있죠. 이게 가능한 이유가 저희는 기본적으로 $x$라는 기호를 $-\infty ~ +\infty$까지의 변수로 보고 사용하기 때문입니다. 하지만, 문제는 파이썬에서 라이브러리 없이 미분을 한다고 가정해보겠습니다. 그러면, 애초에 컴퓨터이기 때문에 무한의 영역으로의 확장을 불가능합니다. 과정은 영역을 지정한 뒤 그 영역에 대한 함수의 미분을 구해야합니다. 그런데 여기서 매우 큰 장벽에 부딪힙니다. 바로 극한이죠. (극한의 정의는 제가 정리하는 미적분학 파트를 참고하시면 됩니다.) 극한을 컴퓨터에서 취한다... 애초에 잘 안됩니다. 따라서, 내부적으로 유한 차분(finite differential)을 구합니다. 그게 내부적으로 함수의 미분을 구하는 방법입니다. 넘파이를 이용하여 코드를 짜보면 아래와 같겠네요.
a = np.arange(-10, 10)
b = a**2
b_fd = np.diff(b, 1)
plt.plot(a, b, label="$y=x^2$")
plt.plot(a[1:], b_fd, label="$y=2x$")
plt.legend()
plt.savefig("finite_diff.png", dpi=300)
일단 확실히 내부적으로 어떤 식으로 동작해야되는 지 이해는 갑니다! 하지만 너무 귀찮지 않나요? 마치 저희가 미분하는 것처럼 $x^{2}$이라는 함수를 미분하면 $2x$라는 답을 내주는 방법이 없을까요? 그게 바로 Sympy입니다! 이번에는 Sympy를 이용해서 미분을 해보도록 하겠습니다.
from sympy import diff
from sympy.abc import x, y
from sympy.plotting import plot
y = x**2
print(diff(y, x)) # 2*x
p1 = plot(y)
p2 = plot(diff(y, x))
p1.append(p2[0])
p1.show()
p1.save("sympy_diff_example.png")
보시면 diff(y, x)라는 함수가 미분하는 것을 볼 수 있습니다. 바로 이전 코드의 넘파이를 이용했을때와는 다르게 영역도 제가 굳이 지정하지 않고 저희가 하는 것처럼 기호로 인식하고 미분하기 때문에 그 출력 결과가 $2*x$나오는 것도 볼 수 있습니다. 그래프역역시 저희가 예상하는 대로 잘 나오고 있습니다.
이와 같이 미분뿐만 아니라 적분을 포함한 미적분학, 대수방정식, 미분방정식, 대수학, 선형대수, 미분기하학 등 다양한 분야에서 활용될 수 있는 파이썬 라이브러리라고 보시면 될 거 같습니다. 다음 포스팅부터는 본격적으로 활용하는 방법에 대해서 알아보도록 하겠습니다.
'Programming > Python' 카테고리의 다른 글
Sympy 알고 쓰자 - Common Simplification (0) | 2020.12.10 |
---|---|
Sympy 알고 쓰자 - 기본 연산 (0) | 2020.11.29 |
넘파이 알고 쓰자 - Linear Algebra Library 3 : 행렬의 고윳값과 고유벡터 (0) | 2020.11.22 |
넘파이 알고 쓰자 - Linear Algebra Library 2 : 아인슈타인 표기법 (0) | 2020.11.20 |
넘파이 알고 쓰자 - Linear Algebra Library 1 : Matrix&Vector Product (0) | 2020.11.16 |