polynomials 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ script: "rake"
2
+ rvm:
3
+ - 1.9.2
4
+
data/README.markdown CHANGED
@@ -1,5 +1,7 @@
1
1
  # Polynomials
2
2
 
3
+ [![Build Status](http://travis-ci.org/mkorfmann/polynomials.png)](http://travis-ci.org/mkorfmann/polynomials)
4
+
3
5
  ## Usage
4
6
 
5
7
  <pre><code>
@@ -14,16 +16,18 @@ points = polynomial.roots | polynomial.local_extrema | polynomial.inflection_po
14
16
 
15
17
  max_x = points.max_by(&amp;:x).x
16
18
  min_x = points.min_by(&amp;:x).x
19
+ max_x = max_x ? max_x.x : 1
20
+ min_x = min_x ? min_x.x : -1
17
21
 
18
- start = (min_x - min_x.abs/2)
19
- stop = (max_x + max_x.abs/2)
20
-
21
- step = (max_x-min_x).abs/200
22
+ difference = (max_x-min_x).abs
22
23
 
23
- pointset = polynomials.pointset(start,stop,step)
24
+ start = min_x - difference/4.0
25
+ stop = max_x + difference/4.0
26
+ step = difference/200.0
24
27
 
25
- data_x = pointset.map(&:x)
26
- data_y = pointset.map(&:y)
28
+ pointset = polynomial.pointset(start,stop,step)
29
+ data_x = pointset.map(&:first)
30
+ data_y = pointset.map(&:last)
27
31
 
28
32
  Gnuplot.open do |gp|
29
33
  Gnuplot::Plot.new(gp) do |plot|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.4.1
@@ -9,14 +9,14 @@ points = polynomial.roots | polynomial.local_extrema | polynomial.inflection_po
9
9
 
10
10
  max_x = points.max_by(&:x)
11
11
  min_x = points.min_by(&:x)
12
- max_x = max_x ? max_x.x : 1
13
- min_x = min_x ? min_x.x : -1
12
+ max_x = max_x == 0 ? max_x.x : 1
13
+ min_x = min_x == 0 ? min_x.x : -1
14
14
 
15
15
  difference = (max_x-min_x).abs
16
16
 
17
17
  start = min_x - difference/4.0
18
18
  stop = max_x + difference/4.0
19
- step = difference/200.0
19
+ step = (start-stop).abs/1000.0
20
20
 
21
21
  pointset = polynomial.pointset(start,stop,step)
22
22
  data_x= pointset.map(&:first)
@@ -33,6 +33,7 @@ Gnuplot.open do |gp|
33
33
  ds.with = "lines"
34
34
  ds.linewidth = 0.2
35
35
  ds.title = "f(x) = #{polynomial}"
36
+ ds.smooth
36
37
  end
37
38
 
38
39
  [:inflection_point,:root, :maximum, :minimum].each do |kind_of_point|
@@ -5,8 +5,9 @@ module Polynomials
5
5
 
6
6
  def strives_for
7
7
  roots = self.roots.map(&:x)
8
- return nil if roots.empty?
9
- [self.(roots.min - 1).sign, self.(roots.max + 1).sign].map { |d| d * Infinity }
8
+ local_extrema = self.local_extrema.map(&:x)
9
+ return nil if roots.empty? && local_extrema.empty?
10
+ [self.((roots.min || local_extrema.min) - 1).sign, self.((roots.max || local_extrema.max) + 1).sign].map { |d| d * Infinity }
10
11
  end
11
12
 
12
13
  def inflection_points
@@ -31,14 +31,13 @@ module Polynomials
31
31
 
32
32
  def derivative
33
33
  new_function = self.alter do |nf, term|
34
- nf.terms[term.exponent - 1].coefficient += term.exponent * term.coefficient
34
+ (nf.terms[term.exponent - 1].coefficient += term.exponent * term.coefficient) unless term.exponent.zero?
35
35
  end
36
- new_function.terms.reject! { |_,t| t.coefficient == 0 }
37
- return new_function
36
+
38
37
  end
39
38
 
40
39
  def roots
41
- if !terms.empty? and terms.keys.none?(&:zero?)
40
+ if !terms.empty? and (terms.keys.none?(&:zero?) || terms[0].coefficient.zero?)
42
41
  self.alter { |nf, term| nf.terms[term.exponent-self.lt.exponent].coefficient = term.coefficient }.roots << Root.new(0.0)
43
42
  else
44
43
  case self.degree
@@ -77,7 +76,7 @@ module Polynomials
77
76
  end
78
77
 
79
78
  def lt
80
- self.terms[self.terms.min_by{ |_,t| t.exponent}.first]
79
+ self.terms[self.terms.reject { |_,t| t.coefficient.zero? }.min_by{ |_,t| t.exponent}.first]
81
80
  end
82
81
 
83
82
  def pointset(start,stop,step=0.1)
@@ -90,6 +89,16 @@ module Polynomials
90
89
  data << [stop,self.(stop)]
91
90
  end
92
91
 
92
+ def grouped_pointset(start,stop,step=0.1,grouped)
93
+ grouped.each do |key,intervals|
94
+ intervals.reject! { |s,e| e < start || s > stop }
95
+ intervals.map! do |s,e|
96
+ self.pointset([s,start].max, [e,stop].min, step)
97
+ end
98
+ end
99
+ return grouped
100
+ end
101
+
93
102
  def coefficients_till(n)
94
103
  coefficients = []
95
104
  (0..n).each do |e|
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.4.0"
8
+ s.version = "0.4.1"
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-18}
12
+ s.date = %q{2011-05-19}
13
13
  s.description = %q{
14
14
  This is a gem dedicated to parsing, manipulating and finding roots,extrema and inflection points of polynomials.
15
15
  It can solve polynomial equations with a degree up to 4 by implementing formulas for solving quadratic, cubic and quartic functions.
@@ -21,6 +21,7 @@ It can solve polynomial equations with a degree up to 4 by implementing formulas
21
21
  ]
22
22
  s.files = [
23
23
  ".document",
24
+ ".travis.yml",
24
25
  "Gemfile",
25
26
  "Gemfile.lock",
26
27
  "LICENSE.txt",
@@ -73,4 +73,19 @@ class TestAnalyzable < MiniTest::Unit::TestCase
73
73
  polynomial = Polynomial.parse('+ 1.0 x^4 + 5.0 x^3 - 1.0 x^2 + 3.0 x + 5.0').derivative
74
74
  assert_equal [-Infinity,Infinity], polynomial.strives_for
75
75
  end
76
+
77
+ def test_inflection_points_some_coefficients_of_derivative2_zero
78
+ polynomial = Polynomial.parse('x^5 + x^1')
79
+ assert_set_eql Set[], polynomial.inflection_points
80
+ end
81
+
82
+ def test_curvature_behaviour_degree_4
83
+ polynomial = Polynomial.parse('x^5 + x^1')
84
+ assert_equal({ :right => [[-Infinity,0.0]], :left => [[0.0, Infinity]] }, polynomial.curvature_behaviour)
85
+ end
86
+
87
+ def test_strives_for_no_roots
88
+ polynomial = Polynomial.new(1,0,0,0,0)
89
+ assert_equal [Infinity,Infinity], polynomial.strives_for
90
+ end
76
91
  end
@@ -73,4 +73,16 @@ class TestPolynomial < MiniTest::Unit::TestCase
73
73
  polynomial = Polynomial.new(1,0,0)
74
74
  assert_equal [[0.1,0.1**2],[0.2,0.2**2],[0.25,0.25**2]], polynomial.pointset(0.1,0.25,0.1)
75
75
  end
76
+
77
+ def test_grouped_pointset
78
+ polynomial = Polynomial.new(1,0,0)
79
+ assert_equal({ :jellyfish => [[[-0.1,0.1**2,],[0,0.0]]] , :peanut_butter => [[[0,0.0],[0.1,0.1**2],[0.2,0.2**2],[0.25,0.25**2]]]},
80
+ polynomial.grouped_pointset(-0.1,0.25,0.1, { :jellyfish => [[-Infinity,0]], :peanut_butter => [[0,Infinity]] }))
81
+ end
82
+
83
+ def test_grouped_pointset_omitting_inteval_through_start_out_of_range
84
+ polynomial = Polynomial.new(1,0,0)
85
+ assert_equal({ :jellyfish => [[[-0.005,0.005**2,],[0,0.0]]] , :peanut_butter => [[[0,0.0],[0.1,0.1**2],[0.2,0.2**2],[0.25,0.25**2]]]},
86
+ polynomial.grouped_pointset(-0.005,0.25,0.1, { :jellyfish => [[-0.01,0]], :peanut_butter => [[-Infinity,-0.1],[0,Infinity]] }))
87
+ end
76
88
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: polynomials
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.0
5
+ version: 0.4.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Manuel Korfmann
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-18 00:00:00 +02:00
13
+ date: 2011-05-19 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -92,6 +92,7 @@ extra_rdoc_files:
92
92
  - README.markdown
93
93
  files:
94
94
  - .document
95
+ - .travis.yml
95
96
  - Gemfile
96
97
  - Gemfile.lock
97
98
  - LICENSE.txt
@@ -127,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
128
  requirements:
128
129
  - - ">="
129
130
  - !ruby/object:Gem::Version
130
- hash: 1327775676768691689
131
+ hash: 805629987972417453
131
132
  segments:
132
133
  - 0
133
134
  version: "0"