複素数とは、「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)
|
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
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つの複素数が近いかどうかをチェックする関数もあります。
まとめ
複素数モジュールと、cmath
モジュールに関連する様々な関数について学びました。