Goals |
Frequently Asked Questions |
What's the easiest way to copy the nbody directory from the COS 126 ftp site to my computer?
DrJava doesn't let me redirect standard input. What should I do instead? Use the command line. Here are instructions for configuring your system to use the command line: [ Windows · Mac · Linux ]
How do I plot a picture using StdDraw? The command StdDraw.picture(x, y, filename) plots the image in the given filename (either JPEG, GIF, or PNG format) on the canvas, centered on (x, y).
My computer doesn't display the animation smoothly. Is there anything I can do? Use StdDraw.show(30) to turn on the animation mode of standard draw. Call it once at the end of each time step, not after each each drawing command.
Can I combine Steps 1, 2, and 3 into one massive loop? No! This will simultaneously screw up the physics and make your code harder to understand and debug.
I draw the planets, but nothing appears on the screen. Why? Use StdDraw.setXscale() and StdDraw.setYscale() to change the coordinate system to use the physics coordinates instead of the unit box.
My planets don't move. Make sure that you are using a large enough value of Δt (we specify 25000, but you might want a smaller one when debugging).
My planets repel each other. Why don't they attract each other? Make sure that you get the sign right when you apply Newton's law of gravitation: (x[j] - x[i]) vs. (x[i] - x[j]). Note that Δx and Δy can be positive or negative so do not use Math.abs(). Do not consider changing the universal gravitational constant G to patch your code!
What is Δx? It's the change in x-coordinate between two bodies (not between a body at time t and at time t + Δt).
When I compile NBody.java, it says "cannot resolve symbol StdDraw." Any thoughts? Be sure you have either StdDraw.java or StdDraw.class in the current directory.
How do I submit the extra credit? Submit the files as usual using Moodle. Document what you did in your readme.txt file.
How do I change my directory to the H: drive from the Windows Command Prompt? Type H: at the command prompt. Then cd to the appropriate directory.
Possible Progress Steps |
These are purely suggestions for how you might make progress. You do not have to follow these steps. Warning: this program is more involved than the previous ones, and you should budget more time accordingly. The best advice we can give you is to carefully test, debug, and re-test your code as you write it. Do not attempt to write the whole program at once - if you do, then you will have no idea where to find the error if the program doesn't work. We promise that proactive testing will save you enormous amounts of time in the long run. Trust us! Also, if you get stumped or frustrated on some portion of the assignment, you should not hesitate to consult a preceptor.
Debugging |
Initial data: 5 2.50e+11 1.496e+11 0.000e+00 0.000e+00 2.980e+04 5.974e+24 earth.gif 2.279e+11 0.000e+00 0.000e+00 2.410e+04 6.419e+23 mars.gif 5.790e+10 0.000e+00 0.000e+00 4.790e+04 3.302e+23 mercury.gif 0.000e+00 0.000e+00 0.000e+00 0.000e+00 1.989e+30 sun.gif 1.082e+11 0.000e+00 0.000e+00 3.500e+04 4.869e+24 venus.gif After one time step (delta t = 25000): 5 2.50e+11 1.496e+11 7.450e+08 -1.482e+02 2.980e+04 5.974e+24 earth.gif 2.279e+11 6.025e+08 -6.386e+01 2.410e+04 6.419e+23 mars.gif 5.788e+10 1.198e+09 -9.893e+02 4.790e+04 3.302e+23 mercury.gif 3.309e+01 0.000e+00 1.323e-03 0.000e+00 1.989e+30 sun.gif 1.082e+11 8.750e+08 -2.833e+02 3.500e+04 4.869e+24 venus.gif After two time steps: 5 2.50e+11 1.496e+11 1.490e+09 -2.964e+02 2.980e+04 5.974e+24 earth.gif 2.279e+11 1.205e+09 -1.277e+02 2.410e+04 6.419e+23 mars.gif 5.783e+10 2.394e+09 -1.979e+03 4.788e+04 3.302e+23 mercury.gif 9.926e+01 2.820e-01 2.647e-03 1.128e-05 1.989e+30 sun.gif 1.082e+11 1.750e+09 -5.666e+02 3.500e+04 4.869e+24 venus.gif
Enrichment |
Here's a more complete explanation of how you should interpret the variables. The classic Euler method updates the position uses the velocity at time t instead of using the updated velocity at time t + Δt. A better idea is to use the velocity at the midpoint t + Δt / 2. The leapfrog method does this in a clever way. It maintains the position and velocity one-half time step out of phase: At the beginning of an iteration, (rx, ry) represents the position at time t and (vx, vy) represents the velocity at time t - Δt / 2. Interpreting the position and velocity in this way, the updated position (rx + Δt vx, ry + Δt vy). uses the velocity at time t + Δt / 2. Almost magically, the only special care needed to deal with the half time-steps is to initialize the system's the velocity at time t = -Δt / 2 (instead of t = 0). Note also that the acceleration is computed at time t so that when we update the velocity, we are using the acceleration at the midpoint of the interval under consideration.