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