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