package name.abuchen.portfolio.math; /** * http://en.wikipedia.org/wiki/Newton's_method */ /* package */class NewtonGoalSeek { public interface Function { double compute(double x); } /** * x(i+1) = xi - ( f(xi) / f'(xi) ) * * @param f * function * @param fd * derivative function * @param x0 * start value */ public static double seek(Function f, Function fd, double x0) { double stop = 0.00001d; double delta = 1; double xi = x0; for (int ii = 0; delta > stop && ii < 500; ii++) { double fxi = f.compute(xi); double fdxi = fd.compute(xi); double xi1 = xi - (fxi / fdxi); delta = Math.abs(xi1 - xi); xi = xi1; } return xi; } }