複素数 (complex型) の演算

複素数 (complex型) の演算

複素数 (complex型)

 組み込みの 複素数 (complex 型)数値型 に分類されるオブジェクトの1つで、a + bj の形で定義します ( i ではなく j であることに注意してください)。a, b はそれぞれ複素数の 実数部虚数部 であり、浮動小数点数型 (float) として扱われます。虚数部が 1 のとき、a + j のように記述するとエラーになります。正しくは a + 1j です。

 Python complex型 複素数平面

 複素数についての詳細は 『数学教室』の「複素数とガウス平面」 を参照してください。
 

複素数の定義と四則演算

 以下のサンプルコードに複素数の定義の仕方や基本的な演算例を載せておきます。

# 複素数型の定義と四則演算

# 7 + 13i
z1 = 7 + 13j

# 5 + i
z2 = 5 + 1j

# 実数 9 を複素数型で定義
z3 = 9 + 0j

# 虚数 2i を複素数型で定義
z4 = 2j

# コンストラクタで複素数 2 + 3i を定義
z5 = complex(2, 3)

# 複素数型の加減乗除
print(z1 + z2)
print(z2 - z1)
print(z1 * z2)
print(z2 / z1)
(12 + 14j)
(-2 - 12j)
(22 + 72j)
(0.2201834862385321 - 0.26605504587155965j)

実部・虚部・共役複素数・絶対値

 複素数型の実部と虚部は、それそれ real 属性とimag 属性で取得することができます。
 共役複素数は conjugateメソッドで、絶対値は abs 関数で取得することができます。

# 複素数型 z = 7 + 13i を定義
z = 7 + 13j

# z の実数部 Re[z] を取得
print("実部:", z.real)

# z の虚数部 Im[z] を取得
print("虚部:", z.imag)

# z の共役複素数 z*
print("共役複素数:", z.conjugate())

# z の絶対値 |z| = zz*
print("絶対値:", abs(z))
実部: 7.0
虚部: 13.0
共役複素数: (7-13j)
絶対値: 14.7648230602334

 

複素数型と他の数値型との演算

 complex 型と int 型, あるいは complex 型と float 型との間で四則演算することもできますが、戻り値はすべて complex 型になります。

# 複素数 z を定義
z = 2 + 3j

# 浮動小数点 x を定義
x = 5.5

# x と z の演算例
print("x + z =", x + z)
print("x - z =", x - z)
print("xz =", x * z)
print("x / z =", x / z)
x + z = (7.5 + 3j)
x - z = (3.5 - 3j)
xz = (11 + 16.5j)
x / z = (0.8461538461538461 - 1.2692307692307694j)

 

cmathモジュールの活用

 複素数の偏角の取得、極座標形式への変換などは cmath モジュール によってサポートされています。

複素数の偏角

 cmathモジュールの phase 関数を使って、複素数 1 + i の偏角を求めてみます。ラジアンを度数法単位に変換するために、math モジュールの degrees関数もインポートしておきます。

# math モジュールをインポート
import math

# cmathモジュールをインポート
import cmath

# 複素数型 z = 1 + i を定義
z = 1 + 1j

# z の偏角(ラジアン)
arg_rad = cmath.phase(z)

# z の偏角(度)
arg_deg = math.degrees(arg_rad)

print("偏角 (ラジアン):", arg_rad)
print("偏角 (°):", arg_deg)
偏角(ラジアン): 0.7853981633974483
偏角(°): 45.0

 よく知られているように、1 + i の偏角は 45°であることが確認できました。
 ラジアンから度数法単位への変換には math モジュールの degrees 関数を用いています。
 

極座標形式

 複素数 z = a + bi を極座標形式 z = e に変換するときは、cmath モジュールの polar 関数を用います。戻り値は (r, θ) のタプル型です。以下のサンプルコードで複素数 1 + i を極座標形式に変換してみます。

# math モジュールをインポート
import math

# cmathモジュールをインポート
import cmath

# 複素数型 z = 1 + i を定義
z = 1 + 1j

# z の極座標形式 z = rexp(iθ) の r と θ を取得
zp = cmath.polar(z)

r = zp[0]
t = zp[1]

# zp を表示
print("極座標形式:", zp)

# r の平方を計算
print("r の平方:", r**2)

# θ を度数法で表示
print("θ[°]:", math.degrees(t))
極座標形式: (1.4142135623730951, 0.7853981633974483)
r の平方: 2.0000000000000004
θ[°]: 45.0

 ちなみに i は (imaginary number) の頭文字です。数学や自然科学では虚数単位をそのまま i と表しますが、電気工学では電流 i との混同を避けるために j で表すことが多いようです。