運動シミュレーター
位置 x と速度 v を、決められた順番で繰り返し更新するシミュレーションです。 更新の順序を入れ替えると結果が変わることを、数直線と表で確かめられます。
動きを1ステップずつ確認する
- いまの位置
- ゴール
- 速度
| t | x | v |
|---|
パソコンではキーボードでも操作できます:→ 次へ / ← 前へ / スペース 再生・一時停止
実行ログを見る(ここまでの処理)
ALGORITHM
運動シミュレーションとは何をしているか
ボールが転がる、車が進むといった動きを、「短い時間ごとに位置と速度を計算し直す」ことで再現するシミュレーションです。 1回の繰り返しが「1単位時間」に対応し、その中で 位置 x を速度 v のぶんだけ進め、速度 v を変化させ、時間 t を1進めるという更新を行います。
v = v - 1 は「1単位時間ごとに速度が1ずつ減る」という意味で、
坂を上るボールや、上に投げた物体のようなだんだん遅くなる動きを表します。
速度が負になれば、位置は後ろへ戻ります。
更新の順序で結果が変わる
このアルゴリズムでいちばん問われるのがここです。次の2つは、行が入れ替わっただけですが結果が変わります。
| 書き方 | x の計算に使われる v | 初速4・x < 10 のときの結果 |
|---|---|---|
| x が先 (x = x + v → v = v - 1) |
更新前の v | x = 10、v = 0、t = 4 で終了 |
| v が先 (v = v - 1 → x = x + v) |
更新後の v | x が 6 までしか伸びず終わらない |
「v が先」の場合、1回目からすでに速度が1減った状態で位置を進めるため、進む距離が毎回1ずつ少なくなります。 その結果 x は 3 → 5 → 6 → 6 と伸びが止まり、x < 10 の条件が成り立ち続けて処理が終わりません。
終了条件の選び方
条件を v > 0 の間 に変えると、速度が0以下になった時点で必ず終わるため、
どちらの更新順でも処理が終わります。
「目標の位置に届くまで」と「速度がなくなるまで」では、止まる仕組みがまったく違うということです。
条件を切り替えて、終わり方の違いを比べてみてください。
なぜ「短い時間ごとに計算し直す」のか
現実の動きは連続していて、位置は途切れなく変化します。しかしコンピュータは連続した変化をそのまま扱えないため、 時間を細かく区切り、その区切りごとに「いまの速度で進んだ分」を足していくという方法で近づけます。 これがシミュレーションの基本的な考え方で、モンテカルロ法と同じく答えは近似になります。
区切る時間を短くすればするほど、本当の動きに近づきます。逆に区切りが粗いと、
「1回の更新の間ずっと同じ速度で進んだ」と見なすため誤差が大きくなります。
このページの t = t + 1 は「1単位時間ずつ区切る」というもっとも粗い設定にあたります。
v = v - 1 は何を表しているか
1単位時間ごとに速度が1ずつ減るという意味で、物理でいう加速度が -1 の状態です。 上に投げたボール、坂を上る自転車、ブレーキをかけた車など、だんだん遅くなる動きに対応します。
速度が 0 を通り過ぎて負になると、位置は逆向きに動き始めます。
ボールが最高点に達して落ちてくる動きがこれにあたります。
シミュレーターで初速を大きくし条件を v > 0 以外にすると、数直線上で点が左へ戻る様子が見られます。
v = v - 1 を v = v(変化なし)にすれば等速運動、v = v + 1 にすれば加速する動きになります。
| 速度の更新 | 表す動き | 身近な例 |
|---|---|---|
| v = v - 1 | だんだん遅くなる(減速) | 上に投げたボール、坂を上る |
| v は変えない | 同じ速さで進む(等速) | 一定速度で走る車 |
| v = v + 1 | だんだん速くなる(加速) | 落下、坂を下る |
t が表しているもの
t は繰り返した回数、つまり経過した時間です。
最後に t を表示すれば「目標に届くまでに何単位時間かかったか」が分かります。
t = t + 1 を書き忘れると時間が進まないため、答えが出せなくなります。
CODE
3つの書き方で見る運動シミュレーション
x = 0 v = 4 t = 0 x < 10 の間繰り返す: |x = x + v |v = v - 1 ⎿ t = t + 1 表示する(x, v, t)
x = 0
v = 4
t = 0
while x < 10:
x = x + v
v = v - 1
t = t + 1
print(x, v, t)
let x = 0;
let v = 4;
let t = 0;
while (x < 10) {
x = x + v;
v = v - 1;
t = t + 1;
}
console.log(x, v, t);
〜の間繰り返す、Python と JavaScript の while は、
いずれも繰り返しの前に条件を調べます。
そのため、最初から条件が成り立たなければ1回も実行されません。
たとえば初速 v = 0 のとき x は 0 のままなので、x < 10 は成り立ち続け、逆に処理が終わらなくなります。
EXAM POINT
共通テスト「情報Ⅰ」での出題ポイント
- 更新の順序:2行を入れ替えた選択肢が並び、正しい結果を選ぶ形。x の計算に使う v が更新前か更新後かで見分けます。
- トレース(値の追跡):t・x・v の表を1行ずつ埋める形。繰り返しの途中の値を書けることが大切です。
- 終了条件:
x < 10の空欄。<=にすると1回多く繰り返す点にも注意します。 - 終わらない場合:「この繰り返しはどうなるか」という問い。速度が0以下になって位置が進まなくなるケースが定番です。
- 表示のタイミング:表示を繰り返しの中に入れるか外に置くかで、出力される回数と値が変わります。
MISTAKES
よくある間違い
| 間違い | 何が起きるか | 正しくは |
|---|---|---|
| 更新の順序を入れ替える | 進む距離が変わり、答えがずれる | 問題文のコードの並び順どおりに計算する |
| v を更新し忘れる | 速度が変わらず等速で進み続ける | 繰り返しの中で v も更新する |
| t = t + 1 を書き忘れる | 経過時間が求められない | 1回の繰り返しにつき t を1増やす |
| 終了条件を確かめない | 条件が成り立ち続け、処理が終わらない | 条件がいつか成り立たなくなるか確認する |
| 最後の値だけ見て途中を追わない | トレース問題で途中の値を答えられない | 1回ごとに t・x・v を書き出す |
CHECK
理解度チェック
Q1. x = 0、v = 4 から「x が先」の順で x < 10 の間繰り返すと、最後の x・v・t はいくつですか。
Q2. 同じ初期値で「v が先」の順にすると、どうなりますか。
Q3. 終了条件を v > 0 の間 に変えると、「v が先」でも終わりますか。
Q4. 条件を x <= 10 に変えると、繰り返しの回数はどうなりますか。
x < 10 なら終了しますが、x <= 10 ならまだ条件が成り立つため、
もう1回繰り返します。不等号に = が付くかどうかで回数が1回変わるのは頻出の注意点です。