【问题标题】:NBody code that won't work in java - what do I need to fix?NBody 代码在 java 中不起作用 - 我需要修复什么?
【发布时间】:2016-04-07 01:15:32
【问题描述】:

我在 Eclipse 中编写了这段代码来求解 NBody 物理方程,但是有一个未解决的错误。在这一行中“double Fnet = Gmassmass/(distdist);” eclipse 用红色强调 Gmass 并给我消息“操作符 * 对于参数类型 double、double[] 未定义。”我该如何解决这个问题?完整代码如下。

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]);
        }

    }
}

【问题讨论】:

  • G 是一个 doublemass 是一个数组。你不能这样做G * mass

标签: java eclipse error-handling physics multiplication


【解决方案1】:

您实际上尝试过这样做:

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

这显然(我希望很明显)行不通。

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多