malge 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4ee499ce2d36b0655594c91a589d22e9eb19d704
4
+ data.tar.gz: 10599d6fb90300bde348a2409ecb163edf21bb0c
5
+ SHA512:
6
+ metadata.gz: 5edf025d2d35ecf31d3a9254762388b650261b2f68b5a9f0f7c66f091a083eaa034db8456461b23922323af51d91605fb6672e3f52c0504c55ae58837e9fa158
7
+ data.tar.gz: bc2d58afee1de8dac341eafdf3c7459f55a74f4319f5f17922668a8ed712265f5f5130d5139b705f7bc80faee83462aa7872af6204920c921caeff949156a86e
data/CHANGES CHANGED
@@ -1,8 +1,17 @@
1
- = vasputils changelog
1
+ = malge changelog
2
2
 
3
- == Master (for 0.0.8)
3
+ == Master (for 0.0.10)
4
4
 
5
- == Version 0.0.7)
5
+ == Version 0.0.9 [2016-03-04] released
6
+ * Modify errorfittedfunction to ignore most strict pair at fitting.
7
+ * Malge::SimultaneousEquations::NotRegularError is added
8
+ * Malge::SimultaneousEquations::SizeMismatchError is added
9
+ * Malge::SimultaneousEquations::NotSquareError is added
10
+
11
+ == Version 0.0.8 [2013-03-18] released
12
+ * Small revision.
13
+
14
+ == Version 0.0.7
6
15
  * Add Malge::ErrorFittedFunction::AXInv2
7
16
  * Add Malge::ErrorFittedFunction::AXInv3
8
17
  * Malge::ErrorFittedFunction may raise UnableCalculationError if contain not finit value in coefficients after fitting.
data/Gemfile CHANGED
@@ -6,9 +6,10 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "rdoc", "~> 3.12"
10
- gem "bundler", "~> 1.2.2"
11
- gem "jeweler", "~> 1.8.3"
12
- gem "simplecov", ">= 0"
13
- #gem "psych", ">= 0"
9
+ gem "test-unit", "~> 3.1"
10
+ gem "rdoc", "~> 4.2"
11
+ gem "bundler", "~> 1.11"
12
+ gem "jeweler", "~> 2.0"
13
+ gem "simplecov", "~> 0.11"
14
+ gem "builtinextension", ">= 0.1.3"
14
15
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.8
1
+ 0.0.9
@@ -1,5 +1,6 @@
1
1
  module Malge; end
2
2
 
3
+ require "float/equalindelta.rb"
3
4
  require "malge/errorfittedfunction.rb"
4
5
  require "malge/errorfittedfunction/aexpbx.rb"
5
6
  require "malge/errorfittedfunction/aexpbx32.rb"
@@ -7,7 +8,9 @@ require "malge/errorfittedfunction/axinv.rb"
7
8
  require "malge/errorfittedfunction/axinv32.rb"
8
9
  require "malge/errorfittedfunction/axinv2.rb"
9
10
  require "malge/errorfittedfunction/axinv3.rb"
11
+ require "malge/errorfittedfunction/axinv4.rb"
10
12
  require "malge/leastsquare.rb"
11
13
  require "malge/matrix.rb"
12
14
  require "malge/simultaneousequations.rb"
13
15
  require "malge/vector.rb"
16
+ require "malge/multivariablefunction.rb"
@@ -24,8 +24,13 @@ class Malge::ErrorFittedFunction
24
24
  raise SizeMismatchError unless pair.size == 2
25
25
  end
26
26
 
27
- @raw_pairs = data_pairs
28
- @diff_abs_pairs = data_pairs.map { |pair| [pair[0], (pair[1] - most_strict_pair[1]).abs] }
27
+ #@raw_pairs = data_pairs
28
+ @raw_pairs = data_pairs.sort_by{|xy| xy[0]}
29
+ most_strict_x = most_strict_pair[0]
30
+ tmp_pairs = Marshal.load(Marshal.dump( @raw_pairs))
31
+ tmp_pairs.delete_if {|pair| pair[0] == most_strict_x}
32
+
33
+ @diff_abs_pairs = tmp_pairs.map { |pair| [pair[0], (pair[1] - most_strict_pair[1]).abs] }
29
34
  fit
30
35
 
31
36
  @coefficients.each do |coef|
@@ -52,6 +57,7 @@ class Malge::ErrorFittedFunction
52
57
  def variance
53
58
  sum = 0.0
54
59
  @diff_abs_pairs.each do |pair|
60
+ #pp pair
55
61
  sum += (pair[1] - expected_error(pair[0]) )**2
56
62
  end
57
63
  sum
@@ -71,6 +77,46 @@ class Malge::ErrorFittedFunction
71
77
  @raw_pairs.mix_by{ |pair| pair[0] }
72
78
  end
73
79
 
80
+ # Compare expected error and @raw_pairs and
81
+ # return a count of estimations of [equal, over, under].
82
+ # (order is like as result of <=>. )
83
+ # Excluding last data.
84
+ def count_equal_under_over
85
+ results = [0,0,0]
86
+ @diff_abs_pairs.each do |x,y|
87
+ results[expected_error(x) <=> y ] += 1
88
+ end
89
+ results
90
+ end
91
+
92
+ def summary(io = $stdout)
93
+ io.puts "Fitted function: #{equation}"
94
+ io.printf("%15s, %15s, %15s, %15s\n",
95
+ "x",
96
+ "raw_y",
97
+ "|diff_y_best|",
98
+ "expected_error"
99
+ )
100
+
101
+ datalist = []
102
+ @raw_pairs.size.times do |i|
103
+ if i != (@raw_pairs.size - 1)
104
+ diff = sprintf("%15.10f", @diff_abs_pairs[i][1])
105
+ else
106
+ diff = '-'*12
107
+ end
108
+
109
+ datalist << sprintf("%15.10f, %15.10f, %15s, %15.10f\n",
110
+ @raw_pairs[i][0],
111
+ @raw_pairs[i][1],
112
+ diff,
113
+ expected_error(@raw_pairs[i][0])
114
+ )
115
+ end
116
+ io.puts datalist.sort.join
117
+ end
118
+
119
+
74
120
  private
75
121
 
76
122
  #Fit the data pairs to a certain function.
@@ -22,7 +22,7 @@ class Malge::ErrorFittedFunction::AExpBX < Malge::ErrorFittedFunction
22
22
  end
23
23
 
24
24
  def equation
25
- sprintf("f(x) = %f \* exp(%f \* x)", * @coefficients)
25
+ sprintf("%f \* exp(%f \* x)", * @coefficients)
26
26
  end
27
27
 
28
28
  def expected_error(x)
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  # coding: utf-8
3
3
 
4
- #Assumed y = a[0] * exp(a[1] * (x ^{3/2}))
4
+ #Assumed y = a[0] * exp(a[1] * (x **{3/2}))
5
5
  #
6
6
  #NOTE: @coefficients[0] might become negative value.
7
7
  # Need discussion for dealing?
@@ -19,19 +19,19 @@ class Malge::ErrorFittedFunction::AExpBX32 < Malge::ErrorFittedFunction
19
19
  end
20
20
 
21
21
  def equation
22
- sprintf("f(x) = %f \* exp(%f \* x^{3/2})", * @coefficients)
22
+ sprintf("%f \* exp(%f \* x**(3.0/2.0))", * @coefficients)
23
23
  end
24
24
 
25
25
  def expected_error(x)
26
26
  @coefficients[0] * Math::exp( @coefficients[1] * x **(3.0/2.0))
27
27
  end
28
28
 
29
- #y = a[0] * exp(a[1] *x^(3/2))
30
- #a[0] * exp(a[1] *x^(3/2)) = y
31
- #exp(a[1] *x^(3/2)) = y/a[0]
32
- #a[1] *x^(3/2) = log( y/a[0])
33
- #x^(3/2) = log( y/a[0])/a[1]
34
- #x = (log( y/a[0])/a[1])^(2/3)
29
+ #y = a[0] * exp(a[1] *x**(3/2))
30
+ #a[0] * exp(a[1] *x**(3/2)) = y
31
+ #exp(a[1] *x**(3/2)) = y/a[0]
32
+ #a[1] *x**(3/2) = log( y/a[0])
33
+ #x**(3/2) = log( y/a[0])/a[1]
34
+ #x = (log( y/a[0])/a[1])**(2/3)
35
35
  def x(y)
36
36
  return (Math::log( y / @coefficients[0])/@coefficients[1]) **(2.0/3.0)
37
37
  end
@@ -40,7 +40,5 @@ class Malge::ErrorFittedFunction::AExpBX32 < Malge::ErrorFittedFunction
40
40
  @raw_pairs.max_by{ |pair| pair[0] }
41
41
  end
42
42
 
43
-
44
43
  end
45
44
 
46
-
@@ -7,13 +7,12 @@ class Malge::ErrorFittedFunction::AXInv < Malge::ErrorFittedFunction
7
7
 
8
8
  def fit
9
9
  inv_pairs = Marshal.load(Marshal.dump(@diff_abs_pairs))
10
- #inv_pairs.delete([most_strict_x, 0.0])
11
10
  inv_pairs.map! {|pair| [1.0/pair[0], pair[1]]}
12
11
  @coefficients = Malge::LeastSquare.least_square_proportional(inv_pairs)
13
12
  end
14
13
 
15
14
  def equation
16
- sprintf("f(x) = %f / x", * @coefficients)
15
+ sprintf("%f / x", * @coefficients)
17
16
  end
18
17
 
19
18
  def expected_error(x)
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  # coding: utf-8
3
3
 
4
- #Assumed y = a[0] /(x^2)
4
+ #Assumed y = a[0] /(x**2)
5
5
  #
6
6
  class Malge::ErrorFittedFunction::AXInv2 < Malge::ErrorFittedFunction
7
7
 
@@ -11,7 +11,7 @@ class Malge::ErrorFittedFunction::AXInv2 < Malge::ErrorFittedFunction
11
11
  end
12
12
 
13
13
  def equation
14
- sprintf("f(x) = %f / (x^2)", * @coefficients)
14
+ sprintf("%f / (x**2)", * @coefficients)
15
15
  end
16
16
 
17
17
  def expected_error(x)
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  # coding: utf-8
3
3
 
4
- #Assumed y = a[0]/(x^3)
4
+ #Assumed y = a[0]/(x**3)
5
5
  #
6
6
  class Malge::ErrorFittedFunction::AXInv3 < Malge::ErrorFittedFunction
7
7
 
@@ -11,7 +11,7 @@ class Malge::ErrorFittedFunction::AXInv3 < Malge::ErrorFittedFunction
11
11
  end
12
12
 
13
13
  def equation
14
- sprintf("f(x) = %f / (x^3)", * @coefficients)
14
+ sprintf("%f / (x**3)", * @coefficients)
15
15
  end
16
16
 
17
17
  def expected_error(x)
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  # coding: utf-8
3
3
 
4
- #Assumed y = a[0] /x^{3/2}
4
+ #Assumed y = a[0] /x**{3/2}
5
5
  #
6
6
  #NOTE: @coefficients[0] might become negative value.
7
7
  # Need discussion for dealing?
@@ -13,18 +13,18 @@ class Malge::ErrorFittedFunction::AXInv32 < Malge::ErrorFittedFunction
13
13
  end
14
14
 
15
15
  def equation
16
- sprintf("f(x) = %f / (x^{3/2})", * @coefficients)
16
+ sprintf("%f / (x**(3.0/2.0))", * @coefficients)
17
17
  end
18
18
 
19
19
  def expected_error(x)
20
20
  @coefficients[0] /(x** (3.0/2.0))
21
21
  end
22
22
 
23
- # y = a[0]/x^{3/2}
24
- # y = a[0]/x^{3/2}
25
- #x^{3/2} y = a[0]
26
- # x^{3/2} = a[0]/y
27
- # x = (a[0]/y)^{2/3}
23
+ # y = a[0]/x**{3/2}
24
+ # y = a[0]/x**{3/2}
25
+ #x**{3/2} y = a[0]
26
+ # x**{3/2} = a[0]/y
27
+ # x = (a[0]/y)**{2/3}
28
28
  def x(y)
29
29
  return (@coefficients[0] / y ) ** (2.0/3.0)
30
30
  end
@@ -33,6 +33,5 @@ class Malge::ErrorFittedFunction::AXInv32 < Malge::ErrorFittedFunction
33
33
  @raw_pairs.max_by{ |pair| pair[0] }
34
34
  end
35
35
 
36
-
37
36
  end
38
37
 
@@ -0,0 +1,33 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #Assumed y = a[0]/(x**4)
5
+ #
6
+ class Malge::ErrorFittedFunction::AXInv4 < Malge::ErrorFittedFunction
7
+
8
+ def fit
9
+ inv_pairs = @diff_abs_pairs.map {|pair| [1.0/(pair[0]**4), pair[1]]}
10
+ @coefficients = Malge::LeastSquare.least_square_proportional(inv_pairs)
11
+ end
12
+
13
+ def equation
14
+ sprintf("%f / (x**4)", * @coefficients)
15
+ end
16
+
17
+ def expected_error(x)
18
+ @coefficients[0] / (x**4)
19
+ end
20
+
21
+ #y = a/x
22
+ #x = a/y
23
+ def x(y)
24
+ return (@coefficients[0] / y) ** (1.0/4.0)
25
+ end
26
+
27
+ def most_strict_pair
28
+ @raw_pairs.max_by{ |pair| pair[0] }
29
+ end
30
+
31
+
32
+ end
33
+
@@ -10,11 +10,11 @@ module Malge::LeastSquare
10
10
 
11
11
  #Return values of [a_0, a_1] in y = a_0 x^0 + a_1 x^1.
12
12
  #Argument 'data_pairs' should be Array of Array's. For example,
13
- # [
14
- # [ 1.0, 2.0],
15
- # [ 2.0, 4.0],
16
- # [ 3.0, 6.0],
17
- # ]
13
+ # [
14
+ # [ 1.0, 2.0],
15
+ # [ 2.0, 4.0],
16
+ # [ 3.0, 6.0],
17
+ # ]
18
18
  #Note that not [a, b] in y = ax + b.
19
19
  def self.least_square_1st_degree(data_pairs)
20
20
  a = 0.0 #x^2
@@ -52,11 +52,11 @@ module Malge::LeastSquare
52
52
 
53
53
  #Return variance when fitted to y = a_0 x^0 + a_1 x^1.
54
54
  #Argument 'data_pairs' should be Array of Array's. For example,
55
- # [
56
- # [ 1.0, 2.0],
57
- # [ 2.0, 4.0],
58
- # [ 3.0, 6.0],
59
- # ]
55
+ # [
56
+ # [ 1.0, 2.0],
57
+ # [ 2.0, 4.0],
58
+ # [ 3.0, 6.0],
59
+ # ]
60
60
  def self.variance_1st_degree(data_pairs)
61
61
  coefficients = self.least_square_1st_degree(data_pairs)
62
62
  data_pairs.inject(0.0) do |sum, pair|
@@ -83,11 +83,11 @@ module Malge::LeastSquare
83
83
 
84
84
  #Return fitted values of [a, b] in a e^{bx} from more than two data points.
85
85
  #Argument 'data_pairs' should be Array of Array's. For example,
86
- # [
87
- # [ 1.0, 2.0],
88
- # [ 2.0, 4.0],
89
- # [ 3.0, 6.0],
90
- # ]
86
+ # [
87
+ # [ 1.0, 2.0],
88
+ # [ 2.0, 4.0],
89
+ # [ 3.0, 6.0],
90
+ # ]
91
91
  def self.least_square_a_exp_bx(data_pairs)
92
92
  data_pairs.each do |pair|
93
93
  raise UnableCalculationError if pair[1] == 0.0
@@ -0,0 +1,106 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ #
6
+ #
7
+ class Malge::MultiVariableFunction
8
+ attr_reader :data
9
+
10
+ TOLERANCE = 1E-10
11
+
12
+ # data example:
13
+ # [
14
+ # {x => 0.0, y => 0.1, z => 0.0},
15
+ # {x => 1.0, y => 1.1, z => 1.0},
16
+ # {x => 2.0, y => 2.1, z => 3.0},
17
+ # ]
18
+ #
19
+ def initialize(data)
20
+ @data = data
21
+ end
22
+
23
+ # Return array of data which matches the hash.
24
+ def abstract!(conditions)
25
+ results = @data.select do |coords|
26
+ match_condition?(coords, conditions)
27
+ end
28
+ @data = results
29
+ end
30
+
31
+ def abstract(conditions)
32
+ result = Marshal.load(Marshal.dump(self))
33
+ result.abstract!(conditions)
34
+ result
35
+ end
36
+
37
+ # unite axes with the same value.
38
+ # keys : [:a, :b]
39
+ # new_key : default is keys[0]
40
+ def unite_axes!(keys, new_key = nil)
41
+ new_key ||= keys[0]
42
+ results = []
43
+ @data.each do |datum|
44
+ new_datum = Marshal.load(Marshal.dump(datum))
45
+ if same?(new_datum, keys)
46
+ val = new_datum[keys[0]]
47
+ keys.each {|key| new_datum.delete(key) }
48
+ new_datum[new_key] = val
49
+ results << new_datum
50
+ end
51
+ end
52
+ @data = results
53
+ end
54
+
55
+ def unite_axes(keys, new_key = nil)
56
+ result = Marshal.load(Marshal.dump(self))
57
+ result.unite_axes!(keys, new_key)
58
+ result
59
+ end
60
+
61
+ def delete_axis!(axis)
62
+ @data.each do |datum|
63
+ datum.delete axis
64
+ end
65
+ end
66
+
67
+ def delete_axis(axis)
68
+ result = Marshal.load(Marshal.dump(self))
69
+ result.delete_axis!(axis)
70
+ result
71
+ end
72
+
73
+ # return 2-dimensional array.
74
+ # [
75
+ # [x0, y0],
76
+ # [x1, y1],
77
+ # :
78
+ # ]
79
+ def data_pairs(key0, key1)
80
+ results = []
81
+ @data.each do |datum|
82
+ results << [datum[key0], datum[key1]]
83
+ end
84
+ results
85
+ end
86
+
87
+ private
88
+
89
+ #if when the same value among keys, return true.
90
+ #if not, return false.
91
+ def same?(datum, keys, tolerance = TOLERANCE)
92
+ ref = datum[keys[0]]
93
+ keys.each do |key|
94
+ return false unless ref.to_f.equal_in_delta?(datum[key].to_f, tolerance)
95
+ end
96
+ return true
97
+ end
98
+
99
+ def match_condition?(datum, conditions)
100
+ conditions.each do |key, val|
101
+ return false unless datum[key] == val
102
+ end
103
+ end
104
+
105
+ end
106
+