bisection

my example

by k6e2n0t12

JavaScript

// function declaration 
//實作時記得用陣列傳參數,用for迴圈取代while,可參考這邊的輸出
function f(a6,a5,a4,a3,a2,a1,a0,x) {
	return x*(x*(x*(x*(x*(a6*x+a5)+a4)+a3)+a2)+a1)+a0;;
}


function bisection (a6,a5,a4,a3,a2,a1,a0,xLo, xHi, eps) {
    if (f(xLo) * f (xHi) > 0)
        return undefined;
    
	var xMid, fHi, fLo, fMid;
	fHi = f(a6,a5,a4,a3,a2,a1,a0,xHi);   // fb
	fLo = f(a6,a5,a4,a3,a2,a1,a0,xLo);   // fa
	while (xHi - xLo > eps) {
		xMid = (xLo+xHi)/2;
		fMid = f(a6,a5,a4,a3,a2,a1,a0,xMid);  // fc
		console.log ('f('+xMid+') = ' + fMid);
		if (Math.abs(fMid) < eps)
			return xMid;
		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;
}

var ans = bisection (10,9,8,7,6,5,-20, 0, 2, 1e-5);
console.log ('f(' + ans.toFixed(3) + ')= ' + f(10,9,8,7,6,5,-20,ans)/*.toExponential(3)*/);