안녕하세요. 지난 포스팅에서 말씀드렸다싶이 심파이는 사람의 입장에서 봤을 때 매우 직관적 문법을 가지고 있기 때문에 실질적으로 사용하기에 더 편한 라이브러리입니다. 오늘은 기초적인 문법과 심파이에서 지원하는 연산에 대해서 알아보도록 하겠습니다.
일단, 다시 한번 말씀드리지만 심파이는 기호 기반 수학 라이브러리이기 때문에 저희는 변수를 기호로써 선언해주어야합니다. 이를 위해서는 아래와 같이 변수를 선언해주면 됩니다.
import sympy as sp
x, y, z = sp.symbols("x y z")
그러면 일단 기초연산을 할 준비는 끝났으니 바로 본격적으로 시작해보도록 하겠습니다.
1. 대입(Substitution)
대입은 아주 간단한 개념이죠. $x^{2} + x + 1 = 10$과 같은 식에서 $x = 2y + 1$로 바꾸어 $(2y + 1)^{2} + (2y + 1) + 1 = 10$과 같이 특정 변수를 다른 변수로 바꾸는 과정을 의미합니다. 심파이에서도 이와 같은 연산을 해볼 수 있습니다.
expr = sp.cos(x) + 1
처음에 위와 같이 선언하면 expr 변수 역시 하나의 기호가 되며 이는 $\cos{x} + 1$이라는 하나의 함수를 표현하게 됩니다. 그런데 저희가 다른 변수를 넣어보도록 하겠습니다.
expr.subs(x, y) # cos(y)+1
이렇게 하면 아주 간단하게 $x$ 대신에 $y$를 대입한 것을 볼 수 있습니다. 이는 저희가 그동안봤던 방법과 동일하기 때문에 쉽게 이해가 가실거라고 생각합니다. 물론, 위처럼 그냥 기호만 바꿀수도 있겠지만, 기호 대신 실제 값을 대입해보거나 더 복잡한 수식을 만들어볼 수도 있습니다. 간단한 예제를 보겠습니다. 먼저 실제 값을 대입해보는 경우입니다.
expr.subs(x, 0) # 2
방금 전에 만들었던 $\cos{x} + 1$에서 $x = 0$을 대입한 것입니다. 따라서 $\cos{0} + 1 = 2$가 되는 것이죠.
그 다음으로 볼 것은 더 복잡한 수식을 만드는 경우입니다.
expr = x**y # x ** y
expr1 = expr.subs(y, x**y) # x**(x**y)
expr2 = expr1.subs(y, x**x) # x**(x**(x**x))
먼저, $x^{y}$라는 식을 만들어줍니다. 그러면 첫번째 대입함수에 의해서 $y = x^{y}$가 대입되어 $x^{x^{y}}$로 바뀌고 두번째 대입함수에 의해서 $y = x^{x}$가 대입되어 $x^{x^{x^{x}}}$로 바뀌게 되는 것이죠.
그런데 만약, 다변수 함수같은 경우에 여러 변수에 대한 대입을 어떤 식으로 하면 될까요? 이 역시도 아주 간단합니다. 바로 예시를 보시면 이해가 가실겁니다.
expr = x**3 + 4*x*y - z
expr.subs([(x, 2), (y, 4), (z, 0)]) # 40
여기서 저희는 $x^{3} + 4xy - z$라는 다변수 함수를 선언했습니다. 이때, $x = 2, y = 4, z = 0$을 대입하고 싶을 때는 바로 아랫줄과 같이 리스트 안에 튜플로 어떤 변수에 어떤 값을 대입하고 싶은 지를 넣어주면 됩니다. 아주 간단하죠?
2. 문자열 변환
이번에 알아볼 함수 역시 간단합니다. 만약, 문자열로 수식으 주어졌을 때 저희가 이 수식을 심파이 표현식으로 바꾸고 싶을 때 사용하는 함수라고 보시면 됩니다.
str_expr = "x**2 + 3*x - 1/2"
expr = sp.sympify(str_expr)
이 함수 역시 사용법이 간단하기 때문에 예시만 보고 넘어가도록 하겠습니다.
3. 수치 계산
만약, 저희가 $\sqrt{8}$, $\frac{3}{18}$과 같은 식을 심파이 표현식으로 구현했을 때 궁금한 것은 실제값일 겁니다. 심파이에서는 evalf 함수를 제공하고 있습니다.
expr = sp.sqrt(8)
expr.evalf() # 2.82842712474619
만약, 더 높은 정확도를 원한다면 evalf 함수안에 정수형의 매개변수를 전달해주면 됩니다. 그러면 아래와 같이 지정한만큼의 소숫점에 해당하는 floating number가 나오게 됩니다.
expr.evalf(100) # 2.828427124746190097603377448419396157139343750753896146353359475981464956924214077700775068655283145
'Programming > Python' 카테고리의 다른 글
Sympy 알고 쓰자 - polynomial Simplify (0) | 2020.12.31 |
---|---|
Sympy 알고 쓰자 - Common Simplification (0) | 2020.12.10 |
Sympy 알고 쓰자 - 소개 (0) | 2020.11.27 |
넘파이 알고 쓰자 - Linear Algebra Library 3 : 행렬의 고윳값과 고유벡터 (0) | 2020.11.22 |
넘파이 알고 쓰자 - Linear Algebra Library 2 : 아인슈타인 표기법 (0) | 2020.11.20 |