1

ここに画像の説明を入力

JavaScript の丸め誤差がかなり扱いにくいことは理解していますが、アドバイスをお願いします。

アプリケーションの丸め誤差を軽減する最善の方法は何ですか? 大きな質量の周りの軌道であるべき立方体があります。立方体は軌道ごとにかなりの量の軌道運動量を獲得し、最終的に介入なしで脱出速度に到達します。

これを防ぐには、軽量な方法が必要です。

数字を修正する方法を見つけようとするのが私の最善の策ですか、それとも、それがどこにあるべきかの論理的な仮定に基づいてエラー修正を使用して、それをファッジして元の場所に戻す方がよいでしょうか?

私の物理学の関数は次のとおりです。

function physPosition(object, delta){
// Update Position
object.position.x += (object.velocity.x * delta) + (0.5*object.acceleration.x*   (Math.pow(delta,2)));
object.position.y += (object.velocity.y * delta) + (0.5*object.acceleration.y*(Math.pow(delta,2)));
object.position.z += (object.velocity.z * delta) + (0.5*object.acceleration.z*(Math.pow(delta,2)));

// Update Velocity (acceleration)
object.velocity.x += object.acceleration.x * delta;
object.velocity.y += object.acceleration.y * delta;
object.velocity.z += object.acceleration.z * delta;

// Update Velocity (gravity)
object.velocity.x += object.gravity.x * delta;
object.velocity.y += object.gravity.y * delta;
object.velocity.z += object.gravity.z * delta;

// Update Rotation
object.rotation.x += object.spin.x * delta; 
object.rotation.y += object.spin.y * delta; 
object.rotation.z += object.spin.z * delta; 
}

function physGravity(a, b){ var grav = new THREE.Vector3(0, 0, 0); grav = grav.subVectors(a.position, b.position); var r = grav.lengthSq(); var A = (G)*(b.mass)/(r); grav = grav.normalize(); grav.multiplyScalar(-A); a.gravity = grav; }

4

2 に答える 2

2

運動方程式の数値積分を実行しようとしています。これは有効な解決策の 1 つです。別の解決策は、Derek が提案したように、運動方程式の解析解を計算することです。問題は、現在使用しているソリューションよりも優れたインテグレーターが必要だということです。数値積分について学ぶようにしてください。特に、ルンゲ・クッタ法は実装が簡単で使いやすいため、お勧めします。

また、数値積分法を含む JavaScript ライブラリを見つけて、独自に実装するのではなく、それらを使用することもできます。4 次のルンゲ クッタ法を使用した例がここにあり、 Numeric JavaScript ライブラリには と呼ばれる Dormand-Prince 積分器が含まれていdopriます。

于 2014-08-29T06:56:32.907 に答える
0

Derek のコメントは理にかなっていますが、可能であればすべての関数を微分ではなくパラメトリックにしてください。あなたのコードでは、別の可能性 (どれほど現実的かはわかりません) は、浮動小数点演算に頼るのではなく、自分で分数を使用してエラーを抑えようとすることです。 .

独自の分数演算を実装し、常に分子と分母を分離し、ポイントの座標を計算するために絶対に必要な場合にのみ除算します。これにより、精度が向上します。使用可能なビット数が 2 倍になるためです。また、浮動小数点エラーは、主に基数 2 で表現できないことが原因で発生しますが、JavaScript が許可する限り、整数と同じくらい多くのものがあります。範囲外になる恐れがあるため、分子と分母を時々正規化する必要がある場合があります。これにより、エラーが再び発生しますが、単純な浮動小数点演算で行っているため、各除算よりも頻度が低くなります。

明らかに、少し遅くなりますが、JavaScript は計算が非常に高速です。

于 2014-08-29T08:31:49.907 に答える