Java/处理计算返回“;“南”;及;“无限”;

Java/处理计算返回“;“南”;及;“无限”;,java,processing,simulation,Java,Processing,Simulation,我正在尝试对in-Processing/Java进行模拟。我创建了一个行星物体,并定义了几个函数来计算行星的引力、力和速度。程序运行时没有任何错误。问题在于计算返回无穷大,并且 NaN输出。 我没有发现任何被零除的错误。 为什么要这样做 float simulationTime = 0.01; float earthMass = pow(10,24)*5.972; Planet[] bodies = {new Planet(100,200, 0, 0,earthMass/2),

我正在尝试对in-Processing/Java进行模拟。我创建了一个行星物体,并定义了几个函数来计算行星的引力、力和速度。程序运行时没有任何错误。问题在于计算返回无穷大,并且 NaN输出。 我没有发现任何被零除的错误。 为什么要这样做

float simulationTime = 0.01;
float earthMass = pow(10,24)*5.972;

Planet[] bodies = {new Planet(100,200, 0, 0,earthMass/2),
                   new Planet(400,500, 0, 0,earthMass/2),
                   new Planet(800,200, 0, 0,earthMass/2)};
int size = 500;
float G = 6.674*pow(10, -11);
float gravAttract(float mass1, float mass2, float x1, float y1, float x2, float y2) {
  float force = G*mass1*mass2/pow(dist1(x1, y1, x2, y2), 2);
  //println(pow(dist1(x1, y1, x2, y2), 2));
  //println(force);
  return force;
}
float attract(Planet one,Planet two){
  float force = G*one.mass*two.mass/pow(dist1(one.xpos,one.ypos,two.xpos,two.ypos),2);
  println(one.xpos,two.xpos,one.xspeed,two.xspeed);
  return force;
}
float[] forceXY(int body){
  float[] xy = {0,0};
  for (int ii = 0; ii<bodies.length; ii = ii+1){
    if (ii == body){
      continue;
    }
    else{
      xy[0] = xy[0]+attract(bodies[body],bodies[ii])*
      (bodies[ii].xpos-bodies[body].xpos)/dist1(bodies[body].xpos,bodies[body].ypos,bodies[ii].xpos,bodies[ii].ypos);
      xy[1] = xy[1]+attract(bodies[body],bodies[ii])*
      (bodies[ii].ypos-bodies[body].ypos)/dist1(bodies[body].xpos,bodies[body].ypos,bodies[ii].xpos,bodies[ii].ypos);
      println(xy);
    }
  }
  return xy;
}
float dist1(float x1,float y1,float x2,float y2){
  float x = dist(x1,y1,x2,y2);
  x = x*149.6*pow(10,7);
  //println(x1,y1,x2,y2);
  return x;
}
class Planet {
  float xpos;
  float ypos;
  float xspeed;
  float yspeed;
  float mass;

  Planet(float a, float b, float c, float d, float e) {
    xpos = a;
    ypos = b;
    xspeed = c;
    yspeed = d;
    mass = e;
  }
  void update(float xforce, float yforce) {
    //println("xy",xpos,ypos);
    float xa = xforce/mass;
    float ya = yforce/mass;
    xspeed = xspeed + xa*simulationTime;
    yspeed = yspeed + ya*simulationTime;
    xpos = xpos + xspeed*simulationTime;
    ypos = ypos + yspeed*simulationTime;
  }
}
void setup() {
  size(1000, 1000);
  frameRate(1);
}
void draw() {
  background(0);
  
  for (int ii = 0; ii < bodies.length; ii = ii+1){
    float[] asdf = new float[2];
    asdf = forceXY(ii);
    circle(bodies[ii].xpos,bodies[ii].ypos,10);
    bodies[ii].update(asdf[0],asdf[1]);
  }
}
float-simulationTime=0.01;
浮土质量=功率(10,24)*5.972;
行星[]天体={新行星(100200,0,0,地球质量/2),
新行星(400500,0,0,地球质量/2),
新行星(800200,0,0,地球质量/2)};
int size=500;
浮子G=6.674*pow(10,-11);
浮子质量(浮子质量1、浮子质量2、浮子x1、浮子y1、浮子x2、浮子y2){
浮力=G*mass1*mass2/pow(距离1(x1,y1,x2,y2),2);
//println(pow(dist1(x1,y1,x2,y2),2));
//println(部队);
返回力;
}
浮动吸引(行星一,行星二){
浮力=G*1.mass*2.mass/pow(dist1(1.xpos,1.ypos,2.xpos,2.ypos),2);
println(1.xpos,2.xpos,1.xspeed,2.xspeed);
返回力;
}
浮动[]强制XY(内部主体){
float[]xy={0,0};

对于(int ii=0;ii我知道你试图用真实的物理值进行计算。问题是,天文质量、距离和力都是天文的,不仅是字面上的,而且是比喻上的。数字太大了,中间计算的结果不能用有限的范围o来表示f
float
数据类型

解决方案是改变单位。例如,不用米、千克和秒,而是用“天文单位”(地球和太阳之间的距离)、质量(地球质量的倍数)和时间(年)来测量距离。或者使用标准。最重要的是,这会改变重力常数G的值

如果你不太喜欢做一个可以预测行星真实位置的模拟,那么只需“飞行”并设置G=1,将质量设置为较小的数值,并利用速度进行模拟,你会发现很容易做出一个真实的模拟