nonlinear hybrid
by jmchen
JavaScript
var eval0 = function (x, deriv) {
var fx = x*x*x - 3*x*x - x + 9;
if (deriv === undefined)
return [fx];
else {
var dfx = ((3*x - 6)* x) - 1;
return [fx,dfx];
}
}
function nonlinearSolver (func, interval, epsilon) {
//debugger;
var eps = epsilon || 1e-4;
var imax = 120;
var a = interval[0], b = interval[1];
var fa = func(a)[0], fb = func(b)[0];
var x0, x1, fdf;
x0 = (b+a)/2;
for (var i = 0; i < imax; i++) {
// bisection break
if (b - a <= eps) break;
fdf = func (x0, 1);
x1 = x0 - fdf[0]/fdf[1];
if (Math.abs(x1 - x0) < eps) // Newton break
break;
if (x1 > b || x1 < a) { // bisection step
if (fdf[0]*fa < 0) // [a,x0]
b = x0, fb = fdf[0];
else // [x0,b]
a = x0, fa = fdf[0];
console.log ('[bisection]: ' + a + ':' + b);
x0 = (a+b)/2;
continue;
}
console.log ('[newton]: ' + x1);
x0 = x1;
}
return [x1, i]; // return [approx. root, iterations]
}
var result = nonlinearSolver (eval0, [-3,3], 1e-4);
console.log (result);