Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java @ 3010:05a3fe8800b3
FixA: Store Chi^2 of fitting into result, too.
flys-artifacts/trunk@4575 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 04 Jun 2012 10:13:20 +0000 |
parents | 9e0500d64524 |
children | ab81ffd1343e |
comparison
equal
deleted
inserted
replaced
3009:4dda67a893da | 3010:05a3fe8800b3 |
---|---|
23 import de.intevation.flys.artifacts.model.FixingsOverviewFactory; | 23 import de.intevation.flys.artifacts.model.FixingsOverviewFactory; |
24 import de.intevation.flys.artifacts.model.Parameters; | 24 import de.intevation.flys.artifacts.model.Parameters; |
25 | 25 |
26 import de.intevation.flys.utils.DateAverager; | 26 import de.intevation.flys.utils.DateAverager; |
27 import de.intevation.flys.utils.DoubleUtil; | 27 import de.intevation.flys.utils.DoubleUtil; |
28 import de.intevation.flys.utils.Pair; | |
28 | 29 |
29 import java.util.ArrayList; | 30 import java.util.ArrayList; |
30 import java.util.Date; | 31 import java.util.Date; |
31 import java.util.HashMap; | 32 import java.util.HashMap; |
32 import java.util.List; | 33 import java.util.List; |
195 | 196 |
196 if (debug) { | 197 if (debug) { |
197 log.debug("number of kms: " + kms.length); | 198 log.debug("number of kms: " + kms.length); |
198 } | 199 } |
199 | 200 |
201 int kmIndex = results.columnIndex("km"); | |
202 int chiSqrIndex = results.columnIndex("chi_sqr"); | |
203 | |
200 int numFailed = 0; | 204 int numFailed = 0; |
201 | 205 |
202 for (int i = 0; i < kms.length; ++i) { | 206 for (int i = 0; i < kms.length; ++i) { |
203 double km = kms[i]; | 207 double km = kms[i]; |
204 | 208 |
207 qs[j] = column.getQ(km); | 211 qs[j] = column.getQ(km); |
208 boolean interpolated = column.getW(km, ws, j); | 212 boolean interpolated = column.getW(km, ws, j); |
209 // TODO: mark as interpolated. | 213 // TODO: mark as interpolated. |
210 } | 214 } |
211 | 215 |
216 Pair<double [], Double> fitResult = fit(func, km, ws, qs); | |
217 | |
212 // TODO: Do preprocessing here! | 218 // TODO: Do preprocessing here! |
213 double [] parameters = fit(func, km, ws, qs); | 219 if (fitResult == null) { // Problems are reported already. |
214 if (parameters == null) { // Problems are reported already. | |
215 ++numFailed; | 220 ++numFailed; |
216 continue; | 221 continue; |
217 } | 222 } |
218 | 223 |
219 int row = results.newRow(); | 224 int row = results.newRow(); |
220 | 225 |
221 results.set(row, "km", km); | 226 results.set(row, kmIndex, km); |
227 results.set(row, chiSqrIndex, fitResult.getB()); | |
228 | |
229 double [] parameters = fitResult.getA(); | |
222 for (int j = 0; j < parameters.length; ++j) { | 230 for (int j = 0; j < parameters.length; ++j) { |
223 if (Double.isNaN(parameters[j])) { | 231 if (Double.isNaN(parameters[j])) { |
224 invalid = true; | 232 invalid = true; |
225 } | 233 } |
226 else { | 234 else { |
227 results.set(row, parameterNames[j], parameters[j]); | 235 results.set(row, parameterNames[j], parameters[j]); |
228 } | 236 } |
229 } | 237 } |
230 // TODO: Calculate statistics, too! | |
231 } | 238 } |
232 | 239 |
233 if (debug) { | 240 if (debug) { |
234 log.debug("success: " + (kms.length - numFailed)); | 241 log.debug("success: " + (kms.length - numFailed)); |
235 log.debug("failed: " + numFailed); | 242 log.debug("failed: " + numFailed); |
572 | 579 |
573 return columns; | 580 return columns; |
574 } | 581 } |
575 | 582 |
576 protected static String [] createColumnNames(String [] parameters) { | 583 protected static String [] createColumnNames(String [] parameters) { |
577 String [] result = new String[parameters.length + 1]; | 584 String [] result = new String[parameters.length + 2]; |
578 result[0] = "km"; | 585 result[0] = "km"; |
579 // TODO: Add statistic columns, too. | 586 result[0] = "chi_sqr"; |
580 System.arraycopy(parameters, 0, result, 1, parameters.length); | 587 System.arraycopy(parameters, 0, result, 2, parameters.length); |
581 return result; | 588 return result; |
582 } | 589 } |
583 | 590 |
584 protected double [] fit( | 591 protected Pair<double [], Double> fit( |
585 Function function, | 592 Function function, |
586 double km, | 593 double km, |
587 double [] ws, | 594 double [] ws, |
588 double [] qs | 595 double [] qs |
589 ) { | 596 ) { |
595 cf.addObservedPoint(qs[i], ws[i]); | 602 cf.addObservedPoint(qs[i], ws[i]); |
596 } | 603 } |
597 } | 604 } |
598 | 605 |
599 try { | 606 try { |
600 return cf.fit(function, function.getInitialGuess()); | 607 double [] parameters = |
608 cf.fit(function, function.getInitialGuess()); | |
609 double chiSqr = lmo.getChiSquare(); | |
610 | |
611 return new Pair<double [], Double>(parameters, chiSqr); | |
601 } | 612 } |
602 catch (MathException me) { | 613 catch (MathException me) { |
603 log.warn(me, me); | 614 log.warn(me, me); |
604 addProblem(km, "fix.fitting.failed"); | 615 addProblem(km, "fix.fitting.failed"); |
605 } | 616 } |