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