/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.hawaii.jmotif.sampler; /** * Determine gradient numerically using central difference. * Needs 2*n function evaluations. * * @author drchaj1 */ public class CentralDifferenceGradient implements NumericalGradient { // TODO: comment public static double gradientCDStepMult = Math.pow(MachineAccuracy.EPSILON, 1.0 / 3.0); public Gradient gradientAt(ObjectiveFunction function, Point point) { double[] gradient = new double[function.getDimension()]; double[] original = point.toArray(); double[] p = point.toArray(); double h = 0; double fxplus = 0; double fxminus = 0; for (int i = 0; i < gradient.length; i++) { h = gradientCDStepMult * Math.abs(original[i]); if (h < gradientCDStepMult) {// TODO revise h = gradientCDStepMult; } p[i] = original[i] + h; fxplus = function.valueAt(Point.at(p)); p[i] = original[i] - h; fxminus = function.valueAt(Point.at(p)); p[i] = original[i]; // first derivative gradient[i] = (fxplus - fxminus) / (2.0 * h); } return Gradient.valueOf(gradient); } }