連続時間マルコフ連鎖の理論をわかりやすく解説

離散時間マルコフ連鎖では、系の状態が各時刻($t = 0, 1, 2, \dots$)に遷移します。しかし、多くの現実のシステムでは、状態の変化は離散的な時刻ではなく、連続的な時間の中でランダムな瞬間に起こります。たとえば、サーバーへのリクエストの到着、電話交換機への通話の着信、化学反応における分子の状態変化などは、連続時間で起きる確率的な遷移です。

このような連続時間における状態遷移をモデル化するのが連続時間マルコフ連鎖(Continuous-Time Markov Chain, CTMC)です。CTMCは離散時間マルコフ連鎖を時間方向に自然に拡張したものであり、待ち行列理論、信頼性工学、生物学、化学反応速度論など幅広い分野で基本的なモデルとして使われています。

連続時間マルコフ連鎖を理解すると、以下のような応用が可能です。

  • 待ち行列理論: M/M/1, M/M/c などの待ち行列モデルの数学的基盤です
  • 信頼性工学: システムの故障・修理のモデル化に使われます
  • 生物学: 遺伝子発現のオン/オフモデル、イオンチャネルの開閉モデルに応用されます
  • 化学反応: ギレスピーアルゴリズムによる確率的化学反応シミュレーションの基礎です

本記事の内容

  • 連続時間マルコフ連鎖の定義とマルコフ性
  • 滞在時間の指数分布と生成行列
  • コルモゴロフの前進・後退方程式
  • 定常分布の導出
  • Pythonによるシミュレーションと可視化

前提知識

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

離散時間からの自然な拡張

離散時間マルコフ連鎖の復習

離散時間マルコフ連鎖では、系は状態 $\{1, 2, \dots, s\}$ の中を遷移し、時刻 $n$ での状態 $X_n$ は遷移行列 $\bm{P} = (p_{ij})$ に従います。

$$ p_{ij} = P(X_{n+1} = j \mid X_n = i) $$

連続時間への移行 — 2つの要素

連続時間マルコフ連鎖では、離散時間からの移行において2つの要素が加わります。

  1. 滞在時間: 各状態にどれくらい留まるか(ランダムな時間)
  2. 遷移先の選択: 状態を離れるとき、どの状態に移るか

CTMCでは、状態 $i$ に入ってから次の遷移が起こるまでの滞在時間は、パラメータ $q_i$ の指数分布に従います。そして、遷移が起きたとき、状態 $j$ に移る確率は離散的な確率で決まります。

なぜ滞在時間が指数分布でなければならないのかを、次のセクションで理解しましょう。

滞在時間と指数分布

マルコフ性が指数分布を要請する

連続時間マルコフ連鎖のマルコフ性(memoryless property)は、「現在の状態だけが将来を決め、過去は関係ない」というものです。

状態 $i$ に時刻 $0$ で入ったとして、時刻 $s$ まで遷移が起きなかったとします。この条件のもとで、さらに時間 $t$ だけ状態 $i$ に留まる確率は、最初から数えた場合と同じでなければなりません(すでに待った $s$ の分だけ「次の遷移が近い」ということはない)。

$$ P(T > s + t \mid T > s) = P(T > t) $$

ここで $T$ は状態 $i$ での滞在時間です。この無記憶性を満たす連続分布は指数分布のみです。

$$ \begin{equation} T_i \sim \text{Exp}(q_i), \quad P(T_i > t) = e^{-q_i t} \end{equation} $$

$q_i$ は状態 $i$ からの脱出率(departure rate)または総遷移率と呼ばれます。$q_i$ が大きいほど、状態 $i$ に短時間しか滞在しません。平均滞在時間は $E[T_i] = 1/q_i$ であり、分散は $\text{Var}(T_i) = 1/q_i^2$ です。

指数分布の無記憶性は直感に反する場合があります。「もう長時間待ったのだから、そろそろ遷移が起きるはず」と感じるかもしれませんが、指数分布のもとでは待った時間は将来に何の影響も与えません。これはポアソン過程における「到着間隔」の性質と同じであり、ポアソン過程がCTMCと密接に関連している理由の一つです。

なお、$q_i = 0$ の場合、状態 $i$ は吸収状態(absorbing state)であり、一度入ると二度と離れません。

埋め込みマルコフ連鎖

状態 $i$ を離れるときの遷移先は、埋め込みマルコフ連鎖(embedded Markov chain)の遷移行列 $\bm{R} = (r_{ij})$ で決まります。

$$ r_{ij} = P(\text{次に状態 } j \text{ に遷移} \mid \text{現在状態 } i), \quad r_{ii} = 0 $$

$r_{ij}$ は $i \neq j$ について $\sum_{j \neq i} r_{ij} = 1$ を満たします。

滞在時間と遷移先の選択を組み合わせると、CTMCの完全な記述が得られます。

生成行列(遷移率行列)

定義

CTMCの遷移構造を一つの行列にまとめたものが生成行列(generator matrix, infinitesimal generator, Q行列)$\bm{Q} = (q_{ij})$ です。

$$ \begin{equation} q_{ij} = \begin{cases} q_i \cdot r_{ij} & (i \neq j) \\ -q_i = -\sum_{j \neq i} q_{ij} & (i = j) \end{cases} \end{equation} $$

生成行列の性質: – 非対角要素は非負: $q_{ij} \geq 0$ for $i \neq j$ – 各行の和はゼロ: $\sum_j q_{ij} = 0$ for all $i$ – 対角要素は非正: $q_{ii} \leq 0$

$q_{ij}$($i \neq j$)は状態 $i$ から状態 $j$ への遷移率(transition rate)と呼ばれます。微小時間 $\Delta t$ の間に状態 $i$ から状態 $j$ に遷移する確率は近似的に $q_{ij} \Delta t$ です。より正確には、$P(X(t + \Delta t) = j \mid X(t) = i) = q_{ij} \Delta t + o(\Delta t)$ です。

生成行列は離散時間の遷移行列 $\bm{P}$ から単位行列 $\bm{I}$ を引いてスケーリングしたものと直感的に理解できます。離散時間で遷移行列が $\bm{P} = \bm{I} + \bm{Q}\Delta t$ のように書けるとすると、$\bm{Q} = (\bm{P} – \bm{I})/\Delta t$ は微小時間あたりの「変化率」を表す行列です。$\Delta t \to 0$ の極限がCTMCの生成行列です。

遷移確率行列との関係

時刻 $0$ に状態 $i$ にいて、時刻 $t$ に状態 $j$ にいる確率を $p_{ij}(t)$ とし、遷移確率行列を $\bm{P}(t) = (p_{ij}(t))$ と書きます。

生成行列と遷移確率行列の間には次の基本的な関係があります。

$$ \begin{equation} \bm{P}(t) = e^{\bm{Q}t} \end{equation} $$

これは行列指数関数であり、スカラーの場合の $e^{at}$ の自然な拡張です。

微分の形で書くと、

$$ \bm{P}'(t) = \bm{Q}\bm{P}(t) = \bm{P}(t)\bm{Q} $$

この微分方程式がコルモゴロフ方程式です。

コルモゴロフ方程式

前進方程式(フォッカー・プランク方程式の離散版)

コルモゴロフの前進方程式は、遷移確率の時間発展を記述する微分方程式です。

$$ \begin{equation} \frac{d\bm{P}(t)}{dt} = \bm{P}(t)\bm{Q} \end{equation} $$

成分で書くと:

$$ \frac{dp_{ij}(t)}{dt} = \sum_{k} p_{ik}(t) q_{kj} = \sum_{k \neq j} p_{ik}(t) q_{kj} – p_{ij}(t) q_j $$

右辺の第1項 $\sum_{k \neq j} p_{ik}(t) q_{kj}$ は、状態 $j$ 以外の状態 $k$ から状態 $j$ への流入率です。第2項 $-p_{ij}(t) q_j$ は、状態 $j$ から他の状態への流出率です。つまり、前進方程式は確率の流入と流出のバランスを記述しています。

前進方程式の導出

チャップマン・コルモゴロフ方程式 $\bm{P}(t + \Delta t) = \bm{P}(t)\bm{P}(\Delta t)$ から出発します。この方程式はマルコフ性の直接的な帰結であり、「時刻 $0$ から $t + \Delta t$ への遷移」を「時刻 $0$ から $t$ への遷移」と「時刻 $t$ から $t + \Delta t$ への遷移」に分解したものです。

微小時間 $\Delta t$ に対して、

$$ \bm{P}(\Delta t) \approx \bm{I} + \bm{Q}\Delta t $$

この近似は、$\Delta t$ が十分小さいとき、ほぼ確実に遷移は高々1回しか起きない(遷移なし: $\bm{I}$、1回遷移: $\bm{Q}\Delta t$)という事実を反映しています。2回以上の遷移は $O((\Delta t)^2)$ で無視できます。

これを代入すると、

$$ \bm{P}(t + \Delta t) \approx \bm{P}(t)(\bm{I} + \bm{Q}\Delta t) = \bm{P}(t) + \bm{P}(t)\bm{Q}\Delta t $$

$$ \frac{\bm{P}(t + \Delta t) – \bm{P}(t)}{\Delta t} \approx \bm{P}(t)\bm{Q} $$

$\Delta t \to 0$ で前進方程式が得られます。

後退方程式

同様に、$\bm{P}(t + \Delta t) = \bm{P}(\Delta t)\bm{P}(t)$ から出発すると後退方程式が得られます。

$$ \begin{equation} \frac{d\bm{P}(t)}{dt} = \bm{Q}\bm{P}(t) \end{equation} $$

前進方程式と後退方程式は $\bm{Q}$ が右から掛かるか左から掛かるかの違いです。有限状態空間のCTMCでは両方程式は同じ解 $\bm{P}(t) = e^{\bm{Q}t}$ を持ちます。

解の行列指数関数表現

コルモゴロフ方程式の解は、初期条件 $\bm{P}(0) = \bm{I}$ のもとで次のように表されます。

$$ \bm{P}(t) = e^{\bm{Q}t} = \sum_{k=0}^{\infty} \frac{(\bm{Q}t)^k}{k!} $$

$\bm{Q}$ が対角化可能で $\bm{Q} = \bm{S}\bm{\Lambda}\bm{S}^{-1}$($\bm{\Lambda} = \text{diag}(\lambda_1, \dots, \lambda_s)$)と書けるとき、

$$ \bm{P}(t) = \bm{S} \, \text{diag}(e^{\lambda_1 t}, \dots, e^{\lambda_s t}) \, \bm{S}^{-1} $$

生成行列の固有値はすべて実部が非正であり($\text{Re}(\lambda_k) \leq 0$)、定常分布に対応する固有値は $\lambda_1 = 0$ です。他の固有値は負の実部を持つため、$t \to \infty$ で $e^{\lambda_k t} \to 0$ となり、遷移確率行列は定常分布に収束します。

状態確率の時間発展

初期状態の確率分布を行ベクトル $\bm{p}(0) = (p_1(0), p_2(0), \dots, p_s(0))$ とすると、時刻 $t$ での状態確率は、

$$ \bm{p}(t) = \bm{p}(0)\bm{P}(t) = \bm{p}(0)e^{\bm{Q}t} $$

この式を微分すると、マスター方程式(master equation)が得られます。

$$ \frac{d\bm{p}(t)}{dt} = \bm{p}(t)\bm{Q} $$

$j$ 番目の成分について書くと、

$$ \frac{dp_j(t)}{dt} = \sum_{k \neq j} p_k(t) q_{kj} – p_j(t) q_j $$

これは状態 $j$ にいる確率の時間変化が、他の状態からの流入(第1項)と状態 $j$ からの流出(第2項)の差で決まることを示しています。化学反応速度論のマスター方程式とまったく同じ形をしています。

コルモゴロフ方程式の長時間挙動($t \to \infty$)は定常分布を与えます。次に定常分布の性質を詳しく見ましょう。

定常分布

定義と計算

CTMCの定常分布 $\bm{\pi} = (\pi_1, \pi_2, \dots, \pi_s)$ は、次の条件を満たします。

$$ \begin{equation} \bm{\pi}\bm{Q} = \bm{0}, \quad \sum_i \pi_i = 1 \end{equation} $$

これは離散時間の $\bm{\pi}\bm{P} = \bm{\pi}$ に対応する条件です。

成分で書くと:

$$ \sum_i \pi_i q_{ij} = 0 \quad \text{for all } j $$

定常分布の存在と一意性

定常分布の存在と一意性は、CTMCの構造に依存します。

既約性(irreducibility): 任意の状態 $i$ から任意の状態 $j$ に有限時間内に正の確率で到達できるとき、CTMCは既約です。既約なCTMCでは、定常分布が存在すれば一意です。

正再帰性(positive recurrence): 有限状態空間の既約CTMCは必ず正再帰的であり、定常分布が存在します。無限状態空間の場合は、正再帰性の追加的な検証が必要です。

グローバルバランス方程式

定常分布の方程式 $\bm{\pi}\bm{Q} = \bm{0}$ を成分ごとに書き下すと、グローバルバランス方程式が得られます。

$$ \sum_{i \neq j} \pi_i q_{ij} = \pi_j q_j = \pi_j \sum_{k \neq j} q_{jk} $$

左辺は状態 $j$ への流入率(inflow rate)、右辺は状態 $j$ からの流出率(outflow rate)です。定常状態では、各状態への流入と流出が釣り合っています。

これを水道管のネットワークに例えると分かりやすいでしょう。各状態をタンク、遷移率をパイプの太さと考えます。定常状態では、各タンクの水量が一定(流入量 = 流出量)です。

詳細釣り合い条件

多くの応用で、定常分布は詳細釣り合い条件(detailed balance)を満たします。

$$ \begin{equation} \pi_i q_{ij} = \pi_j q_{ji} \quad \text{for all } i, j \end{equation} $$

詳細釣り合いが成り立つCTMCは可逆(reversible)と呼ばれます。詳細釣り合いはグローバルバランスよりも強い条件であり、「すべての状態対の間で流れが釣り合う」ことを要求します。グローバルバランスは各状態の「全体としての」流入・流出の釣り合いしか要求しません。

詳細釣り合いが成り立つかどうかの直感的な判定法があります。CTMCの生成行列で、任意のサイクル $i_1 \to i_2 \to \cdots \to i_k \to i_1$ について、

$$ q_{i_1 i_2} q_{i_2 i_3} \cdots q_{i_k i_1} = q_{i_1 i_k} q_{i_k i_{k-1}} \cdots q_{i_2 i_1} $$

が成り立つとき(コルモゴロフの循環条件)、詳細釣り合いが成立します。

定常分布の計算例

3状態のCTMCで定常分布を具体的に計算してみましょう。生成行列が

$$ \bm{Q} = \begin{pmatrix} -2 & 1 & 1 \\ 3 & -5 & 2 \\ 1 & 2 & -3 \end{pmatrix} $$

の場合、$\bm{\pi}\bm{Q} = \bm{0}$ と $\pi_1 + \pi_2 + \pi_3 = 1$ から、

$$ -2\pi_1 + 3\pi_2 + \pi_3 = 0 $$

$$ \pi_1 – 5\pi_2 + 2\pi_3 = 0 $$

$$ \pi_1 + \pi_2 + \pi_3 = 1 $$

1番目の式から $\pi_3 = 2\pi_1 – 3\pi_2$。これを2番目の式に代入すると $\pi_1 – 5\pi_2 + 2(2\pi_1 – 3\pi_2) = 0$、すなわち $5\pi_1 – 11\pi_2 = 0$、$\pi_1 = \frac{11}{5}\pi_2$。正規化条件から $\frac{11}{5}\pi_2 + \pi_2 + (2 \cdot \frac{11}{5} – 3)\pi_2 = 1$ を解くと、$\pi_2 = \frac{5}{23}$, $\pi_1 = \frac{11}{23}$, $\pi_3 = \frac{7}{23}$ が得られます。

吸収状態と過渡解析

吸収状態

ある状態 $i$ で $q_i = 0$($\bm{Q}$ の第 $i$ 行がすべてゼロ)のとき、状態 $i$ は吸収状態(absorbing state)です。一度吸収状態に入ると、二度と離れません。

吸収状態を持つCTMCでは、「吸収されるまでの時間」や「どの吸収状態に吸収されるか」の確率が重要な解析対象になります。これは信頼性工学(システムの故障までの時間)や生態学(種の絶滅までの時間)で重要です。

一次通過時間

状態 $i$ から出発して、初めて状態 $j$ に到達するまでの時間を一次通過時間(first passage time)$T_{ij}$ と呼びます。一次通過時間の期待値 $m_{ij} = E[T_{ij}]$ は次の方程式系を満たします。

$$ \sum_{k \neq i} q_{ik} (m_{kj} – m_{ij}) = -1 \quad \text{for } i \neq j $$

この方程式を成分ごとに整理すると、

$$ q_i \cdot m_{ij} = 1 + \sum_{k \neq i} q_{ik} \cdot m_{kj} $$

$$ m_{ij} = \frac{1}{q_i} + \sum_{k \neq i} \frac{q_{ik}}{q_i} \cdot m_{kj} = \frac{1}{q_i} + \sum_{k \neq i} r_{ik} \cdot m_{kj} $$

直感的な読み方をすると、「状態 $i$ での平均滞在時間 $1/q_i$ を過ごした後、確率 $r_{ik}$ で状態 $k$ に移り、そこから $j$ に到達するまでに $m_{kj}$ の時間がかかる」という再帰的構造を反映しています。

吸収確率

複数の吸収状態 $\{a_1, a_2, \dots\}$ がある場合、過渡状態 $i$ から出発してどの吸収状態に吸収されるかの確率も重要です。状態 $i$ から出発して吸収状態 $a$ に吸収される確率 $h_i(a)$ は、

$$ \sum_{k \neq i} q_{ik} \cdot h_k(a) = q_i \cdot h_i(a) \quad \text{for } i \notin \{\text{吸収状態}\} $$

境界条件として $h_{a}(a) = 1$、$h_{a’}(a) = 0$($a’ \neq a$ が別の吸収状態)を課して解きます。

フェーズ型分布

吸収状態を1つ持つCTMCにおいて、吸収までの時間の分布をフェーズ型分布(phase-type distribution)と呼びます。過渡状態の集合を $\{1, \dots, n\}$、吸収状態を $n+1$ とし、過渡状態間の遷移率行列を $\bm{T}$ とします。初期分布を $\bm{\alpha}$ とすると、吸収時間 $\tau$ の分布は

$$ P(\tau > t) = \bm{\alpha} \, e^{\bm{T}t} \, \bm{1} $$

フェーズ型分布は稠密性(任意の非負分布をフェーズ型分布で近似できる)を持ち、待ち行列理論で一般的なサービス時間分布のモデリングに広く使われます。

CTMCの均一化(一様化)

一様化の手法

CTMCのシミュレーションや解析を簡単にする手法として一様化(uniformization)があります。

アイデアは、すべての状態の脱出率を同じ値 $\gamma \geq \max_i q_i$ に揃えた離散時間マルコフ連鎖を構成することです。

遷移行列 $\bm{P}_{\text{unif}} = \bm{I} + \bm{Q}/\gamma$ を定義すると、元のCTMCの遷移確率は

$$ \bm{P}(t) = e^{\bm{Q}t} = e^{-\gamma t} \sum_{k=0}^{\infty} \frac{(\gamma t)^k}{k!} \bm{P}_{\text{unif}}^k $$

と表されます。右辺はポアソン分布の重みで離散時間マルコフ連鎖のべき乗を足し合わせたものであり、数値計算で行列指数関数を直接計算するよりも安定な場合があります。

ここまでの理論をPythonで実装・可視化しましょう。

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

import numpy as np
from scipy.linalg import expm
import matplotlib.pyplot as plt

def simulate_ctmc(Q, initial_state, T_max, seed=None):
    """連続時間マルコフ連鎖のシミュレーション"""
    if seed is not None:
        np.random.seed(seed)
    s = Q.shape[0]
    state = initial_state
    t = 0.0
    times = [0.0]
    states = [state]

    while t < T_max:
        rate = -Q[state, state]
        if rate <= 0:
            break
        # 滞在時間(指数分布)
        dt = np.random.exponential(1 / rate)
        t += dt
        if t > T_max:
            break
        # 遷移先の選択
        probs = Q[state, :].copy()
        probs[state] = 0
        probs = probs / np.sum(probs)
        state = np.random.choice(s, p=probs)
        times.append(t)
        states.append(state)

    return np.array(times), np.array(states)

# --- 3状態のCTMC(天気モデル)---
# 状態: 0=晴れ, 1=曇り, 2=雨
Q = np.array([
    [-0.5,  0.3,  0.2],
    [ 0.4, -0.7,  0.3],
    [ 0.3,  0.4, -0.7]
])
state_names = ["Sunny", "Cloudy", "Rainy"]

# シミュレーション
times, states = simulate_ctmc(Q, initial_state=0, T_max=100, seed=42)

# 定常分布の計算
# πQ = 0, Σπ = 1
A = Q.T.copy()
A[-1, :] = 1.0
b = np.zeros(3)
b[-1] = 1.0
pi_exact = np.linalg.solve(A, b)

# シミュレーションからの経験的分布
total_time = times[-1]
empirical_pi = np.zeros(3)
for i in range(len(times) - 1):
    empirical_pi[states[i]] += times[i + 1] - times[i]
empirical_pi /= total_time

print("=" * 50)
print("連続時間マルコフ連鎖の結果")
print("=" * 50)
print(f"\n定常分布(理論):   {pi_exact.round(4)}")
print(f"定常分布(経験的): {empirical_pi.round(4)}")

# --- 可視化 ---
fig, axes = plt.subplots(2, 2, figsize=(13, 10))

# サンプルパス
ax = axes[0, 0]
ax.step(times, states, where="post", linewidth=1, color="steelblue")
ax.set_yticks([0, 1, 2])
ax.set_yticklabels(state_names)
ax.set_xlabel("Time", fontsize=11)
ax.set_ylabel("State", fontsize=11)
ax.set_title("Sample path of CTMC", fontsize=12)
ax.set_xlim(0, 50)
ax.grid(True, alpha=0.3)

# 遷移確率の時間発展
ax = axes[0, 1]
t_vals = np.linspace(0, 15, 100)
for j in range(3):
    probs = [expm(Q * t)[0, j] for t in t_vals]
    ax.plot(t_vals, probs, linewidth=2, label=f"P(X(t)={state_names[j]} | X(0)=Sunny)")
    ax.axhline(pi_exact[j], color=f"C{j}", linestyle="--", alpha=0.5)
ax.set_xlabel("Time t", fontsize=11)
ax.set_ylabel("Probability", fontsize=11)
ax.set_title("Transition probabilities (from Sunny)", fontsize=12)
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)

# 定常分布の比較
ax = axes[1, 0]
x_pos = np.arange(3)
width = 0.3
ax.bar(x_pos - width/2, pi_exact, width, color="steelblue", alpha=0.7,
       label="Theoretical")
ax.bar(x_pos + width/2, empirical_pi, width, color="orange", alpha=0.7,
       label="Empirical (T=100)")
ax.set_xticks(x_pos)
ax.set_xticklabels(state_names)
ax.set_ylabel("Probability", fontsize=11)
ax.set_title("Stationary distribution", fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3, axis="y")

# 滞在時間のヒストグラム
ax = axes[1, 1]
for s_val in range(3):
    sojourn_times = []
    for i in range(len(states) - 1):
        if states[i] == s_val:
            sojourn_times.append(times[i + 1] - times[i])
    if sojourn_times:
        ax.hist(sojourn_times, bins=20, density=True, alpha=0.5,
                label=f"{state_names[s_val]}")
        # 理論曲線
        rate = -Q[s_val, s_val]
        t_plot = np.linspace(0, max(sojourn_times), 100)
        ax.plot(t_plot, rate * np.exp(-rate * t_plot), linewidth=2)

ax.set_xlabel("Sojourn time", fontsize=11)
ax.set_ylabel("Density", fontsize=11)
ax.set_title("Sojourn time distributions", fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("ctmc_simulation.png", dpi=150, bbox_inches="tight")
plt.show()

この可視化から、以下のことが確認できます。

  1. サンプルパス(左上)は状態間のランダムな遷移を示している。各状態での滞在時間がランダムであり、遷移が不規則な時刻で起こることがCTMCの特徴です

  2. 遷移確率(右上)は定常分布に収束している。初期状態がSunnyであっても、時間が経つにつれて各状態にいる確率は定常分布に近づきます。破線が定常分布の値であり、実線がそこに収束していることが確認できます

  3. 経験的な定常分布(左下)は理論値と良く一致している。$T = 100$ のシミュレーションでも十分な精度が得られています

  4. 滞在時間の分布(右下)は指数分布に従っている。ヒストグラムと理論的な指数分布の密度関数がよく一致しており、CTMCの基本的な性質が数値的に検証されています

まとめ

本記事では、連続時間マルコフ連鎖の理論を導出し、Pythonで実装しました。

  • 連続時間マルコフ連鎖はマルコフ性により、各状態での滞在時間が指数分布に従います
  • 生成行列(Q行列) は遷移率を表し、各行の和がゼロです。遷移確率行列は $\bm{P}(t) = e^{\bm{Q}t}$ で得られます
  • コルモゴロフ方程式 $\bm{P}'(t) = \bm{Q}\bm{P}(t)$ が遷移確率の時間発展を支配します
  • 定常分布は $\bm{\pi}\bm{Q} = \bm{0}$ を満たし、系が長時間後に到達する平衡状態です

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