You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2012/06/07 01:48:49 UTC

svn commit: r1347211 - in /commons/proper/math/trunk/src: site/xdoc/userguide/optimization.xml test/java/org/apache/commons/math3/optimization/fitting/PolynomialFitterTest.java

Author: erans
Date: Wed Jun  6 23:48:49 2012
New Revision: 1347211

URL: http://svn.apache.org/viewvc?rev=1347211&view=rev
Log:
MATH-800
Updated userguide and added unit test.

Modified:
    commons/proper/math/trunk/src/site/xdoc/userguide/optimization.xml
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/fitting/PolynomialFitterTest.java

Modified: commons/proper/math/trunk/src/site/xdoc/userguide/optimization.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/userguide/optimization.xml?rev=1347211&r1=1347210&r2=1347211&view=diff
==============================================================================
--- commons/proper/math/trunk/src/site/xdoc/userguide/optimization.xml (original)
+++ commons/proper/math/trunk/src/site/xdoc/userguide/optimization.xml Wed Jun  6 23:48:49 2012
@@ -607,25 +607,36 @@ C: 16.324008168386605
           the <a
           href="../apidocs/org/apache/commons/math3/analysis/ParametricUnivariateFunction.html">
           ParametricUnivariateFunction</a> interface and they must provide the initial guess of the
-          parameters. The more specialized <a
-          href="../apidocs/org/apache/commons/math3/optimization/fitting/PolynomialFitter.html">
-          PolynomialFitter</a> and <a
-          href="../apidocs/org/apache/commons/math3/optimization/fitting/HarmonicFitter.html">
-          HarmonicFitter</a> classes require neither an implementation of the parametric real function
-          not an initial guess as they are able to compute them by themselves.
+          parameters.
         </p>
+
         <p>
-          An example of fitting a polynomial is given here:
+        The following example shows how to fit data with a polynomial function.
         </p>
-        <source>PolynomialFitter fitter = new PolynomialFitter(degree, new LevenbergMarquardtOptimizer());
+        <source>final CurveFitter fitter = new CurveFitter(new LevenbergMarquardtOptimizer());
 fitter.addObservedPoint(-1.00, 2.021170021833143);
 fitter.addObservedPoint(-0.99, 2.221135431136975);
 fitter.addObservedPoint(-0.98, 2.09985277659314);
 fitter.addObservedPoint(-0.97, 2.0211192647627025);
 // ... Lots of lines omitted ...
 fitter.addObservedPoint( 0.99, -2.4345814727089854);
-PolynomialFunction fitted = fitter.fit();
+
+// The degree of the polynomial is deduced from the length of the array containing
+// the initial guess for the coefficients of the polynomial.
+final double[] init = { 12.9, -3.4, 2.1 }; // 12.9 - 3.4 x + 2.1 x^2
+
+// Compute optimal coefficients.
+final double[] best = fitter.fit(new PolynomialFunction.Parametric(), init);
+
+// Construct the polynomial that best fits the data.
+final PolynomialFunction fitted = new PolynomialFunction(best);
         </source>
+
+        <p>
+          The more specialized <a href="../apidocs/org/apache/commons/math3/optimization/fitting/HarmonicFitter.html">
+          HarmonicFitter</a> classes requires neither an implementation of the parametric real function
+          nor an initial guess as it is are able to compute them internally.
+        </p>
       </subsection>
      </section>
   </body>

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/fitting/PolynomialFitterTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/fitting/PolynomialFitterTest.java?rev=1347211&r1=1347210&r2=1347211&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/fitting/PolynomialFitterTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/fitting/PolynomialFitterTest.java Wed Jun  6 23:48:49 2012
@@ -26,6 +26,8 @@ import org.apache.commons.math3.optimiza
 import org.apache.commons.math3.optimization.general.LevenbergMarquardtOptimizer;
 import org.apache.commons.math3.optimization.SimpleVectorValueChecker;
 import org.apache.commons.math3.util.FastMath;
+import org.apache.commons.math3.random.RandomDataImpl;
+import org.apache.commons.math3.TestUtils;
 
 import org.junit.Test;
 import org.junit.Assert;
@@ -35,6 +37,28 @@ import org.junit.Assert;
  * polynomial.
  */
 public class PolynomialFitterTest {
+    @Test
+    public void testFit() {
+        final RandomDataImpl rng = new RandomDataImpl();
+        rng.reSeed(64925784252L);
+
+        final LevenbergMarquardtOptimizer optim = new LevenbergMarquardtOptimizer();
+        final CurveFitter fitter = new CurveFitter(optim);
+        final double[] coeff = { 12.9, -3.4, 2.1 }; // 12.9 - 3.4 x + 2.1 x^2
+        final PolynomialFunction f = new PolynomialFunction(coeff);
+
+        // Collect data from a known polynomial.
+        for (int i = 0; i < 100; i++) {
+            final double x = rng.nextUniform(-100, 100);
+            fitter.addObservedPoint(x, f.value(x));
+        }
+
+        // Start fit from initial guesses that are far from the optimal values.
+        final double[] best = fitter.fit(new PolynomialFunction.Parametric(),
+                                         new double[] { -1e-20, 3e15, -5e25 });
+
+        TestUtils.assertEquals("best != coeff", coeff, best, 1e-12);
+    }
 
     @Test
     public void testNoError() {