teichmann@5831: package org.dive4elements.river.artifacts.math.fitting; sascha@3177: sascha@3177: public class InvQuad sascha@3177: extends Function sascha@3177: { sascha@3181: public static final Derivative DERIVATIVE = sascha@3181: new Derivative("Q'(W) = 1/sqrt(4*n*(W-b)+m^2)") { sascha@3181: sascha@3181: @Override teichmann@5831: public org.dive4elements.river.artifacts.math.Function sascha@3181: instantiate(double [] parameters) sascha@3181: { sascha@3181: double n = parameters[0]; sascha@3181: double m = parameters[1]; sascha@3181: final double b = parameters[2]; sascha@3181: final double n4 = 4d*n; sascha@3181: final double mm = m*m; sascha@3181: teichmann@5831: return new org.dive4elements.river.artifacts.math.Function() { sascha@3181: @Override sascha@3181: public double value(double W) { sascha@3181: return 1d/Math.sqrt(n4*(W-b)+mm); sascha@3181: } sascha@3181: }; sascha@3181: } sascha@3181: }; sascha@3181: sascha@3177: public static final Function INSTANCE = new InvQuad(); sascha@3177: sascha@3177: public InvQuad() { sascha@3181: super( sascha@3181: "inv-quad", sascha@3181: "(sqrt(4*n*W-4*b*n+m^2)-m)/(2*n)", sascha@3181: new String [] { "n", "m", "b" }); sascha@3177: } sascha@3177: sascha@3177: @Override sascha@3177: public double value(double W, double [] parameters) { sascha@3181: double n = parameters[0]; sascha@3181: double m = parameters[1]; sascha@3181: double b = parameters[2]; sascha@3181: return (Math.sqrt(4d*n*(W - b) + m*m)-m)/(2d*n); sascha@3177: } sascha@3177: sascha@3177: @Override sascha@3181: public double [] gradient(double W, double [] parameters) { sascha@3181: double n = parameters[0]; sascha@3181: double m = parameters[1]; sascha@3181: double b = parameters[2]; sascha@3181: double Wb = W-b; sascha@3181: double sn4Wb = Math.sqrt(4d*n*Wb + m*m); sascha@3181: return new double [] { sascha@3181: Wb/(n*sn4Wb)-(sn4Wb-m)/(2d*n*n), sascha@3181: (m/sn4Wb-1d)/(2d*n), sascha@3181: -1d/sn4Wb 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 Quad.INSTANCE; sascha@3177: } sascha@3177: } sascha@3177: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :