ChebyRuby 0.0.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +8 -0
- data/bin/chebyruby +4 -0
- data/lib/chebyruby.rb +8 -0
- data/lib/chebyruby/differentiation.rb +5 -0
- data/lib/chebyruby/finite_differencing.rb +38 -0
- data/lib/chebyruby/integration.rb +23 -0
- data/lib/chebyruby/romberg_integration.rb +29 -0
- data/lib/chebyruby/simpsons_integration.rb +25 -0
- data/lib/chebyruby/univariate_function.rb +21 -0
- data/test/test_function.rb +35 -0
- metadata +55 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c0f9d3747a36682aa90b2b738c563d5e744f7b6
|
4
|
+
data.tar.gz: 66f91daacd639572b3ee61bc5cf90664c5d45702
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 35b08a1ba0dee7629ee11c83ca1d461d93d32b31761ee92e4a9b83e9490fa2a6282f873d25a9deb866aed7e3ee5a030aa24a14cad79ed4b66014d46a1e6d782e
|
7
|
+
data.tar.gz: c2cb87ab8481d85bb2f8c085f1d9c6182954188e58eb82d7aa5a2f5572c598a2d9ed943276ed85fa24b682947d53dfcd21e9c84c693e173df6e0a0131c139896
|
data/Rakefile
ADDED
data/bin/chebyruby
ADDED
data/lib/chebyruby.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'differentiation'
|
2
|
+
class ChebyRuby::FiniteDifferencing
|
3
|
+
include Differentiation
|
4
|
+
|
5
|
+
attr_accessor :func
|
6
|
+
|
7
|
+
def initialize(func)
|
8
|
+
@func = func
|
9
|
+
end
|
10
|
+
|
11
|
+
def forward(x, h = 0.1, order = 1)
|
12
|
+
(0..order).map do |i|
|
13
|
+
(-1)**i * FiniteDifferencing::binomial(order, i) *
|
14
|
+
func.value(x + (order - i) * h)
|
15
|
+
end.inject(:+) / (h**order).to_f
|
16
|
+
end
|
17
|
+
|
18
|
+
def backward(x, h = 0.1, order = 1)
|
19
|
+
(0..order).map do |i|
|
20
|
+
(-1)**i * FiniteDifferencing::binomial(order, i) *
|
21
|
+
func.value(x - i * h)
|
22
|
+
end.inject(:+) / (h**order).to_f
|
23
|
+
end
|
24
|
+
|
25
|
+
def central(x, h = 0.1, order = 1)
|
26
|
+
(0..order).map do |i|
|
27
|
+
(-1)**i * FiniteDifferencing::binomial(order, i) *
|
28
|
+
func.value(x + (order/2.0 - i) * h)
|
29
|
+
end.inject(:+) / (h**order).to_f
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def FiniteDifferencing.binomial(n, k)
|
34
|
+
(1..k).map do |i|
|
35
|
+
(n + 1 - i)/i.to_f
|
36
|
+
end.inject(:*) || 1
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ChebyRuby::Integration
|
2
|
+
def trap_integrate(func, a, b, iterations = 32)
|
3
|
+
h = (b - a)/iterations.to_f
|
4
|
+
mesh = (a..b).step(h).to_a[1...-1]
|
5
|
+
summand = func.value(a) +
|
6
|
+
2 * (mesh.map(&func.func).inject(:+) || 0) + func.value(b)
|
7
|
+
(b - a)/(2.0 * iterations) * summand
|
8
|
+
end
|
9
|
+
|
10
|
+
def accuracy_comparison(a, b, method = 'Trapezoid', cm = 'Trapezoid')
|
11
|
+
case method
|
12
|
+
when 'Trapezoid' then (integrate(a, b) - trap_integrate(func, a, b)).abs
|
13
|
+
when 'Romberg' then (integrate(a, b) - Romberg.sintegrate(func, a, b)).abs
|
14
|
+
when 'Simpsons' then (integrate(a, b) - Simpsons.sintegrate(func, a, b)).abs
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def sintegrate(func, a, b)
|
20
|
+
self.new(func).integrate(a, b)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'integration'
|
2
|
+
|
3
|
+
class ChebyRuby::RombergIntegration
|
4
|
+
include ChebyRuby::Integration
|
5
|
+
|
6
|
+
attr_accessor :func
|
7
|
+
|
8
|
+
def initialize(func)
|
9
|
+
@func = func
|
10
|
+
end
|
11
|
+
|
12
|
+
def integrate(a, b, iterations = 8)
|
13
|
+
t = Array.new(iterations)
|
14
|
+
iterations.times do |i|
|
15
|
+
t[i] = []
|
16
|
+
t[i][0] = trap_integrate(func, a, b, 2 ** i).to_f
|
17
|
+
end
|
18
|
+
(1...t.length).each do |i|
|
19
|
+
(1..i).each do |k|
|
20
|
+
t[i][k] = ((4 ** k) * t[i][k-1] - t[i-1][k-1])/(4**k - 1).to_f
|
21
|
+
end
|
22
|
+
end
|
23
|
+
t.last.last
|
24
|
+
end
|
25
|
+
|
26
|
+
def accuracy_comparison(a, b, method = 'Trapezoid')
|
27
|
+
super.accuracy_comparison(a, b, method, 'RombergIntegration')
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'integration'
|
2
|
+
|
3
|
+
class ChebyRuby::SimpsonsIntegration
|
4
|
+
include ChebyRuby::Integration
|
5
|
+
|
6
|
+
attr_accessor :func
|
7
|
+
|
8
|
+
def initialize(func)
|
9
|
+
@func = func
|
10
|
+
end
|
11
|
+
|
12
|
+
def integrate(a, b, iterations = 32)
|
13
|
+
h = (b - a) / iterations.to_f
|
14
|
+
mesh = (a..b).step(h).to_a[1...-1]
|
15
|
+
even = mesh.each_with_index.select{|i, j| j.odd?}.map(&:first)
|
16
|
+
odd = mesh.each_with_index.select{|i, j| j.even?}.map(&:first)
|
17
|
+
summand = func.value(a) + func.value(b) +
|
18
|
+
2 * even.map(&func.func).inject(:+) + 4 * odd.map(&func.func).inject(:+)
|
19
|
+
(h / 3.0) * summand
|
20
|
+
end
|
21
|
+
|
22
|
+
def accuracy_comparison(a, b, method = 'Trapezoid')
|
23
|
+
super.accuracy_comparison(a, b, method, 'RombergIntegration')
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This is the class for a univariate function.
|
2
|
+
#
|
3
|
+
# @attr func [Lambda] the univariate function.
|
4
|
+
class ChebyRuby::UnivariateFunction
|
5
|
+
attr_accessor :func
|
6
|
+
|
7
|
+
# The constructor for the class UnivariateFunction.
|
8
|
+
#
|
9
|
+
# @param [Lambda] func which represents the function.
|
10
|
+
def initialize(&func)
|
11
|
+
@func = func
|
12
|
+
end
|
13
|
+
|
14
|
+
# This gets the value of the function at a specified value.
|
15
|
+
#
|
16
|
+
# @param [Numeric] x the value at which the function is evaluated.
|
17
|
+
# @return the value of the function at x.
|
18
|
+
def value(x)
|
19
|
+
func.call(x.to_f)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'chebyruby'
|
3
|
+
|
4
|
+
class TestFunction < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@sin = ChebyRuby::UnivariateFunction.new {|x| Math.sin(x)}
|
7
|
+
@exp = ChebyRuby::UnivariateFunction.new {|x| Math.exp(x)}
|
8
|
+
@pol = ChebyRuby::UnivariateFunction.new {|x| x**2 + 2*x + 1}
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_functions_return_floats
|
12
|
+
assert_kind_of Float, @sin.value(rand)
|
13
|
+
assert_kind_of Float, @exp.value(rand)
|
14
|
+
assert_kind_of Float, @pol.value(rand)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_functions_return_floats_with_integer_parameters
|
18
|
+
assert_kind_of Float, @sin.value(1)
|
19
|
+
assert_kind_of Float, @exp.value(0)
|
20
|
+
assert_kind_of Float, @pol.value(0)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_functions_return_expected_values
|
24
|
+
assert_in_delta 0, @sin.value(0), 1e-8
|
25
|
+
assert_in_delta 0, @sin.value(Math::PI), 1e-8
|
26
|
+
assert_in_delta 1, @exp.value(0), 1e-8
|
27
|
+
assert_in_delta Math::E, @exp.value(1), 1e-8
|
28
|
+
z = rand
|
29
|
+
assert_in_delta (Math::E ** z), @exp.value(z), 1e-8
|
30
|
+
assert_in_delta 1, @pol.value(0), 1e-8
|
31
|
+
assert_in_delta 4, @pol.value(1), 1e-8
|
32
|
+
f = -> (x) {x**2 + 2*x + 1}
|
33
|
+
assert_in_delta f.call(z), @pol.value(z), 1e-8
|
34
|
+
end
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ChebyRuby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.pre
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eli Sadoff
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-15 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A gem for numerical analysis and scientific computing.
|
14
|
+
email: snood1205@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- Rakefile
|
20
|
+
- bin/chebyruby
|
21
|
+
- lib/chebyruby.rb
|
22
|
+
- lib/chebyruby/differentiation.rb
|
23
|
+
- lib/chebyruby/finite_differencing.rb
|
24
|
+
- lib/chebyruby/integration.rb
|
25
|
+
- lib/chebyruby/romberg_integration.rb
|
26
|
+
- lib/chebyruby/simpsons_integration.rb
|
27
|
+
- lib/chebyruby/univariate_function.rb
|
28
|
+
- test/test_function.rb
|
29
|
+
homepage: https://github.com/snood1205/chebyruby
|
30
|
+
licenses:
|
31
|
+
- MIT
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 2.5.1
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: A gem for numerical analysis and scientific computing.This is a pre-release
|
53
|
+
so beware.
|
54
|
+
test_files:
|
55
|
+
- test/test_function.rb
|