Newton's method

by k6e2n0t12

JavaScript

var getfdf = function (a6,a5,a4,a3,a2,a1,a0,x, derivatives) {
    var deriv = derivatives || 0;   // default argument
    //var fx = a6*x*x*x*x*x*x+a5*x*x*x*x*x+a4*x*x*x*x+a3*x*x*x+a2*x*x+a1*x+a0;
    // Horner method
    var fx = x*(x*(x*(x*(x*(a6*x+a5)+a4)+a3)+a2)+a1)+a0;
    
    if (deriv === 0) 
        return [fx];
    else {
    	//var dfx = a6*6*x*x*x*x*x+a5*5*x*x*x*x+a4*4*x*x*x+a3*3*x*x+a2*2*x+a1;
        var dfx = x*(x*(x*(x*(6*a6*x+5*a5)+4*a4)+3*a3)+2*a2)+a1;
        return [fx,dfx];
    }
}
function Newton (a0,a1,a2,a3,a4,a5,a6, x0, epsilon) {
    var eps = epsilon || 1e-4;
 	var imax = 20;
    for (var i = 0; i < imax; i++) {
        var fdf = getfdf (a0,a1,a2,a3,a4,a5,a6,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 (10,9,8,7,6,5,-20, 2, 1e-4);
console.log ('in ' + result[1] + ' iterations: ' +
            'f(' + result[0] + ') = ' + getfdf (10,9,8,7,6,5,-20,result[0],0) );