
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ありがとう。考古学や歴史学で弓の威力について書かれる場合に、矢が再加速する性質を持っていることが無視される傾向にあると思います。
- 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ファイルに軌道と速度のデータが保存されました。')




























