Newton's method

by jmchen

JavaScript

var eval0 = function(x, deriv = 0) {
  //var fx = x*x*x - 3*x*x - x + 9;
  // Horner method
  var fx = ((1 * x - 3) * x - 1) * x + 9;

  if (deriv === 0)
    return [fx];
  else {
    //var dfx = 3*x*x - 6*x - 1;
    var dfx = ((3 * x - 6) * x) - 1;
    return [fx, dfx];
  }
}

function Newton(eval, x0, eps = 1e-4) {
  var imax = 20;
  for (var i = 0; i < imax; i++) {
    var fdf = eval(x0, 1);
    x1 = x0 - fdf[0] / fdf[1];
    if (Math.abs(x1 - x0) < eps)
      break;
    x0 = x1;
  }
  return [x1, i]; // return [approxRoot, iterations]
}

var result = Newton(eval0, -3, 1e-4);
console.log('in ' + result[1] + ' iterations: ' +
  'f(' + result[0] + ') = ' + eval0(result[0], 0));