목차
Sympy는 파이썬에서 사용할 수 있는 심볼릭 계산(심볼릭 연산)을 위한 라이브러리입니다. 심볼릭 계산은 수학적인 기호와 식을 사용하여 수학 연산을 수행하는 것을 의미합니다. Sympy를 사용하면 실제 수학 공식과 식을 파이썬 코드로 표현하고 계산할 수 있습니다. 또한, 이렇게 만든 수학식의 해를 구하는 것도 가능합니다. Sympy의 기능들을 살펴보고 실제 수식을 만든 후 해를 구하는 방법을 알려드리겠습니다.
1. Sympy란?
Sympy는 Python 프로그래밍 언어를 위한 심볼릭 수학 라이브러리입니다. 심볼릭 수학은 수학적인 심볼들을 사용하여 수식을 표현하고, 이러한 심볼들을 다루는 연산을 수행하는 것을 의미합니다. Sympy를 사용하면 Python을 통해 심볼릭 연산을 수행할 수 있으며, 다양한 수학적인 문제를 해결할 수 있습니다. 아래와 같이 sympy를 설치해야 사용할 수 있습니다.
pip install sympy
sympy는 주요 기능을 다음과 같습니다.
심볼릭 연산:
호 연산(symbolic computation)을 지원하여, 수학적인 심볼들을 사용하여 수식을 정의하고 다양한 수학적인 연산을 수행할 수 있습니다. 이를 통해 심볼릭 미적분, 방정식 풀이, 심볼릭 대수, 행렬 연산 등을 수행할 수 있습니다.
수식 단순화 및 조작:
수식을 단순화하거나 전개하는 기능을 제공합니다. 이를 통해 수식을 간소화하거나 다양한 형태로 변형할 수 있습니다.
방정식 풀이:
다항식 방정식 뿐만 아니라 비선형 방정식, 미분 방정식, 차분 방정식 등 다양한 종류의 수학적 방정식을 풀 수 있습니다.
수학적인 함수 및 상수:
다양한 수학적인 함수와 상수를 제공합니다. 원주율(π), 자연상수(e), 삼각 함수, 지수 함수, 로그 함수 등 다양한 수학 함수를 사용할 수 있습니다.
그래프 플로팅:
다양한 형태의 함수와 수식을 그래프로 플로팅하는 기능을 제공합니다. 2차원 그래프 및 3차원 그래프를 생성할 수 있습니다.
2. Sympy를 이용한 수식 만들기
sympy의 sympols() 함수를 이용하여 'x' 변수를 정의하고 이를 이용하여 다항식 2개를 생성합니다. 생성된 다항식의 연산을 한 결과가 어떻게 출력되는지 보여주는 코드를 만들어 보겠습니다.
import sympy as sp
# 심볼릭 변수 정의
x = sp.symbols('x')
# 다항식 정의
polynomial1 = 2*x**3 - 5*x**2 + 3*x - 1
polynomial2 = x**2 - 4*x + 1
# 다항식 덧셈
sum_polynomial = polynomial1 + polynomial2
print("다항식 덧셈:", sum_polynomial)
# 다항식 곱셈
product_polynomial = polynomial1 * polynomial2
print("다항식 곱셈:", product_polynomial)
# 다항식 덧셈: 2*x**3 - 4*x**2 - x
# 다항식 곱셈: (x**2 - 4*x + 1)*(2*x**3 - 5*x**2 + 3*x - 1)
코드상에서 print를 사용하여 출력을 하면 위와 같이 3승이 '**'로 표시됩니다. vscode의 interactive에서 각 변수의 값을 확인하면 아래의 이미지와 같이 간결한 수식으로 저장되어 있음을 알 수 있습니다.
3. 심볼 수식의 방정식 만들기 및 값 구하기
위의 수식은 방정식이라고 하지 않습니다. 방정식은 좌변과 우변이 있는 형태로 구성되며 이를 계산하여 'x'의 값을 구할 수 있게 돼있어야 합니다. 위에서 만든 수식을 방정식으로 변환하는 것도 sympy에서 'Eq()'함수로 가능합니다.
eq1 = sp.Eq(sum_polynomial, 0)
eq2 = sp.Eq(product_polynomial, 0)
print(eq1, '\n', eq2)
# Eq(2*x**3 - 4*x**2 - x, 0)
# Eq((x**2 - 4*x + 1)*(2*x**3 - 5*x**2 + 3*x - 1), 0)
eq1과 eq2는 sympy의 'Equality' 객체이기 때문에 출력을 하게 되면 객체의 모습을 하고 있습니다. 이 또한, vscode의 interactive 창에서 각 변수의 값을 확인하면 제대로 된 수식이 되어 있음을 알 수 있습니다.
4. 방정식의 해 구하기
심볼을 정의하고 심볼을 이용하여 수식을 만든 후 'Eq' 함수를 이용하여 방정식으로까지 변환하였습니다. 지금 만들어 놓은 수식을 손으로 풀려면 엄청나겠지만 파이썬의 'solve' 함수를 이용하면 1초도 안 걸리고 바로 답을 리턴해 줍니다. 다음 코드는 각 방정식의 해를 출력하게 해 줍니다.
result1 = sp.solve(eq1)
result2 = sp.solve(eq2)
print(result1, '\n', result2)
# [0, 1 - sqrt(6)/2, 1 + sqrt(6)/2]
# [2 - sqrt(3), sqrt(3) + 2, 5/6 + (-1/2 - sqrt(3)*I/2)*(sqrt(177)/72 + 11/54)**(1/3) + 7/(36*(-1/2 - sqrt(3)*I/2)*(sqrt(177)/72 + 11/54)**(1/3)), 5/6 + 7/(36*(-1/2 + sqrt(3)*I/2)*(sqrt(177)/72 + 11/54)**(1/3)) + (-1/2 + sqrt(3)*I/2)*(sqrt(177)/72 + 11/54)**(1/3), 7/(36*(sqrt(177)/72 + 11/54)**(1/3)) + (sqrt(177)/72 + 11/54)**(1/3) + 5/6]
result1은 3차 방정식의 해이므로 3개의 값이 있어야 합니다. result2는 5차이며 5개의 해가 있는 것을 확인할 수 있습니다.
5. 마치며
파이썬 라이브러리 중 수식과 방정식을 생성하게 해 주는 sympy에 대한 기본적인 내용을 정리해 보았습니다. 값을 구할 변수를 심볼로 정의한 후 필요한 수식을 구성하고 이를 방정식으로 변환하여 'solve()' 함수로 해를 구하는 과정을 쭉 살펴봤습니다. 이제 어려운 방정식도 금세 풀 수 있게 됐습니다.