「半減期って、半分になるんでしょ?じゃあ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 個
このコードのポイント:
-
decayConstant()で $\lambda = \ln 2 / T_{1/2}$ を計算 -
remainingAtoms()で $N(t) = N_0 e^{-\lambda t}$ を実装 -
batemanDecay()でバテマン方程式の解析解を実装(特殊ケース $\lambda_A \approx \lambda_B$ もカバー) - 全ての関数は純粋関数(入力に対して出力が一意に決まる)で、テスト容易
数値例で確かめる
それでは、実際の値を代入して計算してみましょう。
ケース: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つのポイント:
-
半減期は「半分になる時間」であって「なくなる時間」ではない
- 10半減期経っても約0.1%残る
- これが廃棄物管理の長期化の根本原因
-
指数減衰の式 $N(t) = N_0 e^{-\lambda t}$ は、たった3行のコードで実装できる
lambda = Math.log(2) / halfLifeN = N0 * Math.exp(-lambda * t)- バテマン方程式も解析解があるので、微分方程式を解かずに計算可能
-
シミュレーターで「見える化」すると、教科書のグラフが「動く実感」になる
- 医療:I-131の急速な減衰
- 環境:Cs-137の長期残留
- 廃棄物管理:親→子の連鎖崩壊
放射性崩壊は、「確率」と「指数関数」が織りなす、美しくも現実的な物理現象です。数式だけだと抽象的に見える世界も、コードとシミュレーターで動かせば「なるほど、そういうことか」と腹落ちします。
ぜひ、実際のシミュレーターでパラメータをいじり倒してみてください。
▶ 放射性崩壊シミュレーター — ブラウザで即動作、登録不要
NovaSolverでは1,600以上の工学シミュレーターを無料公開中 👉 一覧はこちら