HarmonicCurveFitter extends AbstractCurveFitter { public static HarmonicCurveFitter create() { return new HarmonicCurveFitter(null, Integer.MAX_VALUE); } private  HarmonicCurveFitter(double[] initialGuess,
                                int maxIter); static HarmonicCurveFitter create(); HarmonicCurveFitter withStartPoint(double[] newStart); HarmonicCurveFitter withMaxIterations(int newMaxIter);  }
@Test(expected=NumberIsTooSmallException.class) public void testPreconditions1() { HarmonicCurveFitter.create().fit(new WeightedObservedPoints().toList()); }
@Test public void testNoError() { final double a = 0.2; final double w = 3.4; final double p = 4.1; final HarmonicOscillator f = new HarmonicOscillator(a, w, p); final WeightedObservedPoints points = new WeightedObservedPoints(); for (double x = 0.0; x < 1.3; x += 0.01) { points.add(1, x, f.value(x)); } final HarmonicCurveFitter fitter = HarmonicCurveFitter.create(); final double[] fitted = fitter.fit(points.toList()); Assert.assertEquals(a, fitted[0], 1.0e-13); Assert.assertEquals(w, fitted[1], 1.0e-13); Assert.assertEquals(p, MathUtils.normalizeAngle(fitted[2], p), 1e-13); final HarmonicOscillator ff = new HarmonicOscillator(fitted[0], fitted[1], fitted[2]); for (double x = -1.0; x < 1.0; x += 0.01) { Assert.assertTrue(FastMath.abs(f.value(x) - ff.value(x)) < 1e-13); } }
@Test public void test1PercentError() { final Random randomizer = new Random(64925784252L); final double a = 0.2; final double w = 3.4; final double p = 4.1; final HarmonicOscillator f = new HarmonicOscillator(a, w, p); final WeightedObservedPoints points = new WeightedObservedPoints(); for (double x = 0.0; x < 10.0; x += 0.1) { points.add(1, x, f.value(x) + 0.01 * randomizer.nextGaussian()); } final HarmonicCurveFitter fitter = HarmonicCurveFitter.create(); final double[] fitted = fitter.fit(points.toList()); Assert.assertEquals(a, fitted[0], 7.6e-4); Assert.assertEquals(w, fitted[1], 2.7e-3); Assert.assertEquals(p, MathUtils.normalizeAngle(fitted[2], p), 1.3e-2); }
@Test public void testTinyVariationsData() { final Random randomizer = new Random(64925784252L); final WeightedObservedPoints points = new WeightedObservedPoints(); for (double x = 0.0; x < 10.0; x += 0.1) { points.add(1, x, 1e-7 * randomizer.nextGaussian()); } final HarmonicCurveFitter fitter = HarmonicCurveFitter.create(); fitter.fit(points.toList()); }
@Test public void testUnsorted() { Random randomizer = new Random(64925784252L); final double a = 0.2; final double w = 3.4; final double p = 4.1; final HarmonicOscillator f = new HarmonicOscillator(a, w, p); final int size = 100; final double[] xTab = new double[size]; final double[] yTab = new double[size]; for (int i = 0; i < size; i++) { xTab[i] = 0.1 * i; yTab[i] = f.value(xTab[i]) + 0.01 * randomizer.nextGaussian(); } for (int i = 0; i < size; i++) { int i1 = randomizer.nextInt(size); int i2 = randomizer.nextInt(size); double xTmp = xTab[i1]; double yTmp = yTab[i1]; xTab[i1] = xTab[i2]; yTab[i1] = yTab[i2]; xTab[i2] = xTmp; yTab[i2] = yTmp; } final WeightedObservedPoints points = new WeightedObservedPoints(); for (int i = 0; i < size; ++i) { points.add(1, xTab[i], yTab[i]); } final HarmonicCurveFitter fitter = HarmonicCurveFitter.create(); final double[] fitted = fitter.fit(points.toList()); Assert.assertEquals(a, fitted[0], 7.6e-4); Assert.assertEquals(w, fitted[1], 3.5e-3); Assert.assertEquals(p, MathUtils.normalizeAngle(fitted[2], p), 1.5e-2); }