Ruby

放物運動の演算

問 初速 v m/s でX軸正の方向からθ(=theta)度の角度で発射された物体のs秒後の位置を求める関数を定義してください。Y軸負の方向に9.8 m/s^2 の重力加速度が働いているものとします。空気抵抗とか物体のモーメントとかややこしいのは勿論なしです。

解答例 速度をXYそれぞれの軸方向の成分に分解するために三角関数を利用します。X軸方向はそのまま、Y軸方向はそこから、重力加速度の分を減算した値がそれぞれの速度になります(Y軸方向は速度が時間の関数になりますね)。あとは、「速さ x 時間 = 距離」の公式でそれぞれの座標が求まります。

RubyのMathモジュールに用意された三角関数の引数の単位はラジアンですので、その部分の変換も忘れずに。

v = 120
s = 6
theta = Math::PI / 180.0 * 60
G = 9.8

x = v * Math.cos(theta) * s
y = (v * Math.sin(theta) - G * s) * s

puts "v = #{v},theta = #{theta},s = #{s}"
puts "(x,y) = (#{x},#{y})"

おまけ 上記の図はShoesというRubyのGUIライブラリをインストールして描画しています。

def o(x,y)
  oval(left: 10+x-3, top: 400-y-3,radius: 5)
end

Shoes.app do
  v = 120
  G = 9.8
  theta = Math::PI / 180.0 * 60.0
  line(10,0,10,410)
  line(0,400,400,400)
  (0..10).each do |s|
    x = v * Math.cos(theta) * s
    y = (v * Math.sin(theta) - G * s) * s
    o(x,y)
  end
end

参考URL