Pythonのcomplex型で複素数を完全マスター【絶対値・偏角・極座標変換】
Pythonのcomplex型を使えば、複素数の計算を簡単に行うことができます。この記事では、複素数の基本操作から絶対値、偏角、極座標変換まで、実践的なサンプルコードと共に詳しく解説します。
complex型の基本
複素数の作成方法
# 基本的な作成方法
z1 = complex(3, 4) # 3+4j
z2 = 2 + 3j # 2+3j
z3 = 1j # 虚数単位 0+1j
z4 = complex('2+3j') # 文字列から作成
print(z1) # (3+4j)
print(z2) # (2+3j)
実部と虚部の取得
z = 3 + 4j
real_part = z.real # 実部: 3.0
imag_part = z.imag # 虚部: 4.0
print(f"実部: {real_part}")
print(f"虚部: {imag_part}")
複素数の基本演算
四則演算
z1 = 2 + 3j
z2 = 1 + 2j
# 加算
add_result = z1 + z2 # (3+5j)
# 減算
sub_result = z1 - z2 # (1+1j)
# 乗算
mul_result = z1 * z2 # (-4+7j)
# 除算
div_result = z1 / z2 # (1.6-0.2j)
print(f"加算: {add_result}")
print(f"乗算: {mul_result}")
べき乗演算
z = 1 + 1j
# べき乗
power2 = z ** 2 # (0+2j)
power3 = z ** 3 # (-2+2j)
# 平方根(べき乗の逆)
sqrt_z = z ** 0.5 # (1.098+0.455j)
print(f"2乗: {power2}")
print(f"平方根: {sqrt_z}")
複素数の絶対値(モジュラス)
abs()関数の使用
import math
z = 3 + 4j
# 絶対値の計算
absolute_value = abs(z) # 5.0
print(f"絶対値: {absolute_value}")
# 手動計算での確認
manual_abs = math.sqrt(z.real**2 + z.imag**2)
print(f"手動計算: {manual_abs}") # 5.0
複素数のノルム
def complex_norm(z):
return z.real**2 + z.imag**2
z = 3 + 4j
norm = complex_norm(z) # 25
absolute = abs(z) # 5.0
print(f"ノルム: {norm}")
print(f"絶対値: {absolute}")
複素数の偏角(引数)
cmathモジュールの活用
import cmath
z = 3 + 4j
# 偏角をラジアンで取得
phase_rad = cmath.phase(z) # 0.927ラジアン
print(f"偏角(ラジアン): {phase_rad}")
# 偏角を度に変換
phase_deg = cmath.phase(z) * 180 / cmath.pi
print(f"偏角(度): {phase_deg}") # 53.13度
手動での偏角計算
import math
def get_phase(z):
return math.atan2(z.imag, z.real)
z = 1 + 1j
phase = get_phase(z) # π/4 = 0.785ラジアン
print(f"偏角: {phase}")
# 45度の確認
print(f"45度: {math.pi/4}") # 0.785ラジアン
極座標変換
直交座標から極座標へ
import cmath
def to_polar(z):
r = abs(z) # 絶対値(半径)
theta = cmath.phase(z) # 偏角
return r, theta
z = 3 + 4j
r, theta = to_polar(z)
print(f"極座標: r={r}, θ={theta}") # r=5.0, θ=0.927
極座標から直交座標へ
import cmath
def from_polar(r, theta):
return r * cmath.exp(1j * theta)
# 極座標から複素数を作成
r, theta = 5.0, 0.927
z = from_polar(r, theta)
print(f"復元した複素数: {z}") # (3+4j)に近い値
cmathのpolar()とrect()
import cmath
z = 3 + 4j
# polar(): 極座標に変換
r, phi = cmath.polar(z)
print(f"極座標: ({r}, {phi})")
# rect(): 極座標から直交座標に変換
z_restored = cmath.rect(r, phi)
print(f"復元: {z_restored}")
オイラーの公式の実装
e^(iθ) = cos(θ) + i*sin(θ)
import cmath
import math
def euler_formula(theta):
# オイラーの公式: e^(iθ)
complex_exp = cmath.exp(1j * theta)
# 三角関数での計算
cos_sin = math.cos(theta) + 1j * math.sin(theta)
return complex_exp, cos_sin
theta = math.pi / 4 # 45度
exp_result, trig_result = euler_formula(theta)
print(f"e^(iθ): {exp_result}")
print(f"cos+isin: {trig_result}")
複素指数関数
import cmath
# 複素数の指数関数
z = 1 + 1j
exp_z = cmath.exp(z)
print(f"e^(1+i): {exp_z}")
# オイラーの恒等式: e^(iπ) + 1 = 0
euler_identity = cmath.exp(1j * cmath.pi) + 1
print(f"オイラーの恒等式: {euler_identity}") # ほぼ0
複素数の共役
conjugate()メソッド
z = 3 + 4j
# 共役複素数
z_conj = z.conjugate() # (3-4j)
print(f"共役: {z_conj}")
# 共役の性質:z * z.conjugate() = |z|^2
product = z * z_conj # (25+0j)
abs_squared = abs(z) ** 2 # 25.0
print(f"z * z*: {product}")
print(f"|z|^2: {abs_squared}")
複素数の三角関数
cmathの三角関数
import cmath
z = 1 + 1j
# 複素数の三角関数
sin_z = cmath.sin(z)
cos_z = cmath.cos(z)
tan_z = cmath.tan(z)
print(f"sin(1+i): {sin_z}")
print(f"cos(1+i): {cos_z}")
print(f"tan(1+i): {tan_z}")
双曲線関数
import cmath
z = 1 + 1j
# 双曲線関数
sinh_z = cmath.sinh(z)
cosh_z = cmath.cosh(z)
tanh_z = cmath.tanh(z)
print(f"sinh(1+i): {sinh_z}")
print(f"cosh(1+i): {cosh_z}")
複素数の対数関数
自然対数
import cmath
z = 1 + 1j
# 複素数の自然対数
log_z = cmath.log(z)
print(f"log(1+i): {log_z}")
# 対数の底を指定
log10_z = cmath.log10(z) # 常用対数
log2_z = cmath.log(z, 2) # 底が2の対数
print(f"log10(1+i): {log10_z}")
print(f"log2(1+i): {log2_z}")
実践的な応用例
交流回路の計算
import cmath
import math
def ac_impedance(R, L, C, frequency):
omega = 2 * math.pi * frequency
# インピーダンス計算
Z_R = R # 抵抗
Z_L = 1j * omega * L # インダクタンス
Z_C = 1 / (1j * omega * C) # キャパシタンス
Z_total = Z_R + Z_L + Z_C
return Z_total
# 回路パラメータ
R = 100 # 100Ω
L = 0.1 # 0.1H
C = 1e-6 # 1μF
f = 60 # 60Hz
Z = ac_impedance(R, L, C, f)
print(f"インピーダンス: {Z}")
print(f"絶対値: {abs(Z):.2f}Ω")
print(f"位相: {cmath.phase(Z)*180/math.pi:.2f}度")
フーリエ級数の計算
import cmath
import math
def fourier_coefficient(func_values, n, N):
coefficient = 0
for k in range(N):
angle = -2j * math.pi * n * k / N
coefficient += func_values[k] * cmath.exp(angle)
return coefficient / N
# サンプル関数の値
N = 8
t_values = [k * 2 * math.pi / N for k in range(N)]
func_values = [math.sin(t) for t in t_values]
# 1次のフーリエ係数
coeff_1 = fourier_coefficient(func_values, 1, N)
print(f"1次係数: {coeff_1}")
複素数での回転変換
import cmath
import math
def rotate_point(z, angle):
rotation = cmath.exp(1j * angle)
return z * rotation
# 点(1, 0)を90度回転
point = 1 + 0j
rotated = rotate_point(point, math.pi/2)
print(f"回転後: {rotated}") # (0+1j) = i
# 複数点の回転
points = [1+0j, 0+1j, -1+0j, 0-1j]
angle = math.pi/4 # 45度回転
rotated_points = [rotate_point(p, angle) for p in points]
for i, p in enumerate(rotated_points):
print(f"点{i+1}: {p}")
エラーハンドリングと注意点
ゼロ除算の処理
import cmath
def safe_complex_division(z1, z2):
try:
result = z1 / z2
return result
except ZeroDivisionError:
return "ゼロ除算エラー"
z1 = 1 + 2j
z2 = 0 + 0j
result = safe_complex_division(z1, z2)
print(result)
数値精度の注意
import cmath
# 浮動小数点数の精度限界
z = 1e-16 + 1e-16j
print(f"微小な複素数: {z}")
print(f"絶対値: {abs(z)}")
# 比較での注意点
z1 = 1 + 1j
z2 = complex(1.0, 1.0)
print(f"等価性: {z1 == z2}") # True
性能最適化のヒント
NumPyとの比較
import numpy as np
import time
# Python標準のcomplex
start = time.time()
z_list = []
for i in range(10000):
z = complex(i, i+1)
z_list.append(abs(z))
end = time.time()
print(f"標準complex: {end-start:.4f}秒")
# NumPyのcomplex
start = time.time()
z_array = np.arange(10000) + 1j * (np.arange(10000) + 1)
abs_array = np.abs(z_array)
end = time.time()
print(f"NumPy: {end-start:.4f}秒")
まとめ
Pythonのcomplex型は以下の特徴を持ちます:
- 直感的で簡単な複素数操作
- cmathモジュールとの強力な連携
- 数学的に正確な計算結果
- 工学・物理学での実用的な応用
複素数を扱う場面では、Pythonの標準ライブラリだけで高度な計算が可能です。特に信号処理、制御工学、量子計算などの分野で威力を発揮します。実際にコードを書いて複素数の美しい数学的性質を体験してみましょう。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座


