我正在尝试使用Java解决ODE,到目前为止,我已经尝试了两个不同的库。我最信任的是Apache Commons Math,但即使对于简单的问题,我似乎也没有得到正确的解决方案。
当我在 Mathematica 中解决我的系统时,我得到了这个:
如果我用Apache Commons Math中的Dormand-Prince 8(5,3)求解器解决它,我得到这个:
根据这背后的理论,圆圈应该像第一张图片一样关闭。我怎样才能用Java获得这个解决方案?
这是我目前使用的Java代码(我已经测试了步长等的不同设置):
program.java:
import org.apache.commons.math3.ode.*;
import org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator;
import org.apache.commons.math3.ode.sampling.StepHandler;
import org.apache.commons.math3.ode.sampling.StepInterpolator;
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import static java.lang.Math.*;
public class program {
public static void main(String[] args) {
FirstOrderIntegrator dp853 = new DormandPrince853Integrator(1.0E-8, 10E-5, 1.0E-20, 1.0E-20);
FirstOrderDifferentialEquations ode = new CometSun();
double G = 1.48808E-34;
double sunMass = 1.9891E30;
double a = 1;
double e = 0.1;
double rp = a*(1-e);
double v0 = sqrt(G*sunMass*(2/rp-1/a));
double t = 2*PI*sqrt(pow(a,3)/(G*sunMass));
double[] y = new double[6];
y[0] = -rp;
y[1] = 0;
y[2] = 0;
y[3] = 0;
y[4] = v0;
y[5] = 0;
StepHandler stepHandler = new StepHandler() {
ArrayList<String> steps = new ArrayList<String>();
public void init(double t0, double[] y0, double t) {
}
public void handleStep(StepInterpolator interpolator, boolean isLast) {
double t = interpolator.getCurrentTime();
double[] y = interpolator.getInterpolatedState();
if( t > steps.size() )
steps.add(t + " " + y[0] + " " + y[1] + " " + y[2]);
if(isLast) {
try{
PrintWriter writer = new PrintWriter(new File("results.txt"), "UTF-8");
for(String step: steps) {
writer.println(step);
}
writer.close();
} catch(Exception e) {};
}
}
};
dp853.addStepHandler(stepHandler);
dp853.integrate(ode, 0.0, y, t, y);
System.out.println(y[0]);
System.out.println(y[1]);
}
}
CometSun.java:
import org.apache.commons.math3.ode.FirstOrderDifferentialEquations;
import static java.lang.Math.*;
public class CometSun implements FirstOrderDifferentialEquations {
double G = 1.48808E-34;
double sunMass = 1.9891E30;
public int getDimension() {
return 6;
}
public void computeDerivatives(double t, double[] y, double[] yp) {
double coeff = G*sunMass/pow(pow(y[0],2)+pow(y[1],2)+pow(y[2],2),3/2);
yp[0] = y[3];
yp[1] = y[4];
yp[2] = y[5];
yp[3] = -coeff*y[0];
yp[4] = -coeff*y[1];
yp[5] = -coeff*y[2];
}
}
答案 0 :(得分:12)