Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/fitting/LinearizedFittingTest.java @ 9646:0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
author | Gernot Belger <g.belger@bjoernsen.de> |
---|---|
date | Mon, 02 Dec 2019 17:56:15 +0100 |
parents | |
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.fitting; |
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.io.BufferedInputStream; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
13 import java.io.IOException; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
14 import java.io.InputStreamReader; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
15 import java.math.BigDecimal; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
16 import java.util.ArrayList; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
17 import java.util.List; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
18 import java.util.Map.Entry; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
19 import java.util.NavigableMap; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
20 import java.util.TreeMap; |
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 import org.apache.commons.lang.StringUtils; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
23 import org.apache.commons.math3.analysis.MultivariateFunction; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
24 import org.apache.commons.math3.optim.InitialGuess; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
25 import org.apache.commons.math3.optim.MaxEval; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
26 import org.apache.commons.math3.optim.MaxIter; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
27 import org.apache.commons.math3.optim.PointValuePair; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
28 import org.apache.commons.math3.optim.SimpleBounds; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
29 import org.apache.commons.math3.optim.nonlinear.scalar.GoalType; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
30 import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
31 import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
32 import org.apache.commons.math3.util.Pair; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
33 import org.dive4elements.river.artifacts.model.fixings.fitting.LinearLogLinearizedFitting.Result; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
34 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
35 import au.com.bytecode.opencsv.CSVReader; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
36 |
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 * @author Gernot Belger |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
39 */ |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
40 public class LinearizedFittingTest { |
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 public static void main(final String[] args) throws IOException { |
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 // read test data |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
45 final NavigableMap<BigDecimal, List<Pair<BigDecimal, BigDecimal>>> testData = readTestData(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
46 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
47 for (final Entry<BigDecimal, List<Pair<BigDecimal, BigDecimal>>> entry : testData.entrySet()) { |
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 BigDecimal station = entry.getKey(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
50 final List<Pair<BigDecimal, BigDecimal>> testSample = entry.getValue(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
51 optimizeA(station, testSample); |
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 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
55 private static void optimizeA(final BigDecimal station, final List<Pair<BigDecimal, BigDecimal>> testSample) { |
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 /* extrakt observations */ |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
58 final double[] obsDischarges = new double[testSample.size()]; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
59 final double[] obsWaterlevels = new double[testSample.size()]; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
60 for (int i = 0; i < obsWaterlevels.length; i++) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
61 obsDischarges[i] = testSample.get(i).getKey().doubleValue(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
62 obsWaterlevels[i] = testSample.get(i).getValue().doubleValue(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
63 } |
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 TargetFunction targetFunction = new TargetFunction(obsDischarges); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
66 final SqrtErrorFunction sqrtErrorFunction = new SqrtErrorFunction(obsWaterlevels, targetFunction); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
67 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
68 final Result directEstimation = estimateADirect(sqrtErrorFunction); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
69 final Result linearEstimation = new LinearLogLinearizedFitting(obsDischarges, obsWaterlevels).optimize(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
70 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
71 final Result directPostEstimation = postOptimize(directEstimation, sqrtErrorFunction); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
72 final Result linearPostEstimation = postOptimize(linearEstimation, sqrtErrorFunction); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
73 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
74 printResult(station, testSample, directEstimation); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
75 printResult(station, testSample, linearEstimation); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
76 printResult(station, testSample, directPostEstimation); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
77 printResult(station, testSample, linearPostEstimation); |
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 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
80 private static Result postOptimize(final Result estimation, final SqrtErrorFunction errorFunction) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
81 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
82 final double a = estimation.getA(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
83 final double b = estimation.getB(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
84 final double m = estimation.getM(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
85 // final double error = estimation.getError(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
86 final double aIndex = estimation.getBestAindex(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
87 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
88 final double aLow = Math.pow(10, aIndex - 1); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
89 final double aHigh = Math.pow(10, aIndex + 1); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
90 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
91 return directOptimize(aLow, aHigh, a, b, m, errorFunction); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
92 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
93 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
94 private static void printResult(final BigDecimal station, final List<Pair<BigDecimal, BigDecimal>> testSample, final Result optimize) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
95 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
96 final double a = optimize.getA(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
97 final double b = optimize.getB(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
98 final double m = optimize.getM(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
99 final double error = optimize.getError(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
100 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
101 System.out.format("%s %.10f %.10f %.10f %.10f", station, a, b, m, error); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
102 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
103 for (final Pair<BigDecimal, BigDecimal> entry : testSample) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
104 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
105 final BigDecimal waterlevel = entry.getSecond(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
106 System.out.print(' '); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
107 System.out.print(waterlevel); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
108 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
109 System.out.println(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
110 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
111 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
112 private static Result estimateADirect(final SqrtErrorFunction sqrtErrorFunction) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
113 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
114 Result best = null; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
115 double leastError = Double.POSITIVE_INFINITY; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
116 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
117 // iteration über a von 10^^0 bis 10^^20 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
118 for (int i = 0; i < 20; i++) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
119 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
120 final double aStart = Math.pow(10, i); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
121 final double aLow = Math.pow(10, i - 1); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
122 final double aHigh = Math.pow(10, i + 1); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
123 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
124 final Result result = directOptimize(aLow, aHigh, aStart, 1, 1, sqrtErrorFunction); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
125 final double error = result.getError(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
126 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
127 if (error < leastError) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
128 leastError = error; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
129 best = result.withBestAIndex(i); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
130 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
131 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
132 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
133 return best; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
134 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
135 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
136 private static Result directOptimize(final double aLow, final double aHigh, final double a, final double b, final double m, |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
137 final SqrtErrorFunction sqrtErrorFunction) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
138 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
139 // n = 3 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
140 // [n+2, (n+1)(n+2)/2] |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
141 // --> [5, 10] |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
142 final int interpolationPoints = 10; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
143 final BOBYQAOptimizer optimizer = new BOBYQAOptimizer(interpolationPoints); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
144 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
145 /* optimization data */ |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
146 final MultivariateFunction function = new MultivariateFunction() { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
147 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
148 @Override |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
149 public double value(final double[] point) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
150 return sqrtErrorFunction.value(point[0], point[1], point[2]); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
151 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
152 }; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
153 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
154 final MaxEval maxEval = new MaxEval(Integer.MAX_VALUE); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
155 final MaxIter maxIter = new MaxIter(Integer.MAX_VALUE); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
156 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
157 final SimpleBounds bounds = new SimpleBounds(new double[] { aLow, -1e3, 0 }, new double[] { aHigh, 1e3, 1e3 }); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
158 final double[] startValues = new double[] { a, b, m }; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
159 final PointValuePair result = optimizer.optimize(GoalType.MINIMIZE, new ObjectiveFunction(function), new InitialGuess(startValues), bounds, maxEval, |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
160 maxIter); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
161 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
162 final Double error = result.getValue(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
163 final double[] point = result.getPoint(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
164 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
165 final double aEstimation = point[0]; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
166 final double bEstimation = point[1]; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
167 final double mEstimation = point[2]; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
168 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
169 return new Result(aEstimation, bEstimation, mEstimation, error, -1, Double.NaN); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
170 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
171 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
172 private static NavigableMap<BigDecimal, List<Pair<BigDecimal, BigDecimal>>> readTestData() throws IOException { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
173 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
174 final NavigableMap<BigDecimal, List<Pair<BigDecimal, BigDecimal>>> data = new TreeMap<>(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
175 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
176 try (final CSVReader reader = new CSVReader(new InputStreamReader(new BufferedInputStream(LinearizedFittingTest.class.getResourceAsStream("testdata.txt"))), |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
177 '\t')) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
178 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
179 final String[] header = reader.readNext(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
180 if (header == null) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
181 throw new IllegalStateException(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
182 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
183 if (header.length < 2) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
184 throw new IllegalStateException(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
185 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
186 while (true) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
187 final String[] line = reader.readNext(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
188 if (line == null) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
189 break; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
190 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
191 if (line.length != header.length) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
192 throw new IllegalStateException(); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
193 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
194 final BigDecimal discharge = parseDecimal(line[0]); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
195 if (discharge == null) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
196 continue; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
197 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
198 for (int column = 1; column < line.length; column++) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
199 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
200 final BigDecimal station = parseDecimal(header[column]); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
201 if (station == null) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
202 continue; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
203 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
204 if (!data.containsKey(station)) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
205 data.put(station, new ArrayList<Pair<BigDecimal, BigDecimal>>()); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
206 final List<Pair<BigDecimal, BigDecimal>> points = data.get(station); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
207 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
208 final BigDecimal waterlevel = parseDecimal(line[column]); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
209 if (waterlevel != null) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
210 points.add(Pair.create(discharge, waterlevel)); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
211 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
212 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
213 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
214 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
215 return data; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
216 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
217 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
218 private static BigDecimal parseDecimal(final String token) { |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
219 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
220 if (StringUtils.isBlank(token)) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
221 return null; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
222 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
223 if ("nan".equalsIgnoreCase(token)) |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
224 return null; |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
225 |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
226 return new BigDecimal(token); |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
227 } |
0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
Gernot Belger <g.belger@bjoernsen.de>
parents:
diff
changeset
|
228 } |