NA_HW3_1
by ikatyang
JavaScript
function eval(coefs, x) {
var a = coefs[0];
var b = coefs[1];
var c = coefs[2];
var d = coefs[3];
var e = coefs[4];
var f = coefs[5];
var g = coefs[6];
// f(x) = ax^6 + bx^5 + cx^4 + dx^3 + ex^2 + fx + g
var fx = (((((a * x + b) * x + c) * x + d) * x + e) * x + f) * x + g;
// f'(x) = 6ax^5 + 5bx^4 + 4cx^3 + 3dx^2 + 2ex^1 + f
var dfx = ((((6 * a * x + 5 * b) * x + 4 * c) * x + 3 * d) * x + 2 * e) * x + f;
return [fx, dfx];
}
var maxIter = 20;
function bisection(func, eps, xLo, xHi) {
function fx(x) { return func(x)[0] };
var fLo = fx(xLo);
var fHi = fx(xHi);
if (fLo * fHi > 0) return undefined;
var count = 0;
var xMid, fMid;
for (var i = 0; i < maxIter && xHi - xLo > eps; i++) {
count++;
xMid = (xLo + xHi) / 2;
fMid = fx(xMid);
if (Math.abs(fMid) < eps)
return [xMid, count];
else if (fMid * fLo < 0) {
xHi = xMid;
fHi = fMid;
}
else {
xLo = xMid;
fLo = fMid;
}
}
return [(xLo + xHi) / 2, count];
}
function newton(func, eps, x0) {
var x1;
var count = 0;
for (var i = 0; i < maxIter; i++, count++) {
var fdf = func(x0);
x1 = x0 - fdf[0] / fdf[1];
if (Math.abs(x1 - x0) < eps) break;
x0 = x1;
}
return [x1, count];
}
(function tester(coefs, eps) {
function func(x) { return eval(coefs, x); }
console.log('maxIter = ' + maxIter);
var str = 'f(x) = ';
for (var i = 0; i < coefs.length; i++) {
if (i != 0) str += ' + ';
str += '(' + coefs[i] + ')x^' + (6 -i);
}
console.log(str);
var n = newton(func, eps, 0);
console.log('Newton in ' + n[1] + ' iterations: ' + 'f(' + n[0].toFixed(3) + ')= ' + eval(coefs, n[0])[0].toExponential(3));
var b...