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