myhw3test

by SunnyHsu

JavaScript

//f(x) = (x - 0.3) * (x - (-2)) * (x^2 + 1) * (x^2 + 2*x + 3)
//f(x) = 1x^6  + 3.7 x^5  + 6.800000000000001 x^4  + 7.6 x^3  + 4.0 x^2+ 3.899999999999999 x - 1.8

function evaluator(x, array){
    var b=[],c=[];
    var pow = 6;
    
    b[pow] = array[pow];
    c[pow] = b[pow];  
    
    for(var k=pow-1; k>=1; k--){        
    	b[k] = array[k] + b[k+1]*x;        
    	c[k] = b[k] + c[k+1]*x;
        //console.log("b="+b[k]+"  c="+c[k]);
    }
    b[0] = array[0] + b[1]*x;
    
	return [b[0], c[1]];    
}
//1x^6 + 4.5x^5 + 7.5x^4 + 9x^3 + 2x^2 + 4.5x + (-4.5)
var array=[-1.8, 3.899999999999999, 4, 7.6, 6.800000000000001, 3.7, 1];

function f(x) {
	return (((((1*x+3.7)*x+6.800000000000001)*x+7.6)*x+4)*x+ 3.899999999999999)*x-1.8;
}

function bisection (func, xLo, xHi, eps) {
    if (func(xLo) * func (xHi) > 0)
        return undefined;
    
	var xMid, fHi, fLo, fMid;
	fHi = func(xHi);   // fb
	fLo = func(xLo);   // fa
	var iter = 0;
    while (xHi - xLo > eps) {
        ++iter;
		xMid = (xLo+xHi)/2;
		fMid = func(xMid);  // fc
		//console.log ('f(c) = ' + fMid);
		if (Math.abs(fMid) < eps)
			return [xMid, iter];
		else if (fMid*fLo < 0) { // fa*fc < 0 --> [a,c]
			xHi = xMid;
			fHi = fMid;
		} else {  // fc*fb < 0 --> [c,b]
			xLo = xMid;
			fLo = fMid;
		}
	}
	return [(xLo+xHi)/2, iter];
}

var eval0 = function (x, derivatives) {
    var deriv = derivatives || 0;   // default argument
    //var fx =1x^6  + 3.7 x^5  + 6.800000000000001 x^4  + 7.6 x^3  + 4.0 x^2+ 3.899999999999999 x - 1.8
    // Horner method
    var fx = (((((1*x+3.7)*x+6.800000000000001)*x+7.6)*x+4)*x+ 3.899999999999999)*x-1.8;
    
    if (deriv === 0) 
        return [fx];
    else {
    	//var dfx = 6 x^5  + 18.5 x^4  + 27.2 x^3  + 22.8 x^2  + 7.999999999999999 x + 3.899999999999999
        var dfx = ((((6*x+18.5)*x+27.2)*x+22.8)*x+7.999999999999999)*x+ 3.899999999999999;
    	return [fx,dfx];
    }
}

function Newton (eval, x0, epsilon) {
    var eps = epsilon || 1e-16;
 	var imax = 20;
  ...