본문 바로가기
Python/python 응용: 수학 및 과학

Numpy 복소수 계산하기: 근의 공식

by 철이88 2022. 12. 21.
반응형

Python의 수치계산 모듈인 NumPy는 복소수 $i$를 $j$로 표현하여 계산할 수 있습니다. 하지만 NumPy의 루트 함수인 sqrt()에서 실제로 계산을 하다 음수가 나오면 에러가 발생하여 복소수를 계산하지 못하는데요. 이번 포스팅은 근에 공식을 예로 하여 NumPy에서 복소수를 계산하는 방법을 알아보겠습니다.

1. Python에서 복소수 i의 표현


복소수 $i$ = $\sqrt{-1}$은 파이썬에서는 $j$로 표현됩니다.
다음 예를 실행하면 결과가 “(-1+0$j$)”로 나옵니다.

comp_num = 1j
print(comp_num**2)

괄호로 복소수를 나타내며, $i$의 제곱은 그냥 –1이지만  –1 + 0$j$로 표현됩니다.

그런데 NumPy를 이용해 실제로 루트 계산을 해보면, 루트 내에 음수가 나오면 에러가 발생하여 복소수 계산을 할 수 없습니다.

다음 예는 2차 방정식에 근의 공식을 써서 두 개의 해(solution) 중에 하나를 구하는 코드입니다.

import numpy as np
a=1; b=0; c=1 # ax^2 + bx + c = 0
solution = (-b + np.sqrt(b**2 - 4*a*c))/(2*a)
print(solution)

실행하면,
‘invalid value encountered in sqrt’라고 하는 오류 메시지가 뜹니다.
NumPy의 루트 계산 함수인 sqrt()에 음수가 들어가서 인대요. 
이런 식으로는 복소수 계산이 안됩니다.

아래에서 위 코드를 수정해서 복소수 계산이 가능하게 해보겠습니다.

2. NumPy에서 복소수 계산하기


NumPy의 sqrt()함수는 음수 인자를 넣으면 계산이 안되지만, 복소수 형태의 음수 인자는 계산이 됩니다.
다음과 같이 루트 안에 –1 대신 –1 + 0$j$를 넣으면 1$j$를 출력합니다.
(다시 말씀드리지만, $j$는 python에서 $\sqrt{-1}$를 나타냅니다.)  

import numpy as np
print(np.sqrt(-1+0j))

 

*그래서 NumPy에서 복소수를 계산하는 첫번째 방법은 다음과 같습니다.
위의 근의 공식 코드를 다음과 같이 살짝 수정하면 복소수 계산이 됩니다.

import numpy as np
a=1; b=0; c=1 # ax^2 + bx + c = 0
solution = (-b + np.sqrt(b**2 - 4*a*c + 0j))/(2*a)
print(solution)

3번째 줄에 np.sqrt() 안에 0j를 추가 했습니다.


*다른 방법은 NumPy의 lib.scimath 모듈을 이용하는 것입니다.


다음 코드는 numpy.lib.scimath 모듈의 sqrt()함수를 불러와서 계산합니다.

from numpy.lib.scimath import sqrt
a=1; b=0; c=1 # ax^2 + bx + c = 0
solution = (-b + sqrt(b**2 - 4*a*c))/(2*a)
print(solution)

실행하면 복소수 계산이 잘 진행되는 것을 확인할 수 있습니다.

반응형

댓글