comparison 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
comparison
equal deleted inserted replaced
3201:1c00ed73ccf4 3202:307842cf8d9e
19 import org.apache.commons.math.optimization.general.LevenbergMarquardtOptimizer; 19 import org.apache.commons.math.optimization.general.LevenbergMarquardtOptimizer;
20 20
21 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; 21 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
22 22
23 import org.apache.log4j.Logger; 23 import org.apache.log4j.Logger;
24
25 import org.apache.commons.math.optimization.DifferentiableMultivariateVectorialOptimizer;
26 import org.apache.commons.math.optimization.general.GaussNewtonOptimizer;
24 27
25 public class Fitting 28 public class Fitting
26 { 29 {
27 private static Logger log = Logger.getLogger(Fitting.class); 30 private static Logger log = Logger.getLogger(Fitting.class);
28 31
155 if (xs.size() < 2) { 158 if (xs.size() < 2) {
156 log.warn("Too less points."); 159 log.warn("Too less points.");
157 return false; 160 return false;
158 } 161 }
159 162
160 LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer();
161
162 List<IndexedValue> inputs = new ArrayList<IndexedValue>(xs.size()); 163 List<IndexedValue> inputs = new ArrayList<IndexedValue>(xs.size());
163 164
164 de.intevation.flys.artifacts.math.Function instance = null; 165 de.intevation.flys.artifacts.math.Function instance = null;
165 166
167 LevenbergMarquardtOptimizer lmo = null;
168
166 for (;;) { 169 for (;;) {
167 CurveFitter cf = new CurveFitter(lmo); 170 parameters = null;
168 171 for (double tolerance = 1e-10; tolerance < 1e-3; tolerance *= 10d) {
169 for (int i = 0, N = xs.size(); i < N; ++i) { 172
170 cf.addObservedPoint(xs.getQuick(i), ys.getQuick(i)); 173 lmo = new LevenbergMarquardtOptimizer();
171 } 174 lmo.setCostRelativeTolerance(tolerance);
172 175 lmo.setOrthoTolerance(tolerance);
173 try { 176 lmo.setParRelativeTolerance(tolerance);
174 parameters = cf.fit(function, function.getInitialGuess()); 177
175 } 178 CurveFitter cf = new CurveFitter(lmo);
176 catch (MathException me) { 179
177 log.warn(me); 180 for (int i = 0, N = xs.size(); i < N; ++i) {
181 cf.addObservedPoint(xs.getQuick(i), ys.getQuick(i));
182 }
183
184 try {
185 parameters = cf.fit(function, function.getInitialGuess());
186 break;
187 }
188 catch (MathException me) {
189 if (log.isDebugEnabled()) {
190 log.debug("tolerance " + tolerance + " + failed.");
191 }
192 }
193 }
194 if (parameters == null) {
178 return false; 195 return false;
179 } 196 }
180 197
181 // This is the paraterized function for a given km. 198 // This is the paraterized function for a given km.
182 instance = function.instantiate(parameters); 199 instance = function.instantiate(parameters);

http://dive4elements.wald.intevation.org