私は物理学をDIYする方法を学び始めており、最も基本的なレベルで統合を実装することについて質問があります(つまり、これはオイラー対RK4の質問ではありません)。
私が遭遇するほとんどすべての例にintegrate()
は、最後の更新以降のタイムステップを取得し、最後の更新以降の加速度(および/または速度および/または位置)を更新する関数があります。
最も単純な形式: position += velocity * deltaTime
ただし、関数を変更するだけで簡単に取得できるのに、なぜこのように蓄積されるのかわかりません。たとえばgetPosition = makeNewFunction()
、のシグネチャを持つ何かを返す可能性がTime -> Position
あり、その関数の内部動作は適切な数式を介して生成されます。
そうすれば、蓄積はありません...位置を取得する必要があるときはいつでも、現在の時間でその関数を呼び出します。
私の初心者の理解では、これは蓄積から生じるエラーも回避するということです...それではなぜこれが機能しないのですか、何が欠けていますか?
(私はこのアイデアの概念の基本的な証明をまとめましたが、同時にいくつかの他のこともテストしているため、最もクリーンな例ではありません:https : //github.com/dakom/ball-bounce-frp)
編集1:コメントで述べたように、加速の変更についてはまだ学んでいないこと、または加速度を一定にするよりも高次の積分を必要とするジャークやその他のことを扱ったことを指摘することはおそらく重要です。
EDIT 2:ここでのアイデアのいくつかの基本的なサンプルコードで、擬似JavaScriptシンタックス-ノートgetKinematicPosition
され、部分的に適用され、それはちょうど時間の新機能戻っているので- >位置を:
私はここでの位置に固執していますが、それは他の何かかもしれませんgetVelocity
。
getKinematicPosition = initialVelocity => acceleration => time =>
((.5 *acceleration) * (time * time)) + (initialVelocity * time);
getPosition = getKinematicPosition ([0,0,0]) (GRAVITY);
onTick = totalTime => {
position = getPosition (totalTime);
onCollision = () => {
getPosition = changeTheFunction(totalTime);
//changeTheFunction uses totalTime to base updates from 0
//it could use getKinematicPosition or something else entirely
}
}