我正在写一个2d原行星盘的模拟,现在最耗时的代码是计算引力吸引力。这是我目前使用的代码。优化一个n体引力算法
for(int i=0; i<particleCount; i++){
if(boolArray[i]){ //boolArray is linked with particleArray, false means the linked particle has collided with another particle and no longer exists
double iX = particleArray[i].getXPosition();
double iY = particleArray[i].getYPosition();
double iM = particleArray[i].getMass();
for(int j=0; j<particleCount; j++){
if(i!=j&&boolArray[j]){
double rX = iX-particleArray[j].getXPosition();
double rY = iY-particleArray[j].getYPosition();
double rT = Math.sqrt(rX*rX+rY*rY);
double rF = rT*rT*rT;
double fT = -constantGravity*iM*particleArray[j].getMass()/rF;
particleArray[i].updateForce(rX*fT, rY*fT);
}
}
}
}
有没有人有关于如何加快它的任何想法?我认为sqrt在
double rT = Math.sqrt(rX*rX+rY*rY);
是最大的罪魁祸首,但我不知道我是否可以摆脱它。
编译准备代码能够在https://github.com/quietsamurai98/2D-Accretion-Simulation/tree/Trails-png
Java使用Smart Power算法用于sqrt函数,其复杂度为O(log n),其速度很快。这不是延迟的原因 – Rishi
您是否考虑过使用扇区而不是粒子作为均匀区域(尘埃......)?这应该会大大降低物体的粗糙度,精度会稍微降低,但如果您意识到离散积分与现实无关......那么拉伸精度应该不会有太大的影响。为了确保你在比较结果后几次迭代与展位方法,他们应该+/- +/- – Spektre