我的代码出现问题已有两周了,并且调试失败。我来这里是希望有人能提供帮助。我编写了一个程序,利用 Barnes-Hut 算法进行多体引力模拟。我的问题是一个或多个“粒子”将被分配 {NaN, NaN, NaN} 的位置(使用三个 double 来表示 3-d 空间的 x, y, z)。这反过来又导致其他粒子具有 {NaN, NaN, NaN} 的加速度,进而导致 {NaN, NaN, NaN} 的速度和位置。基本上,一两帧之后,一切都会消失。它似乎发生在 updateAcc 方法中,但我有一种感觉,事实并非如此。我知道这是一项艰巨的任务,非常感谢任何帮助我的人。 我检查过的内容: 不存在负平方根,并且所有值似乎都在其范围内。 源码可获取here 。再次感谢。
似乎产生 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;
}
最佳答案
我不确定这是否是唯一的问题,但这是一个开始。
sumDeltaSquare 有时会返回 0,这意味着当在 getForce ratio/= sumDeltaSquare(pos1, pos2);
中使用该值时,它将产生无穷大并开始引起问题。
这是一个严重的问题,您需要调试并弄清楚一切的含义。不过我很喜欢看这些点。
关于java - NaN 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711760/