java/ch/wlkl/javaExamples/LaGrange.java

/*
 * laGrange.java
 *
 * Created on 3. Oktober 2004, 16:33
 */

package ch.wlkl.javaExamples;

/**
 * 
 * @author walter
 */
public class LaGrange {

    /** Creates a new instance of laGrange */
    public LaGrange(float sm, float em, float sr) {
        this.sm = sm;
        this.em = em;
        this.sr = sr;
        er = sr / em * sm;
        omega = (float) (Math.sqrt(em * Gamma / sr) / (er + sr));
    }

    public String toString() {
        return "earth " + em + " kg " + er + " m, sun " + sm + " kg " + sr
                + " m, omega " + omega + " s-1 " + (omega * 86400 * 365.25)
                + " y-1";
    }

    final float Gamma = 6.67e-11f; /* georgi system m**3 * kg**-1 * s**-2 */

    float sm; /* sun mass in kg */

    float em; /* earth mass in kg */

    float sr; /* sun distance from center of gravity in m */

    float er; /* earth distance from center of gravity in m */

    float omega; /* rotation speed */

    public float[] accAt(float[] pos) {
        float[] r = new float[2];
        float e = (float) (Gamma * em / Math.pow(Math.pow(pos[0] - er, 2)
                + pos[1] * pos[1], 1.5));
        float s = (float) (Gamma * sm / Math.pow(Math.pow(pos[0] + sr, 2)
                + pos[1] * pos[1], 1.5));
        r[0] = omega * omega * pos[0] - (pos[0] - er) * e - (pos[0] + sr) * s;
        r[1] = omega * omega * pos[1] - pos[1] * e - pos[1] * s;
        return r;
    }

    public void search(float[] from, float[] to, int steps) {
        float[] cur;
        float[] na;
        float[] nei = new float[2];
        float dist;
        for (int i = 0; i <= steps; i++)
            for (int j = 0; j <= steps; j++) {
                float pos[] = { (i * from[0] + (steps - i) * to[0]) / steps,
                        (j * from[1] + (steps - j) * to[1]) / steps };
                cur = accAt(pos);
                dist = cur[0] * cur[0] + cur[1] * cur[1];
                boolean mini = true;
                boolean maxi = true;
                for (int k = -1; k <= 1; k++)
                    for (int l = -1; l <= 1; l++) {
                        nei[0] = pos[0] + k * (to[0] - from[0]) / steps;
                        nei[1] = pos[1] + l * (to[1] - from[1]) / steps;
                        na = accAt(nei);
                        if (na[0] * na[0] + na[1] * na[1] < dist)
                            mini = false;
                        if (na[0] * na[0] + na[1] * na[1] > dist)
                            maxi = false;
                    }

                if (mini || maxi)
                    System.out.println("local minima " + mini + " maxi " + maxi
                            + " step " + i + "/" + j + "/" + steps + " at ("
                            + pos[0] + ", " + pos[1] + ")" + " acc (" + cur[0]
                            + ", " + cur[1] + ")");
            }
    }

    public static void main(String[] args) {
        LaGrange se;
        float[] x = { 0, 0 };
        float[] y = { 0, 0 };
        float[] r;
        System.out
                .println(new LaGrange(5.976e24f, 5.976e24f * 333.1e3f, 149e9f));
        System.out.println(se = new LaGrange(5.976e24f * 333.1e3f, 5.976e24f,
                149e9f / 333.1e3f));
        /* System.out.println(se = new LaGrange(5.976e24f, 5.976e24f, 1)); */
        r = se.accAt(x);
        System.out.println("-sr > (" + r[0] + ", " + r[1]);
        x[0] = -se.sr;
        r = se.accAt(x);
        System.out.println("-sr > (" + r[0] + ", " + r[1]);
        x[0] = se.er;
        r = se.accAt(x);
        System.out.println("+er > (" + r[0] + ", " + r[1]);
        x[0] = x[1] = -5 * se.er;
        y[0] = y[1] = 5 * se.er;
        se.search(x, y, 300);
        System.out.println("end");
    }
}