0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

半減期を10回経ても約1000個に1個は残る。放射性崩壊の指数減衰をJavaScriptで再現

0
Posted at

「半減期って、半分になるんでしょ?じゃあ2回経てばゼロじゃん」

——これ、実は最大の誤解なんです。しかも、この誤解のまま放射性廃棄物の話をすると、管理期間を10分の1で見積もってしまう危険があります。

今日は、放射性崩壊シミュレーター(ブラウザで動く無料ツール)を題材に、半減期の本当の姿を「数式→コード→実測」の3段階でガッツリ解説します。

結論から言うと、半減期を10回経ても原子は約1000個に1個残る——この感覚が、医療・考古学・環境モニタリングの現場で死活問題になるんです。

▶ 今回のシミュレーター: 放射性崩壊シミュレーター (ブラウザで動作・登録不要)


導入:なぜ「半分」のイメージが危険なのか

「放射性物質って、半減期が過ぎれば安全になるんでしょ?」

——これ、完全な誤解です。半減期は「半分になる時間」であって、「なくなる時間」ではありません。

例えば、ヨウ素131(半減期8日)を考えてみましょう。

  • 8日後:1/2
  • 16日後:1/4
  • 24日後:1/8
  • 32日後:1/16

「まだ残ってるじゃん!」となりますよね。

実は、半減期を10回経ても、初期の約0.1%は残り続けるんです。これが、放射性廃棄物の管理期間が「数十年〜数万年」になる理由の一つ。

この感覚を、今日は数式とコードとシミュレーターで完全に理解しましょう。


ざっくり本質:コイン投げでわかる指数減衰

放射性崩壊を一番簡単にイメージする方法——それはコイン投げです。

  • 1秒ごとに、全ての原子がコインを投げる
  • 表が出たら崩壊(消える)
  • 裏が出たら生き残る

これ、まさに半減期の本質です。

コインは1/2の確率で表が出る。つまり、1秒ごとに原子数は約1/2になる。これが「半減期1秒」の放射性崩壊。

重要なのは、「個々の原子がいつ崩壊するかは予測できないが、大量の原子の振る舞いは確率的に決まる」という点。これが量子力学の核心であり、放射性崩壊の基礎です。

「放射性崩壊は、原子1個1個の『いつ死ぬかわからない』を、10の23乗個集めて確率にしたもの」


数式で理解する

ここからが本番。シミュレーターの計算ロジックを、数式のレベルで完全再現します。

基本の崩壊則

放射性崩壊の基本式は、指数関数的減衰で表されます。

N(t) = N_0\,e^{-\lambda t},\qquad \lambda = \dfrac{\ln 2}{T_{1/2}}

各項の意味:

  • $N(t)$ :時刻 $t$ における残存原子数
  • $N_0$ :初期原子数($t=0$ のときの原子数)
  • $\lambda$ :崩壊定数(単位時間あたりに崩壊する確率)
  • $T_{1/2}$ :半減期(原子数が半分になる時間)
  • $e$ :自然対数の底(約2.718)

なぜ $\ln 2$ が出てくるのか?

半減期の定義「$N(T_{1/2}) = N_0 / 2$」を代入すると:

\frac{N_0}{2} = N_0 e^{-\lambda T_{1/2}}

両辺を $N_0$ で割って:

\frac{1}{2} = e^{-\lambda T_{1/2}}

両辺の自然対数を取ると:

\ln(1/2) = -\lambda T_{1/2}
-\ln 2 = -\lambda T_{1/2}

よって:

\lambda = \frac{\ln 2}{T_{1/2}}

この式の直感的意味:半減期が短いほど $\lambda$ は大きく、崩壊が速い。逆に半減期が長いほど $\lambda$ は小さく、ゆっくり崩壊する。

放射能(Bq)への変換

シミュレーターでは「原子数」と「放射能(Bq)」の両方を表示できます。この関係は:

A(t) = \lambda N(t) = \lambda N_0 e^{-\lambda t}

ここで $A(t)$ は放射能(単位:ベクレル Bq)。1 Bq = 1秒間に1個の原子が崩壊。

重要なポイント:同じ原子数でも、半減期が短い($\lambda$ が大きい)ほど放射能は大きい。これが、I-131(半減期8日)とC-14(半減期5730年)で「同じ原子数でも危険度が全然違う」理由。

バテマン方程式(崩壊系列)

親核種Aが子核種Bに崩壊する場合(A→B)、両方の量は以下の連立微分方程式で記述されます:

\frac{dN_A}{dt} = -\lambda_A N_A
\frac{dN_B}{dt} = \lambda_A N_A - \lambda_B N_B

この解がバテマン方程式:

N_B(t) = \frac{\lambda_A}{\lambda_B - \lambda_A} N_{A0} (e^{-\lambda_A t} - e^{-\lambda_B t}) \quad (\lambda_A \neq \lambda_B)

直感的解釈:

  • 親核種Aは単純に指数減衰
  • 子核種Bは「親から供給される分」と「自分が崩壊する分」のバランスで決まる
  • 最初はBが増え、やがてピークを迎え、その後減少

コードで実装する ★最重要★

それでは、シミュレーターの計算ロジックを JavaScript で実装します。このコードは、ブラウザの開発者ツール(F12)に貼り付けて実際に動かせます。

/**
 * 放射性崩壊シミュレーター コア計算エンジン
 * 
 * 機能:
 * 1. 単一核種の指数減衰計算
 * 2. 親→子(バテマン方程式)の連鎖崩壊計算
 * 3. 放射能(Bq)への変換
 */

// ============================================
// 基本定数
// ============================================
const LN2 = Math.log(2);  // 自然対数 ln(2)

// ============================================
// 1. 単一核種の崩壊計算
// ============================================

/**
 * 崩壊定数 λ を計算
 * @param {number} halfLife - 半減期(任意の時間単位)
 * @returns {number} 崩壊定数 λ
 */
function decayConstant(halfLife) {
    return LN2 / halfLife;
}

/**
 * 時刻 t における残存原子数を計算(指数減衰)
 * @param {number} N0 - 初期原子数
 * @param {number} lambda - 崩壊定数
 * @param {number} t - 経過時間
 * @returns {number} 残存原子数 N(t)
 */
function remainingAtoms(N0, lambda, t) {
    // N(t) = N0 * exp(-λt)
    return N0 * Math.exp(-lambda * t);
}

/**
 * 時刻 t における放射能(Bq)を計算
 * @param {number} N0 - 初期原子数
 * @param {number} lambda - 崩壊定数
 * @param {number} t - 経過時間
 * @returns {number} 放射能 A(t) [Bq]
 */
function activityBq(N0, lambda, t) {
    // A(t) = λ * N(t) = λ * N0 * exp(-λt)
    return lambda * remainingAtoms(N0, lambda, t);
}

// ============================================
// 2. バテマン方程式(親→子の連鎖崩壊)
// ============================================

/**
 * 親核種Aと子核種Bの時刻tにおける原子数を計算
 * @param {number} N_A0 - 親核種の初期原子数
 * @param {number} halfLife_A - 親核種の半減期
 * @param {number} halfLife_B - 子核種の半減期
 * @param {number} t - 経過時間
 * @returns {object} { N_A: 親の残存原子数, N_B: 子の残存原子数 }
 */
function batemanDecay(N_A0, halfLife_A, halfLife_B, t) {
    const lambda_A = decayConstant(halfLife_A);
    const lambda_B = decayConstant(halfLife_B);
    
    // 親核種 A の残存数: N_A(t) = N_A0 * exp(-λ_A * t)
    const N_A = N_A0 * Math.exp(-lambda_A * t);
    
    // 子核種 B の残存数(λ_A ≠ λ_B の場合):
    // N_B(t) = (λ_A / (λ_B - λ_A)) * N_A0 * (exp(-λ_A * t) - exp(-λ_B * t))
    let N_B;
    if (Math.abs(lambda_A - lambda_B) < 1e-15) {
        // λ_A ≈ λ_B の場合(特殊ケース): N_B(t) = λ_A * t * N_A0 * exp(-λ_A * t)
        N_B = lambda_A * t * N_A0 * Math.exp(-lambda_A * t);
    } else {
        N_B = (lambda_A / (lambda_B - lambda_A)) * N_A0 * 
              (Math.exp(-lambda_A * t) - Math.exp(-lambda_B * t));
    }
    
    // 数値誤差対策(負の値にならないように)
    return {
        N_A: Math.max(0, N_A),
        N_B: Math.max(0, N_B)
    };
}

// ============================================
// 3. グラフ描画用のデータ生成
// ============================================

/**
 * 指定した時間範囲で崩壊曲線のデータ点を生成
 * @param {number} N0 - 初期原子数
 * @param {number} halfLife - 半減期
 * @param {number} tMax - 最大時間
 * @param {number} numPoints - データ点数(デフォルト200)
 * @returns {Array} [{t, N, A}] 時間・原子数・放射能の配列
 */
function generateDecayCurve(N0, halfLife, tMax, numPoints = 200) {
    const lambda = decayConstant(halfLife);
    const dt = tMax / (numPoints - 1);
    const data = [];
    
    for (let i = 0; i < numPoints; i++) {
        const t = i * dt;
        const N = remainingAtoms(N0, lambda, t);
        const A = activityBq(N0, lambda, t);
        data.push({ t, N, A });
    }
    
    return data;
}

/**
 * バテマン方程式のデータ点を生成
 * @param {number} N_A0 - 親核種の初期原子数
 * @param {number} halfLife_A - 親核種の半減期
 * @param {number} halfLife_B - 子核種の半減期
 * @param {number} tMax - 最大時間
 * @param {number} numPoints - データ点数
 * @returns {Array} [{t, N_A, N_B}]
 */
function generateBatemanCurve(N_A0, halfLife_A, halfLife_B, tMax, numPoints = 200) {
    const dt = tMax / (numPoints - 1);
    const data = [];
    
    for (let i = 0; i < numPoints; i++) {
        const t = i * dt;
        const result = batemanDecay(N_A0, halfLife_A, halfLife_B, t);
        data.push({ t, N_A: result.N_A, N_B: result.N_B });
    }
    
    return data;
}

// ============================================
// 使用例(ブラウザのコンソールで実行可)
// ============================================

// 例1: C-14(半減期5730年)の100万年後の残存率
const halfLife_C14 = 5730;  // 年
const N0 = 1000000;         // 100万個
const t = 50000;            // 5万年後
const lambda_C14 = decayConstant(halfLife_C14);
const N_50000 = remainingAtoms(N0, lambda_C14, t);
console.log(`C-14: 5万年後の残存数 = ${Math.round(N_50000)} 個`);
// → 約 2,300 個(初期の0.23%)

// 例2: Co-60(半減期5.27年)のバテマン方程式
const halfLife_Co60 = 5.27;  // 年
const halfLife_Ni60 = Infinity;  // Ni-60は安定(崩壊しない)
const N_A0 = 1000000;
const t_check = 10;  // 10年後
const batemanResult = batemanDecay(N_A0, halfLife_Co60, halfLife_Ni60, t_check);
console.log(`Co-60: 10年後 親=${Math.round(batemanResult.N_A)} 子=${Math.round(batemanResult.N_B)}`);
// → 親: 約 270,000 個, 子: 約 730,000 個

このコードのポイント:

  1. decayConstant() で $\lambda = \ln 2 / T_{1/2}$ を計算
  2. remainingAtoms() で $N(t) = N_0 e^{-\lambda t}$ を実装
  3. batemanDecay() でバテマン方程式の解析解を実装(特殊ケース $\lambda_A \approx \lambda_B$ もカバー)
  4. 全ての関数は純粋関数(入力に対して出力が一意に決まる)で、テスト容易

数値例で確かめる

それでは、実際の値を代入して計算してみましょう。

ケース:C-14 年代測定の基礎計算

条件:

  • 同位体:C-14(半減期 $T_{1/2} = 5730$ 年)
  • 初期原子数:$N_0 = 1{,}000{,}000$ 個
  • 経過時間:$t = 11{,}460$ 年(半減期2回分)

ステップ1:崩壊定数を計算

\lambda = \frac{\ln 2}{5730} \approx \frac{0.693147}{5730} \approx 1.2097 \times 10^{-4} \ \text{[年}^{-1}\text{]}

ステップ2:残存原子数を計算

N(11460) = 1{,}000{,}000 \times e^{-1.2097 \times 10^{-4} \times 11460}
= 1{,}000{,}000 \times e^{-1.3863}
= 1{,}000{,}000 \times 0.2500
= 250{,}000 \ \text{[個]}

確認:半減期2回分 → 1/2 → 1/4 → 100万の1/4 = 25万。ピッタリ一致!

ステップ3:放射能を計算

A(11460) = \lambda \times N(11460) = 1.2097 \times 10^{-4} \times 250{,}000 \approx 30.2 \ \text{[Bq]}

意味:11460年後でも、1秒間に約30個のC-14原子が崩壊している。これが年代測定で検出可能な理由。

コードでの確認:

const result = remainingAtoms(1000000, LN2/5730, 11460);
console.log(result); // → 約 250,000

シミュレーターで遊ぶ

それでは、実際のシミュレーターで実験してみましょう。

実験1:I-131(医療用)の急速な減衰を実感

設定:

  • 同位体:I-131(半減期8.02日)
  • 初期原子数:100万個
  • 時間単位:日
  • 表示時間幅:80日(約10半減期)

結果:

  • 8日後:約50万個(半分)
  • 16日後:約25万個(1/4)
  • 40日後(5半減期):約3.1万個(1/32)
  • 80日後(10半減期):約1000個(1/1024)

なぜ医療で使われるか:
甲状腺がん治療では、I-131を患者に投与します。半減期が8日と短いため、治療に必要な期間(約2週間〜1ヶ月)だけ放射線を出し、その後は速やかに崩壊して体内から消える。これが「内部被曝を最小限に抑えつつ、治療効果を最大化できる」理由です。

実験2:Co-60のバテマン方程式(親→子のダイナミクス)

設定:

  • 同位体:Co-60(半減期5.27年)
  • 「バテマン方程式を解く」にチェック
  • 子核種の半減期:Ni-60は安定なので「半減期:非常に長い(例:1億年)」と設定
  • 初期原子数:100万個
  • 表示時間幅:30年

結果の解釈:

  • 親(Co-60):指数関数的に減少(5.27年ごとに半分)
  • 子(Ni-60):最初は0から増加し、親の崩壊に応じて増え続ける
  • 約20年後:親はほぼ消失、子は約100万個に飽和

重要な気づき:
「親が崩壊して子ができる」という一見シンプルなプロセスも、時間経過とともに「どの核種がいつどれだけ存在するか」が劇的に変化する。これが核廃棄物管理で「どの核種がいつ危険か」を予測する基礎になります。

実験3:Cs-137 vs I-131 の長期残留比較

設定:

  • 同位体1:Cs-137(半減期30.1年)
  • 同位体2:I-131(半減期8.02日)
  • 初期原子数:両方とも100万個
  • 時間単位:年
  • 表示時間幅:100年

結果:

  • I-131:約80日で1/1000に減少 → 1年後には事実上ゼロ
  • Cs-137:30年後でも50万個残存 → 100年後でも約10万個残る

現場での意味:
福島第一原発事故後、問題になったのはCs-137(半減期30年)であってI-131(半減期8日)ではなかった理由がここにあります。I-131は短期間で減衰するため、事故直後の対応が重要。一方、Cs-137は数十年にわたって環境中に残留するため、長期的な除染計画が必要になる。


現場でハマるポイント

落とし穴1:「半減期が過ぎれば安全」は大間違い

誤解:「半減期が1回過ぎれば放射能はゼロ」
真実:「半減期が1回過ぎれば半分になるだけ」

具体例:

  • Co-60(半減期5.27年)を10半減期(約53年)管理しても、初期の約0.1%が残る
  • 初期100万個 → 53年後でも約1000個残存
  • 「事実上無視できるレベル」になるまでには、20〜30半減期(約100〜150年)必要

現場での対応:
放射性廃棄物の管理期間は、「放射能が自然放射能レベル以下になるまで」 と定義される。これが、核廃棄物の管理期間が数百年〜数万年になる理由。

落とし穴2:「放射能(Bq)と原子数は比例する」の落とし穴

正しい理解:

  • 放射能 $A = \lambda N$ なので、同じ原子数でも半減期が短いほど放射能は大きい
  • I-131(半減期8日)とC-14(半減期5730年)で同じ100万個なら、I-131の放射能はC-14の約26万倍

現場での影響:

  • 医療用のI-131(数MBq)は少量の原子数でも危険
  • 環境中のC-14(自然存在比)は大量の原子数でも安全
  • 「Bq」という単位だけ見て判断すると誤る

落とし穴3:バテマン方程式の「子核種の半減期」設定

注意点:
親より子の半減期が極端に長い場合(例:親1日、子100年)、子核種がほとんど崩壊せずに溜まり続ける。

現実の例:
原子炉で生成される長寿命核種(プルトニウム239:半減期2.4万年)は、短寿命の親核種から生成されても、一度できると事実上永久に残る。

シミュレーションでの確認:

  • 親:半減期1日、初期100万個
  • 子:半減期100年
  • 結果:1年後、親はほぼゼロだが、子は約100万個残り続ける

まとめ

今日の3つのポイント:

  1. 半減期は「半分になる時間」であって「なくなる時間」ではない

    • 10半減期経っても約0.1%残る
    • これが廃棄物管理の長期化の根本原因
  2. 指数減衰の式 $N(t) = N_0 e^{-\lambda t}$ は、たった3行のコードで実装できる

    • lambda = Math.log(2) / halfLife
    • N = N0 * Math.exp(-lambda * t)
    • バテマン方程式も解析解があるので、微分方程式を解かずに計算可能
  3. シミュレーターで「見える化」すると、教科書のグラフが「動く実感」になる

    • 医療:I-131の急速な減衰
    • 環境:Cs-137の長期残留
    • 廃棄物管理:親→子の連鎖崩壊

放射性崩壊は、「確率」と「指数関数」が織りなす、美しくも現実的な物理現象です。数式だけだと抽象的に見える世界も、コードとシミュレーターで動かせば「なるほど、そういうことか」と腹落ちします。

ぜひ、実際のシミュレーターでパラメータをいじり倒してみてください。

▶ 放射性崩壊シミュレーター — ブラウザで即動作、登録不要

NovaSolverでは1,600以上の工学シミュレーターを無料公開中 👉 一覧はこちら

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?