気象レーダーの原理と降水量推定を解説

気象レーダーは、大気中の降水粒子(雨滴、雪片、雹など)からの電波の後方散乱を利用して、降水の分布や強度を観測するレーダーシステムです。天気予報の精度向上や豪雨の早期検知、竜巻の探知など、防災・気象分野で不可欠な観測手段として世界中で運用されています。

通常のレーダーが航空機やミサイルなどの離散的な点目標を対象とするのに対し、気象レーダーは空間的に分布する降水粒子群(体積目標)を対象とします。この違いから、気象レーダーには独自のレーダー方程式やパラメータ体系が発達してきました。

本記事の内容

  • 気象レーダーの基本原理(降水粒子からのレイリー散乱)
  • レーダー反射因子 $Z$ の定義と導出
  • 気象レーダー方程式の導出
  • Z-R関係による降水量推定(Marshall-Palmer関係式)
  • ドップラー速度による風の観測
  • 二重偏波レーダーの各パラメータ
  • Pythonによるシミュレーション

前提知識

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

気象レーダーの基本原理

降水粒子からの後方散乱

気象レーダーは、一般にCバンド(5GHz、波長6cm)やSバンド(3GHz、波長10cm)、Xバンド(10GHz、波長3cm)の周波数帯を使用します。これらの周波数帯では、雨滴の直径(典型的に0.1–6mm)は波長に比べて十分小さいため、レイリー散乱の条件が成立します。

レイリー散乱の条件は次のように表されます。

$$ \frac{\pi D}{\lambda} \ll 1 \quad \Leftrightarrow \quad D \ll \frac{\lambda}{\pi} $$

ここで、$D$ は雨滴の直径、$\lambda$ はレーダーの波長です。例えば、Cバンド($\lambda = 6\,\text{cm}$)の場合、$D \ll 6/\pi \approx 1.9\,\text{cm}$ であり、通常の雨滴($D < 6\,\text{mm}$)に対してはレイリー条件が十分に満たされます。

レイリー散乱による単一球体のRCS

レイリー散乱の条件下で、直径 $D$ の誘電体球の後方散乱断面積は次のように与えられます。

$$ \sigma_b = \frac{\pi^5}{\lambda^4} |K|^2 D^6 $$

ここで、$K$ は水の複素誘電率 $\epsilon_r$ に関連する因子で、

$$ K = \frac{\epsilon_r – 1}{\epsilon_r + 2} $$

水に対しては $|K|^2 \approx 0.93$、氷に対しては $|K|^2 \approx 0.176$ です。

重要なのは、散乱断面積が $D^6$ に比例する点です。これは、雨滴の直径が2倍になるとRCSが $2^6 = 64$ 倍になることを意味し、気象レーダーの感度が大粒径の雨滴に大きく偏ることの原因となります。

レーダー反射因子 $Z$ の定義と導出

体積目標の散乱

気象レーダーが観測する「体積目標」は、レーダービーム内に存在する多数の降水粒子の集合です。単位体積あたりの合計散乱断面積(反射率)$\eta$ は、各粒子の散乱断面積の総和です。

体積 $V$ 内に $M$ 個の雨滴が存在し、$i$ 番目の雨滴の直径が $D_i$ であるとき、

$$ \eta = \frac{1}{V}\sum_{i=1}^{M} \sigma_{b,i} = \frac{\pi^5 |K|^2}{\lambda^4} \cdot \frac{1}{V}\sum_{i=1}^{M} D_i^6 $$

粒径分布による表現

実際には、雨滴の直径は連続分布に従います。直径 $D$ の雨滴の数密度分布(単位体積あたり、直径 $D$ から $D + dD$ の間にある雨滴の数)を $N(D)$(単位: $\text{m}^{-3}\text{m}^{-1}$)とすると、

$$ \frac{1}{V}\sum_{i=1}^{M} D_i^6 \to \int_0^\infty N(D) D^6 \, dD $$

この積分をレーダー反射因子 $Z$ と定義します。

$$ \boxed{Z = \int_0^\infty N(D) D^6 \, dD} $$

$Z$ の単位は $\text{mm}^6 / \text{m}^3$ です。レーダー反射因子は、降水粒子群の散乱特性を表す最も基本的なパラメータです。

dBZでの表記

$Z$ は非常に広い範囲の値をとるため、通常は対数スケール(dBZ)で表記されます。

$$ Z_{\text{dBZ}} = 10 \log_{10}\left(\frac{Z}{1\,\text{mm}^6/\text{m}^3}\right) $$

典型的な値の目安:

現象 $Z$ (dBZ) 降水強度
霧・薄い雲 $-10$〜$0$ ほぼ降水なし
弱い雨 $20$〜$30$ $\sim 1$ mm/h
中程度の雨 $30$〜$40$ $1$–$10$ mm/h
強い雨 $40$〜$50$ $10$–$50$ mm/h
激しい雷雨 $50$〜$60$ $> 50$ mm/h
$60$〜$75$

気象レーダー方程式の導出

点目標のレーダー方程式からの出発

通常のレーダー方程式は、点目標に対して次のように書けます。

$$ P_r = \frac{P_t G^2 \lambda^2 \sigma}{(4\pi)^3 R^4} $$

ここで、$P_r$ は受信電力、$P_t$ は送信電力、$G$ はアンテナ利得、$R$ は目標距離、$\sigma$ はRCSです。

体積目標への拡張

気象レーダーでは、ビーム内の多数の散乱体(レーダー分解能体積内の降水粒子群)からの散乱を合計する必要があります。

レーダーの分解能体積 $V_{\text{res}}$ は、ビーム幅 $\theta_B$(半値幅、ラジアン)と距離分解能 $\Delta R = c\tau/2$($\tau$ はパルス幅)で決まります。

距離 $R$ におけるビーム断面積は、

$$ A_{\text{beam}} = \frac{\pi}{4}\left(R\theta_B\right)^2 = \frac{\pi R^2 \theta_B^2}{4} $$

(円錐ビームと仮定、水平・垂直のビーム幅が等しい場合)

分解能体積は、

$$ V_{\text{res}} = A_{\text{beam}} \cdot \Delta R = \frac{\pi R^2 \theta_B^2}{4} \cdot \frac{c\tau}{2} = \frac{\pi R^2 \theta_B^2 c \tau}{8} $$

分解能体積内の全散乱断面積は $\eta \cdot V_{\text{res}}$ です。ここで、$\eta$ は単位体積あたりの反射率で、

$$ \eta = \frac{\pi^5 |K|^2}{\lambda^4} Z $$

気象レーダー方程式の完成

点目標のRCS $\sigma$ を $\eta \cdot V_{\text{res}}$ で置き換えます。

$$ \begin{align} P_r &= \frac{P_t G^2 \lambda^2}{(4\pi)^3 R^4} \cdot \eta \cdot V_{\text{res}} \\ &= \frac{P_t G^2 \lambda^2}{(4\pi)^3 R^4} \cdot \frac{\pi^5 |K|^2 Z}{\lambda^4} \cdot \frac{\pi R^2 \theta_B^2 c \tau}{8} \end{align} $$

整理します。

$$ \begin{align} P_r &= \frac{P_t G^2 \lambda^2 \pi^5 |K|^2 Z \pi R^2 \theta_B^2 c \tau}{(4\pi)^3 R^4 \lambda^4 \cdot 8} \\ &= \frac{P_t G^2 \pi^6 |K|^2 Z \theta_B^2 c \tau}{(4\pi)^3 \cdot 8 \cdot R^2 \lambda^2} \end{align} $$

$(4\pi)^3 = 64\pi^3$ を代入し、分母を整理します。

$$ \begin{align} P_r &= \frac{P_t G^2 \pi^6 |K|^2 Z \theta_B^2 c \tau}{64\pi^3 \cdot 8 \cdot R^2 \lambda^2} \\ &= \frac{P_t G^2 \pi^3 |K|^2 Z \theta_B^2 c \tau}{512 R^2 \lambda^2} \end{align} $$

これが気象レーダー方程式です。

$$ \boxed{P_r = \frac{\pi^3 P_t G^2 \theta_B^2 c \tau |K|^2 Z}{512 \lambda^2 R^2}} $$

点目標のレーダー方程式との重要な違いは、受信電力が $R^{-2}$ に比例する点です(点目標は $R^{-4}$)。これは、距離が遠くなると分解能体積 $V_{\text{res}}$ が $R^2$ に比例して増大するため、散乱体の数が増えて $R^{-4}$ の距離減衰を部分的に補償するためです。

レーダー定数

気象レーダー方程式を次のように整理することがあります。

$$ P_r = C \cdot \frac{Z}{R^2} $$

ここで、$C$ はレーダーシステムに固有のレーダー定数(radar constant)です。

$$ C = \frac{\pi^3 P_t G^2 \theta_B^2 c \tau |K|^2}{512 \lambda^2} $$

レーダー定数を正確に知ることで、受信電力 $P_r$ と距離 $R$ から $Z$ を求め、降水量を推定できます。

Z-R関係

Marshall-Palmer関係式

レーダー反射因子 $Z$ と降水強度 $R_{\text{rain}}$(mm/h)の関係は経験的に次の冪乗則で表されます。

$$ Z = a R_{\text{rain}}^b $$

最も広く使われているのはMarshall-Palmer(1948)の関係式です。

$$ \boxed{Z = 200 R_{\text{rain}}^{1.6}} $$

この関係式は、指数分布 $N(D) = N_0 \exp(-\Lambda D)$ の粒径分布(Marshall-Palmer分布)を仮定して導出されています。

導出の概略

Marshall-Palmer分布は次のように定義されます。

$$ N(D) = N_0 \exp(-\Lambda D) $$

ここで、$N_0 = 8000\,\text{m}^{-3}\text{mm}^{-1}$(定数)、$\Lambda = 4.1 R_{\text{rain}}^{-0.21}\,\text{mm}^{-1}$ です。

$Z$ の定義に代入します。

$$ \begin{align} Z &= \int_0^\infty N(D) D^6 \, dD \\ &= N_0 \int_0^\infty D^6 \exp(-\Lambda D) \, dD \\ &= N_0 \cdot \frac{6!}{\Lambda^7} \quad (\because \text{ガンマ関数の公式}) \\ &= \frac{720 N_0}{\Lambda^7} \end{align} $$

ここで、$\int_0^\infty x^n e^{-ax} dx = n! / a^{n+1}$ のガンマ関数の公式を用いました。

$\Lambda = 4.1 R_{\text{rain}}^{-0.21}$ を代入すると、

$$ Z = \frac{720 \times 8000}{(4.1)^7} R_{\text{rain}}^{0.21 \times 7} = \frac{720 \times 8000}{(4.1)^7} R_{\text{rain}}^{1.47} $$

実際のMarshall-Palmer関係式 $Z = 200 R_{\text{rain}}^{1.6}$ は、パラメータのフィッティングの結果として、実測データに最もよく合うように定められたものです。理論的な導出値($b \approx 1.47$)と完全には一致しませんが、降水の種類や観測条件による変動を考慮した実用的な値です。

降水種別によるZ-R関係の変化

降水の種類によって最適なZ-R関係は異なります。

降水種別 Z-R関係 参考
層状性降水 $Z = 200 R^{1.6}$ Marshall-Palmer (1948)
対流性降水 $Z = 300 R^{1.4}$
$Z = 2000 R^{2.0}$
霧雨 $Z = 25 R^{2.0}$

ドップラー速度による風の観測

ドップラー速度の定義

気象ドップラーレーダーは、降水粒子からの反射信号のドップラーシフトを測定し、粒子の視線方向(レーダービーム方向)の速度を求めます。

ドップラー速度(視線速度)$v_r$ は、

$$ v_r = \frac{\lambda f_D}{2} $$

ここで、$f_D$ はドップラー周波数です。降水粒子は風に流されて移動するため、ドップラー速度は降水粒子が存在する高度の風速の視線方向成分を反映します。

VAD(Velocity Azimuth Display)解析

VAD解析は、ドップラーレーダーのデータから上空の水平風速プロファイルを推定する手法です。

レーダーが仰角 $\phi$ で一定距離 $R$ の全方位(方位角 $\alpha$)を走査する場合、視線速度 $v_r$ は次のように表されます。

$$ v_r(\alpha) = u \sin\alpha \cos\phi + v \cos\alpha \cos\phi + w \sin\phi + v_t $$

ここで、

  • $u$ : 東西方向の風速成分
  • $v$ : 南北方向の風速成分
  • $w$ : 鉛直方向の風速成分
  • $v_t$ : 降水粒子の落下速度
  • $\alpha$ : 方位角(北から時計回り)
  • $\phi$ : 仰角

水平風が一様と仮定すると、$v_r(\alpha)$ は方位角 $\alpha$ に対して正弦関数となります。フーリエ解析により $\sin\alpha$ 成分と $\cos\alpha$ 成分を分離すれば、$u$ と $v$ を独立に推定できます。

フーリエ係数の関係:

$$ \begin{align} A_1 &= u \cos\phi \quad (\sin\alpha \text{の係数}) \\ B_1 &= v \cos\phi \quad (\cos\alpha \text{の係数}) \\ A_0 &= w \sin\phi + v_t \quad (\text{定数項}) \end{align} $$

水平風速 $V_h$ と風向 $\theta_{\text{wind}}$ は次のように求められます。

$$ V_h = \frac{\sqrt{A_1^2 + B_1^2}}{\cos\phi} $$

$$ \theta_{\text{wind}} = \arctan\left(\frac{A_1}{B_1}\right) + 180° $$

二重偏波レーダー

基本原理

二重偏波(デュアルポラリゼーション)レーダーは、水平偏波(H)と垂直偏波(V)の2つの偏波を同時に送受信するレーダーです。降水粒子の形状は一般に球対称ではなく(大きな雨滴は落下中に偏平になる)、偏波ごとに異なる散乱特性を示します。この違いを利用して、降水粒子の種類を識別し、降水量推定の精度を向上させます。

偏波パラメータ

差動反射因子 $Z_{\text{DR}}$

水平偏波と垂直偏波のレーダー反射因子の比をdBで表したものです。

$$ Z_{\text{DR}} = 10 \log_{10}\left(\frac{Z_H}{Z_V}\right) \quad [\text{dB}] $$

  • $Z_{\text{DR}} > 0$ : 粒子が水平方向に偏平(大きな雨滴など)
  • $Z_{\text{DR}} \approx 0$ : 粒子がほぼ球形(小さな雨滴、雹など)
  • $Z_{\text{DR}} < 0$ : 粒子が垂直方向に細長い(まれ)

偏波間差分位相 $\Phi_{\text{DP}}$ と比偏波間差分位相 $K_{\text{DP}}$

水平偏波と垂直偏波の位相差は、電波が降水領域を通過するにつれて蓄積されます。この位相差を偏波間差分位相 $\Phi_{\text{DP}}$ と呼びます。

$K_{\text{DP}}$ は $\Phi_{\text{DP}}$ の距離方向の勾配です。

$$ K_{\text{DP}} = \frac{1}{2}\frac{d\Phi_{\text{DP}}}{dr} \quad [°/\text{km}] $$

$K_{\text{DP}}$ は降水粒子の偏平度と含水量に比例し、電波の減衰やビーム遮蔽の影響を受けにくいため、降水量推定に非常に有効なパラメータです。

$K_{\text{DP}}$ を用いた降水量推定の例:

$$ R_{\text{rain}} = 44.0 |K_{\text{DP}}|^{0.822} \quad [\text{mm/h}] $$

偏波間相関係数 $\rho_{\text{HV}}$

水平偏波と垂直偏波の受信信号の相関係数です。

$$ \rho_{\text{HV}} = \frac{||}{\sqrt{<|S_{HH}|^2> <|S_{VV}|^2>}} $$

ここで、$S_{HH}$ と $S_{VV}$ はそれぞれ水平偏波と垂直偏波の後方散乱行列要素です。

  • $\rho_{\text{HV}} > 0.97$ : 均一な降水(雨、雪など)
  • $\rho_{\text{HV}} = 0.80$–$0.97$ : 混合降水(融解層、雨と雹の混在)
  • $\rho_{\text{HV}} < 0.80$ : 非気象エコー(地上クラッター、昆虫など)

粒子識別(ハイドロメテオ分類)

二重偏波パラメータの組み合わせにより、降水粒子の種類を識別できます。

粒子種別 $Z_H$ (dBZ) $Z_{\text{DR}}$ (dB) $\rho_{\text{HV}}$
霧雨 $< 20$ $0$–$0.5$ $> 0.98$
弱い雨 $20$–$35$ $0.5$–$2.0$ $> 0.98$
強い雨 $40$–$55$ $1.0$–$4.0$ $> 0.97$
乾いた雪 $10$–$35$ $0$–$1.0$ $> 0.97$
湿った雪 $25$–$45$ $0.5$–$3.0$ $0.85$–$0.95$
$45$–$70$ $-1.0$–$2.0$ $0.80$–$0.95$

Pythonによるシミュレーション

降水粒径分布とZ計算

Marshall-Palmer分布からレーダー反射因子 $Z$ を計算します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

# Marshall-Palmer分布のパラメータ
N0 = 8000.0  # [m^-3 mm^-1]

def marshall_palmer_N(D, R_rain):
    """
    Marshall-Palmer粒径分布
    D: 雨滴直径 [mm]
    R_rain: 降水強度 [mm/h]
    """
    Lambda = 4.1 * R_rain**(-0.21)  # [mm^-1]
    return N0 * np.exp(-Lambda * D)

# 異なる降水強度での粒径分布
R_rains = [1, 5, 10, 25, 50]  # [mm/h]
D = np.linspace(0, 6, 500)     # 雨滴直径 [mm]

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

# 粒径分布
for R_r in R_rains:
    N = marshall_palmer_N(D, R_r)
    axes[0].semilogy(D, N, linewidth=2, label=f'R = {R_r} mm/h')

axes[0].set_xlabel('Drop Diameter D [mm]', fontsize=13)
axes[0].set_ylabel(r'$N(D)$ [$m^{-3} mm^{-1}$]', fontsize=13)
axes[0].set_title('Marshall-Palmer Drop Size Distribution', fontsize=13)
axes[0].set_xlim([0, 6])
axes[0].set_ylim([1, 1e4])
axes[0].legend(fontsize=11)
axes[0].grid(True, alpha=0.3)

# Z の計算(数値積分)
R_rain_range = np.logspace(-1, 2, 200)  # 0.1 ~ 100 mm/h
Z_values = np.zeros_like(R_rain_range)

for i, R_r in enumerate(R_rain_range):
    Lambda = 4.1 * R_r**(-0.21)
    # Z = ∫ N(D) D^6 dD = N0 * 720 / Lambda^7
    Z_values[i] = N0 * 720.0 / Lambda**7  # [mm^6/m^3]

# Z-R関係のフィット(Marshall-Palmer)
Z_mp = 200 * R_rain_range**1.6

# dBZ変換
Z_dBZ = 10 * np.log10(Z_values + 1e-30)
Z_mp_dBZ = 10 * np.log10(Z_mp + 1e-30)

axes[1].plot(R_rain_range, Z_dBZ, 'b-', linewidth=2,
             label='Numerical integration')
axes[1].plot(R_rain_range, Z_mp_dBZ, 'r--', linewidth=2,
             label=r'$Z = 200 R^{1.6}$')
axes[1].set_xlabel('Rainfall Rate R [mm/h]', fontsize=13)
axes[1].set_ylabel('Z [dBZ]', fontsize=13)
axes[1].set_title('Z-R Relationship', fontsize=13)
axes[1].set_xscale('log')
axes[1].legend(fontsize=12)
axes[1].grid(True, alpha=0.3, which='both')

plt.tight_layout()
plt.show()

数値積分の結果と $Z = 200R^{1.6}$ の近似がよく一致していることが確認できます。

Z-R変換による降水量推定

レーダー観測で得られた $Z$(dBZ)から降水量を推定するプロセスをシミュレーションします。

import numpy as np
import matplotlib.pyplot as plt

def z_to_rain(Z_dBZ, a=200, b=1.6):
    """
    Z-R関係の逆変換: Z [dBZ] → R [mm/h]
    Z = a * R^b → R = (Z/a)^(1/b)
    """
    Z_linear = 10**(Z_dBZ / 10)  # dBZ → 線形値
    R = (Z_linear / a)**(1.0 / b)
    return R

# 仮想的なレーダー観測データ(PPIスキャン)
np.random.seed(42)
n_azimuth = 360   # 方位角の分割数
n_range = 200     # 距離ゲートの数
max_range = 100   # 最大距離 [km]

azimuth = np.linspace(0, 2 * np.pi, n_azimuth, endpoint=False)
range_gate = np.linspace(1, max_range, n_range)
R_grid, Az_grid = np.meshgrid(range_gate, azimuth)
X = R_grid * np.cos(Az_grid)
Y = R_grid * np.sin(Az_grid)

# 降水エコーの生成(2つのセルを重ね合わせ)
# セル1: ガウス状の降水域
x1, y1 = 30, 20
sigma1 = 15
cell1 = 45 * np.exp(-((X - x1)**2 + (Y - y1)**2) / (2 * sigma1**2))

# セル2: より強い対流セル
x2, y2 = -20, -30
sigma2 = 8
cell2 = 55 * np.exp(-((X - x2)**2 + (Y - y2)**2) / (2 * sigma2**2))

# 合成 Z [dBZ]
Z_dBZ = np.maximum(cell1, cell2)
Z_dBZ = np.maximum(Z_dBZ, 5 * np.random.randn(n_azimuth, n_range) + 10)
Z_dBZ = np.clip(Z_dBZ, 0, 65)

# 降水量に変換
R_rain = z_to_rain(Z_dBZ)

# PPIプロット
fig, axes = plt.subplots(1, 2, figsize=(16, 7))

# Z [dBZ]
im1 = axes[0].pcolormesh(X, Y, Z_dBZ, cmap='jet', vmin=0, vmax=60, shading='auto')
axes[0].set_xlabel('X [km]', fontsize=12)
axes[0].set_ylabel('Y [km]', fontsize=12)
axes[0].set_title('Radar Reflectivity Z [dBZ]', fontsize=13)
axes[0].set_aspect('equal')
plt.colorbar(im1, ax=axes[0], label='Z [dBZ]')

# 降水量 [mm/h]
im2 = axes[1].pcolormesh(X, Y, R_rain, cmap='Blues', vmin=0, vmax=50, shading='auto')
axes[1].set_xlabel('X [km]', fontsize=12)
axes[1].set_ylabel('Y [km]', fontsize=12)
axes[1].set_title('Estimated Rainfall Rate [mm/h]', fontsize=13)
axes[1].set_aspect('equal')
plt.colorbar(im2, ax=axes[1], label='Rainfall Rate [mm/h]')

plt.tight_layout()
plt.show()

左にレーダー反射因子(dBZ)、右にZ-R変換による推定降水量(mm/h)を表示しています。2つの降水セル(弱い層状性降水と強い対流セル)が明確に識別できます。

VADによる風速プロファイル推定

VAD解析をシミュレーションし、上空の水平風速プロファイルを推定します。

import numpy as np
import matplotlib.pyplot as plt

# 真の風速プロファイル(高度に依存)
def true_wind(height):
    """
    高度に応じた真の風速 (u, v)
    u: 東西成分 [m/s], v: 南北成分 [m/s]
    """
    u = 5 + 15 * (height / 5000)   # 高度とともに増加
    v = -3 + 8 * (height / 5000)   # 高度とともに増加
    return u, v

# VADパラメータ
elevation = 5.0  # 仰角 [deg]
elev_rad = np.deg2rad(elevation)
n_heights = 20   # 推定する高度数
max_range = 50   # 最大距離 [km]

# 方位角(全方位走査)
n_azimuth = 360
azimuth = np.linspace(0, 360, n_azimuth, endpoint=False)
az_rad = np.deg2rad(azimuth)

# 各距離ゲート(= 高度)での風速推定
ranges = np.linspace(5, max_range, n_heights)
heights = ranges * 1000 * np.sin(elev_rad)  # 高度 [m]

u_est = np.zeros(n_heights)
v_est = np.zeros(n_heights)
u_true = np.zeros(n_heights)
v_true = np.zeros(n_heights)

for i, (r, h) in enumerate(zip(ranges, heights)):
    # 真の風速
    u_t, v_t = true_wind(h)
    u_true[i] = u_t
    v_true[i] = v_t

    # 落下速度(仮定)
    vt = -5.0  # [m/s]

    # 視線速度の生成(ノイズ付き)
    vr = (u_t * np.sin(az_rad) + v_t * np.cos(az_rad)) * np.cos(elev_rad) \
         + (0 + vt) * np.sin(elev_rad)
    noise = np.random.randn(n_azimuth) * 1.0  # 観測ノイズ
    vr_obs = vr + noise

    # フーリエ解析(1次のsin, cos成分を抽出)
    A1 = (2 / n_azimuth) * np.sum(vr_obs * np.sin(az_rad))
    B1 = (2 / n_azimuth) * np.sum(vr_obs * np.cos(az_rad))

    # 風速の推定
    u_est[i] = A1 / np.cos(elev_rad)
    v_est[i] = B1 / np.cos(elev_rad)

# プロット
fig, axes = plt.subplots(1, 3, figsize=(16, 6))

# 東西成分
axes[0].plot(u_true, heights / 1000, 'b-', linewidth=2, label='True')
axes[0].plot(u_est, heights / 1000, 'ro', markersize=6, label='VAD estimate')
axes[0].set_xlabel('u (E-W) [m/s]', fontsize=13)
axes[0].set_ylabel('Height [km]', fontsize=13)
axes[0].set_title('East-West Wind Component', fontsize=13)
axes[0].legend(fontsize=11)
axes[0].grid(True, alpha=0.3)

# 南北成分
axes[1].plot(v_true, heights / 1000, 'b-', linewidth=2, label='True')
axes[1].plot(v_est, heights / 1000, 'ro', markersize=6, label='VAD estimate')
axes[1].set_xlabel('v (N-S) [m/s]', fontsize=13)
axes[1].set_ylabel('Height [km]', fontsize=13)
axes[1].set_title('North-South Wind Component', fontsize=13)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3)

# 風速・風向
Vh_true = np.sqrt(u_true**2 + v_true**2)
Vh_est = np.sqrt(u_est**2 + v_est**2)

axes[2].plot(Vh_true, heights / 1000, 'b-', linewidth=2, label='True')
axes[2].plot(Vh_est, heights / 1000, 'ro', markersize=6, label='VAD estimate')
axes[2].set_xlabel('Wind Speed [m/s]', fontsize=13)
axes[2].set_ylabel('Height [km]', fontsize=13)
axes[2].set_title('Horizontal Wind Speed Profile', fontsize=13)
axes[2].legend(fontsize=11)
axes[2].grid(True, alpha=0.3)

plt.suptitle(f'VAD Wind Profile Retrieval (Elevation = {elevation}°)', fontsize=14)
plt.tight_layout()
plt.show()

# 推定精度の評価
rmse_u = np.sqrt(np.mean((u_est - u_true)**2))
rmse_v = np.sqrt(np.mean((v_est - v_true)**2))
print(f"RMSE (u): {rmse_u:.2f} m/s")
print(f"RMSE (v): {rmse_v:.2f} m/s")

VAD解析により、観測ノイズが存在しても上空の風速プロファイルが精度よく推定できていることが確認できます。

二重偏波パラメータのシミュレーション

降水粒子の種類に応じた二重偏波パラメータの分布を可視化します。

import numpy as np
import matplotlib.pyplot as plt

# 各降水種別の偏波パラメータの統計量(平均, 標準偏差)
hydrometeor_types = {
    'Drizzle': {'Zh_mean': 15, 'Zh_std': 5,
                'Zdr_mean': 0.3, 'Zdr_std': 0.2,
                'rhohv_mean': 0.995, 'rhohv_std': 0.005,
                'color': 'cyan', 'n': 200},
    'Light Rain': {'Zh_mean': 28, 'Zh_std': 5,
                   'Zdr_mean': 0.8, 'Zdr_std': 0.3,
                   'rhohv_mean': 0.99, 'rhohv_std': 0.008,
                   'color': 'blue', 'n': 300},
    'Heavy Rain': {'Zh_mean': 48, 'Zh_std': 5,
                   'Zdr_mean': 2.5, 'Zdr_std': 0.8,
                   'rhohv_mean': 0.985, 'rhohv_std': 0.01,
                   'color': 'green', 'n': 200},
    'Dry Snow': {'Zh_mean': 25, 'Zh_std': 8,
                 'Zdr_mean': 0.3, 'Zdr_std': 0.3,
                 'rhohv_mean': 0.985, 'rhohv_std': 0.015,
                 'color': 'gray', 'n': 200},
    'Wet Snow': {'Zh_mean': 35, 'Zh_std': 7,
                 'Zdr_mean': 1.5, 'Zdr_std': 0.8,
                 'rhohv_mean': 0.9, 'rhohv_std': 0.04,
                 'color': 'orange', 'n': 200},
    'Hail': {'Zh_mean': 55, 'Zh_std': 8,
             'Zdr_mean': 0.2, 'Zdr_std': 1.0,
             'rhohv_mean': 0.88, 'rhohv_std': 0.05,
             'color': 'red', 'n': 150},
}

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

for name, params in hydrometeor_types.items():
    n = params['n']
    Zh = np.random.normal(params['Zh_mean'], params['Zh_std'], n)
    Zdr = np.random.normal(params['Zdr_mean'], params['Zdr_std'], n)
    rhohv = np.clip(
        np.random.normal(params['rhohv_mean'], params['rhohv_std'], n),
        0.6, 1.0
    )

    axes[0].scatter(Zh, Zdr, c=params['color'], s=10, alpha=0.4, label=name)
    axes[1].scatter(Zh, rhohv, c=params['color'], s=10, alpha=0.4, label=name)
    axes[2].scatter(Zdr, rhohv, c=params['color'], s=10, alpha=0.4, label=name)

axes[0].set_xlabel('$Z_H$ [dBZ]', fontsize=13)
axes[0].set_ylabel('$Z_{DR}$ [dB]', fontsize=13)
axes[0].set_title('$Z_H$ vs $Z_{DR}$', fontsize=13)
axes[0].legend(fontsize=9, markerscale=3)
axes[0].grid(True, alpha=0.3)

axes[1].set_xlabel('$Z_H$ [dBZ]', fontsize=13)
axes[1].set_ylabel(r'$\rho_{HV}$', fontsize=13)
axes[1].set_title(r'$Z_H$ vs $\rho_{HV}$', fontsize=13)
axes[1].grid(True, alpha=0.3)

axes[2].set_xlabel('$Z_{DR}$ [dB]', fontsize=13)
axes[2].set_ylabel(r'$\rho_{HV}$', fontsize=13)
axes[2].set_title(r'$Z_{DR}$ vs $\rho_{HV}$', fontsize=13)
axes[2].grid(True, alpha=0.3)

plt.suptitle('Dual-Polarization Parameters by Hydrometeor Type', fontsize=14)
plt.tight_layout()
plt.show()

このシミュレーションにより、各降水種別が二重偏波パラメータ空間で異なる領域を占めることが視覚的に確認できます。雹は $Z_H$ が高く $\rho_{\text{HV}}$ が低い領域に分布し、強い雨は $Z_{\text{DR}}$ が大きい領域に分布する傾向が見られます。

まとめ

本記事では、気象レーダーの原理と降水量推定について解説しました。

  • レーダー反射因子 $Z = \int N(D) D^6 dD$ は、降水粒径分布の6次モーメントとして定義される
  • 気象レーダー方程式では、受信電力は $R^{-2}$ に比例する(体積目標のため、点目標の $R^{-4}$ とは異なる)
  • Marshall-Palmer関係式 $Z = 200R^{1.6}$ により、$Z$ から降水量 $R$ を推定できる
  • ドップラー速度のVAD解析により、上空の水平風速プロファイルを推定できる
  • 二重偏波レーダーのパラメータ($Z_{\text{DR}}$, $K_{\text{DP}}$, $\rho_{\text{HV}}$)により、降水粒子の種類識別と高精度な降水量推定が可能になる

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