require "#{File.dirname(File.expand_path(__FILE__))}/test_helper" class TestMath < MiniTest::Unit::TestCase include Polynomials def test_roots_for_constant_functions polynomial = Polynomial.parse('5') assert_set_eql Set[],polynomial.roots end def test_roots_for_linear_functions polynomial = Polynomial.parse('5x + 2') assert_set_eql Set[Root.new(-2.0/5.0)],polynomial.roots end def test_roots_quadratic_functions polynomial = Polynomial.parse('3x^2 + 2x - 40') p = 2.0/3.0 q = -40.0/3.0 root = Math.sqrt((p/2)**2 - q) fraction = -(p/2) assert_set_eql Set[Root.new((fraction - root).round(10)), Root.new((fraction + root).round(10))],polynomial.roots polynomial = Polynomial.parse('3x^2 - 40') assert_set_eql Set[Root.new(Math.sqrt(40.0/3).round(10)), Root.new(-Math.sqrt(40.0/3).round(10))], polynomial.roots end def test_roots_for_cubic_functions polynomial = Polynomial.parse('1x^3 + 1x^2 + 2x - 1') assert_equal(1, polynomial.roots.size) assert_set_eql Set[Root.new(0.3926467817)], polynomial.roots polynomial = Polynomial.parse('2x^3 - 4x^2 - 22x + 24') assert_set_eql Set[Root.new(4.0),Root.new(-3.0),Root.new(1.0)], polynomial.roots end def test_roots_for_cubic_functions_with_complex coefficients = Polynomial.parse('3x^3 - 10x^2 + 14x + 27').terms.first(4).map{ |t| t.last.coefficient } assert_equal Set[-1.0, Complex(2.1666666666666634,2.0749832663314605), Complex(2.1666666666666634,-2.0749832663314605)],Formulas.roots_of_cubic_function(*coefficients, true) end def test_roots_for_cubic_functions_one_real_all_equal polynomial = Polynomial.parse('1x^3 + 6x^2 + 12x + 8') assert_equal(1, polynomial.roots.size) assert_equal(Root.new(-2), polynomial.roots.first) end def test_roots_for_quartic_functions polynomial = Polynomial.parse('3x^4 + 6x^3 - 123x^2 - 126x + 1080') assert_set_eql Set[Root.new(5.0), Root.new(3.0), Root.new(-4.0), Root.new(-6.0)], polynomial.roots polynomial = Polynomial.parse('-20x^4 + 5x^3 + 17x^2 - 29x + 87') assert_set_eql Set[Root.new(-1.6820039266),Root.new(1.4875831103)], polynomial.roots end def test_roots_without_term_with_exponent_of_zero polynomial = Polynomial.parse('3x^3 + 3x^2') assert_set_eql Set[Root.new(0.0),Root.new(-1.0)], polynomial.roots polynomial = Polynomial.parse('1 x^4') assert_set_eql Set[Root.new(0.0)], polynomial.roots end def test_roots_biquadratic_equation polynomial = Polynomial.parse('4x^4 + 2x^2 - 1') assert_set_eql Set[Root.new(0.5558929703), Root.new(-0.5558929703)], polynomial.roots end end