Mercurial > dive4elements > river
view 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 |
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.artifacts.model.fixings; import java.util.List; import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation; import org.dive4elements.river.artifacts.math.fitting.Function; /** * @author Gernot Belger */ abstract class AbstractFittingOperation { private final Function function; public AbstractFittingOperation(final Function function) { this.function = function; } protected final Function getFunction() { return this.function; } protected final Fitting createFitting(final double[] parameters, final double chiSquare, final List<FittingData> data) { final org.dive4elements.river.artifacts.math.Function instance = this.function.instantiate(parameters); final double[] waterlevels = calculateWaterlevels(instance, data); final double maxQ = calculateMaxQ(data); final double stdDev = calculateStandardDeviation(waterlevels, data); return new Fitting(parameters, stdDev, chiSquare, maxQ); } private double calculateMaxQ(final List<FittingData> data) { double maxQ = -Double.MAX_VALUE; for (int i = 0; i < data.size(); i++) { final FittingData fittingData = data.get(i); if (fittingData.q > maxQ) maxQ = fittingData.q; } return maxQ; } private double calculateStandardDeviation(final double[] waterlevels, final List<FittingData> data) { final StandardDeviation std = new StandardDeviation(); for (int i = 0; i < data.size(); i++) { final FittingData fittingData = data.get(i); final double diff = (waterlevels[i] - fittingData.q) * 100.0; // * 100 for whatever reason std.increment(diff); } return std.getResult(); } private double[] calculateWaterlevels(final org.dive4elements.river.artifacts.math.Function instance, final List<FittingData> data) { final double[] waterlevels = new double[data.size()]; for (int i = 0; i < data.size(); i++) { final FittingData fittingData = data.get(i); waterlevels[i] = instance.value(fittingData.q); } return waterlevels; } }