integration 0.1.1 → 0.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ad161dae6d8cd737f33db6844ab3f345c95fb82
4
- data.tar.gz: d098810e0c476442e1495586d229251fffd37d9c
3
+ metadata.gz: 437b8e5c01a17b8168d503e3053429e5df10238c
4
+ data.tar.gz: 4b8fde1abeece2e42932cda9fa06779ee08ea274
5
5
  SHA512:
6
- metadata.gz: e2ad2678eb811bf5ae28f81e1d7e59fa118b4bef2ba995155f9ac3be109ee9caca9ea54479f86924e49edbf5fcacbf2c8831f6cf64d53b562df7e8af2b75791c
7
- data.tar.gz: d258396d5f21736dd665afc554b2b086cb39ab4126f996fd77ddf7bd54c1c0b11e62cb02a02b5457d8e765cac9e1311e5d6d629ce8145aacebfd066dcca56280
6
+ metadata.gz: 10f8aa27944b66c5e0817f3e6f9b18fc948be1539aef46931ac1ea803c869f243bb91b097a0edd6433cdafdce5728dc6dca9a32109ed6208cba1b65c6b66b47d
7
+ data.tar.gz: 92b5bcc05f2438e3d4c301119d984e82074353ca6e03975eaf972bc39669584e07a038479f9f38fc8a1370708b82d23cec228bb686333343a3c5726c750df871
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  *~
2
+ Gemfile.lock
2
3
  coverage/*
3
4
  pkg/*
@@ -1,15 +1,16 @@
1
1
  language: ruby
2
2
  rvm:
3
- - '1.9.3'
4
- - '2.0.0'
5
- - '2.1.1'
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
6
7
  # - jruby-19mode # JRuby in 1.9 mode -> Problems with bigint
7
8
  # - rbx-19mode
8
9
  # script: bundle exec rspec spec
9
10
 
10
11
  script:
11
- bundle exec rspec
12
-
12
+ bundle exec rake spec
13
+
13
14
  before_install:
14
15
  - sudo apt-get update -qq
15
16
  - sudo apt-get install -y libgsl0-dev
data/README.md CHANGED
@@ -1,60 +1,74 @@
1
- # integration
1
+ # Integration
2
2
 
3
- * http://github.com/clbustos/integration
3
+ [![Build Status](https://travis-ci.org/SciRuby/integration.svg?branch=master)](https://travis-ci.org/SciRuby/integration)
4
+ [![Code Climate](https://codeclimate.com/github/SciRuby/integration/badges/gpa.svg)](https://codeclimate.com/github/SciRuby/integration)
4
5
 
5
- ## DESCRIPTION:
6
+ Numerical integration for Ruby, with a simple interface. Several different integration methods are implemented.
6
7
 
7
- Numerical integration for Ruby, with a simple interface
8
+ ## Installation
8
9
 
9
- ## FEATURES/PROBLEMS:
10
+ ```bash
11
+ $ gem install integration
12
+ ```
13
+
14
+ You can install GSL (please use your package manager) for better performance and support for infinite bounds. After successfully installing the library:
15
+
16
+ ```bash
17
+ $ gem install rb-gsl
18
+ ```
19
+
20
+ ## Documentation
21
+
22
+ You can see the latest documentation for Integration at Rubydoc: [rubydoc.info/github/sciruby/integration](http://www.rubydoc.info/github/sciruby/integration).
23
+
24
+ ## Features
10
25
 
11
26
  * Use only one method: Integration.integrate
12
- * Rectangular, Trapezoidal, Simpson, Adaptive quadrature, Monte Carlo and Romberg integration methods available on pure Ruby.
13
- * If available, uses Ruby/GSL QNG non-adaptive Gauss-Kronrod integration and QAG adaptive integration, with support for Infinity+ and Infinity-
14
-
15
-
16
- ## SYNOPSIS:
17
-
18
- Integration.integrate(1,2,{:tolerance=>1e-10,:method=>:simpson}) {|x| x**2} => 2.333333
19
-
20
- # Support for infinity bounds with GSL QAG adaptative integration
21
-
22
- normal_pdf=lambda {|x| (1/Math.sqrt(2*Math::PI))*Math.exp(-(x**2/2))}
23
- Integration.integrate(Integration::MInfinity, 0 , {:tolerance=>1e-10}, &normal_pdf) => 0.5
24
- Integration.integrate(0, Integration::Infinity , {:tolerance=>1e-10}, &normal_pdf) => 0.5
25
-
26
- ## REQUIREMENTS:
27
-
28
- * Ruby/GSL, for better performance and support for infinite bounds
29
-
30
- ## INSTALL:
31
-
32
- gem install integration
33
-
34
- ## LICENSE:
35
-
36
- Copyright (c) 2005 Beng
37
- 2011.2014 clbustos
38
-
39
- Permission is hereby granted, free of charge, to any person obtaining a
40
- copy of this software and associated documentation files (the "Software"),
41
- to deal in the Software without restriction, including without limitation
42
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
43
- and/or sell copies of the Software, and to permit persons to whom the
44
- Software is furnished to do so, subject to the following conditions:
45
-
46
- The above copyright notice and this permission notice shall be included in
47
- all copies or substantial portions of the Software.
48
-
49
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
50
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
51
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
52
- THE DEVELOPERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
53
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
54
- OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55
- SOFTWARE.
56
-
57
- Except as contained in this notice, the name of the Beng shall not
58
- be used in advertising or otherwise to promote the sale, use or other dealings
59
- in this Software without prior written authorization from Beng.
27
+ * Rectangular, Trapezoidal, Simpson, Adaptive quadrature, Monte Carlo and Romberg integration methods available on pure Ruby.
28
+ * If available, uses Ruby/GSL QNG non-adaptive Gauss-Kronrod integration and QAG adaptive integration, with support for Infinity+ and Infinity-
29
+
30
+ ## Examples
31
+
32
+ ```ruby
33
+ # Integrate x^2 in [1, 2] using Simpson's rule.
34
+ Integration.integrate(1, 2, tolerance: 1e-10, method: :simpson) do |x|
35
+ x**2
36
+ end
37
+ # => 2.333333
38
+
39
+ # Support for infinity bounds with GSL QAG adaptative integration.
40
+
41
+ normal_pdf = lambda do |x|
42
+ (1 / Math.sqrt(2 * Math::PI)) * Math.exp(-0.5 * (x**2))
43
+ end
44
+
45
+ Integration.integrate(Integration::MInfinity, 0, tolerance: 1e-10, &normal_pdf) # => 0.5
46
+ Integration.integrate(0, Integration::Infinity , tolerance: 1e-10, &normal_pdf) # => 0.5
47
+ ```
48
+
49
+ ## License
50
+
51
+ Copyright (c) 2005 Beng
52
+ 2011-2015 clbustos
53
+
54
+ Permission is hereby granted, free of charge, to any person obtaining a
55
+ copy of this software and associated documentation files (the "Software"),
56
+ to deal in the Software without restriction, including without limitation
57
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
58
+ and/or sell copies of the Software, and to permit persons to whom the
59
+ Software is furnished to do so, subject to the following conditions:
60
+
61
+ The above copyright notice and this permission notice shall be included in
62
+ all copies or substantial portions of the Software.
63
+
64
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
65
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
67
+ THE DEVELOPERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
68
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
69
+ OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
70
+ SOFTWARE.
60
71
 
72
+ Except as contained in this notice, the name of the Beng shall not
73
+ be used in advertising or otherwise to promote the sale, use or other dealings
74
+ in this Software without prior written authorization from Beng.
data/Rakefile CHANGED
@@ -1,14 +1,9 @@
1
- # -*- ruby -*-
2
- $:.unshift(File.expand_path(File.dirname(__FILE__)+"/lib/"))
3
- require 'rubygems'
4
- require 'integration'
5
- require 'bundler'
6
-
7
- Bundler::GemHelper.install_tasks
8
-
9
-
10
- gemspec = eval(IO.read("integration.gemspec"))
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
11
2
 
3
+ require 'integration/version'
4
+ require 'bundler'
5
+ require 'bundler/gem_tasks'
6
+ require 'rspec/core/rake_task'
12
7
 
13
8
  begin
14
9
  Bundler.setup(:default, :development)
@@ -18,28 +13,13 @@ rescue Bundler::BundlerError => e
18
13
  exit e.status_code
19
14
  end
20
15
 
21
-
22
-
23
- require "rubygems/package_task"
24
- Gem::PackageTask.new(gemspec).define
25
-
26
- desc "install the gem locally"
27
- task :install => [:package] do
28
- sh %{gem install pkg/integration-#{Integration::VERSION}.gem}
29
- end
30
-
31
- require 'rspec/core/rake_task'
32
- require 'rspec/core'
33
- require 'rspec/core/rake_task'
34
16
  RSpec::Core::RakeTask.new(:spec) do |spec|
35
17
  spec.pattern = FileList['spec/**/*_spec.rb']
36
18
  end
37
19
 
38
-
39
20
  desc "Open an irb session preloaded with integration"
40
21
  task :console do
41
22
  sh "irb -rubygems -I lib -r integration.rb"
42
23
  end
43
24
 
44
25
  task :default => :spec
45
- # vim: syntax=ruby
@@ -1,16 +1,15 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib/', __FILE__)
3
- $:.unshift lib unless $:.include?(lib)
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
4
2
 
3
+ require 'integration/version'
5
4
 
6
5
  Gem::Specification.new do |s|
7
6
  s.name = "integration"
8
- s.version = "0.1.1"
7
+ s.version = Integration::VERSION
9
8
  s.authors = ["Claudio Bustos","Ben Gimpert"]
10
9
  s.description = "Numerical integration for Ruby, with a simple interface"
11
10
  s.email = ["clbustos@gmail.com", "No Email"]
12
11
  s.files = `git ls-files`.split("\n")
13
- s.test_files = `git ls-files -- {test,spec,features,benchmark}/*`.split("\n")
12
+ s.test_files = `git ls-files -- {test,spec,features,benchmark}/*`.split("\n")
14
13
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
14
  s.require_paths = ["lib"]
16
15
  s.summary = "A suite for integration in Ruby"
@@ -7,10 +7,10 @@
7
7
  # the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
8
  # and/or sell copies of the Software, and to permit persons to whom the
9
9
  # Software is furnished to do so, subject to the following conditions:
10
- #
10
+ #
11
11
  # The above copyright notice and this permission notice shall be included in
12
12
  # all copies or substantial portions of the Software.
13
- #
13
+ #
14
14
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
15
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
16
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
@@ -18,33 +18,32 @@
18
18
  # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19
19
  # OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  # SOFTWARE.
21
- #
21
+ #
22
22
  # Except as contained in this notice, the name of the Beng shall not
23
23
  # be used in advertising or otherwise to promote the sale, use or other dealings
24
24
  # in this Software without prior written authorization from Beng.
25
25
 
26
26
  # Diverse integration methods
27
27
  # Use Integration.integrate as wrapper to direct access to methods
28
- #
29
- # Method API
28
+ #
29
+ # Method API
30
30
  #
31
31
 
32
32
  class Integration
33
- VERSION = '0.2.0'
34
33
  # Minus Infinity
35
34
  MInfinity=:minfinity
36
35
  # Infinity
37
36
  Infinity=:infinity
38
37
  class << self
39
-
38
+
40
39
  # Create a method 'has_<library>' on Module
41
40
  # which require a library and return true or false
42
- # according to success of failure
41
+ # according to success of failure
43
42
  def create_has_library(library) #:nodoc:
44
43
  define_singleton_method("has_#{library}?") do
45
44
  cv="@@#{library}"
46
45
  if !class_variable_defined? cv
47
- begin
46
+ begin
48
47
  require library.to_s
49
48
  class_variable_set(cv, true)
50
49
  rescue LoadError
@@ -60,7 +59,7 @@ class Integration
60
59
  # * Ayres : Outline of calculus
61
60
  def rectangle(t1, t2, n, &f)
62
61
  d=(t2-t1) / n.to_f
63
- n.times.inject(0) {|ac,i|
62
+ n.times.inject(0) {|ac,i|
64
63
  ac+f[t1+d*(i+0.5)]
65
64
  }*d
66
65
  end
@@ -72,35 +71,44 @@ class Integration
72
71
  def trapezoid(t1, t2, n, &f)
73
72
  d=(t2-t1) / n.to_f
74
73
  (d/2.0)*(f[t1]+
75
- 2*(1..(n-1)).inject(0){|ac,i|
74
+ 2*(1..(n-1)).inject(0){|ac,i|
76
75
  ac+f[t1+d*i]
77
76
  }+f[t2])
78
77
  end
78
+
79
79
  # Simpson's rule
80
80
  # +n+ implies number of subdivisions
81
81
  # Source:
82
82
  # * Ayres : Outline of calculus
83
83
  def simpson(t1, t2, n, &f)
84
84
  n += 1 unless n % 2 == 0
85
- d=(t2-t1) / n.to_f
85
+ d=(t2-t1) / n.to_f
86
86
  out= (d / 3.0)*(f[t1.to_f].to_f+
87
87
  ((1..(n-1)).inject(0) {|ac,i|
88
- ac+((i%2==0) ? 2 : 4)*f[t1+d*i]
88
+ ac+((i%2==0) ? 2 : 4)*f[t1+d*i]
89
89
  })+f[t2.to_f].to_f)
90
90
  out
91
91
  end
92
- # TODO: Document method
92
+
93
+ # Simpson's 3/8 Rule
94
+ # +n+ implies number of subdivisions
95
+ # Source:
96
+ # * Burden, Richard L. and Faires, J. Douglas (2000): Numerical Analysis (7th ed.). Brooks/Cole
93
97
  def simpson3by8(t1, t2, n, &f)
94
- d = (t2-t1) / n.to_f
98
+ d = (t2-t1) / n.to_f
95
99
  ac = 0
96
100
  (0..n-1).each do |i|
97
101
  ac+=(d/8.0)*(f[t1+i*d]+3*f[t1+i*d+d/3]+3*f[t1+i*d+2*d/3]+f[t1+(i+1)*d])
98
102
  end
99
103
  ac
100
104
  end
101
- # TODO: Document method
105
+
106
+ # Boole's Rule
107
+ # +n+ implies number of subdivisions
108
+ # Source:
109
+ # Weisstein, Eric W. "Boole's Rule." From MathWorld—A Wolfram Web Resource
102
110
  def boole(t1, t2, n, &f)
103
- d = (t2-t1) / n.to_f
111
+ d = (t2-t1) / n.to_f
104
112
  ac = 0
105
113
  (0..n-1).each do |i|
106
114
  ac+=(d/90.0)*(7*f[t1+i*d]+32*f[t1+i*d+d/4]+12*f[t1+i*d+d/2]+32*f[t1+i*d+3*d/4]+7*f[t1+(i+1)*d])
@@ -108,26 +116,38 @@ class Integration
108
116
  ac
109
117
  end
110
118
 
111
- # TODO: Document method
119
+ # Open Trapezoid method
120
+ # +n+ implies number of subdivisions
121
+ # Values computed at mid point and end point instead of starting points
112
122
  def open_trapezoid(t1, t2, n, &f)
113
- d = (t2-t1) / n.to_f
123
+ d = (t2-t1) / n.to_f
114
124
  ac = 0
115
125
  (0..n-1).each do |i|
116
126
  ac+=(d/2.0)*(f[t1+i*d+d/3]+f[t1+i*d+2*d/3])
117
127
  end
118
128
  ac
119
129
  end
120
- # TODO: Document method
130
+
131
+ # Milne's Method
132
+ # +n+ implies number of subdivisions
133
+ # Source:
134
+ # Abramowitz, M. and Stegun, I. A. (Eds.).
135
+ # Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables,
136
+ # 9th printing. New York: Dover, pp. 896-897, 1972.
121
137
  def milne(t1, t2, n, &f)
122
- d = (t2-t1) / n.to_f
138
+ d = (t2-t1) / n.to_f
123
139
  ac = 0
124
140
  (0..n-1).each do |i|
125
141
  ac+=(d/3.0)*(2*f[t1+i*d+d/4]-f[t1+i*d+d/2]+2*f[t1+i*d+3*d/4])
126
142
  end
127
143
  ac
128
144
  end
129
- # TODO: Document method
130
- def adaptive_quadrature(a, b, tolerance)
145
+
146
+ # Adaptive Quadrature
147
+ # Calls the Simpson's rule recursively on subintervals
148
+ # in case the error exceeds the desired tolerance
149
+ # +tolerance+ is the desired tolerance of error
150
+ def adaptive_quadrature(a, b, tolerance)
131
151
  h = (b.to_f - a) / 2
132
152
  fa = yield(a)
133
153
  fc = yield(a + h)
@@ -151,7 +171,9 @@ class Integration
151
171
  }
152
172
  return helper.call(a, b, fa, fb, fc, h, s, 1)
153
173
  end
154
- # TODO: Document method
174
+
175
+ # Gaussian Quadrature
176
+ # n-point Gaussian quadrature rule gives an exact result for polynomials of degree 2n − 1 or less
155
177
  def gauss(t1, t2, n)
156
178
  case n
157
179
  when 1
@@ -187,50 +209,195 @@ class Integration
187
209
  else
188
210
  raise "Invalid number of spaced abscissas #{n}, should be 1-10"
189
211
  end
190
-
212
+
191
213
  sum = 0
192
214
  (0...n).each do |i|
193
- t = ((t1.to_f + t2) / 2.0) + (((t2 - t1) / 2.0) * z[i])
215
+ t = ((t1.to_f + t2) / 2.0) + (((t2 - t1) / 2.0) * z[i])
194
216
  sum += w[i] * yield(t)
195
217
  end
196
218
  return ((t2 - t1) / 2.0) * sum
197
219
  end
198
- # TODO: Document method
220
+
221
+ # Gauss Kronrod Rule:
222
+ # Provides a 3n+1 order estimate while re-using the function values of a lower-order(n order) estimate
223
+ # Source:
224
+ # "Gauss–Kronrod quadrature formula", Encyclopedia of Mathematics, Springer, ISBN 978-1-55608-010-4
199
225
  def gauss_kronrod(t1,t2,n,points)
200
226
  #g7k15
201
227
  case points
202
228
  when 15
203
- z = [-0.9914553711208126, -0.9491079123427585, -0.8648644233597691, -0.7415311855993945, -0.5860872354676911, -0.4058451513773972, -0.20778495500789848, 0.0, 0.20778495500789848, 0.4058451513773972, 0.5860872354676911, 0.7415311855993945, 0.8648644233597691, 0.9491079123427585, 0.9914553711208126]
204
- w = [0.022935322010529224, 0.06309209262997856, 0.10479001032225019, 0.14065325971552592, 0.1690047266392679, 0.19035057806478542, 0.20443294007529889, 0.20948214108472782, 0.20443294007529889, 0.19035057806478542, 0.1690047266392679, 0.14065325971552592, 0.10479001032225019, 0.06309209262997856, 0.022935322010529224]
229
+
230
+ z = [-0.9914553711208126, -0.9491079123427585, -0.8648644233597691,
231
+ -0.7415311855993945, -0.5860872354676911, -0.4058451513773972,
232
+ -0.20778495500789848, 0.0, 0.20778495500789848,
233
+ 0.4058451513773972, 0.5860872354676911, 0.7415311855993945,
234
+ 0.8648644233597691, 0.9491079123427585, 0.9914553711208126]
235
+
236
+ w = [0.022935322010529224, 0.06309209262997856, 0.10479001032225019,
237
+ 0.14065325971552592, 0.1690047266392679, 0.19035057806478542,
238
+ 0.20443294007529889, 0.20948214108472782, 0.20443294007529889,
239
+ 0.19035057806478542, 0.1690047266392679, 0.14065325971552592,
240
+ 0.10479001032225019, 0.06309209262997856, 0.022935322010529224]
241
+
205
242
  when 21
206
243
  #g10k21
207
- z = [-0.9956571630258081, -0.9739065285171717, -0.9301574913557082, -0.8650633666889845, -0.7808177265864169, -0.6794095682990244, -0.5627571346686047, -0.4333953941292472, -0.2943928627014602, -0.14887433898163122, 0.0, 0.14887433898163122, 0.2943928627014602, 0.4333953941292472, 0.5627571346686047, 0.6794095682990244, 0.7808177265864169, 0.8650633666889845, 0.9301574913557082, 0.9739065285171717, 0.9956571630258081]
208
- w = [0.011694638867371874, 0.032558162307964725, 0.054755896574351995, 0.07503967481091996, 0.0931254545836976, 0.10938715880229764, 0.12349197626206584, 0.13470921731147334, 0.14277593857706009, 0.14773910490133849, 0.1494455540029169, 0.14773910490133849, 0.14277593857706009, 0.13470921731147334, 0.12349197626206584, 0.10938715880229764, 0.0931254545836976, 0.07503967481091996, 0.054755896574351995, 0.032558162307964725, 0.011694638867371874]
244
+
245
+ z = [-0.9956571630258081, -0.9739065285171717, -0.9301574913557082,
246
+ -0.8650633666889845, -0.7808177265864169, -0.6794095682990244,
247
+ -0.5627571346686047, -0.4333953941292472, -0.2943928627014602,
248
+ -0.14887433898163122, 0.0, 0.14887433898163122,
249
+ 0.2943928627014602, 0.4333953941292472, 0.5627571346686047,
250
+ 0.6794095682990244, 0.7808177265864169, 0.8650633666889845,
251
+ 0.9301574913557082, 0.9739065285171717, 0.9956571630258081]
252
+
253
+ w = [0.011694638867371874, 0.032558162307964725,
254
+ 0.054755896574351995, 0.07503967481091996, 0.0931254545836976,
255
+ 0.10938715880229764, 0.12349197626206584, 0.13470921731147334,
256
+ 0.14277593857706009, 0.14773910490133849, 0.1494455540029169,
257
+ 0.14773910490133849, 0.14277593857706009, 0.13470921731147334,
258
+ 0.12349197626206584, 0.10938715880229764, 0.0931254545836976,
259
+ 0.07503967481091996, 0.054755896574351995, 0.032558162307964725,
260
+ 0.011694638867371874]
261
+
209
262
  when 31
210
263
  #g15k31
211
- z = [-0.9980022986933971, -0.9879925180204854, -0.9677390756791391, -0.937273392400706, -0.8972645323440819, -0.8482065834104272, -0.790418501442466, -0.7244177313601701, -0.650996741297417, -0.5709721726085388, -0.4850818636402397, -0.3941513470775634, -0.29918000715316884, -0.20119409399743451, -0.1011420669187175, 0.0, 0.1011420669187175, 0.20119409399743451, 0.29918000715316884, 0.3941513470775634, 0.4850818636402397, 0.5709721726085388, 0.650996741297417, 0.7244177313601701, 0.790418501442466, 0.8482065834104272, 0.8972645323440819, 0.937273392400706, 0.9677390756791391, 0.9879925180204854, 0.9980022986933971]
212
- w = [0.005377479872923349, 0.015007947329316122, 0.02546084732671532, 0.03534636079137585, 0.04458975132476488, 0.05348152469092809, 0.06200956780067064, 0.06985412131872826, 0.07684968075772038, 0.08308050282313302, 0.08856444305621176, 0.09312659817082532, 0.09664272698362368, 0.09917359872179196, 0.10076984552387559, 0.10133000701479154, 0.10076984552387559, 0.09917359872179196, 0.09664272698362368, 0.09312659817082532, 0.08856444305621176, 0.08308050282313302, 0.07684968075772038, 0.06985412131872826, 0.06200956780067064, 0.05348152469092809, 0.04458975132476488, 0.03534636079137585, 0.02546084732671532, 0.015007947329316122, 0.005377479872923349]
264
+
265
+ z = [-0.9980022986933971, -0.9879925180204854, -0.9677390756791391,
266
+ -0.937273392400706, -0.8972645323440819, -0.8482065834104272,
267
+ -0.790418501442466, -0.7244177313601701, -0.650996741297417,
268
+ -0.5709721726085388, -0.4850818636402397, -0.3941513470775634,
269
+ -0.29918000715316884, -0.20119409399743451, -0.1011420669187175,
270
+ 0.0, 0.1011420669187175, 0.20119409399743451,
271
+ 0.29918000715316884, 0.3941513470775634, 0.4850818636402397,
272
+ 0.5709721726085388, 0.650996741297417, 0.7244177313601701,
273
+ 0.790418501442466, 0.8482065834104272, 0.8972645323440819,
274
+ 0.937273392400706, 0.9677390756791391, 0.9879925180204854,
275
+ 0.9980022986933971]
276
+
277
+ w = [0.005377479872923349, 0.015007947329316122, 0.02546084732671532,
278
+ 0.03534636079137585, 0.04458975132476488, 0.05348152469092809,
279
+ 0.06200956780067064, 0.06985412131872826, 0.07684968075772038,
280
+ 0.08308050282313302, 0.08856444305621176, 0.09312659817082532,
281
+ 0.09664272698362368, 0.09917359872179196, 0.10076984552387559,
282
+ 0.10133000701479154, 0.10076984552387559, 0.09917359872179196,
283
+ 0.09664272698362368, 0.09312659817082532, 0.08856444305621176,
284
+ 0.08308050282313302, 0.07684968075772038, 0.06985412131872826,
285
+ 0.06200956780067064, 0.05348152469092809, 0.04458975132476488,
286
+ 0.03534636079137585, 0.02546084732671532, 0.015007947329316122,
287
+ 0.005377479872923349]
288
+
213
289
  when 41
214
290
  #g20k41
215
- z = [-0.9988590315882777, -0.9931285991850949, -0.9815078774502503, -0.9639719272779138, -0.9408226338317548, -0.912234428251326, -0.878276811252282, -0.8391169718222188, -0.7950414288375512, -0.7463319064601508, -0.6932376563347514, -0.636053680726515, -0.5751404468197103, -0.5108670019508271, -0.4435931752387251, -0.37370608871541955, -0.301627868114913, -0.22778585114164507, -0.15260546524092267, -0.07652652113349734, 0.0, 0.07652652113349734, 0.15260546524092267, 0.22778585114164507, 0.301627868114913, 0.37370608871541955, 0.4435931752387251, 0.5108670019508271, 0.5751404468197103, 0.636053680726515, 0.6932376563347514, 0.7463319064601508, 0.7950414288375512, 0.8391169718222188, 0.878276811252282, 0.912234428251326, 0.9408226338317548, 0.9639719272779138, 0.9815078774502503, 0.9931285991850949, 0.9988590315882777]
216
- w = [0.0030735837185205317, 0.008600269855642943, 0.014626169256971253, 0.020388373461266523, 0.02588213360495116, 0.0312873067770328, 0.036600169758200796, 0.041668873327973685, 0.04643482186749767, 0.05094457392372869, 0.05519510534828599, 0.05911140088063957, 0.06265323755478117, 0.06583459713361842, 0.06864867292852161, 0.07105442355344407, 0.07303069033278667, 0.07458287540049918, 0.07570449768455667, 0.07637786767208074, 0.07660071191799965, 0.07637786767208074, 0.07570449768455667, 0.07458287540049918, 0.07303069033278667, 0.07105442355344407, 0.06864867292852161, 0.06583459713361842, 0.06265323755478117, 0.05911140088063957, 0.05519510534828599, 0.05094457392372869, 0.04643482186749767, 0.041668873327973685, 0.036600169758200796, 0.0312873067770328, 0.02588213360495116, 0.020388373461266523, 0.014626169256971253, 0.008600269855642943, 0.0030735837185205317]
291
+
292
+ z = [-0.9988590315882777, -0.9931285991850949, -0.9815078774502503,
293
+ -0.9639719272779138, -0.9408226338317548, -0.912234428251326,
294
+ -0.878276811252282, -0.8391169718222188, -0.7950414288375512,
295
+ -0.7463319064601508, -0.6932376563347514, -0.636053680726515,
296
+ -0.5751404468197103, -0.5108670019508271, -0.4435931752387251,
297
+ -0.37370608871541955, -0.301627868114913, -0.22778585114164507,
298
+ -0.15260546524092267, -0.07652652113349734, 0.0,
299
+ 0.07652652113349734, 0.15260546524092267, 0.22778585114164507,
300
+ 0.301627868114913, 0.37370608871541955, 0.4435931752387251,
301
+ 0.5108670019508271, 0.5751404468197103, 0.636053680726515,
302
+ 0.6932376563347514, 0.7463319064601508, 0.7950414288375512,
303
+ 0.8391169718222188, 0.878276811252282, 0.912234428251326,
304
+ 0.9408226338317548, 0.9639719272779138, 0.9815078774502503,
305
+ 0.9931285991850949, 0.9988590315882777]
306
+
307
+ w = [0.0030735837185205317, 0.008600269855642943,
308
+ 0.014626169256971253, 0.020388373461266523, 0.02588213360495116,
309
+ 0.0312873067770328, 0.036600169758200796, 0.041668873327973685,
310
+ 0.04643482186749767, 0.05094457392372869, 0.05519510534828599,
311
+ 0.05911140088063957, 0.06265323755478117, 0.06583459713361842,
312
+ 0.06864867292852161, 0.07105442355344407, 0.07303069033278667,
313
+ 0.07458287540049918, 0.07570449768455667, 0.07637786767208074,
314
+ 0.07660071191799965, 0.07637786767208074, 0.07570449768455667,
315
+ 0.07458287540049918, 0.07303069033278667, 0.07105442355344407,
316
+ 0.06864867292852161, 0.06583459713361842, 0.06265323755478117,
317
+ 0.05911140088063957, 0.05519510534828599, 0.05094457392372869,
318
+ 0.04643482186749767, 0.041668873327973685, 0.036600169758200796,
319
+ 0.0312873067770328, 0.02588213360495116, 0.020388373461266523,
320
+ 0.014626169256971253, 0.008600269855642943,
321
+ 0.0030735837185205317]
322
+
217
323
  when 61
218
324
  #g30k61
219
- z = [-0.9994844100504906, -0.9968934840746495, -0.9916309968704046, -0.9836681232797472, -0.9731163225011262, -0.9600218649683075, -0.94437444474856, -0.9262000474292743, -0.9055733076999078, -0.8825605357920527, -0.8572052335460612, -0.8295657623827684, -0.799727835821839, -0.7677774321048262, -0.7337900624532268, -0.6978504947933158, -0.6600610641266269, -0.6205261829892429, -0.5793452358263617, -0.5366241481420199, -0.49248046786177857, -0.44703376953808915, -0.4004012548303944, -0.3527047255308781, -0.30407320227362505, -0.25463692616788985, -0.20452511668230988, -0.15386991360858354, -0.10280693796673702, -0.0514718425553177, 0.0, 0.0514718425553177, 0.10280693796673702, 0.15386991360858354, 0.20452511668230988, 0.25463692616788985, 0.30407320227362505, 0.3527047255308781, 0.4004012548303944, 0.44703376953808915, 0.49248046786177857, 0.5366241481420199, 0.5793452358263617, 0.6205261829892429, 0.6600610641266269, 0.6978504947933158, 0.7337900624532268, 0.7677774321048262, 0.799727835821839, 0.8295657623827684, 0.8572052335460612, 0.8825605357920527, 0.9055733076999078, 0.9262000474292743, 0.94437444474856, 0.9600218649683075, 0.9731163225011262, 0.9836681232797472, 0.9916309968704046, 0.9968934840746495, 0.9994844100504906]
220
- w = [0.0013890136986770077, 0.003890461127099884, 0.0066307039159312926, 0.009273279659517764, 0.011823015253496341, 0.014369729507045804, 0.01692088918905327, 0.019414141193942382, 0.021828035821609193, 0.0241911620780806, 0.0265099548823331, 0.02875404876504129, 0.030907257562387762, 0.03298144705748372, 0.034979338028060025, 0.03688236465182123, 0.038678945624727595, 0.040374538951535956, 0.041969810215164244, 0.04345253970135607, 0.04481480013316266, 0.04605923827100699, 0.04718554656929915, 0.04818586175708713, 0.04905543455502978, 0.04979568342707421, 0.05040592140278235, 0.05088179589874961, 0.051221547849258774, 0.05142612853745902, 0.05149472942945157, 0.05142612853745902, 0.051221547849258774, 0.05088179589874961, 0.05040592140278235, 0.04979568342707421, 0.04905543455502978, 0.04818586175708713, 0.04718554656929915, 0.04605923827100699, 0.04481480013316266, 0.04345253970135607, 0.041969810215164244, 0.040374538951535956, 0.038678945624727595, 0.03688236465182123, 0.034979338028060025, 0.03298144705748372, 0.030907257562387762, 0.02875404876504129, 0.0265099548823331, 0.0241911620780806, 0.021828035821609193, 0.019414141193942382, 0.01692088918905327, 0.014369729507045804, 0.011823015253496341, 0.009273279659517764, 0.0066307039159312926, 0.003890461127099884, 0.0013890136986770077]
325
+
326
+ z = [-0.9994844100504906, -0.9968934840746495, -0.9916309968704046,
327
+ -0.9836681232797472, -0.9731163225011262, -0.9600218649683075,
328
+ -0.94437444474856, -0.9262000474292743, -0.9055733076999078,
329
+ -0.8825605357920527, -0.8572052335460612, -0.8295657623827684,
330
+ -0.799727835821839, -0.7677774321048262, -0.7337900624532268,
331
+ -0.6978504947933158, -0.6600610641266269, -0.6205261829892429,
332
+ -0.5793452358263617, -0.5366241481420199, -0.49248046786177857,
333
+ -0.44703376953808915, -0.4004012548303944, -0.3527047255308781,
334
+ -0.30407320227362505, -0.25463692616788985,
335
+ -0.20452511668230988, -0.15386991360858354,
336
+ -0.10280693796673702, -0.0514718425553177, 0.0,
337
+ 0.0514718425553177, 0.10280693796673702, 0.15386991360858354,
338
+ 0.20452511668230988, 0.25463692616788985, 0.30407320227362505,
339
+ 0.3527047255308781, 0.4004012548303944, 0.44703376953808915,
340
+ 0.49248046786177857, 0.5366241481420199, 0.5793452358263617,
341
+ 0.6205261829892429, 0.6600610641266269, 0.6978504947933158,
342
+ 0.7337900624532268, 0.7677774321048262, 0.799727835821839,
343
+ 0.8295657623827684, 0.8572052335460612, 0.8825605357920527,
344
+ 0.9055733076999078, 0.9262000474292743, 0.94437444474856,
345
+ 0.9600218649683075, 0.9731163225011262, 0.9836681232797472,
346
+ 0.9916309968704046, 0.9968934840746495, 0.9994844100504906]
347
+
348
+ w = [0.0013890136986770077, 0.003890461127099884,
349
+ 0.0066307039159312926, 0.009273279659517764,
350
+ 0.011823015253496341, 0.014369729507045804, 0.01692088918905327,
351
+ 0.019414141193942382, 0.021828035821609193, 0.0241911620780806,
352
+ 0.0265099548823331, 0.02875404876504129, 0.030907257562387762,
353
+ 0.03298144705748372, 0.034979338028060025, 0.03688236465182123,
354
+ 0.038678945624727595, 0.040374538951535956,
355
+ 0.041969810215164244, 0.04345253970135607, 0.04481480013316266,
356
+ 0.04605923827100699, 0.04718554656929915, 0.04818586175708713,
357
+ 0.04905543455502978, 0.04979568342707421, 0.05040592140278235,
358
+ 0.05088179589874961, 0.051221547849258774, 0.05142612853745902,
359
+ 0.05149472942945157, 0.05142612853745902, 0.051221547849258774,
360
+ 0.05088179589874961, 0.05040592140278235, 0.04979568342707421,
361
+ 0.04905543455502978, 0.04818586175708713, 0.04718554656929915,
362
+ 0.04605923827100699, 0.04481480013316266, 0.04345253970135607,
363
+ 0.041969810215164244, 0.040374538951535956,
364
+ 0.038678945624727595, 0.03688236465182123, 0.034979338028060025,
365
+ 0.03298144705748372, 0.030907257562387762, 0.02875404876504129,
366
+ 0.0265099548823331, 0.0241911620780806, 0.021828035821609193,
367
+ 0.019414141193942382, 0.01692088918905327, 0.014369729507045804,
368
+ 0.011823015253496341, 0.009273279659517764,
369
+ 0.0066307039159312926, 0.003890461127099884,
370
+ 0.0013890136986770077]
371
+
221
372
  else # using 15 point quadrature
373
+
222
374
  n = 15
223
- z = [-0.9914553711208126, -0.9491079123427585, -0.8648644233597691, -0.7415311855993945, -0.5860872354676911, -0.4058451513773972, -0.20778495500789848, 0.0, 0.20778495500789848, 0.4058451513773972, 0.5860872354676911, 0.7415311855993945, 0.8648644233597691, 0.9491079123427585, 0.9914553711208126]
224
- w = [0.022935322010529224, 0.06309209262997856, 0.10479001032225019, 0.14065325971552592, 0.1690047266392679, 0.19035057806478542, 0.20443294007529889, 0.20948214108472782, 0.20443294007529889, 0.19035057806478542, 0.1690047266392679, 0.14065325971552592, 0.10479001032225019, 0.06309209262997856, 0.022935322010529224]
375
+
376
+ z = [-0.9914553711208126, -0.9491079123427585, -0.8648644233597691,
377
+ -0.7415311855993945, -0.5860872354676911, -0.4058451513773972,
378
+ -0.20778495500789848, 0.0, 0.20778495500789848,
379
+ 0.4058451513773972, 0.5860872354676911, 0.7415311855993945,
380
+ 0.8648644233597691, 0.9491079123427585, 0.9914553711208126]
381
+
382
+ w = [0.022935322010529224, 0.06309209262997856, 0.10479001032225019,
383
+ 0.14065325971552592, 0.1690047266392679, 0.19035057806478542,
384
+ 0.20443294007529889, 0.20948214108472782, 0.20443294007529889,
385
+ 0.19035057806478542, 0.1690047266392679, 0.14065325971552592,
386
+ 0.10479001032225019, 0.06309209262997856, 0.022935322010529224]
387
+
225
388
  end
389
+
226
390
  sum = 0
227
391
  (0...n).each do |i|
228
392
  t = ((t1.to_f + t2) / 2.0) + (((t2 - t1) / 2.0) * z[i])
229
393
  sum += w[i] * yield(t)
230
394
  end
231
- return ((t2 - t1) / 2.0) * sum
395
+
396
+ ((t2 - t1) / 2.0) * sum
232
397
  end
233
- # TODO: Document method
398
+
399
+ # Romberg Method:
400
+ # It is obtained by applying extrapolation techniques repeatedly on the trapezoidal rule
234
401
  def romberg(a, b, tolerance,max_iter=20)
235
402
  # NOTE one-based arrays are used for convenience
236
403
  h = b.to_f - a
@@ -251,8 +418,10 @@ class Integration
251
418
  end
252
419
  r[j][j]
253
420
  end
254
-
255
- # TODO: Document method
421
+
422
+ # Monte Carlo:
423
+ # Uses a non deterministic(probabilistic) approach for calculation of definite integrals
424
+ # Estimates the integral by randomly choosing points in a set and then calculating the number of points that fall in the desired area
256
425
  def monte_carlo(t1, t2, n)
257
426
  width = (t2 - t1).to_f
258
427
  height = nil
@@ -269,15 +438,19 @@ class Integration
269
438
  end
270
439
  return (width * height) * area_ratio
271
440
  end
441
+
272
442
  def is_infinite?(v)
273
- v==Infinity or v==MInfinity
443
+ v == Infinity || v == MInfinity
274
444
  end
445
+
275
446
  # Methods available on pure ruby
276
447
  RUBY_METHOD=[:rectangle,:trapezoid,:simpson, :adaptive_quadrature , :gauss, :romberg, :monte_carlo, :gauss_kronrod, :simpson3by8, :boole, :open_trapezoid, :milne]
448
+
277
449
  # Methods available with Ruby/GSL library
278
450
  GSL_METHOD=[:qng, :qag]
451
+
279
452
  # Get the integral for a function +f+, with bounds +t1+ and
280
- # +t2+ given a hash of +options+.
453
+ # +t2+ given a hash of +options+.
281
454
  # If Ruby/GSL is available, you could use +Integration::Minfinity+
282
455
  # and +Integration::Infinity+ as bounds. Method
283
456
  # Options are
@@ -285,7 +458,7 @@ class Integration
285
458
  # Default: 1e-10
286
459
  # [:initial_step] Initial number of subdivitions
287
460
  # [:step] Subdivitions increment on each iteration
288
- # [:method] Integration method.
461
+ # [:method] Integration method.
289
462
  # Methods are
290
463
  # [:rectangle] for [:initial_step+:step*iteration] quadrilateral subdivisions
291
464
  # [:trapezoid] for [:initial_step+:step*iteration] trapezoid-al subdivisions
@@ -304,7 +477,7 @@ class Integration
304
477
  lower_bound=t1
305
478
  upper_bound=t2
306
479
  options[:method]=:qag if options[:method].nil?
307
- else
480
+ else
308
481
  lower_bound = [t1, t2].min
309
482
  upper_bound = [t1, t2].max
310
483
  end
@@ -320,35 +493,37 @@ class Integration
320
493
  raise "Unknown integration method \"#{options[:method]}\""
321
494
  end
322
495
  end
496
+
323
497
  # TODO: Document method
324
- def integrate_gsl(lower_bound,upper_bound,options,&f)
325
-
498
+ def integrate_gsl(lower_bound,upper_bound,options,&f)
499
+
326
500
  f = GSL::Function.alloc(&f)
327
501
  method=options[:method]
328
502
  tolerance=options[:tolerance]
329
-
503
+
330
504
  if(method==:qag)
331
505
  w = GSL::Integration::Workspace.alloc()
332
- if(is_infinite?(lower_bound) and is_infinite?(upper_bound))
506
+ if(is_infinite?(lower_bound) and is_infinite?(upper_bound))
333
507
  #puts "ambos"
334
- val=f.qagi([tolerance,0.0], 1000, w)
508
+ val=f.qagi([tolerance,0.0], 1000, w)
335
509
  elsif is_infinite?(lower_bound)
336
510
  #puts "inferior #{upper_bound}"
337
- val=f.qagil(upper_bound, [tolerance, 0], w)
511
+ val=f.qagil(upper_bound, [tolerance, 0], w)
338
512
  elsif is_infinite?(upper_bound)
339
513
  #puts "superior"
340
514
  val=f.qagiu(lower_bound, [tolerance, 0], w)
341
515
  else
342
-
516
+
343
517
  val=f.qag([lower_bound,upper_bound],[tolerance,0.0], GSL::Integration::GAUSS61, w)
344
518
  end
345
519
  elsif(method==:qng)
346
- val=f.qng([lower_bound, upper_bound], [tolerance, 0.0])
520
+ val=f.qng([lower_bound, upper_bound], [tolerance, 0.0])
347
521
  else
348
522
  raise "Unknown integration method \"#{method}\""
349
523
  end
350
524
  val[0]
351
525
  end
526
+
352
527
  def integrate_ruby(lower_bound,upper_bound,options,&f)
353
528
  method=options[:method]
354
529
  tolerance=options[:tolerance]
@@ -388,14 +563,14 @@ class Integration
388
563
  current_step+=step
389
564
  previous=value
390
565
  #puts "Llamando al metodo"
391
-
566
+
392
567
  value=method_obj.call(lower_bound, upper_bound, current_step, &f)
393
568
  end
394
- #p diffs
395
-
569
+
396
570
  value
397
571
  end
398
572
  end
399
573
  end
574
+
400
575
  create_has_library :gsl
401
576
  end