Pythonでの複素数の使い方|位相や極座標等の解説をする

スポンサーリンク

複素数とは、「a + bj」という形式の数で、「a」と「b」は実数、「j*j」は-1です。

Pythonでは、このようなComplex Numberを作成する方法が複数あります。

スポンサーリンク

Python で複素数を作成する

  • a + bj` という構文で直接複素数を作ることができます。
>>> a = 4 + 3j
>>> print(a)
(4+3j)
>>> print(type(a))
<class 'complex'>
  • 複素数を作成するには、 complex クラスを使用することもできます。
>>> a = complex(4, 3)
>>> print(type(a))
<class 'complex'>
>>> print(a)
(4+3j)

複素数における実部と虚部

すべての複素数 (a + bj) は実部 (a) と虚部 (b) を持っています。

実数部を得るには number.real を、虚数部を得るには number.imag を使う。

>>> a
(4+3j)
>>> a.real
4.0
>>> a.imag
3.0

複素数の共役

複素数 a + bj の共役は a - bj と定義されます。

また、共役を得るには number.conjugate() メソッドを使用します。

>>> a
(4 + 3j)
>>> a.conjugate()
(4-3j)

複素数に対する算術演算

実数と同じように、複素数も足し算、引き算、掛け算、割り算ができます。

Pythonでどのようにこれを行うか見てみましょう。

a = 1 + 2j
b = 2 + 4j
print('Addition =', a + b)
print('Subtraction =', a - b)
print('Multiplication =', a * b)
print('Division =', a / b)

結果は以下の通りです。

Addition = (3+6j)
Subtraction = (-1-2j)
Multiplication = (-6+8j)
Division = (2+0j)

注意:実数とは異なり、2つの複素数を比較することはできません。

実数である以上、実部と虚部を個別に比較するしかありません。

次の例は、これを証明するものです。

>>> a
(4+3j)
>>> b
(4+6j)
>>> a < b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'complex' and 'complex'

複素数の位相(引数)

複素数は、実軸と虚軸からなる平面上の2成分からなるベクトルとして表現することができます

したがって、ベクトルの2つの成分は実部と虚部です。

import cmath
import math
 
num = 4 + 3j
 
# Using cmath module
p = cmath.phase(num)
print('cmath Module:', p)
 
# Using math module
p = math.atan(num.imag/num.real)
print('Math Module:', p)

ベクトルと実軸の間の角度は、複素数の「引数」または「位相」として定義されます。

これは形式的に次のように定義されます。

phase(number) = arctan(imaginary_part / real_part)

ここで、arctan関数はtanの逆数学関数です。

Pythonでは、複素数のためのモジュール cmath を使用して複素数の位相を得ることができます。

また、math.arctan関数を使用して、その数学的定義から位相を取得することもできます。

cmath Module: 0.6435011087932844
Math Module: 0.6435011087932844

結果は以下の通りです。

import cmath
import numpy as np
 
num = 4 + 3j
 
# Using cmath module
p = cmath.phase(num)
print('cmath Module in Radians:', p)
print('Phase in Degrees:', np.degrees(p))

この関数は位相角を radians で返すことに注意してください。


もし degrees に変換する必要がある場合は、 numpy のような別のライブラリを使用します。

cmath Module in Radians: 0.6435011087932844
Phase in Degrees: 36.86989764584402

結果は以下の通りです。

>>> import cmath
>>> a = 3 + 4j
>>> polar_coordinates = cmath.polar(a)
>>> print(polar_coordinates)
(5.0, 0.9272952180016122)
 
>>> modulus = abs(a)
>>> phase = cmath.phase(a)
>>> rect_coordinates = cmath.rect(modulus, phase)
>>> print(rect_coordinates)
(3.0000000000000004+3.9999999999999996j)

長方形と極座標

複素数は cmath.rect()cmath.polar() 関数を使って長方形座標と極座標の形式で書くことができます。

print('π =', cmath.pi)
print('e =', cmath.e)
print('tau =', cmath.tau)
print('Positive infinity =', cmath.inf)
print('Positive Complex infinity =', cmath.infj)
print('NaN =', cmath.nan)
print('NaN Complex =', cmath.nanj)

cmath モジュールの定数

cmath モジュールには、特別な定数があります。

そのいくつかを以下に示します。

π = 3.141592653589793
e = 2.718281828459045
tau = 6.283185307179586
Positive infinity = inf
Positive Complex infinity = infj
NaN = nan
NaN Complex = nanj

結果は、以下の通りです。

import cmath
 
a = 3 + 4j
 
print('Sine:', cmath.sin(a))
print('Cosine:', cmath.cos(a))
print('Tangent:', cmath.tan(a))
 
print('ArcSin:', cmath.asin(a))
print('ArcCosine:', cmath.acos(a))
print('ArcTan:', cmath.atan(a))

三角関数

複素数に対する三角関数も cmath モジュールで利用できます。

Sine: (3.853738037919377-27.016813258003936j)
Cosine: (-27.034945603074224-3.8511533348117775j)
Tangent: (-0.0001873462046294784+0.999355987381473j)
ArcSin: (0.6339838656391766+2.305509031243477j)
ArcCosine: (0.9368124611557198-2.305509031243477j)
ArcTan: (1.4483069952314644+0.15899719167999918j)

結果を出力すると、以下の様になります。

import cmath
 
a = 3 + 4j
 
print('Hyperbolic Sine:', cmath.sinh(a))
print('Hyperbolic Cosine:', cmath.cosh(a))
print('Hyperbolic Tangent:', cmath.tanh(a))
 
print('Inverse Hyperbolic Sine:', cmath.asinh(a))
print('Inverse Hyperbolic Cosine:', cmath.acosh(a))
print('Inverse Hyperbolic Tangent:', cmath.atanh(a))

双曲線関数

三角関数と同様に、複素数に対する双曲線関数も cmath モジュールで利用可能です。

Hyperbolic Sine: (-6.5481200409110025-7.61923172032141j)
Hyperbolic Cosine: (-6.580663040551157-7.581552742746545j)
Hyperbolic Tangent: (1.000709536067233+0.00490825806749606j)
Inverse Hyperbolic Sine: (2.2999140408792695+0.9176168533514787j)
Inverse Hyperbolic Cosine: (2.305509031243477+0.9368124611557198j)
Inverse Hyperbolic Tangent: (0.11750090731143388+1.4099210495965755j)

結果は以下の通りです。

import cmath
a = 3 + 4j
print('e^c =', cmath.exp(a))
print('log2(c) =', cmath.log(a, 2))
print('log10(c) =', cmath.log10(a))
print('sqrt(c) =', cmath.sqrt(a))

指数関数と対数関数

e^c = (-13.128783081462158-15.200784463067954j)
log2(c) = (2.321928094887362+1.3378042124509761j)
log10(c) = (0.6989700043360187+0.4027191962733731j)
sqrt(c) = (2+1j)

結果は以下の通りです。

>>> print(cmath.isfinite(2 + 2j))
True
 
>>> print(cmath.isfinite(cmath.inf + 2j))
False
 
>>> print(cmath.isinf(2 + 2j))
False
 
>>> print(cmath.isinf(cmath.inf + 2j))
True
 
>>> print(cmath.isinf(cmath.nan + 2j))
False
 
>>> print(cmath.isnan(2 + 2j))
False
 
>>> print(cmath.isnan(cmath.inf + 2j))
False
 
>>> print(cmath.isnan(cmath.nan + 2j))
True
 
>>> print(cmath.isclose(2+2j, 2.01+1.9j, rel_tol=0.05))
True
 
>>> print(cmath.isclose(2+2j, 2.01+1.9j, abs_tol=0.005))
False

その他の機能

複素数が有限か無限か nan かを調べるための雑多な関数がいくつかあります。

また、2つの複素数が近いかどうかをチェックする関数もあります。

Complex Number Vector 1
Complex Number Vector

まとめ

複素数モジュールと、cmathモジュールに関連する様々な関数について学びました。

タイトルとURLをコピーしました