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爆速講座