2014年5月9日金曜日

複素数

python numpyでの複素数の扱い方についてです。


複素数は型としてはnumpy.complexと定義されています。
これを利用してみます。

つまり、

numpy.array( [3, 2, 1], dtype=numpy.complex )

とすると

 array([ 3.+0.j,  2.+0.j,  1.+0.j])

というふうに複素数配列となります。


複素数の演算もできます
a = numpy.array( [3, 2, 1], dtype=numpy.complex )
a ** 2

とすると2乗します。
実行結果は

 array([ 9.+0.j,  4.+0.j,  1.+0.j])

となります。

指数計算はそのまま掛けて計算されます。
つまり、python風な数式で表すと
z=x+jy
とすると
z**2 = (x+jy) * (x+jy) = x**2 - y**2 + j 2*x*y
となります。


複素数には色々と実数にはなかった計算方式が出てくるので注意が必要です。
実数部は
numpy.real(z)
虚数部は
numpy.imag(z)
とします。
これらの関数はzがarrayでもOKです。その場合、出力もarrayになります。

複素共役は
numpy.conj(z)
とします。
複素共役が何かわからない場合は検索してみて下さい。
誰かがわかりやすく説明してくれていると思います。

絶対値はnumpy.abs(z)
で計算できます。


複素数の乱数発生は簡単にはできませんでした。
一様分布の場合
z = numpy.random.uniform( -5, 5, 10 ) + 1j * numpy.random.uniform( -5, 5, 10 )
としました。
結果は

array([-4.48658518-4.19169279j,  2.39542899+4.87030019j,
        4.03412469-1.00727465j,  1.72313031+0.99345025j,
        0.68053779-0.385337j  ,  2.08333535-0.32240792j,
       -0.65638447-0.27364433j,  1.36415791-1.89435328j,
        0.19786534-4.51657661j,  2.44853396+3.04850488j])

となりました。
もっとスマートな方法があれば、是非ご教示下さい。





0 件のコメント:

コメントを投稿