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  }