일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘 분석의 실례
- Big Theta
- Big-Oh notation
- itertools
- 빅오메가
- Big-Oh 예제
- Big Omega
- one-to-one
- 코틀린 Hello World!
- 배열 섞기
- recursive algorithms
- matrix trnasformations
- 빅오 표기법
- 코틀린 시작하기
- matrix-vector product
- linear dependence
- 랜덤 순서 배열
- homogeneous linear system
- python
- 빅세타
- NumPy
- 이진 탐색
- nonhomogeneous linear system
- 일차변환
- trivial solution
- 재귀함수
- matrix fo a linear transformation
- solutions of matrix equation
- nontrivial solution
- Big-O 예제
- Today
- Total
코딩 연습
(파이썬) 방정식 풀기 본문
파이썬을 이용하여 방정식을 푸는 방법에 대해 알아 보자.
방정식을 풀기 위해서는 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 |