私は2週間コードに問題があり、デバッグに失敗しました。私は誰かが助けることができるという希望でここに来ました。私は、n-body重力シミュレーションにBarnes-Hutアルゴリズムを利用したプログラムを作成しました。私の問題は、(NaN、NaN、NaN){NaN、NaN、NaN}の位置が1つ以上の「パーティクル」に割り当てられていることです(3次元空間のx、y、zを表すために3つの2倍を使用します)。これにより、他の粒子は{NaN、NaN、NaN}の加速度を持ち、さらに{NaN、NaN、NaN}の速度と位置も持ちます。基本的に、1フレームまたは2フレーム後、すべてが消えます。 updateAccメソッドで発生しているようですが、そうではないと感じています。私はこれが大きな仕事であると理解し、私を助けてくれる誰にとっても非常に感謝しています。 私がチェックしたこと: 負の平方根はなく、すべての値が限界内にあるようです。 ソースコードはhereです。再度、感謝します。 NaNを生成するようだNaNに関する問題
コード:
private static void getAcc(particle particle, node node)
{
if ((node.particle == null && node.children == null) || node.particle == particle)
{
//Geting gravity to a node that is either empty or the same node...
}
else if (distance(node.centerOfMass, particle.position)/node.sideLength > theta && node.children != null)
{
for (int i = 0; i < node.children.length; i++)
{
if (node.children[i] != null)
{
getAcc(particle, node.children[i]);
}
}
}
else
{
particle.acceleration = vecAdd(particle.acceleration, vecDiv(getForce(particle.position, particle.mass, node.centerOfMass, node.containedMass), particle.mass));
}
}
private static double sumDeltaSquare(double[] pos1, double[] pos2)
{
return Math.pow(pos1[0]-pos2[0],2)+Math.pow(pos1[1]-pos2[1],2)+Math.pow(pos1[2]-pos2[2],2);
}
private static double[] getForce(double[] pos1, double m1, double[] pos2, double m2)
{
double ratio = G*m1*m2;
ratio /= sumDeltaSquare(pos1, pos2);
ratio /= Math.sqrt(sumDeltaSquare(pos1,pos2));
return vecMul(vecSub(pos2, pos1), ratio);
}
private static double distance(double[] position, double[] center)
{
double distance = Math.sqrt(Math.pow(position[0]-center[0],2) + Math.pow(position[1]-center[1],2) + Math.pow(position[2]-center[2],2));
return distance;
}
?そのコードを投稿するとよいでしょう。 – Hidde
それだけです。NaNが実際にどこから来ているのかを特定できませんでした。 – danfoster3141
クローズしてください:見知らぬ人に検査によるコードの100行分のエラーを発見することは生産的ではありません。デバッガー(または多くの印刷ステートメント)を使用して後方にトレースする必要があります。 NaNを生成するどこかの計算が必要です。 –