polynomials 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.4
data/lib/polynomials.rb CHANGED
@@ -43,9 +43,9 @@ class Polynomial
43
43
  return new_function
44
44
  end
45
45
 
46
- def nulls
46
+ def roots
47
47
  if terms.keys.none?(&:zero?)
48
- self.alter { |nf, term| nf.terms[term.exponent-1].coefficient = term.coefficient }.nulls << 0.0
48
+ self.alter { |nf, term| nf.terms[term.exponent-1].coefficient = term.coefficient }.roots << 0.0
49
49
  else
50
50
  case self.degree
51
51
  when 1
@@ -64,18 +64,20 @@ class Polynomial
64
64
 
65
65
  def local_extremums
66
66
  derivative = self.derivative
67
- possible_extremums = derivative.nulls.sort
68
67
  max_min_extremum = Hash.new { |hash,key| hash[key] = Set.new }
68
+ unless derivative.degree == 0
69
+ possible_extremums = derivative.roots.sort
69
70
 
70
- samples = ([possible_extremums.first - 1] + possible_extremums.sort + [possible_extremums.last + 1]).each_cons(2).map do |before,after|
71
- (before + after)/2
72
- end
71
+ samples = ([possible_extremums.first - 1] + possible_extremums.sort + [possible_extremums.last + 1]).each_cons(2).map do |before,after|
72
+ (before + after)/2
73
+ end
73
74
 
74
- possible_extremums.zip(samples.each_cons(2)).each do |pe,(after,before)|
75
- yafter = derivative.calculate(after)
76
- ybefore = derivative.calculate(before)
77
- kind_of_extremum = NegPosMinMaxExtremumMapping[[yafter/yafter.abs,ybefore/ybefore.abs]]
78
- max_min_extremum[kind_of_extremum] << pe if kind_of_extremum
75
+ possible_extremums.zip(samples.each_cons(2)).each do |pe,(after,before)|
76
+ yafter = derivative.calculate(after)
77
+ ybefore = derivative.calculate(before)
78
+ kind_of_extremum = NegPosMinMaxExtremumMapping[[yafter/yafter.abs,ybefore/ybefore.abs]]
79
+ max_min_extremum[kind_of_extremum] << pe if kind_of_extremum
80
+ end
79
81
  end
80
82
  return max_min_extremum
81
83
  end
data/polynomials.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{polynomials}
8
- s.version = "0.1.2"
8
+ s.version = "0.1.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Manuel Korfmann"]
12
- s.date = %q{2011-05-12}
12
+ s.date = %q{2011-05-13}
13
13
  s.description = %q{
14
14
  * Parses polynomials
15
15
  * Provides useful methods on top of the Polynomial class, like:
@@ -34,7 +34,6 @@ Gem::Specification.new do |s|
34
34
  "lib/core_ext/math.rb",
35
35
  "lib/polynomials.rb",
36
36
  "lib/term.rb",
37
- "polynomial.gemspec",
38
37
  "polynomials.gemspec",
39
38
  "test/helper.rb",
40
39
  "test/math_test.rb",
data/test/math_test.rb CHANGED
@@ -1,65 +1,65 @@
1
1
  require 'test_helper'
2
2
  class TestMath < MiniTest::Unit::TestCase
3
- def test_nulls_for_constant_functions
3
+ def test_roots_for_constant_functions
4
4
  polynomial = Polynomial.parse('5')
5
- assert_equal Set[],polynomial.nulls
5
+ assert_equal Set[],polynomial.roots
6
6
  end
7
7
 
8
- def test_nulls_for_linear_functions
8
+ def test_roots_for_linear_functions
9
9
  polynomial = Polynomial.parse('5x + 2')
10
- assert_equal Set[-2.0/5.0],polynomial.nulls
10
+ assert_equal Set[-2.0/5.0],polynomial.roots
11
11
  end
12
12
 
13
- def test_nulls_quadratic_functions
13
+ def test_roots_quadratic_functions
14
14
  polynomial = Polynomial.parse('3x^2 + 2x - 40')
15
15
  p = 2.0/3.0
16
16
  q = -40.0/3.0
17
17
  root = Math.sqrt((p/2)**2 - q)
18
18
  fraction = -(p/2)
19
- assert_equal Set[(fraction - root).round(10), (fraction + root).round(10)],polynomial.nulls
19
+ assert_equal Set[(fraction - root).round(10), (fraction + root).round(10)],polynomial.roots
20
20
 
21
21
  polynomial = Polynomial.parse('3x^2 - 40')
22
- assert_equal Set[Math.sqrt(40.0/3).round(10), -Math.sqrt(40.0/3).round(10)], polynomial.nulls
22
+ assert_equal Set[Math.sqrt(40.0/3).round(10), -Math.sqrt(40.0/3).round(10)], polynomial.roots
23
23
  end
24
24
 
25
- def test_nulls_for_cubic_functions
25
+ def test_roots_for_cubic_functions
26
26
  polynomial = Polynomial.parse('1x^3 + 1x^2 + 2x - 1')
27
- assert_equal(1, polynomial.nulls.size)
28
- assert_equal Set[0.3926467817], polynomial.nulls
27
+ assert_equal(1, polynomial.roots.size)
28
+ assert_equal Set[0.3926467817], polynomial.roots
29
29
 
30
30
  polynomial = Polynomial.parse('2x^3 - 4x^2 - 22x + 24')
31
- assert_equal Set[4.0,-3.0,1.0], polynomial.nulls
31
+ assert_equal Set[4.0,-3.0,1.0], polynomial.roots
32
32
  end
33
33
 
34
- def test_nulls_for_cubic_functions_with_complex
34
+ def test_roots_for_cubic_functions_with_complex
35
35
  coefficients = Polynomial.parse('3x^3 - 10x^2 + 14x + 27').terms.first(4).map{ |t| t.last.coefficient }
36
36
  assert_equal Set[-1.0, Complex(2.1666666666666634,2.0749832663314605), Complex(2.1666666666666634,-2.0749832663314605)],Math.roots_of_cubic_function(*coefficients, true)
37
37
  end
38
38
 
39
- def test_nulls_for_cubic_functions_one_real_all_equal
39
+ def test_roots_for_cubic_functions_one_real_all_equal
40
40
  polynomial = Polynomial.parse('1x^3 + 6x^2 + 12x + 8')
41
- assert_equal(1, polynomial.nulls.size)
42
- assert_equal(-2, polynomial.nulls.first)
41
+ assert_equal(1, polynomial.roots.size)
42
+ assert_equal(-2, polynomial.roots.first)
43
43
  end
44
44
 
45
- def test_nulls_for_quartic_functions
45
+ def test_roots_for_quartic_functions
46
46
  polynomial = Polynomial.parse('3x^4 + 6x^3 - 123x^2 - 126x + 1080')
47
- assert_equal Set[5.0, 3.0, -4.0, -6.0], polynomial.nulls
47
+ assert_equal Set[5.0, 3.0, -4.0, -6.0], polynomial.roots
48
48
 
49
49
  polynomial = Polynomial.parse('-20x^4 + 5x^3 + 17x^2 - 29x + 87')
50
- assert_equal Set[-1.6820039266,1.4875831103], polynomial.nulls
50
+ assert_equal Set[-1.6820039266,1.4875831103], polynomial.roots
51
51
  end
52
52
 
53
- def test_nulls_without_term_with_exponent_of_zero
53
+ def test_roots_without_term_with_exponent_of_zero
54
54
  polynomial = Polynomial.parse('3x^3 + 3x^2')
55
- assert_equal Set[0.0,-1.0], polynomial.nulls
55
+ assert_equal Set[0.0,-1.0], polynomial.roots
56
56
 
57
57
  polynomial = Polynomial.parse('1 x^4')
58
- assert_equal Set[0.0], polynomial.nulls
58
+ assert_equal Set[0.0], polynomial.roots
59
59
  end
60
60
 
61
- def test_nulls_biquadratic_equation
61
+ def test_roots_biquadratic_equation
62
62
  polynomial = Polynomial.parse('4x^4 + 2x^2 - 1')
63
- assert_equal Set[0.5558929703, -0.5558929703], polynomial.nulls
63
+ assert_equal Set[0.5558929703, -0.5558929703], polynomial.roots
64
64
  end
65
65
  end
@@ -56,6 +56,9 @@ class TestPolynomial < MiniTest::Unit::TestCase
56
56
 
57
57
  polynomial = Polynomial.parse('-1 x^4')
58
58
  assert_equal({ right: Set[-1.0/0..+1.0/0] }, polynomial.curvature_behaviour)
59
+
60
+ polynomial = Polynomial.parse('5x^2')
61
+ assert_equal({ left: Set[-1.0/0..+1.0/0] }, polynomial.curvature_behaviour)
59
62
  end
60
63
 
61
64
  def test_no_curve_and_no_inflection_points
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 4
9
+ version: 0.1.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Manuel Korfmann
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-05-12 00:00:00 +02:00
17
+ date: 2011-05-13 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -109,7 +109,6 @@ files:
109
109
  - lib/core_ext/math.rb
110
110
  - lib/polynomials.rb
111
111
  - lib/term.rb
112
- - polynomial.gemspec
113
112
  - polynomials.gemspec
114
113
  - test/helper.rb
115
114
  - test/math_test.rb
@@ -130,7 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
129
  requirements:
131
130
  - - ">="
132
131
  - !ruby/object:Gem::Version
133
- hash: -894786567939167734
132
+ hash: -100517783123906074
134
133
  segments:
135
134
  - 0
136
135
  version: "0"
data/polynomial.gemspec DELETED
@@ -1,76 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{polynomial}
8
- s.version = "0.1.1"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Manuel Korfmann"]
12
- s.date = %q{2011-05-12}
13
- s.description = %q{
14
- * Parses polynomials
15
- * Provides useful methods on top of the Polynomial class, like:
16
- ** Polynomial#local_extremums
17
- ** Polynomial#nulls
18
- ** Polynomial#curvature_behaviour
19
- * Implements root's finding formulas for quadratic, cubic and quartic functions
20
- }
21
- s.email = %q{manu@korfmann.info}
22
- s.extra_rdoc_files = [
23
- "LICENSE.txt",
24
- "README.rdoc"
25
- ]
26
- s.files = [
27
- ".document",
28
- "Gemfile",
29
- "Gemfile.lock",
30
- "LICENSE.txt",
31
- "README.rdoc",
32
- "Rakefile",
33
- "VERSION",
34
- "lib/core_ext/math.rb",
35
- "lib/polynomials.rb",
36
- "lib/term.rb",
37
- "polynomial.gemspec",
38
- "polynomials.gemspec",
39
- "test/helper.rb",
40
- "test/math_test.rb",
41
- "test/polynomial_test.rb",
42
- "test/term_test.rb",
43
- "test/test_helper.rb"
44
- ]
45
- s.homepage = %q{http://github.com/mkorfmann/polynomials}
46
- s.licenses = ["MIT"]
47
- s.require_paths = ["lib"]
48
- s.rubygems_version = %q{1.3.7}
49
- s.summary = %q{Polyomial calculations library}
50
-
51
- if s.respond_to? :specification_version then
52
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
53
- s.specification_version = 3
54
-
55
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
- s.add_development_dependency(%q<shoulda>, [">= 0"])
57
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
58
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
59
- s.add_development_dependency(%q<rcov>, [">= 0"])
60
- s.add_development_dependency(%q<awesome_print>, [">= 0"])
61
- else
62
- s.add_dependency(%q<shoulda>, [">= 0"])
63
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
64
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
65
- s.add_dependency(%q<rcov>, [">= 0"])
66
- s.add_dependency(%q<awesome_print>, [">= 0"])
67
- end
68
- else
69
- s.add_dependency(%q<shoulda>, [">= 0"])
70
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
71
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
72
- s.add_dependency(%q<rcov>, [">= 0"])
73
- s.add_dependency(%q<awesome_print>, [">= 0"])
74
- end
75
- end
76
-