public void testModelsMerging() throws DerivativeException, IntegratorException { // theoretical solution: y[0] = cos(t), y[1] = sin(t) FirstOrderDifferentialEquations problem = new FirstOrderDifferentialEquations() { public void computeDerivatives(double t, double[] y, double[] dot) throws DerivativeException { dot[0] = -y[1]; dot[1] = y[0]; } public int getDimension() { return 2; } }; // integrate backward from π to 0; ContinuousOutputModel cm1 = new ContinuousOutputModel(); FirstOrderIntegrator integ1 = new DormandPrince853Integrator(0, 1.0, 1.0e-8, 1.0e-8); integ1.setStepHandler(cm1); integ1.integrate(problem, Math.PI, new double[] {-1.0, 0.0}, 0, new double[2]); // integrate backward from 2π to π ContinuousOutputModel cm2 = new ContinuousOutputModel(); FirstOrderIntegrator integ2 = new DormandPrince853Integrator(0, 0.1, 1.0e-12, 1.0e-12); integ2.setStepHandler(cm2); integ2.integrate(problem, 2.0 * Math.PI, new double[] {1.0, 0.0}, Math.PI, new double[2]); // merge the two half circles ContinuousOutputModel cm = new ContinuousOutputModel(); cm.append(cm2); cm.append(new ContinuousOutputModel()); cm.append(cm1); // check circle assertEquals(2.0 * Math.PI, cm.getInitialTime(), 1.0e-12); assertEquals(0, cm.getFinalTime(), 1.0e-12); assertEquals(cm.getFinalTime(), cm.getInterpolatedTime(), 1.0e-12); for (double t = 0; t < 2.0 * Math.PI; t += 0.1) { cm.setInterpolatedTime(t); double[] y = cm.getInterpolatedState(); assertEquals(Math.cos(t), y[0], 1.0e-7); assertEquals(Math.sin(t), y[1], 1.0e-7); } }
private boolean checkAppendError(ContinuousOutputModel cm, double t0, double[] y0, double t1) throws DerivativeException { try { ContinuousOutputModel otherCm = new ContinuousOutputModel(); otherCm.handleStep(buildInterpolator(t0, y0, t1), true); cm.append(otherCm); } catch (IllegalArgumentException iae) { // expected behavior return true; } return false; }