From f2f10bd02d37a107c1fabd324819d049bf49b6ca Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Thu, 7 Mar 2024 22:09:16 +0000 Subject: [PATCH 1/2] fix: hadnle zeros at the endpoints --- Maths/BisectionMethod.js | 9 ++++----- Maths/test/BisectionMethod.test.js | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Maths/BisectionMethod.js b/Maths/BisectionMethod.js index 49b8c8ecc0..4539e6d466 100644 --- a/Maths/BisectionMethod.js +++ b/Maths/BisectionMethod.js @@ -23,7 +23,7 @@ const findRoot = (a, b, func, numberOfIterations) => { // Bolzano theorem const hasRoot = (a, b, func) => { - return func(a) * func(b) < 0 + return func(a) * func(b) <= 0 } if (hasRoot(a, b, func) === false) { throw Error( @@ -45,10 +45,9 @@ const findRoot = (a, b, func, numberOfIterations) => { const prod2 = fm * func(b) // Depending on the sign of the products above, decide which position will m fill (a's or b's) - if (prod1 > 0 && prod2 < 0) return findRoot(m, b, func, --numberOfIterations) - else if (prod1 < 0 && prod2 > 0) - return findRoot(a, m, func, --numberOfIterations) - else throw Error('Unexpected behavior') + if (prod2 <= 0) return findRoot(m, b, func, --numberOfIterations) + + return findRoot(a, m, func, --numberOfIterations) } export { findRoot } diff --git a/Maths/test/BisectionMethod.test.js b/Maths/test/BisectionMethod.test.js index ad865b6ad6..764b36047e 100644 --- a/Maths/test/BisectionMethod.test.js +++ b/Maths/test/BisectionMethod.test.js @@ -35,3 +35,28 @@ test('Equation f(x) = sqrt(x) + e^(2*x) - 8*x = 0, has root x = 0.93945851 in [a ) expect(Number(Number(root).toPrecision(8))).toBe(0.93945851) }) + +test('Equation f(x) = x^3 = 0, has root x = 0.0 in [a, b] = [-1.0, 1.0]', () => { + const root = findRoot( + -1.0, + 1.0, + (x) => { + return Math.pow(x, 3) + }, + 32 + ) + expect(root).toBeCloseTo(0.0, 5) +}) + +test('Throws an error when function does not change sign', () => { + expect(() => + findRoot( + -1.0, + 1.0, + (x) => { + return Math.pow(x, 2) + }, + 10 + ) + ).toThrowError() +}) From c7cda09fe0f88c84dc7f84688f7427f263852ab0 Mon Sep 17 00:00:00 2001 From: Piotr Idzik Date: Tue, 26 Mar 2024 22:02:21 +0000 Subject: [PATCH 2/2] style: use simpler syntax express polynomials Co-authored-by: appgurueu <34514239+appgurueu@users.noreply.github.com> --- Maths/test/BisectionMethod.test.js | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/Maths/test/BisectionMethod.test.js b/Maths/test/BisectionMethod.test.js index 764b36047e..4a49e8f6a4 100644 --- a/Maths/test/BisectionMethod.test.js +++ b/Maths/test/BisectionMethod.test.js @@ -1,14 +1,7 @@ import { findRoot } from '../BisectionMethod' test('Equation f(x) = x^2 - 3*x + 2 = 0, has root x = 1 in [a, b] = [0, 1.5]', () => { - const root = findRoot( - 0, - 1.5, - (x) => { - return Math.pow(x, 2) - 3 * x + 2 - }, - 8 - ) + const root = findRoot(0, 1.5, (x) => x ** 2 - 3 * x + 2, 8) expect(root).toBe(0.9990234375) }) @@ -37,26 +30,10 @@ test('Equation f(x) = sqrt(x) + e^(2*x) - 8*x = 0, has root x = 0.93945851 in [a }) test('Equation f(x) = x^3 = 0, has root x = 0.0 in [a, b] = [-1.0, 1.0]', () => { - const root = findRoot( - -1.0, - 1.0, - (x) => { - return Math.pow(x, 3) - }, - 32 - ) + const root = findRoot(-1.0, 1.0, (x) => x ** 3, 32) expect(root).toBeCloseTo(0.0, 5) }) test('Throws an error when function does not change sign', () => { - expect(() => - findRoot( - -1.0, - 1.0, - (x) => { - return Math.pow(x, 2) - }, - 10 - ) - ).toThrowError() + expect(() => findRoot(-1.0, 1.0, (x) => x ** 2, 10)).toThrowError() })