Pythonで学ぶ複素数計算の基本操作と応用

数学

数学では、実数(Real Number)の他に複素数 (Complex number)も扱います。

この記事では、主にPythonを使って以下のような複素数を計算、操作、描画する方法を解説していきます。

  • Pythonによる複素数の計算と変換方法
  • Pythonによる複素数の判定方法
  • Pythonによる複素数の絶対値の求め方
  • Pythonによるグラフの描画と可視化の方法

プログラミング、機械学習など、無料体験はこちら↓↓↓


複素数とは

複素数は、実数部と虚数部から成る数の一種です。

一般的な数学の概念であり、複素数は以下の形で表されます:

ここで、 は実数部、 は虚数部を表します。 は虚数単位であり、 です。

複素数の実数部が0の場合、つまり のとき、複素数は純粋な虚数となり、虚数部が0の場合、つまり のとき、複素数は実数となります。

複素数が実数部も虚数部も持つ場合、一般的に「複素数」と呼ばれます。

Pythonでの複素数の計算と変換: 基本操作から学ぶ

Pythonを使って複素数を計算するときは、複素数の虚部に使われる記号  をjで表します。

例えば、

複素数 3+4 を3+4j と表します。

では実際に複素数を見てみましょう。

下記では、3+4j に a を割り当て、type 関数で a を指定します。

a = 3+4j
type(a)

Outputはcomplex 型のオブジェクトになります。

complex

複素数の加算と減算

次に複素数の加算と減算を行ってみます。

複素数a およびbを定義し加算を行います。

# 複素数の定義
a = 3+4j
b = 4+3j

# 加算
sum_result = a + b
print("加算結果:", sum_results)

加算結果が7+7jと出力されました。

加算結果:(7+7j)

次に減算を行います。

# 減算
substruaction_results = a-b
print("減算結果:", substraction_results)

結果は-1+1jになります。

減算結果:(-1+1j)

複素数の乗算と除算

次に複素数の乗算と除算を行います。

複素数を定義し乗算、つまり掛け算を行ってみましょう。

# 複素数の定義
a = 5+7j
b = 4+3j

# 乗算
product_results = a*b
print("乗算結果:", product_results)

乗算結果は-1+43jですね。

乗算結果: (-1+43j)

同じように除算、つまり割り算を行ってみます。

# 除算
division_results = a/b
print("除算結果:", division_results)

除算結果は1.64+0.52jとなりました。

除算結果: (1.64+0.52j)

複素数の実部と虚部の取り出し。

複素数の実部と虚部の取り出しが必要な理由は主に以下の三つになります。

    • 数学的な操作: 複素数を扱う際に、実部と虚部を分離して計算や操作を行うことがあります。たとえば、複素数の加算や減算を行う際には、実部同士と虚部同士を別々に計算して合算します。
    • 幾何学的な解釈: 複素数は平面上の点として表現できるため、実部と虚部はそれぞれx軸とy軸上の座標を示しています。このような表現を用いると、複素数の性質や演算を幾何学的に理解しやすくなります。
    • 解析学: 複素数は解析学においても重要な役割を果たします。複素数平面上での関数の解析や微分、積分を考える際に、実部と虚部を個別に扱うことがあります。

そのほかにも、複素数の実部と虚部を取り出すことで、さまざまな応用分野での問題解決などが容易になります。

では実際に、複素数の実部と虚部を取り出してみましょう。

複素数の実部は3+4jで言えば、3の部分で、虚部は4jの部分。

属性realと属性imagを使って実部と虚部の部分を取り出していきます。

まずは実部から。

# 3+4jの実部

a = 3+4j
ar = a.real
print("実部:", ar)

実部は3.0。

実部: 3.0

虚部はというと以下の通り。

# 3+4jの虚部

a = 3+4j
ai = a.imag
print("虚部:", ai)

虚部は4.0になりました。

虚部: 4.0

複素数の共役

また、複素数の共役 (conjugate) とは、実部が同じで虚部の符号が逆になったものを言います。

例えば 3+4j の共役は 3-4j。

conjugate()メソッドを使って3+4jの共役および、実部と虚部を取り出してみましょう。

# 3+4jの共役
a = 3+4j
ac = a.conjugate()
ar = a.real
ai = a.imag

print("共役:", ac)
print("実部:", ar)
print("虚部:", ai)
共役: (3-4j)
実部: 3.0
虚部: 4.0

3+4jの共役が 3-4j、実部と虚部は3.0と4.0になります。

Pythonでの複素数判定とその応用

Pythonで複素数の判定を行う場合、type()関数を使って型を判定するか、isinstance()関数でオブジェクトが指定した型に属しているかを判定します。

では複素数 3+4jを使って判定を行ってみましょう。

# 複素数の定義
z = 3 + 4j

# type() 関数を使用した複素数判定
if type(z) == complex:
   print("zは複素数です")
else:
   print("zは複素数ではありません")

# isinstance() 関数を使用した複素数判定
if isinstance(z, complex):
   print("zは複素数です")
else:
   print("zは複素数ではありません")

type()関数とisinstance()関数を使って複素数の判定を行い、両方で複素数判定が出ました。

zは複素数です
zは複素数です

複素数判定応を応用することで、データ処理や数学、プログラミングなどで適切な処理を行うことができます。

例えば、

  • プログラミングの制御フロー: 複素数か実数かで条件分岐する場合や、複素数と実数を区別して処理する場合に、複素数判定が役立ちます。
  • 数学的な演算: 複素数を扱うプログラムやライブラリの中で、複素数判定を行って特定の演算や処理を行う場合があります。
  • データフィルタリング: 複素数を含むデータセットを扱う際に、複素数を検出して適切な処理を行うために複素数判定が用いられます。

などですね。

複素数の大きさ(絶対値)の求め方

複素数の大きさ(絶対値)は、複素数の原点からその複素数を表す点までの距離を表します。

これは、複素数平面上での点と原点(原点からその点へのベクトル)のユークリッド距離として定義されます。

数式を使って絶対値を求める

複素数の絶対値は以下のように計算されます。

ここで は複素数の実部を表し、 は複素数の虚部を表します。

また絶対値は常に非負の実数となります。

この式をもとに、pythonで計算してみましょう。

# 複素数の定義
z = -2 + 5j
magnitude = (z.real**2 + z.imag**2)**0.5
print("絶対値:", round(magnitude, 3))

絶対値が5.385と出力されました。

絶対値: 5.385

abs関数を使って絶対値を求める

実は、絶対値の数式にわざわざ当てはめなくてもabs関数を使うことで絶対値を求めることができます。

実際にやってみましょう。

# 複素数の定義
z = -2 + 5j

magnitude = abs(z)
print("絶対値:", round(magnitude, 3))
絶対値: 5.385

絶対値は数式を使った時と同じように、5.385になりました。

Pythonでの複素数のグラフ描画と可視化

では複素数をグラフ上で表してみましょう。

グラフ描画で必要なモジュールmatplotlibをインストールし、グラフを描画していきます。

以下コードになります。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.rcParams['font.family'] = 'MS Gothic' #豆腐化防止

# 複素数の定義
z = -2 + 3j

# 実部と虚部を取得
real_part = z.real
imaginary_part = z.imag

# 複素数の絶対値と偏角を計算
magnitude = abs(z)
angle_rad = np.angle(z)

# グラフ描画
fig, ax = plt.subplots()
ax.scatter(real_part, imaginary_part, color='red', label='複素数')
ax.annotate(f'({real_part:.2f}, {imaginary_part:.2f})', (real_part, imaginary_part), textcoords="offset points", xytext=(5,5), ha='center')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_aspect('equal')
ax.axhline(0, color='black', lw=0.5)
ax.axvline(0, color='black', lw=0.5)
ax.set_xlabel('Real')
ax.set_ylabel('Imaginary')
ax.set_title('Complex Number Visualization')
ax.grid()
ax.legend()

plt.show()

複素数の偏角操作

複素数の偏角とは、複素数が複素数平面上でどの方向を向いているかを示す角度のことで、複素数を極座標形式で表現する際に、偏角は複素数の極角を表します。

ここで、極座標形式とは複素数を直交座標(実数部と虚数部)ではなく、大きさ(絶対値)と向き(偏角)で表現する方法であり、極角とは複素数を極座標形式で表現した際に、向きを表す角度です。

複素数の極座標形式は以下のように表します。

この式において、 が複素数の絶対値(大きさ)になりまず。

は複素数の偏角になり、x軸から複素数を表す点への線がどれだけ回転しているかを表す角度で、通常ラジアンで表されます。

複素数の偏角の計算

では早速複素数の偏角(ラジアン、度数)を計算してみましょう。

複素数を  と定義し、その偏角を計算します。

# 複素数の定義
z = -2 + 5j

import cmath
# 偏角 (ラジアン)
angle_rad = cmath.phase(z)
print("偏角 (ラジアン):", round(angle_rad, 3))

# 偏角(度数)
angle_deg = cmath.phase(z) * 180/cmath.pi
print("偏角 (度数):", round(angle_deg, 3))

以下のように、ラジアン1.951、度数111.801と計算されました。

偏角 (ラジアン): 1.951
偏角 (度数): 111.801

複素数の偏角操作と応用の具体例

PythonのライブラリNumPyを使って複素数の偏角を取得、変更して新しい複素数を生成してみます。

以下コード。

import numpy as np

# 複素数の定義
z = -2 + 5j

# 偏角の取得(ラジアン)
angle_rad = np.angle(z)
print("偏角(ラジアン):", round(angle_rad, 3))

# 偏角を変更する場合
new_angle_rad = angle_rad + np.pi / 4 # 45度分加算
new_z = np.abs(z) * np.exp(5j * new_angle_rad)
print("新しい複素数:", new_z)

NumPy によって偏角を取得、変更し新しい複素数を生成しています。

偏角(ラジアン): 1.951
新しい複素数: (2.360105511047139+4.840444398681274j)

複素数の回転

複素数の偏角を操作することで複素数を平面上で動かす(回転)ことができます。

では実際に複素数を左に30度回転させてみましょう。

import numpy as np
import matplotlib.pyplot as plt

# 複素数の定義
z = -2 + 3j

# 偏角の取得(ラジアン)
angle_rad = np.angle(z)

# 複素数の回転(30度回転)
rotation_angle_rad = np.pi / 6
rotated_z = np.abs(z) * np.exp(1j * (angle_rad + rotation_angle_rad))

# グラフ描画
plt.figure(figsize=(6, 6))
plt.plot([0, z.real], [0, z.imag], 'b', label='Original Complex Number')
plt.plot([0, rotated_z.real], [0, rotated_z.imag], 'r', label='Rotated Complex Number')
plt.axhline(0, color='black', lw=0.5)
plt.axvline(0, color='black', lw=0.5)
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Complex Number Rotation')
plt.legend()
plt.grid()
plt.show()

左へ30度回転できました。

右へ回転する場合はライン11のコードを-6にするだけです。

rotation_angle_rad = np.pi / 6

以上複素数についてまとめてみました。

プログラミング、機械学習など、無料体験はこちら↓↓↓


コメント

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