電磁波の偏波(直線・円・楕円偏波)を解説

電磁波は横波であり、電場ベクトルは伝搬方向に垂直な面内で振動します。この電場ベクトルの振動方向のパターンを 偏波(polarization) と呼びます。

偏波は、衛星通信の多重化(右旋円偏波と左旋円偏波を使い分ける)、光学フィルタ、液晶ディスプレイ、レーダーの目標識別、電離層伝搬の解析(ファラデー回転)など、工学と物理学の広い分野で重要な概念です。

本記事の内容

  • 偏波の定義と物理的意味
  • 直線偏波、円偏波、楕円偏波の数学的表現
  • ジョーンズベクトルによる偏波の行列表現
  • ストークスパラメータとポアンカレ球
  • 波長板($\lambda/4$ 板・$\lambda/2$ 板)の行列表現
  • 衛星通信における偏波の応用
  • Pythonによる偏波の3D可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

偏波とは

電場ベクトルの振動

$z$ 方向に伝搬する平面電磁波の電場は、$x$ 成分と $y$ 成分の重ね合わせで表されます。

$$ \bm{E}(z, t) = E_x(z, t)\hat{\bm{x}} + E_y(z, t)\hat{\bm{y}} $$

各成分は一般に異なる振幅と位相を持ちます。

$$ E_x(z, t) = E_{0x} \cos(\omega t – kz + \delta_x) $$

$$ E_y(z, t) = E_{0y} \cos(\omega t – kz + \delta_y) $$

ここで、$E_{0x}$, $E_{0y}$ は各成分の振幅、$\delta_x$, $\delta_y$ は初期位相です。

偏波の種類は、2つの成分の 振幅比 $E_{0y}/E_{0x}$ と 位相差 $\delta = \delta_y – \delta_x$ によって決まります。

ある固定点(例えば $z = 0$)で、時間の経過とともに電場ベクトル $(E_x, E_y)$ の先端が描く軌跡が偏波の種類を定めます。

直線偏波

条件

位相差が $\delta = 0$ または $\delta = \pi$ のとき、電場ベクトルは一直線上を振動します。

$\delta = 0$ の場合:

$$ E_x = E_{0x}\cos(\omega t – kz), \quad E_y = E_{0y}\cos(\omega t – kz) $$

$$ \frac{E_y}{E_x} = \frac{E_{0y}}{E_{0x}} = \text{const} $$

電場ベクトルの先端は、傾き $E_{0y}/E_{0x}$ の直線上を振動します。

特別な場合

  • 水平偏波($x$ 偏波): $E_{0y} = 0$ のとき、$\bm{E} = E_{0x}\cos(\omega t – kz)\hat{\bm{x}}$
  • 垂直偏波($y$ 偏波): $E_{0x} = 0$ のとき、$\bm{E} = E_{0y}\cos(\omega t – kz)\hat{\bm{y}}$
  • 45度偏波: $E_{0x} = E_{0y}$, $\delta = 0$ のとき、$\bm{E}$ は45度方向に振動

$\delta = \pi$ の場合は傾きの符号が反転します。

$$ \frac{E_y}{E_x} = -\frac{E_{0y}}{E_{0x}} $$

円偏波

条件

振幅が等しく($E_{0x} = E_{0y} = E_0$)、位相差が $\delta = \pm\pi/2$ のとき、電場ベクトルの先端は円を描きます。

$\delta = -\pi/2$($\delta_y – \delta_x = -\pi/2$)の場合、$z = 0$ で $\delta_x = 0$ とすると、

$$ E_x = E_0 \cos(\omega t) $$

$$ E_y = E_0 \cos\left(\omega t – \frac{\pi}{2}\right) = E_0 \sin(\omega t) $$

このとき、

$$ E_x^2 + E_y^2 = E_0^2 \cos^2(\omega t) + E_0^2 \sin^2(\omega t) = E_0^2 $$

電場ベクトルの先端は半径 $E_0$ の円上を動きます。

右旋と左旋の定義

電磁波の進行方向($+z$ 方向)に向かって見たとき:

  • 右旋円偏波(RHCP): 電場ベクトルが時計回りに回転($\delta = -\pi/2$)

$$ \bm{E} = E_0[\cos(\omega t – kz)\hat{\bm{x}} + \sin(\omega t – kz)\hat{\bm{y}}] $$

  • 左旋円偏波(LHCP): 電場ベクトルが反時計回りに回転($\delta = +\pi/2$)

$$ \bm{E} = E_0[\cos(\omega t – kz)\hat{\bm{x}} – \sin(\omega t – kz)\hat{\bm{y}}] $$

注意:右旋・左旋の定義は分野によって異なることがあります。IEEE/工学の慣習では上記の定義を使用します。

楕円偏波

一般的な偏波状態

一般には位相差 $\delta$ と振幅比 $E_{0y}/E_{0x}$ は任意の値をとり、電場ベクトルの先端は楕円を描きます。これを 楕円偏波 と呼びます。直線偏波と円偏波は楕円偏波の特別な場合です。

楕円の方程式の導出

$z = 0$ での電場成分は、$\phi = \omega t + \delta_x$ として、

$$ \frac{E_x}{E_{0x}} = \cos\phi $$

$$ \frac{E_y}{E_{0y}} = \cos(\phi + \delta) = \cos\phi\cos\delta – \sin\phi\sin\delta $$

第1式から $\cos\phi = E_x/E_{0x}$、$\sin\phi = \pm\sqrt{1 – (E_x/E_{0x})^2}$ を第2式に代入します。

$$ \frac{E_y}{E_{0y}} = \frac{E_x}{E_{0x}}\cos\delta – \sin\phi\sin\delta $$

$\sin\phi$ を消去するために、両辺を整理します。

$$ \frac{E_y}{E_{0y}} – \frac{E_x}{E_{0x}}\cos\delta = -\sin\phi\sin\delta $$

両辺を2乗すると、

$$ \left(\frac{E_y}{E_{0y}} – \frac{E_x}{E_{0x}}\cos\delta\right)^2 = \sin^2\phi \sin^2\delta = \left(1 – \frac{E_x^2}{E_{0x}^2}\right)\sin^2\delta $$

左辺を展開します。

$$ \frac{E_y^2}{E_{0y}^2} – 2\frac{E_x E_y}{E_{0x}E_{0y}}\cos\delta + \frac{E_x^2}{E_{0x}^2}\cos^2\delta = \sin^2\delta – \frac{E_x^2}{E_{0x}^2}\sin^2\delta $$

整理すると、偏波楕円の方程式が得られます。

$$ \begin{equation} \frac{E_x^2}{E_{0x}^2} + \frac{E_y^2}{E_{0y}^2} – 2\frac{E_x E_y}{E_{0x}E_{0y}}\cos\delta = \sin^2\delta \end{equation} $$

これは $E_x$-$E_y$ 平面上の楕円の方程式です。

特別な場合の確認

  • $\delta = 0$: 左辺 $= (E_x/E_{0x} – E_y/E_{0y})^2 = 0$ → 直線 $E_y/E_x = E_{0y}/E_{0x}$
  • $\delta = \pi/2$, $E_{0x} = E_{0y}$: $E_x^2/E_0^2 + E_y^2/E_0^2 = 1$ → 円
  • 一般の $\delta$ と振幅比 → 楕円

楕円の傾き角とアクシャル比

偏波楕円の長軸の傾き角 $\tau$ は、

$$ \begin{equation} \tan 2\tau = \frac{2E_{0x}E_{0y}}{E_{0x}^2 – E_{0y}^2}\cos\delta \end{equation} $$

アクシャル比(AR)は長軸 $a$ と短軸 $b$ の比です。

$$ AR = \frac{a}{b} $$

円偏波では $AR = 1$(0 dB)、直線偏波では $AR = \infty$ です。

ジョーンズベクトル

定義

完全偏波の電場をコンパクトに表現するために、ジョーンズベクトル を使います。複素振幅を2次元の列ベクトルにまとめます。

$$ \begin{equation} \bm{J} = \begin{pmatrix} E_{0x} e^{j\delta_x} \\ E_{0y} e^{j\delta_y} \end{pmatrix} \end{equation} $$

$\delta_x = 0$ を基準にとれば、

$$ \bm{J} = \begin{pmatrix} E_{0x} \\ E_{0y} e^{j\delta} \end{pmatrix} $$

代表的なジョーンズベクトル

正規化($|\bm{J}|^2 = 1$)した代表的な偏波のジョーンズベクトルを示します。

水平直線偏波

$$ \bm{J}_H = \begin{pmatrix} 1 \\ 0 \end{pmatrix} $$

垂直直線偏波

$$ \bm{J}_V = \begin{pmatrix} 0 \\ 1 \end{pmatrix} $$

45度直線偏波

$$ \bm{J}_{45} = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} $$

右旋円偏波(RHCP)

$$ \bm{J}_R = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ -j \end{pmatrix} $$

左旋円偏波(LHCP)

$$ \bm{J}_L = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ j \end{pmatrix} $$

ジョーンズ行列

光学素子(偏光子、波長板など)は $2 \times 2$ のジョーンズ行列で表され、入射波のジョーンズベクトルに行列を乗じることで出射波が得られます。

$$ \bm{J}_{\text{out}} = \bm{M} \cdot \bm{J}_{\text{in}} $$

波長板のジョーンズ行列

$\lambda/4$ 波長板(Quarter-wave plate)

$\lambda/4$ 板は、fast軸とslow軸の間に $\pi/2$ の位相差を導入する光学素子です。fast軸が $x$ 軸方向の場合、

$$ \begin{equation} \bm{M}_{\lambda/4} = \begin{pmatrix} 1 & 0 \\ 0 & e^{-j\pi/2} \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & -j \end{pmatrix} \end{equation} $$

応用例: 45度直線偏波を $\lambda/4$ 板に通すと円偏波が得られます。

$$ \bm{M}_{\lambda/4} \cdot \bm{J}_{45} = \begin{pmatrix} 1 & 0 \\ 0 & -j \end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ -j \end{pmatrix} = \bm{J}_R $$

45度直線偏波が右旋円偏波に変換されました。

$\lambda/2$ 波長板(Half-wave plate)

$\lambda/2$ 板は $\pi$ の位相差を導入します。

$$ \begin{equation} \bm{M}_{\lambda/2} = \begin{pmatrix} 1 & 0 \\ 0 & e^{-j\pi} \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \end{equation} $$

応用例: 右旋円偏波を $\lambda/2$ 板に通すと左旋円偏波に変換されます。

$$ \bm{M}_{\lambda/2} \cdot \bm{J}_R = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ -j \end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ j \end{pmatrix} = \bm{J}_L $$

回転した波長板

fast軸が $x$ 軸から角度 $\theta$ だけ回転している場合、ジョーンズ行列は回転行列 $\bm{R}(\theta)$ を用いて変換されます。

$$ \bm{M}(\theta) = \bm{R}(-\theta) \cdot \bm{M}_0 \cdot \bm{R}(\theta) $$

ここで回転行列は、

$$ \bm{R}(\theta) = \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} $$

ストークスパラメータとポアンカレ球

ストークスパラメータ

ジョーンズベクトルは完全偏波のみを扱えますが、ストークスパラメータ は部分偏波(自然光を含む状態)も記述できます。

4つのストークスパラメータは以下で定義されます。

$$ \begin{equation} S_0 = E_{0x}^2 + E_{0y}^2 \end{equation} $$

$$ \begin{equation} S_1 = E_{0x}^2 – E_{0y}^2 \end{equation} $$

$$ \begin{equation} S_2 = 2E_{0x}E_{0y}\cos\delta \end{equation} $$

$$ \begin{equation} S_3 = 2E_{0x}E_{0y}\sin\delta \end{equation} $$

$S_0$ は全強度(電力に比例)、$S_1$ は水平/垂直偏波の優位性、$S_2$ は45度/$-45$度偏波の優位性、$S_3$ は右旋/左旋円偏波の優位性を表します。

完全偏波では以下の関係が成り立ちます。

$$ S_0^2 = S_1^2 + S_2^2 + S_3^2 $$

部分偏波では $S_0^2 \geq S_1^2 + S_2^2 + S_3^2$ です。

偏波度

偏波度(DOP: Degree of Polarization)は、

$$ \text{DOP} = \frac{\sqrt{S_1^2 + S_2^2 + S_3^2}}{S_0} $$

完全偏波なら $\text{DOP} = 1$、完全な自然光なら $\text{DOP} = 0$ です。

代表的なストークスパラメータ

各偏波のストークスパラメータ($S_0 = 1$ に正規化)をまとめます。

偏波 $S_0$ $S_1$ $S_2$ $S_3$
水平直線 1 1 0 0
垂直直線 1 -1 0 0
45度直線 1 0 1 0
-45度直線 1 0 -1 0
右旋円 1 0 0 1
左旋円 1 0 0 -1

ポアンカレ球

ストークスパラメータ $(S_1, S_2, S_3)$ を3次元空間の座標と見なすと、完全偏波は半径 $S_0$ の球面上の点に対応します。この球を ポアンカレ球 と呼びます。

  • 赤道上: 直線偏波($S_3 = 0$)
  • 北極: 左旋円偏波($S_3 = S_0$)
  • 南極: 右旋円偏波($S_3 = -S_0$)
  • その他の点: 楕円偏波

ポアンカレ球の緯度は楕円率角 $2\chi$($\chi$ は楕円率角)、経度は偏波の傾き角 $2\tau$ に対応します。

$$ S_1 = S_0 \cos 2\chi \cos 2\tau $$

$$ S_2 = S_0 \cos 2\chi \sin 2\tau $$

$$ S_3 = S_0 \sin 2\chi $$

衛星通信における偏波の応用

偏波多重(周波数再利用)

衛星通信では、同一周波数帯で右旋円偏波(RHCP)と左旋円偏波(LHCP)を同時に使用することで、周波数利用効率を2倍にできます。理想的な円偏波同士は直交しており、互いに干渉しません。

$$ \bm{J}_R^{\dagger} \cdot \bm{J}_L = \frac{1}{2}\begin{pmatrix} 1 & j \end{pmatrix}\begin{pmatrix} 1 \\ j \end{pmatrix} = \frac{1}{2}(1 + j^2) = 0 $$

交差偏波識別度(XPD)

実際のアンテナでは完全な偏波分離は困難で、不要な偏波成分が漏れ込みます。この度合いを 交差偏波識別度(XPD: Cross-Polarization Discrimination) で表します。

$$ \text{XPD} = 10\log_{10}\frac{P_{\text{co}}}{P_{\text{cross}}} \text{ [dB]} $$

衛星通信では通常 $\text{XPD} > 25$ dB が求められます。

ファラデー回転

電離層を通過する直線偏波の電磁波は、地磁場との相互作用により偏波面が回転します(ファラデー回転)。回転角は周波数の2乗に反比例するため、低周波ほど影響が大きくなります。衛星通信で円偏波が好まれる理由の一つです。

Pythonでの実装

各種偏波の電場ベクトル軌跡の3D可視化

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# --- 偏波の3D可視化 ---
fig = plt.figure(figsize=(18, 12))

# 偏波パラメータの定義
# (名前, E0x, E0y, delta)
polarizations = [
    ('Horizontal Linear', 1.0, 0.0, 0),
    ('Vertical Linear', 0.0, 1.0, 0),
    ('45° Linear', 1.0, 1.0, 0),
    ('RHCP', 1.0, 1.0, -np.pi/2),
    ('LHCP', 1.0, 1.0, np.pi/2),
    ('Elliptical', 1.0, 0.6, np.pi/4),
]

omega = 2 * np.pi  # 正規化
k = 2 * np.pi
t = np.linspace(0, 1, 500)  # 1周期
z = np.linspace(0, 2, 500)  # 2波長分の空間

for idx, (name, E0x, E0y, delta) in enumerate(polarizations):
    ax = fig.add_subplot(2, 3, idx + 1, projection='3d')

    # 空間的な波形(t=0の瞬間)
    Ex = E0x * np.cos(-k * z)
    Ey = E0y * np.cos(-k * z + delta)

    # 3D波形
    ax.plot(z, Ex, Ey, 'b-', linewidth=1.5, alpha=0.8)

    # Ex成分(下面に射影)
    E_max = max(E0x, E0y) if max(E0x, E0y) > 0 else 1
    ax.plot(z, Ex, -E_max * np.ones_like(z), 'r-', linewidth=0.8, alpha=0.4)
    # Ey成分(側面に射影)
    ax.plot(z, E_max * np.ones_like(z), Ey, 'g-', linewidth=0.8, alpha=0.4)

    # z=0での偏波楕円
    Ex_trace = E0x * np.cos(omega * t)
    Ey_trace = E0y * np.cos(omega * t + delta)
    ax.plot(np.zeros_like(t), Ex_trace, Ey_trace, 'k-', linewidth=2)

    ax.set_xlabel('z / $\\lambda$', fontsize=9)
    ax.set_ylabel('$E_x$', fontsize=9)
    ax.set_zlabel('$E_y$', fontsize=9)
    ax.set_title(name, fontsize=12, fontweight='bold')
    ax.set_xlim([0, 2])
    ax.set_ylim([-E_max, E_max])
    ax.set_zlim([-E_max, E_max])
    ax.view_init(elev=25, azim=-60)

plt.tight_layout()
plt.savefig('polarization_3d.png', dpi=150, bbox_inches='tight')
plt.show()

偏波楕円の2D表示

import numpy as np
import matplotlib.pyplot as plt

# --- 偏波楕円の2Dプロット ---
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.flatten()

# (名前, E0x, E0y, delta, 回転方向テキスト)
polarizations = [
    ('Horizontal Linear\n($\\delta = 0$, $E_{0y}=0$)', 1.0, 0.0, 0, ''),
    ('45° Linear\n($\\delta = 0$)', 1.0, 1.0, 0, ''),
    ('-45° Linear\n($\\delta = \\pi$)', 1.0, 1.0, np.pi, ''),
    ('RHCP\n($\\delta = -\\pi/2$)', 1.0, 1.0, -np.pi/2, 'CW'),
    ('LHCP\n($\\delta = +\\pi/2$)', 1.0, 1.0, np.pi/2, 'CCW'),
    ('Elliptical\n($\\delta = \\pi/4$)', 1.0, 0.6, np.pi/4, 'CW'),
]

t = np.linspace(0, 2 * np.pi, 500)

for ax, (name, E0x, E0y, delta, rot) in zip(axes, polarizations):
    Ex = E0x * np.cos(t)
    Ey = E0y * np.cos(t + delta)

    # カラーマップで時間進行を表現
    for i in range(len(t) - 1):
        color = plt.cm.viridis(i / len(t))
        ax.plot(Ex[i:i+2], Ey[i:i+2], color=color, linewidth=2)

    # 矢印で回転方向を示す
    if rot:
        mid = len(t) // 4
        ax.annotate('', xy=(Ex[mid+1], Ey[mid+1]),
                    xytext=(Ex[mid], Ey[mid]),
                    arrowprops=dict(arrowstyle='->', color='red', lw=2))

    ax.set_xlabel('$E_x$', fontsize=11)
    ax.set_ylabel('$E_y$', fontsize=11)
    ax.set_title(name, fontsize=11)
    ax.set_xlim([-1.3, 1.3])
    ax.set_ylim([-1.3, 1.3])
    ax.set_aspect('equal')
    ax.grid(True, alpha=0.3)
    ax.axhline(y=0, color='gray', linewidth=0.5)
    ax.axvline(x=0, color='gray', linewidth=0.5)
    if rot:
        ax.text(0.95, 0.95, rot, transform=ax.transAxes,
                fontsize=12, fontweight='bold', ha='right', va='top', color='red')

plt.tight_layout()
plt.savefig('polarization_ellipse.png', dpi=150, bbox_inches='tight')
plt.show()

ポアンカレ球の可視化

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# --- ポアンカレ球 ---
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')

# 球面のワイヤーフレーム
u = np.linspace(0, 2 * np.pi, 50)
v = np.linspace(0, np.pi, 30)
x_sphere = np.outer(np.cos(u), np.sin(v))
y_sphere = np.outer(np.sin(u), np.sin(v))
z_sphere = np.outer(np.ones_like(u), np.cos(v))

ax.plot_wireframe(x_sphere, y_sphere, z_sphere,
                  alpha=0.08, color='gray', linewidth=0.5)

# 赤道と子午線
theta_eq = np.linspace(0, 2 * np.pi, 100)
ax.plot(np.cos(theta_eq), np.sin(theta_eq), np.zeros_like(theta_eq),
        'k-', linewidth=0.8, alpha=0.3)
ax.plot(np.cos(theta_eq), np.zeros_like(theta_eq), np.sin(theta_eq),
        'k-', linewidth=0.8, alpha=0.3)
ax.plot(np.zeros_like(theta_eq), np.cos(theta_eq), np.sin(theta_eq),
        'k-', linewidth=0.8, alpha=0.3)

# 代表的な偏波状態のプロット
# (名前, S1, S2, S3, 色, マーカー)
states = [
    ('H', 1, 0, 0, 'red', 'o'),
    ('V', -1, 0, 0, 'blue', 'o'),
    ('45°', 0, 1, 0, 'green', 's'),
    ('-45°', 0, -1, 0, 'orange', 's'),
    ('LHCP', 0, 0, 1, 'purple', '^'),
    ('RHCP', 0, 0, -1, 'cyan', 'v'),
]

for name, s1, s2, s3, color, marker in states:
    ax.scatter(s1, s2, s3, color=color, s=150, marker=marker,
              edgecolors='black', linewidth=1.5, zorder=5)
    ax.text(s1 * 1.15, s2 * 1.15, s3 * 1.15, name,
            fontsize=11, fontweight='bold', color=color)

# 楕円偏波の軌跡例(tiltを変化)
tau_range = np.linspace(0, 2 * np.pi, 100)
chi = np.pi / 8  # 楕円率角 22.5°
ax.plot(np.cos(2*chi) * np.cos(tau_range),
        np.cos(2*chi) * np.sin(tau_range),
        np.sin(2*chi) * np.ones_like(tau_range),
        'm--', linewidth=1.5, alpha=0.6, label=f'$\\chi = {np.degrees(chi):.1f}°$')

ax.set_xlabel('$S_1$', fontsize=13)
ax.set_ylabel('$S_2$', fontsize=13)
ax.set_zlabel('$S_3$', fontsize=13)
ax.set_title('Poincaré Sphere', fontsize=15)
ax.set_xlim([-1.3, 1.3])
ax.set_ylim([-1.3, 1.3])
ax.set_zlim([-1.3, 1.3])
ax.view_init(elev=20, azim=45)

plt.tight_layout()
plt.savefig('poincare_sphere.png', dpi=150, bbox_inches='tight')
plt.show()

ジョーンズ行列による偏波変換のシミュレーション

import numpy as np
import matplotlib.pyplot as plt

# --- ジョーンズ行列による偏波変換 ---

def jones_to_stokes(J):
    """ジョーンズベクトルからストークスパラメータを計算"""
    Ex, Ey = J[0], J[1]
    S0 = np.abs(Ex)**2 + np.abs(Ey)**2
    S1 = np.abs(Ex)**2 - np.abs(Ey)**2
    S2 = 2 * np.real(Ex * np.conj(Ey))
    S3 = 2 * np.imag(Ex * np.conj(Ey))
    return np.array([S0, S1, S2, S3])

def rotation_matrix(theta):
    """回転行列"""
    c, s = np.cos(theta), np.sin(theta)
    return np.array([[c, s], [-s, c]])

def qwp(theta=0):
    """λ/4波長板のジョーンズ行列(fast軸角度θ)"""
    M0 = np.array([[1, 0], [0, -1j]])
    R = rotation_matrix(theta)
    Rinv = rotation_matrix(-theta)
    return Rinv @ M0 @ R

def hwp(theta=0):
    """λ/2波長板のジョーンズ行列(fast軸角度θ)"""
    M0 = np.array([[1, 0], [0, -1]])
    R = rotation_matrix(theta)
    Rinv = rotation_matrix(-theta)
    return Rinv @ M0 @ R

# 水平直線偏波をλ/4板(角度θ)に通す
theta_range = np.linspace(0, np.pi, 200)
J_in = np.array([1, 0], dtype=complex)  # 水平直線偏波

S_out = np.zeros((4, len(theta_range)))
for i, theta in enumerate(theta_range):
    J_out = qwp(theta) @ J_in
    S_out[:, i] = jones_to_stokes(J_out)

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# ストークスパラメータの変化
ax = axes[0, 0]
labels = ['$S_0$', '$S_1$', '$S_2$', '$S_3$']
colors = ['black', 'red', 'green', 'blue']
for k in range(4):
    ax.plot(np.degrees(theta_range), S_out[k], color=colors[k],
            linewidth=2, label=labels[k])
ax.set_xlabel('QWP fast axis angle $\\theta$ [deg]', fontsize=11)
ax.set_ylabel('Stokes parameter', fontsize=11)
ax.set_title('H-pol through QWP at angle $\\theta$', fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# 偏波楕円の変化(選択角度)
selected_angles = [0, 22.5, 45, 67.5, 90]
ax = axes[0, 1]
t = np.linspace(0, 2 * np.pi, 300)

for theta_deg in selected_angles:
    theta = np.radians(theta_deg)
    J_out = qwp(theta) @ J_in
    Ex = np.real(J_out[0] * np.exp(1j * t))
    Ey = np.real(J_out[1] * np.exp(1j * t))
    ax.plot(Ex, Ey, linewidth=1.5, label=f'$\\theta = {theta_deg}°$')

ax.set_xlabel('$E_x$', fontsize=11)
ax.set_ylabel('$E_y$', fontsize=11)
ax.set_title('Polarization ellipse after QWP', fontsize=12)
ax.set_aspect('equal')
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_xlim([-1.2, 1.2])
ax.set_ylim([-1.2, 1.2])

# λ/2板:直線偏波の回転
ax = axes[1, 0]
for theta_deg in [0, 15, 30, 45, 60]:
    theta = np.radians(theta_deg)
    J_out = hwp(theta) @ J_in
    Ex = np.real(J_out[0] * np.exp(1j * t))
    Ey = np.real(J_out[1] * np.exp(1j * t))
    ax.plot(Ex, Ey, linewidth=2, label=f'$\\theta = {theta_deg}°$')

ax.set_xlabel('$E_x$', fontsize=11)
ax.set_ylabel('$E_y$', fontsize=11)
ax.set_title('H-pol through HWP at angle $\\theta$', fontsize=12)
ax.set_aspect('equal')
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_xlim([-1.2, 1.2])
ax.set_ylim([-1.2, 1.2])

# アクシャル比 vs QWP角度
ax = axes[1, 1]
AR_dB = []
for i, theta in enumerate(theta_range):
    J_out = qwp(theta) @ J_in
    E0x_out = np.abs(J_out[0])
    E0y_out = np.abs(J_out[1])
    delta_out = np.angle(J_out[1]) - np.angle(J_out[0])

    # 楕円の長軸・短軸を計算
    A = E0x_out**2 + E0y_out**2
    B = np.sqrt((E0x_out**2 - E0y_out**2)**2 +
                (2 * E0x_out * E0y_out * np.cos(delta_out))**2)
    a = np.sqrt(0.5 * (A + B))
    b = np.sqrt(max(0.5 * (A - B), 1e-30))
    ar = a / b if b > 1e-10 else 100
    AR_dB.append(min(20 * np.log10(ar), 40))

ax.plot(np.degrees(theta_range), AR_dB, 'b-', linewidth=2)
ax.axhline(y=0, color='green', linestyle='--', linewidth=1, label='AR = 0 dB (circular)')
ax.axhline(y=3, color='orange', linestyle=':', linewidth=1, label='AR = 3 dB')
ax.set_xlabel('QWP fast axis angle $\\theta$ [deg]', fontsize=11)
ax.set_ylabel('Axial Ratio [dB]', fontsize=11)
ax.set_title('Axial Ratio after QWP', fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_ylim([-1, 42])

plt.tight_layout()
plt.savefig('jones_matrix_demo.png', dpi=150, bbox_inches='tight')
plt.show()

まとめ

本記事では、電磁波の偏波について体系的に解説しました。

  • 偏波の分類: 電場の $x$, $y$ 成分の振幅比と位相差 $\delta$ で偏波が決まります。$\delta = 0, \pi$ で直線偏波、$\delta = \pm\pi/2$ かつ等振幅で円偏波、一般には楕円偏波です
  • 偏波楕円の方程式: $E_x^2/E_{0x}^2 + E_y^2/E_{0y}^2 – 2(E_x E_y / E_{0x}E_{0y})\cos\delta = \sin^2\delta$
  • ジョーンズベクトル: 偏波状態を2次元複素ベクトルでコンパクトに表現し、光学素子を $2 \times 2$ 行列で扱えます
  • 波長板: $\lambda/4$ 板で直線偏波を円偏波に、$\lambda/2$ 板で偏波面を回転させることができます
  • ストークスパラメータ: 4つのパラメータ $(S_0, S_1, S_2, S_3)$ で完全偏波・部分偏波の両方を記述できます
  • ポアンカレ球: ストークスパラメータの幾何学的表現で、球面上の点が偏波状態に対応します

次のステップとして、以下の記事も参考にしてください。