Newton's method

by YouTingKuo

JavaScript

var eval0 = function (x, derivatives) {
    var deriv = derivatives || 0;   // default argument
    //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, epsilon) {
    var eps = epsilon || 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 [approx. root, iterations]
}

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