コンテンツにスキップ

モデル化とシミュレーション

指導者向けの公開補足

学習本文に加えて、指導の視点・背景・授業での確かめ方を示します。どなたでも読めます。

指導の焦点

モデルは現実のすべてを再現するものではない。問いに必要な要因と、仮定して省いた要因を先に明示する。結果の数値だけでなく、適用できる条件も評価する。

一歩踏み込んだ背景

計算が正しく動くかという検証と、現実を十分に表すかという妥当性の確認は別である。乱数を使う場合は一回の結果だけで結論を出さない。

授業での確かめ方

掲載モデルの入力や仮定を一つずつ変える。結果が変わる要因を比較し、「このモデルでは言えないこと」も結論として書かせる。

制度・規格等は本文末尾の参考資料も確認してください。

JSFiddleでコードを試す

JSFiddleは、ブラウザーでHTML・CSS・JavaScriptを入力して実行できるサービスです。短い動作確認から始められます。

  1. 新しい編集画面を開きます。JavaScriptは通常のJavaScriptを選び、外部ライブラリは追加しません。
  2. HTML欄にはページの本文、CSS欄には見た目、JavaScript欄には処理を書きます。HTML欄に<html>や<body>は不要です。JavaScript欄に<script>は付けません。
  3. DOMを使う例では、JavaScriptの実行タイミングを「On Load」「On DOM Ready」または「No wrap - bottom of body」にします。
  4. 「Run」を押してResult欄を確認します。書き換えたら再びRunを押します。

console.logの結果は通常、ページではなく開発者ツールのコンソールに出ます。このサイトの計算例をResult欄で読みたいときは、HTML欄に次を入れます。

<pre id="output"></pre>

JavaScript欄には次を入れ、console.log(2 + 3);の行を、試したいコード一つに置き換えます。独立した例を複数まとめて貼らないでください。

{
  const output = document.getElementById("output");
  const console = {
    log(...values) {
      output.textContent += values.join(" ") + "\n";
    }
  };
  console.log(2 + 3);
}

Runを押すと「5」と表示されます。外側の波括弧の中だけで表示用のconsoleを用意しているため、ブラウザー本来のコンソールは変更しません。

HTMLとJavaScriptの両方を載せた実習例は、この表示用コードで囲まず、それぞれの欄へ分けて貼り付けます。保存・共有時は公開範囲を確認し、個人情報やパスワードを入力しないでください。コードは手元にも残しましょう。

NAS・GitHub・CodePenなど、作業環境の選び方

この単元でできるようになること

Section titled “この単元でできるようになること”
  • モデルに取り入れた条件と、省いた条件を説明できる。
  • シミュレーションの結果を、前提と結び付けて説明できる。
  • 現実と比べてモデルを見直す方法を提案できる。

現実の全部を、そのまま写すわけではない

Section titled “現実の全部を、そのまま写すわけではない”

調べたいことに必要な特徴を取り出し、扱いやすい形で表したものをモデルという。式、図、実物の縮小物など、表し方はいろいろある。

モデルを使って、条件に応じた変化や結果を調べることがシミュレーションだ。ここでは、タンクの水量を1分ごとに計算する。

  • 最初の水量は20 L。
  • 水は毎分6 Lずつ入る。
  • タンクの容量は50 L。
  • 水は使わず、漏れや蒸発もない。
  • 計算は1分刻みで行う。

この前提なら、水量は毎分6 Lずつ増える。水圧によって流量が変わる状況などは、このモデルには入っていない。

水量を1分ごとに計算する
let water = 20;
const capacity = 50;
const inflow = 6;
for (let minute = 1; minute <= 5; minute++) {
water = Math.min(capacity, water + inflow);
console.log(minute, water);
}

Math.min は、指定した値の中で最も小さい値を返す。ここでは、計算した水量が容量を超えないようにしている。超えた分がある場合の、あふれた水量は記録しない。

経過時間 水量
1分 26 L
2分 32 L
3分 38 L
4分 44 L
5分 50 L

このモデルでは、5分後に満水になる。「どのタンクも5分で満水になる」という意味ではない。

結果は、モデルの外でも確かめる

Section titled “結果は、モデルの外でも確かめる”

実際の測定で、5分後の水量が46 Lだったとする。計算結果だけを正しいことにせず、条件を見直す。

流入量は本当に一定か。測定開始時の水量は正しいか。どこかで水を使っていないか。測定方法に違いはないか。

このタンクは、水量という状態を時間とともに変える動的モデルである。ある時点の必要容量だけを式で求め、時間変化を追わないなら静的モデルになる。また流入量などを固定すると、同じ初期条件から同じ結果が出る決定論的モデルになる。乱数を使って流入量の変動を表すなら、確率的モデルとして扱う。

静的か動的か、決定論的か確率的かは別の観点である。「動的だから毎回結果が変わる」とは限らない。何を調べたいのかに合わせ、必要な特徴を選ぶ。式や表で表す数理モデルのほか、縮尺を変えた実物模型や、関係を図にしたモデルもある。見た目が現実に似ていることより、目的の性質を適切に表すことが重要だ。

水量は現実には連続的に変化するが、掲載コードでは一分ごとの値だけを求めている。毎分七リットルなら、容量までの差三十リットルを満たす連続時間は約四・二九分である。一分刻みの観察では五分後に初めて満水を記録する。この差は、流量が間違っているからではなく、結果を記録する時刻の違いからも生じる。

初期水量、容量、流入量は、条件として変更できるパラメータである。他の条件をそろえて流入量だけを変えると、結果の違いを解釈しやすい。次の表は最初二十リットル、容量五十リットルを固定し、一分刻みで満水を確認した結果を手計算したものだ。

毎分の流入量 三分後の水量 最初に満水を確認する時刻
3 L 29 L 十分後
6 L 38 L 五分後
10 L 50 L 三分後

満水時刻が流量によって大きく変わるなら、現実の流量測定を丁寧にする価値がある。このように入力の変更が出力へ与える影響を調べることを感度分析という。複数の条件を同時に変えた結果だけでは、どの条件が変化の原因だったかを判断しにくい。

変動を取り入れるときの読み方

Section titled “変動を取り入れるときの読み方”

流入量が毎分五、七、六、四、八リットルと変わる説明用の記録なら、水量は二十五、三十二、三十八、四十二、五十リットルと推移する。平均の流入量は六リットルでも、途中の水量は一定流量のモデルと違う。平均値が同じであれば、どんな途中経過も同じになるわけではない。

観測から変動の範囲や確率を推定し、乱数で条件を生成して何度も試す方法もある。確率的な試行を繰り返して結果の分布や割合などを推定する方法は、モンテカルロ法と呼ばれる。たとえば「五分以内に満水になる試行が何回あったか」を記録すれば、平均時刻だけでは見えないばらつきに目を向けられる。

ただし、適当な乱数を加えれば現実的になるわけではない。流量の取りうる範囲や時間的な関連が現実と合っているかを確認する。試行数が少ないと推定には大きな変動が残ることもある。再現可能な検討には、乱数の生成方法や種などの実行条件も記録する。種をそろえて再現できることは、モデルが正しい証拠とは別である。

式どおりにプログラムが動くかを確認する作業と、その式が現実の目的に合うかを評価する作業は分ける。前者なら流入零で水量が変わらないか、容量を超えて記録しないかを確認できる。後者なら、別の日に測った水量と予測を比べ、一定流量という前提が使える範囲を考える。

モデルを作るために使ったデータだけで良さを判断すると、その条件に合わせすぎることがある。別の測定条件でも比較し、結果の差と測定の不確かさを記録する。結果が目的に十分でなければ、流量を時間ごとに変える、水の使用量を追加するなど、必要な箇所から見直そう。

用語 意味
モデル 目的に必要な特徴を取り出して表したもの
シミュレーション モデルを使って変化や結果を調べること
前提 計算や判断の土台として置く条件
妥当性 目的に照らして、そのモデルや結果が適切かということ
パラメータ モデルに与えて変更できる条件や量
感度分析 入力条件の変更が結果へ与える影響を調べること
モンテカルロ法 確率的な試行を繰り返して量や分布などを推定する方法
  1. 毎分2 Lの水を使う状況も扱うなら、どの計算を変える必要があるか。
  2. 最初の水量を30 Lにした場合、1分後の水量を求めよう。
  3. このモデルを、現実の給水設備の安全判断にそのまま使えない理由を挙げよう。
問1の解答例を見る

水量更新で毎分の使用量2 Lも引く。たとえばwater = Math.max(0, Math.min(capacity, water + inflow - 2))とする。流入と使用を一分ごとにまとめるモデルなので、あふれや使用の順序を詳しく扱う場合は別途条件を決める。

問2の解答例を見る

36 L。初期水量30 Lに毎分6 Lを加え、容量50 L以下なので、30+6=36 Lとなる。

問3の解答例を見る

流入量一定という仮定や、一分刻みの計算が現実に合うとは限らない。設備の故障、流量の変化、測定誤差、あふれなどを十分に扱っておらず、実測や専門的な基準による検証が必要になる。