cmath — 복소수를 위한 수학 함수

cmath — 복소수를 위한 수학 함수 (Mathematical functions for complex numbers)

복소수를 위한 수학 함수에 접근할 수 있게 해주는 모듈이에요. 이 모듈의 함수는 정수, 부동소수점 또는 복소수를 인자로 받아들여요.

출처: Python 표준 라이브러리

본문

이 모듈은 복소수를 위한 수학 함수에 접근할 수 있게 해줘요. 이 모듈의 함수는 정수, 부동소수점 또는 복소수를 인자로 받아들여요. 또한 __complex__() 또는 __float__() 메서드를 가진 어떤 Python 객체도 받아들여요. 이 메서드들은 객체를 각각 복소수나 부동소수점 수로 변환하는 데 사용되고, 함수는 변환 결과에 적용돼요.

참고: 분기 절단(branch cut)을 포함하는 함수의 경우, 절단 위에서 그 함수를 어떻게 정의할지 결정하는 문제가 있어요. Kahan의 "Branch cuts for complex elementary functions" 논문과 C99 이후 C 표준의 Annex G를 따라, 우리는 부호가 0(zero)임을 이용해 분기 절단의 한쪽을 다른쪽과 구분해요. 실수 축을 따라 (부분적으로) 분기 절단이 있으면 허수부의 부호를 보고, 허수 축을 따라 절단이 있으면 실수부의 부호를 봐요.

예를 들어 cmath.sqrt() 함수는 음의 실수 축을 따라 분기 절단이 있어요. -2-0j 인자는 분기 절단 아래에 놓인 것으로 취급되어 음의 허수 축에 결과를 주어요:

>>> cmath.sqrt(-2-0j)
-1.4142135623730951j

하지만 -2+0j 인자는 분기 절단 위에 놓인 것으로 취급돼요:

>>> cmath.sqrt(-2+0j)
1.4142135623730951j

극좌표 변환 (Conversions to and from polar coordinates)

Python 복소수 z는 내부적으로 직각(Cartesian) 좌표를 사용해 저장돼요. 실수부 z.real과 허수부 z.imag로 완전히 결정돼요. 극좌표는 복소수를 표현하는 대안적인 방법이에요. 극좌표에서 복소수 z는 계수(modulus) r과 위상각(phase angle) phi로 정의돼요. 계수 rz에서 원점까지의 거리이고, 위상 phi는 양의 x축에서 원점과 z를 잇는 선분까지 반시계 방향으로 측정한 라디안 각도예요.

다음 함수는 기본 직각 좌표에서 극좌표로, 그리고 다시 변환하는 데 사용할 수 있어요.

  • cmath.phase(z)z의 위상(복소수의 argument라고도 함)을 float로 반환해요. phase(z)math.atan2(z.imag, z.real)과 동일해요. 결과는 [-π, π] 범위에 있고, 이 연산의 분기 절단은 음의 실수 축을 따라 있어요. 결과의 부호는 z.imag가 0일 때조차 z.imag의 부호와 같아요:
    >>> phase(-1+0j)
    3.141592653589793
    >>> phase(-1-0j)
    -3.141592653589793
    

    참고: 복소수 z의 계수(절대값)는 내장 abs() 함수로 계산할 수 있어요. 이 연산을 위한 별도의 cmath 모듈 함수는 없어요.

  • cmath.polar(z)z의 극좌표 표현을 반환해요. (r, phi) 쌍을 반환하는데, rz의 계수이고 phiz의 위상이에요. polar(z)(abs(z), phase(z))와 동일해요.
  • cmath.rect(r, phi) — 극좌표 rphi를 가진 복소수 z를 반환해요. complex(r * math.cos(phi), r * math.sin(phi))와 동일해요.

거듭제곱과 로그 함수 (Power and logarithmic functions)

  • cmath.exp(z) — 자연로그의 밑 ez 제곱한 값을 반환해요.
  • cmath.log(z[, base]) — 주어진 밑에 대한 z의 로그를 반환해요. 밑이 지정되지 않으면 z의 자연로그를 반환해요. 0에서 음의 실수 축을 따라 -∞까지 한 개의 분기 절단이 있어요.
  • cmath.log10(z)z의 상용로그(밑 10)를 반환해요. log()와 같은 분기 절단이 있어요.
  • cmath.sqrt(z)z의 제곱근을 반환해요. log()와 같은 분기 절단이 있어요.

삼각 함수 (Trigonometric functions)

  • cmath.acos(z)z의 아크코사인을 반환해요. 두 개의 분기 절단이 있어요. 하나는 1에서 실수 축을 따라 오른쪽으로 ∞까지, 다른 하나는 -1에서 실수 축을 따라 왼쪽으로 -∞까지 뻗어요.
  • cmath.asin(z)z의 아크사인을 반환해요. acos()와 같은 분기 절단이 있어요.
  • cmath.atan(z)z의 아크탄젠트를 반환해요. 두 개의 분기 절단이 있어요. 하나는 1j에서 허수 축을 따라 ∞j까지, 다른 하나는 -1j에서 허수 축을 따라 -∞j까지 뻗어요.
  • cmath.cos(z)z의 코사인을 반환해요.
  • cmath.sin(z)z의 사인을 반환해요.
  • cmath.tan(z)z의 탄젠트를 반환해요.

쌍곡선 함수 (Hyperbolic functions)

  • cmath.acosh(z)z의 역쌍곡코사인을 반환해요. 1에서 실수 축을 따라 왼쪽으로 -∞까지 하나의 분기 절단이 있어요.
  • cmath.asinh(z)z의 역쌍곡사인을 반환해요. 두 개의 분기 절단이 있어요. 하나는 1j에서 허수 축을 따라 ∞j까지, 다른 하나는 -1j에서 허수 축을 따라 -∞j까지 뻗어요.
  • cmath.atanh(z)z의 역쌍곡탄젠트를 반환해요. 두 개의 분기 절단이 있어요. 하나는 1에서 실수 축을 따라 ∞까지, 다른 하나는 -1에서 실수 축을 따라 -∞까지 뻗어요.
  • cmath.cosh(z)z의 쌍곡코사인을 반환해요.
  • cmath.sinh(z)z의 쌍곡사인을 반환해요.
  • cmath.tanh(z)z의 쌍곡탄젠트를 반환해요.

분류 함수 (Classification functions)

  • cmath.isfinite(z)z의 실수부와 허수부가 모두 유한하면 True를, 그렇지 않으면 False를 반환해요. 3.2 버전에서 추가.
  • cmath.isinf(z)z의 실수부 또는 허수부 중 하나가 무한대이면 True를, 그렇지 않으면 False를 반환해요.
  • cmath.isnan(z)z의 실수부 또는 허수부 중 하나가 NaN이면 True를, 그렇지 않으면 False를 반환해요.
  • cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) — 값 ab가 서로 가까우면 True를, 그렇지 않으면 False를 반환해요. 두 값이 가까운지 여부는 주어진 절대 및 상대 허용오차에 따라 결정돼요. 오류가 없으면 결과는 abs(a-b) = max(rel_tol * max(abs(a), abs(b)), abs_tol)이 돼요. rel_tol은 상대 허용오차예요. ab 사이의, ab의 더 큰 절대값에 상대적인 최대 허용 차이예요. 예를 들어 5% 허용오차를 설정하려면 rel_tol=0.05를 전달하세요. 기본 허용오차는 1e-09로, 두 값이 약 9자리 소수점 안에서 같은 것을 보장해요. rel_tol은 음수가 아니고 1.0보다 작아야 해요. abs_tol은 절대 허용오차로, 기본값은 0.0이고 음수가 아니어야 해요. x0.0과 비교할 때 isclose(x, 0)abs(x) = rel_tol * abs(x)로 계산되는데, 이는 rel_tol이 1.0보다 작은 어떤 x에 대해서도 False예요. 그래서 호출에 적절한 양수 abs_tol 인자를 추가하세요. IEEE 754 특수값인 NaN, inf, -inf는 IEEE 규칙에 따라 처리돼요. 구체적으로 NaN은 어떤 다른 값(NaN 포함)과도 가깝지 않은 것으로 간주돼요. inf와 -inf는 자신과만 가깝다고 간주돼요. 3.5 버전에서 추가.

    더 알아보기: PEP 485 — A function for testing approximate equality

상수 (Constants)

  • cmath.pi — 수학 상수 π를 float로.
  • cmath.e — 수학 상수 e를 float로.
  • cmath.tau — 수학 상수 τ를 float로. 3.6 버전에서 추가.
  • cmath.inf — 부동소수점 양의 무한대. float('inf')와 동일. 3.6 버전에서 추가.
  • cmath.infj — 실수부가 0이고 허수부가 양의 무한대인 복소수. complex(0.0, float('inf'))와 동일. 3.6 버전에서 추가.
  • cmath.nan — 부동소수점 "not a number"(NaN) 값. float('nan')과 동일. math.nan도 참고. 3.6 버전에서 추가.
  • cmath.nanj — 실수부가 0이고 허수부가 NaN인 복소수. complex(0.0, float('nan'))과 동일. 3.6 버전에서 추가.

참고사항

함수 선택이 math 모듈과 비슷하지만 동일하지는 않다는 점을 참고하세요. 두 모듈이 있는 이유는 일부 사용자는 복소수에 관심이 없고, 심지어 복소수가 뭔지도 모를 수 있기 때문이에요. 그들은 복소수를 반환받기보다는 math.sqrt(-1)이 예외를 발생시키는 걸 선호해요. 또한 cmath에 정의된 함수는 답을 실수로 표현할 수 있어도(이 경우 복소수의 허수부는 0이 됨) 항상 복소수를 반환한다는 점도 참고하세요.

분기 절단에 대한 참고: 분기 절단은 주어진 함수가 연속이 되지 못하는 곡선이에요. 이는 많은 복소 함수의 필수적인 특징이에요. 복소 함수로 계산해야 한다면 분기 절단에 대해 이해하고 있을 거라고 가정해요. 통찰을 얻으려면 복소 변수에 관한 거의 모든 (너무 초보적이지 않은) 책을 참고하세요. 수치적 목적을 위한 분기 절단의 올바른 선택에 대한 정보로 좋은 참고자료는 다음과 같아요:

  • Kahan, W: "Branch cuts for complex elementary functions; or, Much ado about nothing's sign bit." In Iserles, A., and Powell, M. (eds.), The state of the art in numerical analysis. Clarendon Press (1987) pp165–211.