teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.math.fitting; sascha@3177: sascha@3177: public class InvSQPow sascha@3177: extends Function sascha@3177: { sascha@3181: public static final Derivative DERIVATIVE = sascha@3181: new Derivative("Q'(S) = (S/a)^(1/b)/(b*S)") { sascha@3181: sascha@3181: @Override teichmann@5831: public org.dive4elements.river.artifacts.math.Function sascha@3181: instantiate(double [] parameters) sascha@3181: { sascha@3181: final double _1a = 1d/parameters[0]; sascha@3181: final double b = parameters[1]; sascha@3181: final double _1b = 1d/b; sascha@3181: teichmann@5831: return new org.dive4elements.river.artifacts.math.Function() { sascha@3181: @Override sascha@3181: public double value(double S) { sascha@3181: return Math.pow(S*_1a, _1b)/(b*S); sascha@3181: } sascha@3181: }; sascha@3181: } sascha@3181: }; sascha@3177: public static final Function INSTANCE = new InvSQPow(); sascha@3177: sascha@3177: public InvSQPow() { sascha@3181: super( sascha@3181: "inv-sq-pow", sascha@3181: "Q(S) = Q=(S/a)^(1/b)", sascha@3181: new String [] { "a", "b" }); sascha@3177: } sascha@3177: sascha@3177: @Override sascha@3181: public double value(double S, double [] parameters) { sascha@3181: double a = parameters[0]; sascha@3181: double b = parameters[1]; sascha@3181: return Math.pow(S/a, 1d/b); sascha@3177: } sascha@3177: sascha@3177: @Override sascha@3181: public double [] gradient(double S, double [] parameters) { sascha@3181: double a = parameters[0]; sascha@3181: double b = parameters[1]; sascha@3181: double Sa = S/a; sascha@3181: double _1b = 1d/b; sascha@3181: double eSa1b = Math.pow(Sa, _1b); sascha@3181: return new double [] { sascha@3181: -eSa1b/(a*b), sascha@3181: -(eSa1b*Math.log(Sa))/(b*b) sascha@3181: }; sascha@3177: } sascha@3177: sascha@3177: @Override sascha@3177: public Derivative getDerivative() { sascha@3181: return DERIVATIVE; sascha@3177: } sascha@3177: sascha@3177: @Override sascha@3177: public Function getInverse() { sascha@3178: return SQPow.INSTANCE; sascha@3177: } sascha@3177: } sascha@3177: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :