Mercurial > dive4elements > river
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); |