PR

座礁した客船を人の力で押して動かすには何人必要?プログラミングで計算してみました

アイキャッチ画像

突然ですが、私は兵庫県神戸市に住んでいます。
神戸といえば、国内有数の港町として有名ですね。

今回は、プログラミングと物理の知識を使って、「座礁した客船を人が押して動かす」には何人必要か計算してみます。

ターゲット読者

プログラミングと物理の基本的な知識がある人

この記事でわかること

プログラミングを使って物理の問題を解くことができるという実感

問題文

航行していた客船が誤って海岸に座礁してしまった。もし、人の力だけで押して動かすには何人必要か?

ただし、条件は以下の通りとする。

海岸は水平である
客船の重さは、\({2.0}\times{10^4}t\)
一人が客船を水平に押す力は、\(700N\)
海岸の静止摩擦係数は、\(0.5\)
重力加速度は、\({9.8}m/{s^2}\)

(オリジナル問題)

自分で考えて解きたいは、一旦ここでストップして考えてから先を読み進めてください。

考え方

客船の重さを\(m\)、重力加速度を\(g\)、垂直抗力を\(N\)とおくと、垂直方向の力の釣り合いより、$$N = mg$$
また、海岸の静止摩擦係数を\(\mu\) とおくと、客船にかかる水平方向の静止摩擦力は、$${\mu}N$$
すなわち、$${\mu}mg$$である
人が客船を水平に押す力の総和を\(F\)とおくと、客船が動くためには、$$F > {\mu}mg$$となれば良い

以上を踏まえてプログラミングで計算します。

プログラミングで計算

<?php

// 客船の重さの単位をkgに直す
$weight = 20000 * 1000;
// 客船にかかる水平方向の静止摩擦力を定義する
$friction_power = 0.5 * $weight * 9.8;
// 一人が客船を水平に押す力を定義する
$power_per_person = 700;
// 人が客船を水平に押す力の総和を定義する
$total_power = 0;

// for文で「客船にかかる水平方向の静止摩擦力」>=「人が客船を水平に押す力の総和」の条件でループする
for ($i = 1; $friction_power >= $total_power; $i++) {
    $total_power += $power_per_person;
}

// 人数を出力する
echo $i;

?>

結果は、

140002

人の力で客船を動かすには、約14万人という膨大な人数が必要であることがわかりました。

もしかすると、

「客船にかかる水平方向の静止摩擦力」>=「人が客船を水平に押す力の総和」の条件でループしてるから、初めて\(F > {\mu}mg\)となる人数を求めるには、あと1人足さないといけないんじゃないの?

と疑問に感じる方もいるかもしれません。

for文は、「ループ条件」→「繰り返し処理」→「変数の更新」という順番なので、人が客船を水平に押す力の総和が客船にかかる水平方向の静止摩擦力を超えないギリギリまで繰り返し処理をして変数を更新してから、終了しています。

つまり、条件を満たす数値+1が得られているので、問題はないです。

また、変数$iの初期値が1であることもポイントで、もし、初期値が0なら得られる数値は「客船にかかる水平方向の静止摩擦力」>=「人が客船を水平に押す力の総和」の条件を満たす数値なので、+1しないといけません。

<?php

// 中略

for ($i = 0; $friction_power >= $total_power; $i++) {
    $total_power += $power_per_person;
}

echo $i + 1;

?>

まとめ

プログラミングで物理の摩擦力の問題を計算してみました。
このようにプログラミングを使えば、実際に計算することなくコードを書くだけで答えを求めることができます。

今後このようなプログラミングで計算をして問題を解く記事も上げていく予定なので、楽しみにしていてください!