annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/AbstractFittingOperation.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.math3.stat.descriptive.moment.StandardDeviation;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
15 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
16
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
17 /**
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
18 * @author Gernot Belger
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 abstract class AbstractFittingOperation {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
21
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
22 private final Function function;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
23
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
24 public AbstractFittingOperation(final Function function) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
25 this.function = function;
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
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
28 protected final Function getFunction() {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
29 return this.function;
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
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
32 protected final Fitting createFitting(final double[] parameters, final double chiSquare, 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 org.dive4elements.river.artifacts.math.Function instance = this.function.instantiate(parameters);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
35 final double[] waterlevels = calculateWaterlevels(instance, data);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
36 final double maxQ = calculateMaxQ(data);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
37 final double stdDev = calculateStandardDeviation(waterlevels, data);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
38
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
39 return new Fitting(parameters, stdDev, chiSquare, maxQ);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
40 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
41
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
42 private double calculateMaxQ(final List<FittingData> data) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
43
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
44 double maxQ = -Double.MAX_VALUE;
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 (int i = 0; i < data.size(); i++) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
47
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
48 final FittingData fittingData = data.get(i);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
49
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
50 if (fittingData.q > maxQ)
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
51 maxQ = fittingData.q;
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
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
54 return maxQ;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
55 }
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 private double calculateStandardDeviation(final double[] waterlevels, final List<FittingData> data) {
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 final StandardDeviation std = new StandardDeviation();
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
60
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
61 for (int i = 0; i < data.size(); i++) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
62
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
63 final FittingData fittingData = data.get(i);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
64
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
65 final double diff = (waterlevels[i] - fittingData.q) * 100.0; // * 100 for whatever reason
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
66
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
67 std.increment(diff);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
68 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
69
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
70 return std.getResult();
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
71 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
72
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
73 private double[] calculateWaterlevels(final org.dive4elements.river.artifacts.math.Function instance, final List<FittingData> data) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
74
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
75 final double[] waterlevels = new double[data.size()];
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
76
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
77 for (int i = 0; i < data.size(); i++) {
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
78
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
79 final FittingData fittingData = data.get(i);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
80
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
81 waterlevels[i] = instance.value(fittingData.q);
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
82 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
83
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
84 return waterlevels;
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
85 }
0380717105ba Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff changeset
86 }

http://dive4elements.wald.intevation.org