Pythonで複素数の計算をする

Pythonには複素数についても豊富な機能があります。はじめに、複素数型の変数の定義や実部、虚部、共役複素数を求める関数について取り上げます。

複素数の基本的な計算方法

虚数単位の計算

虚数単位は、英語ではimaginary numberというので通常は英字iで表します。iは次の通り計算することができます。

$i=\sqrt(-1)$

ところが、pythonでは虚数単位を英字のjで表現します。これは電気の世界で電流の強さintensityといい英字iが使われているので、その次ということでjになったといわれています。pythonでは1×虚数単位を1jというように表現します。

  1. # 1 虚数単位の計算
  2. im = 1j
  3. print(im)
  4. print(type(im))
  5. print(im**2)
  6. print(type(im))

1j

(-1+0j)

1jを変数imに代入し、出力すると1jと表示され、type関数で型を調べるとcomplex(複素数型)になります。複素数は英語でcomplex numberというところから由来しています。imを2乗すると、虚数単位の定義からわかる通り-1になりますが、pythonでは、(-1+0j)と複素数型で表現します。

複素数の表現

複素数は実数と虚数の和で表現します。複素数はzで表すのが一般的です。ドイツ語でのkomplexen Zahlenからきているという説もあります。

  1. #2 複素数の表現
  2. cn = 2 + 3j
  3. print(cn)
  4. cf=complex(2,3)
  5. print(cf)
  6. print(cn==cf)

(2+3j)
(2+3j)
True

複素数は、2行目のように定義通り表現する方法と、4行目のようにcomplex関数で計算する方法がありますが、6行目のように結果は同じになります。

このように、complex型をまとめると次の通りになります。

複素数の表現
複素数の表現

複素数型に関わるメソッド

複素数に関する関数

  1. #3 複素数に関する関数
  2. print(cf.real)
  3. print(cf.imag)
  4. print(cf.conjugate())

read-only attributes

2.0z
3.0
(2-3j)

複素数型の変数にrealを適用すると実部、imagを適用すると虚部を取り出すことができます。また、ある複素数に対して、虚部の正負を反転したものを共益複素数といいます。共益複素数はconjugateメソッドで取り出すことできます。

複素数を扱うcmathモジュール

虚数単位のi(Pythonではj)の計算をしてみます。

  1. #4 負の実数の平方根の計算
  2. import math
  3. try:
  4. print((-1)**0.5)
  5. print(math.sqrt(-1))
  6. except Exception as e:
  7. print(str(type(e)))

(6.123233995736766e-17+1j)

  1. 4行目では-1の0.5乗を計算すると複素数型になりますが、実部が0になるはずなのに約6×10のマイナス17乗とわずかですが誤差が生じてしまいます。
  2. 5行目でmathモジュールのsqrt関数を使って-1の平方根を計算するとvalueエラーになってしまいます。

そこで、cmathモジュールのsqrt関数を使い同じ計算をします。

  1. #5 cmath関数を使った
  2. import cmath
  3. z1 = cmath.sqrt(-1)
  4. print(z1)
  5. print(type(z1))
  6. z2 = cmath.sqrt(-1)+2
  7. print(z2)

1j

(2+1j)

cmath関数を使うとうまくいくようです。