diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java @ 3202:307842cf8d9e

FixA: Make fitting more tolerant. flys-artifacts/trunk@4819 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 27 Jun 2012 17:29:33 +0000
parents 71484036b6ae
children 1b9f791937c3
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java	Wed Jun 27 16:41:02 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java	Wed Jun 27 17:29:33 2012 +0000
@@ -22,6 +22,9 @@
 
 import org.apache.log4j.Logger;
 
+import org.apache.commons.math.optimization.DifferentiableMultivariateVectorialOptimizer;
+import org.apache.commons.math.optimization.general.GaussNewtonOptimizer;
+
 public class Fitting
 {
     private static Logger log = Logger.getLogger(Fitting.class);
@@ -157,24 +160,38 @@
             return false;
         }
 
-        LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer();
-
         List<IndexedValue> inputs = new ArrayList<IndexedValue>(xs.size());
 
         de.intevation.flys.artifacts.math.Function instance = null;
 
+        LevenbergMarquardtOptimizer lmo = null;
+
         for (;;) {
-            CurveFitter cf = new CurveFitter(lmo);
+            parameters = null;
+            for (double tolerance = 1e-10; tolerance < 1e-3; tolerance *= 10d) {
 
-            for (int i = 0, N = xs.size(); i < N; ++i) {
-                cf.addObservedPoint(xs.getQuick(i), ys.getQuick(i));
+                lmo = new LevenbergMarquardtOptimizer();
+                lmo.setCostRelativeTolerance(tolerance);
+                lmo.setOrthoTolerance(tolerance);
+                lmo.setParRelativeTolerance(tolerance);
+
+                CurveFitter cf = new CurveFitter(lmo);
+
+                for (int i = 0, N = xs.size(); i < N; ++i) {
+                    cf.addObservedPoint(xs.getQuick(i), ys.getQuick(i));
+                }
+
+                try {
+                    parameters = cf.fit(function, function.getInitialGuess());
+                    break;
+                }
+                catch (MathException me) {
+                    if (log.isDebugEnabled()) {
+                        log.debug("tolerance " + tolerance + " + failed.");
+                    }
+                }
             }
-
-            try {
-                parameters = cf.fit(function, function.getInitialGuess());
-            }
-            catch (MathException me) {
-                log.warn(me);
+            if (parameters == null) {
                 return false;
             }
 

http://dive4elements.wald.intevation.org