코딩 연습

(파이썬) 방정식 풀기 본문

Python

(파이썬) 방정식 풀기

코딩아저씨 2016. 3. 15. 16:24
반응형

파이썬을 이용하여 방정식을 푸는 방법에 대해 알아 보자.

방정식을 풀기 위해서는 solve() 함수가 필요하다. 다음의 예제를 보자.

>>> from sympy import Symbol, solve
>>> x=Symbol('x')
>>> equation = 2 * x - 6
>>> solve(equation)
[3]

예제에서 볼 수 있듯이 solve(equation)은  equation = 0 이라는 방정식을 풀어서 그 근을 리스트로 반환해 준다.

이차방정식의 경우는 어떻게 되는지 보자.

>>> equation = x ** 2 + 3 * x + 2
>>> solve(equation)
[-2, -1]
>>> solve(equation, dict=True)
[{x: -2}, {x: -1}]

이차방정식의 경우도 두 근을 리스트의 형태로 반환해 주는 것을 볼 수 있다. solve 함수에 dict=True 라는 옵션을 주면 근을 사전형태로 반환하며, 근이 여러 개일 경우에는 사전들의 리수트로 반환되는 것을 볼 수 있다. 

만약 실근을 갖지 않는 경우라면 어떻게 될까?

>>> equation = x ** 2 + x + 1
>>> solve(equation, dict=True)
[{x: -1/2 - sqrt(3)*I/2}, {x: -1/2 + sqrt(3)*I/2}]

허근 역시 허수 단위 I 로 표현되어 나타나는 것을 볼 수 있다. 괜찮은데?

그럼 문자가 포함되어 있는 경우는 어떻게 될까? 예를 들어, equation 을 \(ax^2 + bx +c\) 로 한다면 결과는 어떻게 될까? 우리의 예상대로라면 중학교때 부터 신물나게 외웠던 근의 공식이 나와야 하는데...

from sympy import symbols
>>> a, b, c = symbols('a, b, c')
>>> equation = a * x ** 2 + b * x + c
>>> solve(equation)
[{a: -(b*x + c)/x**2}]

어라? 답이 나온 것을 보니 아무래도 이 바보가 \(a\)에 대한 방정식으로 착각하여 푼 모양이다. 역시 컴퓨터는 하나하나 가르쳐 줘야만 일을 잘해. 이런거 보면 빨랑 빨랑 인공지능이 발전을 해야 하는데... 그래서 이 방정식이 \(x\) 에 대한 방정식임을 알려줘야 한다. 방법은 다음과 같다. 

>>> solve(equation, x, dict=True)
[{x: (-b + sqrt(-4*a*c + b**2))/(2*a)}, {x: -(b + sqrt(-4*a*c + b**2))/(2*a)}]

오~~~~ 드디어 전국민이 다 아는 근의 공식이 나왔다. 짜식 잘 가르쳐 주기만 하면 나름 똑똑한데? 그럼 혹시 pprint 를 하면 이쁘게 나올까?

>>> pprint(solve(equation, x, dict=True))
⎡⎧           _____________⎫  ⎧    ⎛       _____________⎞ ⎫⎤
⎢⎪          ╱           2 ⎪  ⎪    ⎜      ╱           2 ⎟ ⎪⎥
⎢⎨   -b + ╲╱  -4⋅a⋅c + b  ⎬  ⎨   -⎝b + ╲╱  -4⋅a⋅c + b  ⎠ ⎬⎥
⎢⎪x: ─────────────────────⎪, ⎪x: ────────────────────────⎪⎥
⎣⎩            2⋅a         ⎭  ⎩             2⋅a           ⎭⎦

늘 느끼는 거지만 하나도 안 이쁘다. 왜 이름이 pretty printing 일까? 결과가 정말로 이쁘게 보인다면 훨씬 더 매력적으로 다가올것 같은데... 그러고보면 tex 가 수식을 참 이쁘게 보여주는 것 같다.


내침김에 이원 일차 연립방정식도 풀어볼까? 이원 일차 연립방정식 \[ \left \{ \begin{array}{*{20}{c}} {x + 2y = 3} \\ {3x - y =  - 2} \end{array} \right. \] 를 풀기 위해서는 다음과 같이 하면 된다.

>>> y = symbol('y')
>>> equation1 = x + 2 * y - 3
>>> equation2 = 3 * x - y + 2
>>> solve((equation1, equation2), dict=True)
[{y: 11/7, x: -1/7}]

역시 깔끔하게 해를 찾아낸다. 파이썬을 공부한지 1년이 다 되어 가는데 이런 기능이 있다는 것은 또 처음 알았네.. 역쉬 파이썬!!!


반응형

'Python' 카테고리의 다른 글

(파이썬) 극한값 구하기  (0) 2016.03.15
(파이썬) 집합  (0) 2016.03.15
(파이썬) 다항식의 전개와 인수분해  (0) 2016.03.15
(파이썬) 최빈값 구하기  (0) 2016.03.15
(파이썬) 막대 그래프 그리기  (0) 2016.03.15


Comments