简单的java重力模拟

计算科学 模拟 爪哇
2021-12-10 12:44:15

我正在尝试编写一个使用牛顿万有引力定律来计算行星场的课程。我已经通过输入地球的值来测试我的代码,对于纯粹的垂直运动,所以我应该得到 g = -9.8 而我没有。我有一个可以使用的类,它可以对向量进行所有可以想象的操作,称为 PhysicsVector。我已经盯着我的代码很久了,但无法找出问题所在!如果有帮助,我可以添加主类,但我假设我在这里的 GravField 类中犯了一些数学错误:

import java.lang.Math;
public class GravField{ 
public static final double G = 6.674*Math.pow(10,-11);          //Gravitational constant, same for everything
private double planetMass=0;                        
private double planetRadius=0;                      
private double projectileX=0;
private double projectileY=0;
PhysicsVector projectilePosition = new PhysicsVector(a, projectileY);   //Haven't declared a yet, don't know if that's allowed
PhysicsVector gravityAcceleration = new PhysicsVector();

public GravField(double planetMass, double planetRadius, double projectileX, double projectileY){

    double distance = Math.sqrt(projectileX*projectileX+projectileY*projectileY);   //Distance of projectile from Earth
    double a = planetRadius + projectileX;              //Newton's law assumes origin at planet centre,
                                    //my co-ord system starts at planet surface

    double x = (-G*planetMass*projectileX)/(distance*distance*distance);    //Probably some maths mistake here
    double y = (-G*planetMass*projectileY)/(distance*distance*distance);

    gravityAcceleration.setVector(x, y);                //setVector is in PhysicsVector class and makes vector 
    gravityAcceleration.print2D();                  //xi + yj


}

public static double magnitude(PhysicsVector gravityAcceleration){

    double magnitudeOfGravField = gravityAcceleration.magnitude();  //again magnitude is in PhysicsVector class
    return magnitudeOfGravField;

}

}

2个回答

这应该是 codereview 的工作......但是我们到了,所以让我们继续。

这些是对您的类的一些修改,以使其更好地形成:

import java.lang.Math;

public class GravField {    
  private static final double G = 6.674*Math.pow(10,-11);           //Gravitational constant, same for everything
  private double planetMass = 0;                      
  private double planetRadius = 0;                        
  private PhysicsVector planetPosition;

  public GravField(double planetMass, double planetRadius, PhysicsVector planetPosition){
    this.planetPosition = planetPosition;
    this.planetMass = planetMass;
    this.planetRadius = planetRadius;
  }

  public PhysicsVector gravityAcceleration(PhysicsVector projectile){
    PhysicsVector distanceVector = projectile.difference(this.planetPosition);  // hope your class can make vector operations
    double distance = distanceVector.magnitude();   //Distance of projectile from Earth
    double x;
    double y;
    if (distance > this.planetRadius) {
      x = (-G * this.planetMass * distanceVector.getX()) / (distance * distance * distance);   
      y = (-G * this.planetMass * distanceVector.getY()) / (distance * distance * distance);
    } else {    // inside a planet gravity decreases linearly with the distance from the center
      double magnitude = G * this.planetMass * distance/Math.pow(this.planetRadius, 3.0);
      x = -magnitude * distanceVector.getX() / distance;
      y = -magnitude * distanceVector.getY() / distance;         
    }

    PhysicsVector gravity = new PhysicsVector();

    gravity.setVector(x, y);                //setVector is in PhysicsVector class and makes vector 

    return gravity;
  }

  public double magnitude(PhysicsVector projectile){
    double magnitudeOfGravField = this.gravityAcceleration(projectile).magnitude();  //again magnitude is in PhysicsVector class
    return magnitudeOfGravField;
  }
}

现在您可以在任何位置创建您的世界并计算空间中每个点的重力矢量,或者只计算其大小。

如果你有两个世界,你只需要实例化两个 GravField,你可以计算你的射弹上的总场,加上你实例化的两个世界产生的场。

享受!

牛顿的万有引力定律(除以弹丸的质量)是

g=Gmerr3

为地球的质量和半径手动计算得出的值为,这对我的口味来说已经足够接近了(我预计会出错,因为我们离地表很近,而地球不是点质量)。9.93 m/s2

您的错误是您在坐标中使用的原点位于地表而不是地心。你需要:r

double x = (-G*planetMass*a)/(distance*distance*distance);