矢の速度と再加速の計算

5月に更新された新型AIではもう十分にアーチェリー業務で実用的なレベルにあるという記事を書いてからは結構利用させていただいています。先日、歴史学で弓についての研究(?)というか研究の中で、矢の威力を扱っているものを読みましたが、計算がぜんぜん違うよな…となりまして、具体的には矢と銃弾を混同していて、銃弾は基本的にほぼ真っすぐ飛び、長距離になると下に落ちていきますが、矢は高さの到達点から落ちていきながら、位置エネルギーによって再加速されるのです。

質問をするために自分で矢の威力を計算したいとなりましたが、運動方程式が難しすぎるので、AIに任せてみました。AI(Copilot Pro)は自分では計算できないようです。よく考えれば、LLM(大規模言語モデル)ですので、計算はしないか。計算するためのコードは書いてくれるので、自分で計算することにしました。

計算するに当たり、初期設定としては初速などが当然必要ですが、この数値の中で、空気抵抗係数だけがわからないのですが、ここも勉強してみたら難しそうだったので、調べたら直径7mm・20gのイーストンシャフトで測定した論文がありました。

こちらの論文では空気抵抗係数は1.94ということになっていましたのでこの数字を使って1、計算すると、一発で結果が出ました。

60m/sで40度で打ち出した場合、到達距離は237m、129m時点で最高高度に到達して59m。そこからは59mからものを落とすと加速するのと同じ理由で、最高点での33m/sから、的中までに7m/s(22%)、40m/sまで加速します。Copilotありがとう。考古学や歴史学で弓の威力について書かれる場合に、矢が再加速する性質を持っていることが無視される傾向にあると思います。

  1. H. O. Meyer, Applications of Physics to Archery, 2015 ↩︎
使用コード(Google Colab)
import math
import csv

# 初期設定
v0 = 60.0  # 初速度 (m/s)
angle = 40.0  # 発射角度 (度)
mass = 0.02  # 矢の重さ (kg)
Cd = 1.9  # 空気抵抗係数
rho = 1.225  # 空気の密度 (kg/m^3)
A = 0.000036  # 矢の断面積 (m^2)
g = 9.81  # 重力加速度 (m/s^2)
time_interval = 0.01  # 時間間隔 (s)
total_time = 10  # 計算する総時間 (s)


# 角度をラジアンに変換
angle_rad = math.radians(angle)

# 水平方向と垂直方向の初速度成分
v0x = v0 * math.cos(angle_rad)
v0y = v0 * math.sin(angle_rad)

# 速度と位置の初期値
vx = v0x
vy = v0y
x = 0
y = 0

# 結果を保存するリスト
trajectory_data = []

# 時間経過に伴う位置と速度の計算
for t in range(int(total_time / time_interval)):
    # 空気抵抗力
    Fd = 0.5 * Cd * rho * (vx**2 + vy**2) * A
    # 空気抵抗による加速度
    ax = -Fd / mass * (vx / math.sqrt(vx**2 + vy**2))
    ay = -Fd / mass * (vy / math.sqrt(vx**2 + vy**2))
    
    # 重力の影響を加えた垂直方向の加速度
    ay -= g
    
    # 速度の更新
    vx += ax * time_interval
    vy += ay * time_interval
    
    # 位置の更新
    x += vx * time_interval
    y += vy * time_interval
    
    # 現在の速度
    velocity = math.sqrt(vx**2 + vy**2)
    
    # 地面に達したら計算終了
    if y <= 0:
        break
    
    # 結果をリストに追加
    trajectory_data.append((t * time_interval, x, y, vx, vy, velocity))

# CSVファイルに保存
with open('trajectory_with_drag_and_velocity.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    # ヘッダーを書き込む
    writer.writerow(['Time (s)', 'X Position (m)', 'Y Position (m)', 'X Velocity (m/s)', 'Y Velocity (m/s)', 'Total Velocity (m/s)'])
    # データを書き込む
    writer.writerows(trajectory_data)

print('CSVファイルに軌道と速度のデータが保存されました。')

The following two tabs change content below.
アバター画像

Ryo

熱海フィールド・あちぇ屋代表。日本スポーツ人類学会員、弓の歴史を研究中。リカーブ競技歴13年、コンパウンド競技歴5年、ベアボウ競技歴2年。リカーブとコンパウンドで全日本ターゲットに何度か出場、最高成績は2位(準優勝)。

2 thoughts on “矢の速度と再加速の計算

  1. ヤマハの技術者は正しい知識があると思うのでこのような資料は作らないと思います。

    > その発射角 θ(°)、水平到達距離を D(m)とすると、こんな式になります。前述の条件で90mで10点に的中させようとするなら、水平面から7°の角度で射ち出すことになります。

    リンク見ましたが、60m/sの打ち出し角度7度で90m先の10点に当たるとしていますが、違います(重力加速度を9.81として)。
    7度で射る場合、下の8点あたりに当たります(計算では高さ-15cmの場所に当たる)。

    このサイトに関しては、根拠も算出時期もないのでこれ以上は想像です。

    以前の記事で70年代のデータを2000年になっても正しいとしてアーチェリー教本に掲載されているけど、正しいわけないという記事を書きました。
    https://archerreports.org/2021/08/%e6%ad%b4%e5%8f%b2%e3%81%aa%e3%82%93%e3%81%a6%e8%aa%bf%e3%81%b9%e3%81%a6%e4%bd%95%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e3%81%ae%e3%81%8b/

    画像を見るとイメージの解像度が著しく低いです。これも70年代のデータであると仮定すると、3:2というデータ算出はX7などで計算されていると考えられます。そこで70年代のワンピースボウ&1914のような大型シャフトと仮定して、矢の初速を遅くして、断面積を大きくして、矢を重くした結果、おおよそ、3:2の軌道をシミュレーションから得ることが出来ました。

    私の見解としてはこのシミュレーションは50年前に行われたと推測します。当時の前提条件としては妥当かもしれませんが、今は2024年です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です