合同会社小村ソフト
第 6 章

シミュレータと最小モデル — 条件を動かして直感にする

教材用の簡易モデルで、温度・圧力・触媒活性・パージ率・不活性混入がどの指標に効くかを可視化する。

まずは 5 つのパラメータを 1 つずつ動かす

この章のシミュレータは、温度・圧力・触媒活性・パージ率・不活性混入を、教材用の簡易モデルに落としたものです。目的は、厳密な設計計算ではなく、どの操作変数(パラメータ)がどの指標へ効くかを視覚的に切り分けることです。

  • 温度: 低くすると平衡に有利だが、速度は落ちやすい。
  • 圧力: 高くすると平衡に有利。
  • 触媒活性: 主に速度側へ効く。
  • パージ率: 低すぎると不活性が抜けにくい。
  • 不活性混入: ループ内の分圧を食い、見かけの性能を落とす。

HB101 シミュレータ

条件を動かして、どこに効くかを見る

これは実プラント計算ではなく、どの条件が平衡・速度・ループ健全性へ効くかをつかむための教材用モデルです。

平衡有利度
0%
速度スコア
0%
推定 1 パス転化率
0%
再循環負荷
0%
不活性蓄積リスク
0%
読み方のコツ

どれか一つだけでなく、平衡・速度・再循環・パージの折り合いで読むのがコツです。

教材モデルの JavaScript

教材側のコードも、数式や仮定を隠さず短く書いています。入力範囲を外れた値は、黙って補正するのではなく RangeError を投げて止めます。

係数の根拠について: 以下のコード中の数値(0.18, 0.52, 0.30 など)は、実プラントの実測値や厳密な熱力学・速度論からの導出ではなく、本講座で繰り返し説明してきた『どの条件がどの指標へ効くか』という定性的関係を、0〜1 のスコアとして直感的に再現するために手で選んだ教材用係数です。たとえば 0.52 * temperatureBonus0.30 * pressureBonus の比は『温度の方が圧力よりやや強く効く』という相対感を、ベースの 0.18 は『どんな条件でも完全にゼロにはしない最低水準』を表現しています。実プラント設計には絶対に使わず、章本文の説明と数値の動きを対応付けるためのモデルとして読んでください。

function assertFiniteInRange(name, value, min, max) {
  if (!Number.isFinite(value) || value < min || value > max) {
    throw new RangeError(`${name} must be a finite number in [${min}, ${max}]`);
  }
}

function clamp01(value) {
  if (!Number.isFinite(value)) {
    throw new RangeError("value must be finite");
  }
  return Math.min(1, Math.max(0, value));
}

// 平衡有利度: 低温・高圧ほど NH3 側に有利、という第3章の関係を 0〜1 スコア化
function equilibriumFavorability(temperatureC, pressureBar) {
  assertFiniteInRange("temperatureC", temperatureC, 350, 550);
  assertFiniteInRange("pressureBar", pressureBar, 80, 280);

  // 520°C を境に低温ほどボーナス(0〜1)。170 は350〜520°C 幅をスケーリング
  const temperatureBonus = clamp01((520 - temperatureC) / 170);
  // 80 bar を起点に高圧ほどボーナス(0〜1)。170 は80〜250 bar 幅をスケーリング
  const pressureBonus = clamp01((pressureBar - 80) / 170);
  // 0.18=最低水準、0.52=温度の寄与係数、0.30=圧力の寄与係数
  // 比は『温度の方がやや強く効く』という定性関係を反映した教材設定
  return clamp01(0.18 + 0.52 * temperatureBonus + 0.30 * pressureBonus);
}

// 速度スコア: 高温・高活性ほど反応が速い、という第4章の関係を 0〜1 スコア化
function rateScore(temperatureC, catalystActivityPct) {
  assertFiniteInRange("temperatureC", temperatureC, 350, 550);
  assertFiniteInRange("catalystActivityPct", catalystActivityPct, 40, 120);

  // 360°C を起点に温度が上がるほどドライブ増(0〜1)
  const temperatureDrive = clamp01((temperatureC - 360) / 140);
  const activity = catalystActivityPct / 100;
  // 0.12=最低水準、0.78=温度×活性の寄与係数(積で『両方そろって初めて速い』を表現)
  return clamp01(0.12 + 0.78 * temperatureDrive * activity);
}

// 不活性蓄積リスク: 不活性多 & パージ少 ほど高リスク、という第5章の関係を 0〜1 スコア化
function inertRisk(purgePct, inertPct) {
  assertFiniteInRange("purgePct", purgePct, 0.5, 8);
  assertFiniteInRange("inertPct", inertPct, 0, 8);

  // パージ 4.5% を境に下回るほど lowPurge スコアが上がる
  const lowPurge = clamp01((4.5 - purgePct) / 4);
  const inertLoad = clamp01(inertPct / 8);
  // 0.04=最低水準、0.64=不活性混入の寄与(こちらが主因)、0.22=パージ不足の寄与(副因)
  return clamp01(0.04 + 0.64 * inertLoad + 0.22 * lowPurge);
}

// 推定 1 パス(1 回通過)転化率
function estimateSinglePassConversion(temperatureC, pressureBar, catalystActivityPct, purgePct, inertPct) {
  const equilibrium = equilibriumFavorability(temperatureC, pressureBar);
  const rate = rateScore(temperatureC, catalystActivityPct);
  const risk = inertRisk(purgePct, inertPct);
  // パージ 4% を中心に、benefit と loss が対称に効く設計:
  //   ・パージを増やすと不活性が抜けやすく、転化率がわずかに上がる(最大 +0.02)
  //   ・パージを増やしすぎると原料 H2 ロスで実効転化率がわずかに下がる(最大 -0.02)
  // 結果として『パージ 4% 付近で見かけ最良』というカーブを擬似的に作る
  const purgeBenefit = clamp01(purgePct / 4) * 0.02;
  const purgeLoss = clamp01((purgePct - 4) / 4) * 0.02;
  // 0.05=ベース転化率、0.23=平衡×速度の寄与(積で『両方そろって初めて高い』)、
  // -0.05=不活性リスクのペナルティ
  const raw = 0.05 + 0.23 * equilibrium * rate - 0.05 * risk + purgeBenefit - purgeLoss;
  // 出力レンジを 3〜28% にクリップ(教材モデルとしての現実性ガード)
  return Math.min(0.28, Math.max(0.03, raw));
}

equilibriumFavorabilityrateScore をまず分け、そこへ inertRisk を重ねて estimateSinglePassConversion を出しています。教材としては、これくらい分解してある方が『どの話がどこに対応するか』を追いやすくなります。

このシミュレータの読み方

おすすめは、まず「教科書的」を押して基準を見てから、温度だけ、圧力だけ、触媒活性だけを変えることです。複数を同時に動かすと、何が効いたのか分かりにくくなります。

注意: ここで出る数値は、実プラント保証値や安全設計値ではありません。教材用にスケーリングした直感モデルです。

理解チェック — シミュレータと最小モデル

シミュレータの読み方と、最小モデルのコード方針を確認します。

Q1. シミュレータで「触媒劣化」プリセットを押したとき、最も直接に下がる指標はどれですか。

触媒が効くのは平衡より速度でした。

Q2. シミュレータで温度を固定したまま圧力だけを上げると、最も直接に改善しやすいのはどれですか。

高圧化は『どちらの向きが有利か』に効きます。

Q3. 不活性混入がある状態でパージ率を下げすぎると、シミュレータ上で何のリスクが上がりやすいですか。

ループを閉じすぎると、追い出せない成分がたまります。

Q4. この教材の JavaScript 実装では、前提を満たさない入力が来たとき何を投げる方針にしていますか。

暗黙に補正せず、明示的に止めます。

第 6 章のまとめ

  • 温度・圧力は平衡側、触媒活性は速度側に主に効くという切り分けがシミュレータ上でそのまま見える。
  • パージを下げすぎると不活性蓄積リスクが上がり、見かけの性能を落とす。
  • 最小モデルは数式と仮定を隠さず書き、範囲外入力には RangeError を投げて静かに丸めない。