annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/LevenbergMarquardtFittingOperation.java @ 9648:c5a496bf1b0b

Fixed: Duplizieren einer Fixierungsanalyse schlägt fehl.
author Gernot Belger <g.belger@bjoernsen.de>
date Wed, 04 Dec 2019 16:10:28 +0100
parents 0380717105ba
children
rev   line source
9646
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
2 * Software engineering by
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
5 *
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
9 */
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
10 package org.dive4elements.river.artifacts.model.fixings;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
11
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
12 import java.util.List;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
13
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
14 import org.apache.commons.math.MathException;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
15 import org.apache.commons.math.optimization.fitting.CurveFitter;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
16 import org.apache.commons.math.optimization.general.LevenbergMarquardtOptimizer;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
17 import org.apache.log4j.Logger;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
18 import org.dive4elements.river.artifacts.math.fitting.Function;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
19
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
20 /**
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
21 * @author Gernot Belger
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
22 */
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
23 final class LevenbergMarquardtFittingOperation extends AbstractFittingOperation implements IFittingOperation {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
24
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
25 private static Logger log = Logger.getLogger(LevenbergMarquardtFittingOperation.class);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
26
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
27 public LevenbergMarquardtFittingOperation(final Function function) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
28 super(function);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
29 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
30
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
31 @Override
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
32 public Fitting execute(final List<FittingData> data) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
33
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
34 final Function function = getFunction();
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
35
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
36 for (double tolerance = 1e-10; tolerance < 1e-1; tolerance *= 10d) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
37
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
38 final LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer();
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
39 lmo.setCostRelativeTolerance(tolerance);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
40 lmo.setOrthoTolerance(tolerance);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
41 lmo.setParRelativeTolerance(tolerance);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
42
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
43 try {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
44 final CurveFitter cf = new CurveFitter(lmo);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
45
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
46 for (final FittingData fittingData : data)
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
47 cf.addObservedPoint(fittingData.q, fittingData.w);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
48
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
49 final double[] parameters = cf.fit(function, function.getInitialGuess());
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
50
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
51 return createFitting(parameters, lmo.getChiSquare(), data);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
52 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
53 catch (final MathException me) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
54 if (log.isDebugEnabled()) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
55 log.debug("tolerance " + tolerance + " + failed.", me);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
56 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
57 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
58 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
59
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
60 return null;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
61 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
62 }

http://dive4elements.wald.intevation.org