2016-04-07 8 views
0

Ich schrieb diesen Code in Eclipse, um die NBody-Physikgleichung zu lösen, aber es gibt einen ungelösten Fehler. In dieser Zeile "Doppel-Fnet = G Masse Masse/(dist dist);" Eclipse unterstreicht G Masse in rot und gibt mir die Nachricht "Der Operator * ist nicht definiert für die Argumentart (en) double, double []." Wie behebe ich dieses Problem? Der vollständige Code ist unten enthalten.NBodierungscode, der in Java nicht funktioniert - was muss ich reparieren?

public class NBody { 

    public static final String PLANETS_FILE = "planets.txt"; 

    // animation pause (in miliseconds) 
    public static final int DELAY = 20; 

    // music (2001 theme) 
    public static final String MUSIC = "2001theme.wav"; 

    // background image 
    public static final String BACKGROUND = "starfield.jpg"; 

    // gravitational constant (N m^2/kg^2) 
    public static final double G = 6.67e-11; 

             // parameters from command line 
    public static double T;    // simulate from time 0 to T (s) 
    public static double dt;   // time quantum (s) 

             // parameters from first two lines 
    public static int N;    // number of bodies 
    public static double R;    // radius of universe 

    public static double[] rx;   // x position (m) 
    public static double[] ry;   // y position (m) 
    public static double[] vx;   // x velocity (m/s) 
    public static double[] vy;   // y velocity (m/s) 
    public static double[] mass;  // mass (kg) 
    public static String[] image;  // name of gif 

    // TODO: read the planet file, new the parallel arrays, and load 
    // their values from the file. 
    public static void loadPlanets(String planetFileName) { 
     java.util.Scanner input = new java.util.Scanner(System.in); 

      int N = input.nextInt(); 
      double R = input.nextDouble(); 
      double[] rx = new double[N];   
      double[] ry = new double[N];   
      double[] vx = new double[N];   
      double[] vy = new double[N];   
      double[] mass = new double[N];   
      String[] image= new String[N]; 

      for (int i = 0; i < N; i++) { 

        rx[i] = input.nextDouble(); 
        ry[i] = input.nextDouble(); 
        vx[i] = input.nextDouble(); 
        vy[i] = input.nextDouble(); 
        mass[i] = input.nextDouble(); 
        image[i] = "./images/" + input.next(); 
       } 

     } 




    public static void runSimulation() { 

     // run numerical simulation from 0 to T 
     for (double t = 0.0; t < T; t += dt) { 

      // the x- and y-components of force 
      double[] fx = new double[N]; 
      double[] fy = new double[N]; 

      // calculate forces on each object 
      for (int i = 0; i < N; i++) { 

       // reset forces to zero 
       fx[i] = 0.0; 
       fy[i] = 0.0; 

       for (int j = 0; j < N; j++) { 
        if (i != j) { 
         double dx = rx[j] - rx[i]; 
         double dy = ry[j] - ry[i]; 
         double dist = Math.sqrt(dx*dx + dy*dy); 
         double Fnet = G*mass*mass/(dist*dist); 

         fx[i] += Fnet * dx/dist; 
         fy[i] += Fnet * dy/dist; 
        } 
       } 
      } 

      //calculate acceleration, velocities and positions 
      double ax = 0.0; 
      double ay = 0.0; 
      for (int i = 0; i < N; i++) { 
       ax = fx[i]/mass[i]; 
       ay = fy[i]/mass[i]; 

       vx[i] += dt * ax; 
       vy[i] += dt * ay; 

       rx[i] += dt * vx[i]; 
       ry[i] += dt * vy[i]; 



      // draw background and then planets 
      StdDraw.picture(0, 0, BACKGROUND); 
      StdDraw.picture(rx[i], ry[i], image[i]); 

      //loop to plot the N bodies 

      // pause for a short while, using "animation mode" 
      StdDraw.show(DELAY); 
      } 
     } 

    } 

    public static void main(String[] args) { 

     // TODO: read T and dt from command line. 
     T = 0; 

     // load planets from file specified in the command line 
     String planetFileName = "planets.txt"; 
     loadPlanets(planetFileName); 

     // rescale coordinates that we can use natural x- and y-coordinates 
     StdDraw.setXscale(-R, +R); 
     StdDraw.setYscale(-R, +R); 

     StdAudio.play(MUSIC); 

     // turn on animation mode 
     StdDraw.show(0); 

     // Run simulation 
     runSimulation(); 

     // print final state of universe to standard output 
     System.out.printf("%d\n", N); 
     System.out.printf("%.2e\n", R); 
     for (int i = 0; i < N; i++) { 
      System.out.printf("%11.4e %11.4e %11.4e %11.4e %11.4e %12s\n", 
          rx[i], ry[i], vx[i], vy[i], mass[i], image[i]); 
     } 

    } 
} 
+1

'G' ist ein' double' und 'mass' ist ein Array. Du kannst nicht "G * Masse" machen. –

Antwort

0

Sie tatsächlich versucht, dies zu tun:

double * double[] * double[]/(double * double)

die offensichtlich (ich hoffe, es liegt auf der Hand) wird nicht funktionieren.

+0

Die Antwort ist richtig, warum die down vote? – zyexal