hw3-2

hw3-2

by yi hom

JavaScript

var num = [1,-35.3,495.5,-3470.5,12271.5,-18502.2,4536];

function f(x,a) {
	return ((((((((((((a[0])*x)+a[1])*x)+a[2])*x)+a[3])*x)+a[4])*x)+a[5])*x)+a[6];
}


var eval0 = function (x,a, derivatives) {
    var deriv = derivatives || 0;   // default argument
    //var fx = x*x*x - 3*x*x - x + 9;
    // Horner method
    var fx = ((((((((((((a[0])*x)+a[1])*x)+a[2])*x)+a[3])*x)+a[4])*x)+a[5])*x)+a[6];
    
    if (deriv === 0) 
        return [fx];
    else {
    	//var dfx = 3*x*x - 6*x - 1;
        var dfx = ((((((((((a[0]*6)*x)+a[1]*5)*x)+a[2]*4)*x)+a[3]*3)*x)+a[4]*2)*x)+a[5];
    	return [fx,dfx];
    }
}

var wx0,wx1,wLo,wHi;

function bisection (func, xLo, xHi,eps) {
    if (func(xLo,num) * func (xHi,num) > 0)
        return undefined;
    
	var xMid, fHi, fLo, fMid;
	fHi = func(xHi,num);   // fb
	fLo = func(xLo,num);   // fa
//	var iter = 0;
    if (xHi - xLo > eps) {
//        ++iter;
		xMid = (xLo+xHi)/2;
		fMid = func(xMid,num);  // 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;
		}
	}
    wHi=xHi;
   	wLo=xLo;
	return (xLo+xHi)/2;
}

function Newton (eval, x0) {
        var fdf = eval0 (x0,num, 1);
        var x1 = x0 - fdf[0]/fdf[1];
        wx1=x1;
        wx0=x0;
    return x1;  // return [approx. root, iterations]    
}

function run(Lo,Hi,eps){
  	 var ans;
         ans=Newton(eval0,(Lo+Hi)/2);
         console.log("[newton "+ans+"]");
     while(Math.abs(wx1 - wx0) > eps){
         if(ans>Hi||ans<Lo){
             ans=bisection(f,Lo,Hi,eps);
             console.log("[bisection "+ans+"]");
             Lo=wLo;
             Hi=wHi;
             ans=Newton(eval0,(Lo+Hi)/2);
             console.log("[newton "+ans+"]");     
         }
         else if(ans<Hi||ans>Lo){
             ans=Newton(eval0,ans);
             console.log("[newton "+ans+"]");         	
       ...