複素数型 (complex)
Python組み込みの複素数型は数値型に分類されるオブジェクトの1つで、a + bj の形で定義します ( i ではなく j であることに注意してください)。a, b はそれぞれ複素数の実数部と虚数部であり、浮動小数点数型 (float) として扱われます。虚数部が 1 のとき、a + j のように記述するとエラーになります。正しくは a + 1j です。
複素数の定義と四則演算
リテラルで a + bj と記述すると、複素数 (complexクラスのオブジェクト) が定義されます。あるいは、コンストラクタ complex(a, b) で明示的に定義します。
# PYTHON_COMPLEX
# In[1]
# 複素数 7+13i を定義
z1 = 7 + 13j
# コンストラクタで複素数5+iを定義
z2 = complex(5, 1)
算術演算子を使って複素数同士の加減乗除ができます。
# In[2]
print("z1 + z2 : {}".format(z1 + z2))
print("z1 - z2 : {}".format(z2 - z1))
print("z1 * z2 : {}".format(z1 * z2))
print("z2 / z1 : {}".format(z2 / z1))
# z1 + z2 : (12 + 14j)
# z2 - z1 : (2 + 12j)
# z1 * z2 : (22 + 72j)
# z2 / z1 : (0.2201834862385321 - 0.26605504587155965j)
complex 型と int 型、complex 型と float 型との間でも四則演算できます。
戻り値はすべて complex 型になります。
# In[3]
# 複素数zを定義
z = 2 + 3j
# 浮動小数点xを定義
x = 5.5
# x+z
print(x + z)
# (7.5 + 3j)
実部・虚部・共役複素数
複素数 7 + 13j を定義します。
# In[4]
# 複素数型z=7+13iを定義
z = 7 + 13j
real 属性で実部を参照できます。
# In[5]
# zの実数部 Re[z]
print(z.real)
# 7.0
imag 属性で虚部を参照できます。
# In[6]
# zの虚数部 Im[z]
print("虚部:", z.imag)
# 13.0
conjugate()メソッドは共役複素数を返します。
# In[7]
# zの共役複素数 z*
print(z.conjugate())
# (7-13j)
abs 関数は絶対値を返します。
# In[8]
# zの絶対値 |z|=zz*
print(abs(z))
# 14.7648230602334
【cmath】複素数演算
複素数の偏角の取得、極座標形式への変換などは cmath モジュール によってサポートされています。
複素数の偏角
cmathモジュールの phase 関数を使って、複素数 1 + i の偏角を求めてみます。ラジアンを度数法単位に変換するために、math モジュールの degrees関数もインポートしておきます。
# PYTHON_CMATH_COMPLEX
# In[1]
# 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 = eiθ に変換するときは、cmath モジュールの polar 関数を用います。戻り値は (r, θ) のタプル型です。以下のサンプルコードで複素数 1 + i を極座標形式に変換してみます。
# PYTHON_COMPLEX_POLAR
# In[1]
import math
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 で表すことが多いようです。
【NumPy】複素数演算
NumPy には複素数の演算に関連するいくつかのユニバーサル関数が用意されています。
複素数の実部と虚部
numpy.real() は配列の各要素の実部を返します。
numpy.imag() は配列の各要素の虚部を取得します。
# NUMPY_COMPLEX
# In[1]
import numpy as np
# 複素数の配列
z = np.array([7 + 9j, 11 + 5j, 3 + 6j])
# 配列の各要素の実部を取得
z_real = np.real(z)
# 配列の各要素の実部を取得
z_imag = np.imag(z)
print("z_real = {}".format(z_real))
print("z_imag = {}".format(z_imag))
# z_real = [ 7. 11. 3.]
# z_imag = [9. 5. 6.]
共役複素数と偏角
numpy.conj() は配列の各要素の共役複素数を計算します。
# In[2]
import numpy as np
# 複素数の配列
z = np.array([3 + 7j, 1 + 2j, 5 + 12j])
# 配列の各要素の共役複素数を計算
z_conj = np.conj(z)
print("z_conj = {}".format(z_conj))
# z_conj = [3. -7.j 1. -2.j 5.-12.j]
numpy.angle() は配列の各要素の偏角を計算します。
# In[3]
# 複素数の配列
z = np.array([4 + 13j, 25 + 19j, 8 + 17j])
# 配列の各要素の共役複素数を計算
z_angle = np.angle(z)
# 数値を丸める
z_angle = np.round(z_angle, 3)
print("z_angle = {}".format(z_angle))
# z_angle = [1.272 0.65 1.131]
【SymPy】複素数演算
SymPy で複素数の演算を実行する場合、虚数単位として sympy.I を使います。
# SYMPY_COMPLEX
# In[1]
from sympy import *
# 記号を定義
a, b, c, d = symbols("a b c d")
# 複素数a+bi
z1 = a + b*I
# 複素数c+di
z2 = c + d*I
# 複素数同士の加算
# 式は虚数単位Iについて整理する
z3 = collect(z1 + z2, I)
z3
# a + c + I*(b + d)
sympy.re() は引数の実部を返します。
# In[2]
# 5+13iの実部
re(5 + 13*I)
# 5
sympy.im() は引数の虚部を返します。
# In[3]
# 7-9iの虚部
im(7 - 9*I)
# -9
sympy.arg() は引数の偏角を返します。
# In[4]
# 1+iの偏角
arg(1 + I)
# pi/4
sympy.conjugate() は引数の共役複素数を返します。
# In[5]
# 3+2iの共役複素数
conjugate(3 + 2*I)
# 3 - 2*I
コメントを書く