電磁波は横波であり、電場ベクトルは伝搬方向に垂直な面内で振動します。この電場ベクトルの振動方向のパターンを 偏波(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)$ で完全偏波・部分偏波の両方を記述できます
- ポアンカレ球: ストークスパラメータの幾何学的表現で、球面上の点が偏波状態に対応します
次のステップとして、以下の記事も参考にしてください。