У меня были проблемы с моим кодом в течение двух недель, и я не смог его отладить. Я пришел сюда в надежде, что кто-то может помочь. Я написал программу, которая использует алгоритм Барнса-Хата для гравитационного моделирования n-тела. Моя проблема в том, что одна или несколько «частиц» будут иметь назначенную им позицию {NaN, NaN, NaN} (используя три двойных, чтобы представить x, y, z трехмерного пространства). Это, в свою очередь, заставляет другие частицы иметь ускорение {NaN, NaN, NaN} и, в свою очередь, скорость и положение {NaN, NaN, NaN}. По сути, после одного или двух кадров все исчезает. Кажется, это происходит в методе updateAcc, но у меня есть ощущение, что это не так. Я понимаю, что это огромное начинание, и я очень благодарен всем, кто мне помогает.
Что я проверил:
Нет отрицательных квадратных корней, и все значения, кажется, находятся в их пределах.
Исходный код доступен здесь . Еще раз спасибо.
Код, который, кажется, производит 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;
}