趣味とか呟きとか

趣味ブログ。端的に言うと自己顕示欲の置き場所。絵を上げたり、本の感想書いたり、長い呟きとか。

気になった問題を解いた

出会い
Twitterをぼーっと眺めてたらこのような問題が流れてきた。
mobile.twitter.com
 僕は大学入試で物理を選択していたし、こんなものは超基礎の問題だから瞬殺できた。答えは4である。
 投げ上げと投げ下ろしが一致するのは若干直観に反するかもしれないが、投げ上げても最初の位置では同じ速さで落ちてくるから結局投げ下ろしの結果と変わらないのだ。水平投射は下向きに速さがついていないので、両者よりも遅くなる。超簡単(メガネクイクイッ

 さて、一般人の皆さん()はどんな回答を出しているのかなぁと思ってリプ欄を見たら、みんな6を選んでいた。つまり全て同じ速さだと言っているのだ。え、そんなわけなくない?ただし、ただ答えてるだけでなくエネルギー保存則で理屈づけている。確かにその理屈を聞くと、なんかそっちが正しいような気がしてくるが、だまされてはいけない。いやだって下向きに加速度ついてないじゃん。えー、みんなが間違ってるんじゃないの?と思って解答を調べたら6だった。え、なんで?


解決
 マジで納得いかなかったので、めんどかったがプログラムを組んだ。だってめっちゃもやもやするんだもん。以下ソースコード

import numpy as np
import matplotlib.pyplot as plt

# INITIAL SETTING
g = 9.8 # GRAVITATIONAL ACCELERATION
h = 10 # HEIGHT
dt = 0.1 # STEP OF TIME
dis = h # DISTANCE FROM GROUND
lst = [5, -5, 0] # LIST OF INITIAL VELOCITY
t = 0 # TIME

# SETTING OF GRAPHE
fig = plt.figure()
ax = fig.add_subplot(111, xlabel="time [s]", ylabel='height from ground [m]')
lst_t = []
lst_dis = []
cnt_ini = 0


# TRACK OF BALL
for v0 in lst :
  while dis > 0.0 :
      v = v0 + g*t
      dis = h - (v0*t + (g*t**2)/2)
      lst_dis.append(dis)
      lst_t.append(t)
      t = t + dt

  v_fin = np.sqrt(v0**2 + 2*g*h)

# PLOT
  ax.scatter(lst_t, lst_dis, label="Ini. and Fin. vel. : {} and {}".format(v0,str(v_fin)[0:5]))
  ax.legend()
  fig.savefig("rslt{}.pdf".format(cnt_ini))

# RESET VARIABLE
  lst_dis = []
  lst_t = []
  dis = h
  t = 0
  cnt_ini += 1


 下のグラフが横軸時間で縦軸ボールの高さを示した結果である。

f:id:naturalaccident:20201203034510p:plain
ボールの高さと時間変化の関係性

 青、オレンジがそれぞれ投げ下ろしと投げ上げを表しており、緑が水平投射を表している。また、凡例に初期の速さと最終の速さの値を載せた。単位は[m/s]。
 これを見ると投げ下ろしが最も早く地面に到達しており、投げ上げが最も遅く、水平投射がその間という結果になっている。これは妥当な結果だと思う。
 最終の速さに着目すると、投げ上げと投げ下ろしが同じで、水平投射はそれらよりも遅いことがわかる。やっぱり俺は合っていたんだ!見たか!伊達に物理やってないわ!
 しかし、でもまあエネルギーの議論もそれっぽいのでもうちょっと考えてみた。そこで、重要なことに気づくのである。問題文は
「ぶつかる直前の速さがどうなるか」という聞き方なのである。
 そうするとちょっと話が変わってくる。なぜなら、水平投射ではボールが斜め方向に速度を持っているため、水平方向の速さも考慮する必要があるからである。
 なので、プログラムを少し書き直した。

import numpy as np
import matplotlib.pyplot as plt

# INITIAL SETTING
g = 9.8 # GRAVITATIONAL ACCELERATION
h = 10 # HEIGHT
dt = 0.1 # STEP OF TIME
dis = h # DISTANCE FROM GROUND
lst = [5, -5, 0] # LIST OF INITIAL VELOCITY
t = 0 # TIME

# SETTING OF GRAPHE
fig = plt.figure()
ax = fig.add_subplot(111, xlabel="time [s]", ylabel='height from ground [m]')
lst_t = []
lst_dis = []
cnt_ini = 0


# TRACK OF BALL
for v0 in lst :
  while dis > 0.0 :
      v = v0 + g*t
      dis = h - (v0*t + (g*t**2)/2)
      lst_dis.append(dis)
      lst_t.append(t)
      t = t + dt

  if cnt_ini != 2 :
      v_fin = np.sqrt(v0**2 + 2*g*h)
  else :
      v_fin = np.sqrt(5**2 + (v0**2 + 2*g*h))


# PLOT
  ax.scatter(lst_t, lst_dis, label="Ini. and Fin. vel. : {} and {}".format(v0,str(v_fin)[0:5]))
  ax.legend()
  fig.savefig("rslt{}.png".format(cnt_ini))

# RESET VARIABLE
  lst_dis = []
  lst_t = []
  dis = h
  t = 0
  cnt_ini += 1

 その結果がこちら

f:id:naturalaccident:20201203040112p:plain
ボールの高さと時間の関係性(水平速度を考慮)

 ああああああ!全て同じ速度になってる!!リプ欄の皆様が正しかったです、すいません!すいません!あああああああ!
 マジでくやしい。これは高校入試だから、俺は何年も力学をやってきてちょっとできる中学生に負けたのだ。あ、あああ……やばいやばい今までの俺の積み重ねって何?世界がゆがむううぅぅぅ……(時空のゆがみが体を包み込み、後には起動したままのPCだけが取り残された)


その他
WSLでやったんですけど、プロットではまったので解決に有用だったサイトを紹介します。

メイン:
dev.to
参照元
stackoverflow.com