Pythonで「モデル化とシミュレーション」前夜

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

前回の続きです。

「モデル化とシミュレーション」前夜
Excelで「モデル化とシミュレーション」前夜

がこれまでの記事になります。前回はExcelでシミュレーションしましたが、今回はPython(他の言語でもいいのですが・・・)でシミュレーションしてみます。

Pythonのプログラム

それでは、早速プログラムを載せます。

# パラメータの設定
taro_initial_position = 1000
jiro_initial_position = 0
taro_speed = 55
jiro_speed = 45


# 初期化
time = 0
taro_position = taro_initial_position
jiro_position = jiro_initial_position

# シミュレーション
while taro_position > jiro_position:
    time += 1
    taro_position = taro_initial_position - taro_speed * time
    jiro_position = jiro_initial_position + jiro_speed * time
    print( '{0}分経過 太郎は{1}m 次郎は{2}mの位置にいる'.format(time, taro_position, jiro_position))

# 計算結果出力
print( '{0}分経過で2人はすれ違う'.format(time))

簡単なプログラムの説明

パラメータ

プログラムの2~5行目です。Excelのときは、パラメータをまとめておく表を作りました。プログラムでは、わかりやすいように最初にパラメータをまとめておきます。

太郎くんの最初の位置は、

taro_initial_position = 1000

として代入しています。歩く速さは、

taro_speed = 55

と代入しています。次郎くんについても同様です。変数名を付けて値を持たせていれば、何の値なのかがわかりやすいと思います。

初期化

経過時間を time としています。forのループで回してもよいのですが、どれだけループを回すかを計算するのが面倒だったので、whileのループにして、すれ違うまで(初めは、太郎くんの方が家から遠くにいるので太郎くんが家から遠くにいる間)のループにしています。

taro_position = taro_initial_position

としているのは、whileループの条件を2人の位置の比較だけで済むように taro_position の初期値を与えています。次郎くんについても同じです。

シミュレーション

while文の条件は、初期化の項で書いた通り2人の位置に着目して書いています。最初は、太郎くんが駅にいて、次郎くんは家にいるので、家からの距離は太郎くんの方が大きい状態で始まります。しばらくその状態が続くので、それに合わせて

while taro_position > jiro_position:

としています。

次に、時間を進めます。

    time += 1

で1秒進めます。時刻が進んだので

    taro_position = taro_initial_position - taro_speed * time
    jiro_position = jiro_initial_position + jiro_speed * time

で2人の位置を計算します。この式は、 太郎くんの位置 = 太郎くんの最初の位置 ー 太郎くんの歩く速さ * 経過時間 、すなわち 太郎くんの位置 = 1000 - 55t と同じ式になっています。数式モデルを作ることができれば、そのままプログラムに書くことでその値を求めてくれるんですね。

求めた2人の位置を経過時間と一緒に表示します。str とか 文字をつなげる + を書くと出力しているものがわかりにくくなるので、format を使いました。

    print( '{0}分経過 太郎は{1}m 次郎は{2}mの位置にいる'.format(time, taro_position, jiro_position))

計算結果出力

2人がすれ違って家からの距離の大小関係が変わったら(太郎くんの距離が次郎くんより遠くなくなったら)、14行目のwhileのループを抜け(15~17行目の処理を止めて)計算結果の出力になります。

print( '{0}分経過で2人はすれ違う'.format(time))

で、2人の位置関係が入れ替わったときの経過時間を表示しています。ちょうど2人が出会ったときか、すれ違って行き過ぎてしまったかは、画面に出力された2人の位置を見て判断します。すれ違って行き過ぎてしまった場合には、時間の変化(15行目)を変えて試してみましょう。どの程度まで正確さを要求されるかによって調整してください。

結果

このプログラムの結果を載せておきます。「10分経過ですれ違う」と表示されていますが、実際には「出会う」ですね。この区別については手を抜きました<(_ _)>

1分経過 太郎は945m 次郎は45m
2分経過 太郎は890m 次郎は90m
3分経過 太郎は835m 次郎は135m
4分経過 太郎は780m 次郎は180m
5分経過 太郎は725m 次郎は225m
6分経過 太郎は670m 次郎は270m
7分経過 太郎は615m 次郎は315m
8分経過 太郎は560m 次郎は360m
9分経過 太郎は505m 次郎は405m
10分経過 太郎は450m 次郎は450m
10分経過で2人はすれ違う

おまけの話

今回のプログラムは、64ビット版のPython3.6.5で試しています。他のバージョンではどうなるかわかりませんが、15行目を

    time += 0.1

にしてみると興味深いことが起こります。プログラムで小数を扱うのって大変。この話だけでいろいろなことが書けそう。

ということで、今回はおしまい。では、また次回。

Posted by 春日井 優