NA_HW3_1

by ikatyang

JavaScript

function eval(coefs, x) {
    
    var a = coefs[0];
    var b = coefs[1];
    var c = coefs[2];
    var d = coefs[3];
    var e = coefs[4];
    var f = coefs[5];
    var g = coefs[6];
    
	// f(x)  =  ax^6 +  bx^5 +  cx^4 +  dx^3 +  ex^2 + fx + g
    var fx = (((((a * x + b) * x + c) * x + d) * x + e) * x + f) * x + g;
    
    // f'(x) = 6ax^5 + 5bx^4 + 4cx^3 + 3dx^2 + 2ex^1 + f
    var dfx = ((((6 * a * x + 5 * b) * x + 4 * c) * x + 3 * d) * x + 2 * e) * x + f;
    
    return [fx, dfx];
}
var maxIter = 20;
function bisection(func, eps, xLo, xHi) {
    
    function fx(x) { return func(x)[0] };
    
    var fLo = fx(xLo);
    var fHi = fx(xHi);
    
    if (fLo * fHi > 0) return undefined;
    
    var count = 0;
    var xMid, fMid;
    
    for (var i = 0; i < maxIter && xHi - xLo > eps; i++) {
        
        count++;
        
        xMid = (xLo + xHi) / 2;
        fMid = fx(xMid);
        
        if (Math.abs(fMid) < eps)
            return [xMid, count];
        else if (fMid * fLo < 0) {
            xHi = xMid;
            fHi = fMid;
        }
        else {
            xLo = xMid;
            fLo = fMid;
        }
    }
    
    return [(xLo + xHi) / 2, count];
}
function newton(func, eps, x0) {
    
    var x1;
    var count = 0;
    
    for (var i = 0; i < maxIter; i++, count++) {
        
        var fdf = func(x0);
        x1 = x0 - fdf[0] / fdf[1];
        
        if (Math.abs(x1 - x0) < eps) break;
        
        x0 = x1;
    }
    
    return [x1, count];
}
(function tester(coefs, eps) {
    function func(x)    { return eval(coefs, x); }
    console.log('maxIter = ' + maxIter);
    
    var str = 'f(x) = ';
    for (var i = 0; i < coefs.length; i++) {
        if (i != 0) str += ' + ';
        str += '(' + coefs[i] + ')x^' + (6 -i);
    }
    console.log(str);
    
    var n = newton(func, eps, 0);
    console.log('Newton in ' + n[1] + ' iterations: ' + 'f(' + n[0].toFixed(3) + ')= ' + eval(coefs, n[0])[0].toExponential(3));
    
    var b...