私は最近、ドラッグによる発射体の動きのモデリングに関する作業を行っていたので、この質問は非常に興味深いものでした。
ポイント 1:基本的に、状態の新しい各値が古い値の関数である明示的/前方オイラー反復を使用して、位置と速度を更新しています。このような場合、最初に位置を更新してから、速度を更新する必要があります。
ポイント 2:抗力摩擦の効果については、より現実的な物理モデルがあります。1 つのモデル ( Adam Lissによって提案された) には、速度に比例する抗力 (ストークス抗力として知られ、一般に低速度の状況に適用される) が含まれます。私が以前に提案したものには、速度の2 乗に比例する抗力が含まれます(二次抗力として知られ、一般に高速の状況に適用されます)。最大速度と最大速度に効果的に到達するのに必要な時間の公式をどのように推測するかについて、それぞれについて説明します。完全な派生はかなり複雑なので省略します。
ストークスの抗力:
速度を更新する式は次のようになります。
velocity += acceleration - friction*velocity
これは、次の微分方程式を表します。
dv/dt = a - f*v
この積分表の最初のエントリを使用して、解を見つけることができます (t = 0 で v = 0 と仮定)。
v = (a/f) - (a/f)*exp(-f*t)
最大 (つまり終末) 速度は t >> 0 のときに発生するため、方程式の第 2 項はゼロに非常に近くなり、次のようになります。
v_max = a/f
最大速度に到達するのに必要な時間に関しては、方程式が実際に到達することはなく、それに向けて漸近することに注意してください。ただし、指数関数の引数が -5 に等しい場合、速度は最大速度の約 98% であり、おそらく等しいと考えるのに十分近いでしょう。次に、最大速度までの時間を次のように概算できます。
t_max = 5/f
次に、これらの 2 つの方程式を使用して、目的のvmaxとtmaxを指定してfとaを解くことができます。
二次抗力:
速度を更新する式は次のようになります。
velocity += acceleration - friction*velocity*velocity
これは、次の微分方程式を表します。
dv/dt = a - f*v^2
この積分表の最初のエントリを使用して、解を見つけることができます (t = 0 で v = 0 と仮定)。
v = sqrt(a/f)*(exp(2*sqrt(a*f)*t) - 1)/(exp(2*sqrt(a*f)*t) + 1)
t >> 0 の場合に最大 (終末) 速度が発生するため、指数項は 1 よりはるかに大きくなり、式は次のようになります。
v_max = sqrt(a/f)
最大速度に到達するのに必要な時間に関しては、方程式が実際に到達することはなく、漸近することに注意してください。ただし、指数関数の引数が 5 に等しい場合、速度は最大速度の約 99% であり、おそらく等しいと考えるのに十分近いでしょう。次に、最大速度までの時間を次のように概算できます。
t_max = 2.5/sqrt(a*f)
これは以下と同等です:
t_max = 2.5/(f*v_max)
目的のvmaxとtmaxの場合、 tmaxの 2 番目の方程式はfがどうあるべきかを示し、それをvmaxの方程式に差し込んでaの値を得ることができます。
これは少しやり過ぎのように思えますが、実際にはドラッグをモデル化する最も簡単な方法です。統合手順を本当に見たい人は、私にメールを送ってください。送信します。ここに入力するには少し複雑すぎます。
別のポイント:これはすぐにはわかりませんでしたが、代わりにv(t)に対して導出した式を使用すれば、速度の更新は不要になります。単純に静止状態からの加速をモデル化し、加速が始まってからの時間を追跡している場合、コードは次のようになります。
position += velocity_function(timeSinceStart)
ここで、「velocity_function」はv(t)の 2 つの式の 1 つであり、速度変数は不要になります。一般に、ここにはトレードオフがあります。v(t)の計算は、単純に反復スキームで速度を更新するよりも計算コストが高くなる可能性がありますが (指数項のため)、安定して制限されたままであることが保証されています。特定の条件下 (非常に短いtmaxを取得しようとする場合など) では、反復が不安定になり、爆発する可能性があります。これは、フォワード オイラー法によくある問題です。ただし、変数の制限 (0 < f < 1 など) を維持することで、これらの不安定性を防ぐことができます。
さらに、多少自虐的であると感じている場合は、v(t)の式を統合してp(t)の閉じた形式の解を取得できる場合があります。これにより、ニュートン反復の必要性が完全になくなります。他の人が試すためにこれを残します。=)