1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math4.legacy.fitting;
18
19 import java.util.Random;
20
21 import org.apache.commons.math4.legacy.TestUtils;
22 import org.apache.commons.math4.legacy.analysis.ParametricUnivariateFunction;
23 import org.apache.commons.math4.legacy.analysis.polynomials.PolynomialFunction;
24 import org.apache.commons.statistics.distribution.ContinuousDistribution;
25 import org.apache.commons.statistics.distribution.UniformContinuousDistribution;
26 import org.apache.commons.rng.simple.RandomSource;
27 import org.junit.Test;
28
29
30
31
32 public class SimpleCurveFitterTest {
33 @Test
34 public void testPolynomialFit() {
35 final Random randomizer = new Random(53882150042L);
36 final ContinuousDistribution.Sampler rng
37 = UniformContinuousDistribution.of(-100, 100).createSampler(RandomSource.WELL_512_A.create(64925784253L));
38
39 final double[] coeff = { 12.9, -3.4, 2.1 };
40 final PolynomialFunction f = new PolynomialFunction(coeff);
41
42
43 final WeightedObservedPoints obs = new WeightedObservedPoints();
44 for (int i = 0; i < 100; i++) {
45 final double x = rng.sample();
46 obs.add(x, f.value(x) + 0.1 * randomizer.nextGaussian());
47 }
48
49 final ParametricUnivariateFunction function = new PolynomialFunction.Parametric();
50
51 final SimpleCurveFitter fitter
52 = SimpleCurveFitter.create(function,
53 new double[] { -1e20, 3e15, -5e25 });
54 final double[] best = fitter.fit(obs.toList());
55
56 TestUtils.assertEquals("best != coeff", coeff, best, 2e-2);
57 }
58 }