Example: Contour Chart from Gridded Data

In the restricted three-body problem, two large objects (masses M_1 and M_2) a distance a apart, undergoing mutual gravitational attraction, circle a common center-of-mass. A third small object (mass m ) is assumed to move in the same plane as M_1 and M_2 and is assumed to be two small to affect the large bodies. For simplicity, we use a coordinate system that has the center of mass at the origin. M_1 and M_2 are on the x -axis at x_1 and x_2, respectively.

In the center-of-mass coordinate system, the effective potential energy of the system is given by

 V= \frac{m(M_1+M_2)G}{a} \left[ \frac{x_2}{\sqrt{(x-x_1)^2+y^2}} - \frac{x_1}{\sqrt{(x-x_2)^2+y^2}} - \frac{1}{2}\left( x^2+y^2 \right) \right]
The universal gravitational constant is G . The following program plots the part of V(x,y) inside of the square bracket. The factor \frac{m(M_1+M_2)G}{a} is ignored because it just scales the plot.
import com.imsl.chart.*;

public class ContourEx1 extends javax.swing.JApplet {
    private JPanelChart panel;
    
    public void init() {
        Chart chart = new Chart(this);
        panel = new JPanelChart(chart);
        getContentPane().add(panel, java.awt.BorderLayout.CENTER);
        setup(chart);
    }
    
    static private void setup(Chart chart) {        
        int nx = 80;
        int ny = 80;
        
        // Allocate space
        double xGrid[] = new double[nx];
        double yGrid[] = new double[ny];
        double zData[][] = new double[nx][ny];
        
        // Setup the grids points
        for (int i = 0;  i < nx;  i++) {
            xGrid[i] = -2 + 4.0*i/(double)(nx-1);
        }
        for (int j = 0;  j < ny;  j++) {
            yGrid[j] = -2 + 4.0*j/(double)(ny-1);
        }
        
        // Evaluate the function at the grid points
        for (int i = 0;  i < nx;  i++) {
            for (int j = 0;  j < ny;  j++) {
                double x = xGrid[i];
                double y = yGrid[j];
                double rm = 0.5;
                double x1 = rm / (1.0+rm);
                double x2 = x1 - 1.0;
                double d1 = Math.sqrt((x-x1)*(x-x1)+y*y);
                double d2 = Math.sqrt((x-x2)*(x-x2)+y*y);
                zData[i][j] = x2/d1 - x1/d2 - 0.5*(x*x+y*y);
            }
        }
        
        // Create the contour chart, with user-specified levels and a legend
        AxisXY axis = new AxisXY(chart);
        double cLevel[] = {-7, -5.4, -3, -2.3, -2.1, -1.97, -1.85, -1.74, -1.51, -1.39, -1};
        Contour c = new Contour(axis, xGrid, yGrid, zData, cLevel);
        c.getContourLegend().setPaint(true);
    }
    
    
    public static void main(String argv[]) {
        JFrameChart frame = new JFrameChart();
        ContourEx1.setup(frame.getChart());
        frame.show();
    }
}

Output

eqn_0188

Link to Java source.