psychart
Version:
View air conditions on a psychrometric chart
46 lines (45 loc) • 1.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.zero = zero;
var SMath = require("smath");
/**
* Find the solution (zero) of a function.
*/
function zero(func, left, right, epsilon, maxIterations) {
if (epsilon === void 0) { epsilon = 1e-6; }
if (maxIterations === void 0) { maxIterations = 1e6; }
for (var i = 0; i < maxIterations; i++) {
var funcLeft = func(left);
var funcRight = func(right);
if (Number.isNaN(funcLeft)) {
throw new Error("f(".concat(left, ") is NaN"));
}
if (Number.isNaN(funcRight)) {
throw new Error("f(".concat(right, ") is NaN"));
}
var leftSign = Math.sign(funcLeft);
var rightSign = Math.sign(funcRight);
if (SMath.approx(funcLeft, 0, epsilon)) {
return left;
}
if (SMath.approx(funcRight, 0, epsilon)) {
return right;
}
if (leftSign === rightSign) {
throw new Error('A solution cannot be found.');
}
var mid = (left + right) / 2;
var funcMid = func(mid);
var midSign = Math.sign(funcMid);
if (SMath.approx(funcMid, 0, epsilon)) {
return mid;
}
if (midSign === leftSign) {
left = mid;
}
else {
right = mid;
}
}
return (left + right) / 2;
}