note.nkmk.me

Python, complex型で複素数を扱う(絶対値、偏角、極座標変換など)

Date: 2018-03-21 / tags: Python, 算数・数学

Pythonには複素数を扱うための型、complex型が標準で用意されている。単純な計算だけならモジュールをインポートすることなく使える。

ここでは以下の内容についてサンプルコードとともに説明する。

  • 複素数の変数を生成
  • 実部と虚部を取得: real, imag属性
  • 共役な複素数を取得: conjugate()メソッド
  • 絶対値(大きさ)を取得: abs()関数
  • 偏角(位相)を取得: math, cmathモジュール
  • 極座標変換(極形式表現): math, cmathモジュール
  • 複素数の計算(四則演算、べき乗、平方根)
スポンサーリンク

複素数の変数を生成

虚数単位をjで表し、以下のように記述する。iではないので注意。

c = 3 + 4j

print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
source: complex.py

虚部が1の場合、省略するとエラーNameErrorになる。もしjという名前の変数が先に定義されているとその変数と見なされてしまう。

1jと明示的に記述する必要がある。

# c = 3 + j
# NameError: name 'j' is not defined

c = 3 + 1j

print(c)
# (3+1j)
source: complex.py

実部が0の場合は省略してもOK。

c = 3j

print(c)
# 3j
source: complex.py

虚部が0の値を複素数complex型として定義したい場合は0を明示的に記述する。なお、後述のようにcomplex型と整数int型、浮動小数点float型との演算も可能。

c = 3 + 0j

print(c)
# (3+0j)
source: complex.py

実部、虚部は浮動小数点float型で指定できる。指数表記などでもOK。

c = 1.2e3 + 3j

print(c)
# (1200+3j)
source: complex.py

complex型のコンストラクタで生成することもできる。complex(実部, 虚部)のように指定する。

c = complex(3, 4)

print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
source: complex.py

複素数の実部と虚部を取得: real, imag属性

複素数complex型の実部と虚部はそれぞれreal, imag属性で取得できる。どちらも浮動小数点float型。

c = 3 + 4j

print(c.real)
print(type(c.real))
# 3.0
# <class 'float'>

print(c.imag)
print(type(c.imag))
# 4.0
# <class 'float'>
source: complex.py

read onlyなので変更はできない。

# c.real = 5.5
# AttributeError: readonly attribute
source: complex.py

共役な複素数を取得: conjugate()メソッド

共役な複素数を取得するには、conjugate()メソッドを使う。

c = 3 + 4j

print(c.conjugate())
# (3-4j)
source: complex.py

複素数の絶対値(大きさ)を取得: abs()関数

複素数の絶対値(大きさ)を取得するには、組み込み関数abs()を使う。

c = 3 + 4j

print(abs(c))
# 5.0

c = 1 + 1j

print(abs(c))
# 1.4142135623730951
source: complex.py

複素数の偏角(位相)を取得: math, cmathモジュール

複素数の偏角(位相)を取得するには、mathモジュールまたはcmathモジュールを使う。

cmathモジュールは複素数のための数学関数モジュール。

定義どおり逆正接関数math.atan2()で算出するか、偏角(位相)を返すcmath.phase()を使う。

import cmath
import math

c = 1 + 1j

print(math.atan2(c.imag, c.real))
# 0.7853981633974483

print(cmath.phase(c))
# 0.7853981633974483

print(cmath.phase(c) == math.atan2(c.imag, c.real))
# True

いずれの場合も、取得できる角度の単位はラジアン。度に変換したい場合は、math.degrees()を使う。

print(math.degrees(cmath.phase(c)))
# 45.0

複素数の極座標変換(極形式表現): math, cmathモジュール

上述のように、複素数の絶対値(大きさ)と偏角(位相)を取得できるが、cmath.polar()を使うと(絶対値, 偏角)のタプルでまとめて取得できる。

c = 1 + 1j

print(cmath.polar(c))
print(type(cmath.polar(c)))
# (1.4142135623730951, 0.7853981633974483)
# <class 'tuple'>

print(cmath.polar(c)[0] == abs(c))
# True

print(cmath.polar(c)[1] == cmath.phase(c))
# True

極座標から直交座標への変換はcmath.rect()を使う。cmath.rect(絶対値, 偏角)のように引数を指定すると、等価な複素数complex型の値が取得できる。

print(cmath.rect(1, 1))
# (0.5403023058681398+0.8414709848078965j)

print(cmath.rect(1, 0))
# (1+0j)

print(cmath.rect(cmath.polar(c)[0], cmath.polar(c)[1]))
# (1.0000000000000002+1j)

実部と虚部は、絶対値と偏角から余弦math.cos()、正弦math.sin()で計算した結果と等価。

r = 2
ph = math.pi

print(cmath.rect(r, ph).real == r * math.cos(ph))
# True

print(cmath.rect(r, ph).imag == r * math.sin(ph))
# True

複素数の計算(四則演算、べき乗、平方根)

通常の算術演算子を使って、四則演算、べき乗の計算が可能。

c1 = 3 + 4j
c2 = 2 - 1j

print(c1 + c2)
# (5+3j)

print(c1 - c2)
# (1+5j)

print(c1 * c2)
# (10+5j)

print(c1 / c2)
# (0.4+2.2j)

print(c1 ** 3)
# (-117+44j)
source: complex.py

平方根は**0.5でも算出できるが、誤差が生じる。cmath.sqrt()を使うと正確な値が算出できる。

print((-3 + 4j) ** 0.5)
# (1.0000000000000002+2j)

print((-1) ** 0.5)
# (6.123233995736766e-17+1j)

print(cmath.sqrt(-3 + 4j))
# (1+2j)

print(cmath.sqrt(-1))
# 1j

complex型とint型、float型との演算もできる。

print(c1 + 3)
# (6+4j)

print(c1 * 0.5)
# (1.5+2j)
source: complex.py
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事