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+"]");
...