Pythonのcomplex()関数を徹底解説!複素数の生成と活用
Pythonは、科学技術計算やデータ解析に非常に強いプログラミング言語ですが、その理由の一つに複素数(Complex Number)を標準で扱えるという点が挙げられます。数学や物理学、電気工学などで登場する複素数をPythonで表現し、計算するために欠かせないのがcomplex()関数です。この記事では、complex()関数の基本的な使い方から、複素数の概念、そしてPythonで複素数を扱う際の活用事例までを初心者にもわかりやすく解説します。
complex()関数とは?Pythonにおける複素数の生成
Pythonのcomplex()関数は、複素数を生成するための組み込み関数です。複素数は、実数部(real part)と虚数部(imaginary part)から成り立ち、虚数単位 j (または i) を用いて $a + bj$ の形式で表されます。Pythonでは、虚数単位としてjを使用します。
基本的な使い方:実数部と虚数部の指定
complex()関数は、主に2つの方法で複素数を生成します。
実数部と虚数部を引数で指定する:
complex(実数部, 虚数部) の形式で、2つの引数を渡します。
Python# 実数部3、虚数部4の複素数 c1 = complex(3, 4) print(c1) # 出力: (3+4j) print(type(c1)) # 出力: <class 'complex'> # 虚数部が負の場合 c2 = complex(1, -2) print(c2) # 出力: (1-2j) # 実数部のみの場合(虚数部を省略すると0として扱われる) c3 = complex(5) print(c3) # 出力: (5+0j)文字列として複素数を指定する:
“a+bj” の形式で、複素数を表す文字列を引数に渡します。この場合、+ や – の符号が必要です。
Python# 文字列から複素数を生成 c4 = complex("2+3j") print(c4) # 出力: (2+3j) c5 = complex("-1-5j") print(c5) # 出力: (-1-5j) # 実数部のみ、または虚数部のみの文字列も可能 c6 = complex("7") print(c6) # 出力: (7+0j) c7 = complex("-8j") print(c7) # 出力: -8j (実数部が0の場合、(0-8j)のように表示されることもあるが、等価)注意点: 文字列から変換する場合、スペースや不正な文字が含まれていると
ValueErrorが発生します。Python# エラーになる例 # c_error1 = complex("3 + 4j") # ValueError: complex() arg is a malformed string # c_error2 = complex("3+4i") # ValueError: complex() arg is a malformed string (虚数単位は'j'のみ)
虚数リテラルとしてのj
Pythonでは、数値の直後にjをつけることで、虚数リテラルを直接記述することもできます。
x = 3 + 4j
y = -2j
z = 5.5 + 1.2j
print(x) # 出力: (3+4j)
print(y) # 出力: (-0-2j)
print(z) # 出力: (5.5+1.2j)
これはcomplex()関数を使うのと同じ結果になりますが、より簡潔に記述できます。
複素数の実数部と虚数部にアクセスする
生成された複素数は、.real属性と.imag属性を使ってそれぞれ実数部と虚数部にアクセスできます。
my_complex = complex(6, -7)
print(my_complex.real) # 出力: 6.0
print(my_complex.imag) # 出力: -7.0
これらの属性は、それぞれ浮動小数点数(float型)として値を返します。
複素数の演算
Pythonの複素数は、他の数値型(intやfloat)と同様に、四則演算(加算、減算、乗算、除算)が可能です。
c1 = complex(2, 3) # (2+3j)
c2 = complex(1, -1) # (1-1j)
# 加算
print(c1 + c2) # 出力: (3+2j)
# 減算
print(c1 - c2) # 出力: (1+4j)
# 乗算
print(c1 * c2) # 出力: (5+1j) ((2+3j)*(1-1j) = 2-2j+3j-3j^2 = 2+j+3 = 5+j)
# 除算
print(c1 / c2) # 出力: (-0.5+2.5j) ((2+3j)/(1-1j) = (2+3j)(1+1j)/((1-1j)(1+1j)) = (2+2j+3j+3j^2)/(1+1) = (-1+5j)/2 = -0.5+2.5j)
また、共役複素数(conjugate)は.conjugate()メソッドで取得できます。
共役複素数とは、虚数部の符号を反転させたものです。
c_val = complex(4, 5) # (4+5j)
print(c_val.conjugate()) # 出力: (4-5j)
複素数の活用事例
1. 物理学・工学計算
交流回路の計算(インピーダンスなど)、信号処理、量子力学など、多くの科学技術分野で複素数が不可欠です。Pythonのcomplex()関数と複素数型は、これらの計算を直接的に記述し、実行することを可能にします。
# 例: 交流回路のインピーダンス計算
R = 100 # 抵抗 (Ω)
L = 0.1 # インダクタンス (H)
C = 0.00001 # キャパシタンス (F)
f = 60 # 周波数 (Hz)
omega = 2 * 3.14159 * f # 角周波数
# インダクタンスのリアクタンス
XL = complex(0, omega * L)
# キャパシタンスのリアクタンス
XC = complex(0, -1 / (omega * C))
# 全体のインピーダンス
Z = R + XL + XC
print(f"インピーダンス Z: {Z} Ω")
# 出力例: インピーダンス Z: (100+37.763420510000005j) Ω
2. 数学的なアルゴリズム
マンデルブロ集合の生成やフラクタル図形の描画など、複素平面上での計算を伴うアルゴリズムの実装に利用されます。
# マンデルブロ集合の計算の一部(簡略化)
def mandelbrot_check(c_val, max_iter):
z = 0 + 0j
for i in range(max_iter):
z = z*z + c_val
if abs(z) > 2: # zの絶対値が2を超えたら発散
return i
return max_iter # 発散しなかった場合
# 例: ある点の収束回数をチェック
point_c = complex(-0.5, 0.5)
iterations = mandelbrot_check(point_c, 100)
print(f"点 {point_c} の収束回数: {iterations}")
3. その他
音声信号処理、画像処理、暗号化アルゴリズムの一部など、幅広い分野で複素数が必要とされる場面があります。
complex()関数と関連する関数・モジュール
mathモジュール vs cmathモジュール
Pythonの標準mathモジュールは実数に対する数学関数を提供しますが、cmathモジュールは複素数に対する数学関数(平方根、対数、三角関数など)を提供します。複素数を含む計算を行う際には、cmathモジュールをインポートして利用することが重要です。
import cmath
c_val = complex(-1, 0) # -1
print(cmath.sqrt(c_val)) # 出力: 1j ((-1)の平方根はiまたはj)
# print(math.sqrt(c_val)) # TypeError: can't convert complex to float
int()やfloat()との関係
int()やfloat()関数はそれぞれ整数や浮動小数点数を生成するのに対し、complex()は複素数を生成します。これらは異なる数値型であり、互換性のない変換もあります(例えば、虚数部を持つ複素数をint()やfloat()で直接変換することはできません)。
まとめ
Pythonのcomplex()関数と組み込みの複素数型は、複素数を必要とする科学技術計算や数学的なアルゴリズムを効率的に記述するための強力な機能です。
complex()関数は、実数部と虚数部、または複素数を表す文字列から複素数を生成します。Pythonでは虚数単位として
jを使用します。生成された複素数は、
.real(実数部)と.imag(虚数部)属性でアクセスできます。他の数値型と同様に四則演算が可能で、
.conjugate()で共役複素数が得られます。複素数に対する数学関数は
cmathモジュールで提供されます。
この機能を理解し活用することで、より高度な数値計算や複雑な問題解決が可能になります。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

