Numpy Sympyで複素数の計算をする

Pythonで複素数について計算するときに、NumPyモジュールやSymPyモジュールを使うと、より応用的な計算をすることができます。

NumPy、SymPyモジュールによる複素数の基本的な計算

虚数単位の計算

NumPyモジュールでは、ndarrayとして配列を定義すると、複数の複素数について同時に演算をすることができます。

NumPyモジュールによる複素数の計算

  1. #1 NumPyモジュールによる複素数の四則演算
  2. import numpy as np
  3. a = np.array([1+1j, 1+2j, 1+3j])
  4. b = np.array([1+1j, 2+1j, 3+1j])
  5. print(a+b)
  6. print(a-b)
  7. print(a*b)
  8. print(a/b)
  9. print(type(a+b))
  10. print(np.real(a))
  11. print(np.imag(a))
  12. print(np.conj(a))

[2.+2.j 3.+3.j 4.+4.j]
[ 0.+0.j -1.+1.j -2.+2.j]
[0. +2.j 0. +5.j 0.+10.j]
[1. +0.j  0.8+0.6j 0.6+0.8j]

[1. 1. 1.]
[1. 2. 3.]
[1.-1.j 1.-2.j 1.-3.j]

  1. 3、4行目で複素数を含んだndarray形式の配列を定義します。
  2. 5~8行目で四則演算をしています。結果は9行目でわかるようにndarray形式で返されます。
  3. 9行目以下のとおり、実部はreal関数、虚部はimag関数、共役複素数はconj関数で計算することができます。

SymPyモジュールによる虚数の定義と計算

SymPyモジュールでは、虚数単位を大文字のIで表します。

  1. #2 SymPyモジュールによる虚数の定義
  2. import sympy
  3. print(sympy.I)
  4. print((sympy.I)**2)

I
-1

SymPyでは虚数単位は英大文字のIで表します。Iを2乗すると定義通り-1になります。

SymPyモジュールの複素数に関する関数

SymPyモジュールにも複素数に関する基本的な関数が用意されています。

  1. #3 SymPyモジュールによる複素数に関する基本的な関数
  2. import sympy
  3. c = 2+3*sympy.I
  4. print(sympy.re(c))
  5. print(sympy.im(c))
  6. print(c.as_real_imag())
  7. print(sympy.conjugate(c))

2
3
(2, 3)
2 - 3*I

  1. SymPyモジュールでは3行目のようにIを使って複素数を定義します。
  2. 4行目のようにas_real_imagメソッドにより、実部と虚部をタプルにすることができます。
  3. 5行目以下のとおり実部はre関数、虚部はim関数、共役複素数はconjugate関数で計算することができます。

SymPyモジュールによる代数計算

SymPyモジュールによる代数計算の基礎

SymPyによる複素数の代数としての定義

SymPyモジュールには、複素数の代数計算をする機能が用意されています。

  1. #4 SymPyモジュールによる代数計算
  2. import sympy
  3. sympy.var('z', complex=True)
  4. display(z)
  5. display(sympy.expand_complex(z))
  6. display(sympy.conjugate(z))
  7. display(sympy.expand_complex(sympy.conjugate(z)))
SymPyによる複素数の代数計算
SymPyによる複素数の代数計算
  1. 2行目にようにSymPyで変数を定義するとき”complex=True”と指定すると、複素数として取り扱うことができます。
  2. 3行目のように単純に出力するとzとしか表示されませんが、4行目のようにexpand_complex関数を使うと実部と虚部を分けて表示することができます。
  3. 5行目のようにconjugate関数を使うと$\overline{Z} $のように共役複素数の表現をすることができます。これに対して6行目のようにexpand_complex関数を使うと、共役複素数を実部と虚部を分けて表示させることができます。

SymPyモジュールで代数に複素数の値を代入した場合の計算

SymPyモジュールで、変数に具体的な複素数を代入したのち、前節と同じ計算をすると次のとおりになります。

  1. #5 SymPyモジュールで代数に複素数の値を代入した場合の計算
  2. import sympy
  3. z=1+2*I
  4. display(z)
  5. display(expand_complex(z))
  6. display(conjugate(z))
  7. display(expand_complex(conjugate(z)))

1+2𝑖 
1+2𝑖
1−2𝑖
1−2𝑖
1+2𝑖

変数zに値が代入されているので、expand_complex関数を使っても単純な複素数の表示になります。

SymPyにより複素数の基本的な定理を計算する

SymPyによる共役複素数の計算

共役複素数について基本的な公式は次の通りです。

$\overline{\alpha+\beta}=\overline{\alpha}+{\overline{\beta}}$
$\overline{\alpha\beta}=\overline{\alpha}{\overline{\beta}}$
$\displaystyle \overline{ \left( \frac{\alpha}{\beta} \right) } = \frac{ \overline{ \alpha } }{ \overline{ \beta } }\quad(\beta \neq 0)$
$\overline{\overline{\alpha}}=\alpha$
$\displaystyle \frac{\alpha+\overline{\alpha}}{2}=re(\alpha)$
$\displaystyle \frac{\alpha-\overline{\alpha}}{2}=img(\alpha)$

SymPyの代数計算を使えば、これらの公式をかくにんすることができます。

  1. #6 SymPyで計算する複素数の基本的な定理
  2. var('alpha beta',complex=True)
  3. display(conjugate(alpha+beta))
  4. display(conjugate(alpha*beta))
  5. display(conjugate(alpha/beta))
  6. display(sympy.conjugate(sympy.conjugate(alpha)))
  7. display(expand_complex((alpha+conjugate(alpha))/2))
  8. display(expand_complex((alpha-conjugate(alpha))/(2*I)))

SymPyによる複素数の基本定理
SymPyによる複素数の基本定理

SymPyによる代数計算の応用

次の定理は受験参考書を見ると自明なものとしてでてきますが、しっかり意識しておかないと計算ミスにつながります。このような定理もSymPyの代数計算を使えば確認することができます。

  1. #7 複素数の基本定理2
  2. sympy.var('z',complex=True)
  3. display(sympy.conjugate(sympy.I*z))
  4. display(sympy.conjugate(z**2+sympy.I*z))

SymPyによる複素数の基本定理
SymPyによる複素数の基本定理