複素数とは、「a + bj」という形式の数で、「a」と「b」は実数、「j*j」は-1です。
Pythonでは、このようなComplex Numberを作成する方法が複数あります。
Python で複素数を作成する
- a + bj` という構文で直接複素数を作ることができます。
>>> a = 4 + 3j
>>> print(a)
(4+3j)
>>> print(type(a))
<class 'complex'>
|
- 複素数を作成するには、
complexクラスを使用することもできます。
>>> a = complex(4, 3)
>>> print(type(a))
<class 'complex'>
>>> print(a)
(4+3j)
|
複素数における実部と虚部
すべての複素数 (a + bj) は実部 (a) と虚部 (b) を持っています。
実数部を得るには number.real を、虚数部を得るには number.imag を使う。
>>> a(4+3j)
>>> a.real4.0>>> a.imag3.0 |
複素数の共役
複素数 a + bj の共役は a - bj と定義されます。
また、共役を得るには number.conjugate() メソッドを使用します。
>>> a(4 + 3j)>>> a.conjugate()(4-3j) |
複素数に対する算術演算
実数と同じように、複素数も足し算、引き算、掛け算、割り算ができます。
Pythonでどのようにこれを行うか見てみましょう。
a = 1 + 2j
b = 2 + 4j
print('Addition =', a + b)
print('Subtraction =', a - b)
print('Multiplication =', a * b)
print('Division =', a / b)
|
結果は以下の通りです。
Addition = (3+6j)
Subtraction = (-1-2j)
Multiplication = (-6+8j)
Division = (2+0j)
|
注意:実数とは異なり、2つの複素数を比較することはできません。
実数である以上、実部と虚部を個別に比較するしかありません。
次の例は、これを証明するものです。
>>> a(4+3j)
>>> b(4+6j)
>>> a < bTraceback (most recent call last): File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'complex' and 'complex'
|
複素数の位相(引数)
複素数は、実軸と虚軸からなる平面上の2成分からなるベクトルとして表現することができます。
したがって、ベクトルの2つの成分は実部と虚部です。
import cmath
import math
num = 4 + 3j
# Using cmath modulep = cmath.phase(num)
print('cmath Module:', p)
# Using math modulep = math.atan(num.imag/num.real)
print('Math Module:', p)
|
ベクトルと実軸の間の角度は、複素数の「引数」または「位相」として定義されます。
これは形式的に次のように定義されます。
phase(number) = arctan(imaginary_part / real_part)
ここで、arctan関数はtanの逆数学関数です。
Pythonでは、複素数のためのモジュール cmath を使用して複素数の位相を得ることができます。
また、math.arctan関数を使用して、その数学的定義から位相を取得することもできます。
cmath Module: 0.6435011087932844
Math Module: 0.6435011087932844
|
結果は以下の通りです。
import cmath
import numpy as np
num = 4 + 3j
# Using cmath modulep = cmath.phase(num)
print('cmath Module in Radians:', p)
print('Phase in Degrees:', np.degrees(p))
|
この関数は位相角を radians で返すことに注意してください。
もし degrees に変換する必要がある場合は、 numpy のような別のライブラリを使用します。
cmath Module in Radians: 0.6435011087932844
Phase in Degrees: 36.86989764584402
|
結果は以下の通りです。
>>> import cmath
>>> a = 3 + 4j
>>> polar_coordinates = cmath.polar(a)
>>> print(polar_coordinates)
(5.0, 0.9272952180016122)
>>> modulus = abs(a)
>>> phase = cmath.phase(a)
>>> rect_coordinates = cmath.rect(modulus, phase)
>>> print(rect_coordinates)
(3.0000000000000004+3.9999999999999996j)
|
長方形と極座標
複素数は cmath.rect() と cmath.polar() 関数を使って長方形座標と極座標の形式で書くことができます。
print('π =', cmath.pi)
print('e =', cmath.e)
print('tau =', cmath.tau)
print('Positive infinity =', cmath.inf)
print('Positive Complex infinity =', cmath.infj)
print('NaN =', cmath.nan)
print('NaN Complex =', cmath.nanj)
|
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
cmath モジュールの定数
cmath モジュールには、特別な定数があります。
そのいくつかを以下に示します。
π = 3.141592653589793
e = 2.718281828459045
tau = 6.283185307179586
Positive infinity = inf
Positive Complex infinity = infj
NaN = nan
NaN Complex = nanj
|
結果は、以下の通りです。
import cmath
a = 3 + 4j
print('Sine:', cmath.sin(a))
print('Cosine:', cmath.cos(a))
print('Tangent:', cmath.tan(a))
print('ArcSin:', cmath.asin(a))
print('ArcCosine:', cmath.acos(a))
print('ArcTan:', cmath.atan(a))
|
三角関数
複素数に対する三角関数も cmath モジュールで利用できます。
Sine: (3.853738037919377-27.016813258003936j)
Cosine: (-27.034945603074224-3.8511533348117775j)
Tangent: (-0.0001873462046294784+0.999355987381473j)
ArcSin: (0.6339838656391766+2.305509031243477j)
ArcCosine: (0.9368124611557198-2.305509031243477j)
ArcTan: (1.4483069952314644+0.15899719167999918j)
|
結果を出力すると、以下の様になります。
import cmath
a = 3 + 4j
print('Hyperbolic Sine:', cmath.sinh(a))
print('Hyperbolic Cosine:', cmath.cosh(a))
print('Hyperbolic Tangent:', cmath.tanh(a))
print('Inverse Hyperbolic Sine:', cmath.asinh(a))
print('Inverse Hyperbolic Cosine:', cmath.acosh(a))
print('Inverse Hyperbolic Tangent:', cmath.atanh(a))
|
双曲線関数
三角関数と同様に、複素数に対する双曲線関数も cmath モジュールで利用可能です。
Hyperbolic Sine: (-6.5481200409110025-7.61923172032141j)
Hyperbolic Cosine: (-6.580663040551157-7.581552742746545j)
Hyperbolic Tangent: (1.000709536067233+0.00490825806749606j)
Inverse Hyperbolic Sine: (2.2999140408792695+0.9176168533514787j)
Inverse Hyperbolic Cosine: (2.305509031243477+0.9368124611557198j)
Inverse Hyperbolic Tangent: (0.11750090731143388+1.4099210495965755j)
|
結果は以下の通りです。
import cmath
a = 3 + 4j
print('e^c =', cmath.exp(a))
print('log2(c) =', cmath.log(a, 2))
print('log10(c) =', cmath.log10(a))
print('sqrt(c) =', cmath.sqrt(a))
|
指数関数と対数関数
e^c = (-13.128783081462158-15.200784463067954j)
log2(c) = (2.321928094887362+1.3378042124509761j)
log10(c) = (0.6989700043360187+0.4027191962733731j)
sqrt(c) = (2+1j)
|
結果は以下の通りです。
>>> print(cmath.isfinite(2 + 2j))
True>>> print(cmath.isfinite(cmath.inf + 2j))
False>>> print(cmath.isinf(2 + 2j))
False>>> print(cmath.isinf(cmath.inf + 2j))
True>>> print(cmath.isinf(cmath.nan + 2j))
False>>> print(cmath.isnan(2 + 2j))
False>>> print(cmath.isnan(cmath.inf + 2j))
False>>> print(cmath.isnan(cmath.nan + 2j))
True>>> print(cmath.isclose(2+2j, 2.01+1.9j, rel_tol=0.05))
True>>> print(cmath.isclose(2+2j, 2.01+1.9j, abs_tol=0.005))
False |
その他の機能
複素数が有限か無限か nan かを調べるための雑多な関数がいくつかあります。
また、2つの複素数が近いかどうかをチェックする関数もあります。

まとめ
複素数モジュールと、cmathモジュールに関連する様々な関数について学びました。