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) );