interpolation 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 736c1de695651f5d9b074dbc0e4dfe56614c3ad4
4
- data.tar.gz: 4ce0806e958fbff6c78fbe94992f0f8259f46955
3
+ metadata.gz: b7fc3cc6ff6163f8b9471a7a2b858426868d0b03
4
+ data.tar.gz: 47cf81100158e19aae3e99610c552c41c2df545b
5
5
  SHA512:
6
- metadata.gz: ce4fe2d42c2bf757b8cea3b647c754e7797878ad22c29fd1ae388b9b9a4a55d80f21015bb5f590b9dcd3fb70869e27d21f421ca529e4f2bfa5b378dfbe57440a
7
- data.tar.gz: 9bc487d1338da2ecfd509028d9b9fdbc4962f2e54b525d821bd403c5b2af1009b3b423ab87f0cd20814d5b2d36cf3a83b5c2560927a0abef5b1fc4b89cbb6cb2
6
+ metadata.gz: 3c81a2efcec63b92ff04b50a9cd73dc790af2465878ca99e568e50590467e4426c68d611e04c5d4f63d5d7f315cb4953be79faf60f0ca431e4ea4f8f650a62a7
7
+ data.tar.gz: 09583536302d4b8fe3670008302e643b4b2f02b60754937c96e7406112225da191df03c31aebe8573db041d5e00cddb7d40d54ef5fb6cfb18f18ca6832370708
@@ -0,0 +1 @@
1
+ *.gem
@@ -1,8 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- interpolation (0.0.1)
5
- nmatrix (~> 0.1.0.rc5)
4
+ interpolation (0.0.2)
6
5
 
7
6
  GEM
8
7
  remote: https://rubygems.org/
@@ -32,5 +31,6 @@ PLATFORMS
32
31
 
33
32
  DEPENDENCIES
34
33
  interpolation!
34
+ nmatrix (~> 0.1.0.rc5)
35
35
  rake
36
36
  rspec
data/README.md CHANGED
@@ -2,3 +2,21 @@ interpolation
2
2
  =============
3
3
 
4
4
  Interpolation routines for ruby.
5
+
6
+ Note : This library is still under development and currently does not support a lot of interpolation routines.
7
+
8
+ Supports the following 1D interpolation routines:
9
+ * Linear interpolation
10
+ * Cubic spline interpolation
11
+
12
+ ## Usage
13
+
14
+ See the documentation for detailed examples.
15
+
16
+ ## Roadmap
17
+
18
+ * Support polynomial interpolation.
19
+ * N-dimensional interpolation routines.
20
+ * Optional fast data manipulation with NMatrix.
21
+ * Easy plotting of results.
22
+ * Complete NMatrix integration.
@@ -20,6 +20,4 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.add_development_dependency 'rake'
22
22
  gem.add_development_dependency 'rspec'
23
-
24
- gem.add_runtime_dependency 'nmatrix', '~> 0.1.0.rc5'
25
23
  end
@@ -1,5 +1,19 @@
1
+ #--
2
+ # = Interpolation
3
+ # Copyright (c) 2014, Sameer Deshmukh
4
+ # All rights reserved.
5
+ #
6
+ # Interpolation is a library for executing various interpolation
7
+ # functions in Ruby.
8
+ #
9
+ # == spec/lib/1d_interpolation_spec.rb
10
+ #
11
+ # Tests for 1D interpolation.
12
+ #++
13
+
1
14
  require 'nmatrix'
2
15
 
3
16
  $:.unshift File.dirname(__FILE__)
4
17
 
5
- require 'interpolation/one_dimensional.rb'
18
+ require 'interpolation/one_dimensional.rb'
19
+ require 'monkeys.rb'
@@ -1,37 +1,31 @@
1
1
  #--
2
- # = Interpolation
2
+ # = Interpolation
3
+ # Copyright (c) 2014, Sameer Deshmukh
4
+ # All rights reserved.
3
5
  #
4
6
  # Interpolation is a library for executing various interpolation
5
- # functions in Ruby. Works with NMatrix.
7
+ # functions in Ruby.
6
8
  #
7
- # == interpolation/base.rb
9
+ # == spec/lib/1d_interpolation_spec.rb
8
10
  #
9
- # Base class for all interpolation methods.
11
+ # Tests for 1D interpolation.
10
12
  #++
11
13
 
12
14
  module Interpolation
13
15
  class Base
14
16
  def initialize x, y, opts
15
- @x, @y, @opts = x, y, opts
17
+ @x, @y = x, y
16
18
 
17
- raise ArgumentError, "Specify the kind of interpolation?" if !@opts[:kind]
18
- raise DataTypeError, "Invalid data type of x/y" if !valid_dtypes?
19
- raise ArgumentError, "Axis specified out of bounds" if invalid_axis?
20
-
21
- @opts[:precision] = 3 if !@opts[:precision]
22
-
23
- axis = (@opts[:axis] ? @opts[:axis] : 0)
19
+ @opts = {
20
+ precision: 3,
21
+ sorted: false,
22
+ type: :linear
23
+ }.merge(opts)
24
24
 
25
25
  @size = @x.size # considers size of @x only
26
26
  @x = @x.sort unless @opts[:sorted]
27
+ @x.map! { |n| n = Float(n)}
27
28
  end
28
- private
29
-
30
- def valid_dtypes?
31
- (@x.is_a?(Array) or @x.is_a?(NMatrix)) and
32
- (@y.is_a?(Array) or @y.is_a?(NMatrix))
33
- end
34
-
35
29
  protected
36
30
 
37
31
  def locate num
@@ -50,15 +44,9 @@ module Interpolation
50
44
  end
51
45
  end
52
46
 
53
- if num == @x[0] then return 0
54
- elsif num == @x[@size-1] then return @size-2
55
- else return jl
56
- end
47
+ return 0 if num == @x[0]
48
+ return @size-2 if num == @x[@size - 1]
49
+ return jl
57
50
  end
58
-
59
- def invalid_axis?
60
- @opts[:axis] and @opts[:axis] > @y.cols-1
61
- end
62
-
63
51
  end
64
52
  end
@@ -1,16 +1,18 @@
1
- $:.unshift File.dirname(__FILE__)
2
-
3
1
  #--
4
- # = Interpolation
2
+ # = Interpolation
3
+ # Copyright (c) 2014, Sameer Deshmukh
4
+ # All rights reserved.
5
5
  #
6
6
  # Interpolation is a library for executing various interpolation
7
- # functions in Ruby. Works with NMatrix.
7
+ # functions in Ruby.
8
8
  #
9
- # == interpolation/one_dimensional.rb
9
+ # == spec/lib/1d_interpolation_spec.rb
10
10
  #
11
- # Methods for performing one dimensional interpolation.
11
+ # Tests for 1D interpolation.
12
12
  #++
13
13
 
14
+ $:.unshift File.dirname(__FILE__)
15
+
14
16
  require 'base.rb'
15
17
 
16
18
  module Interpolation
@@ -19,15 +21,24 @@ module Interpolation
19
21
  #
20
22
  # ==== Usage
21
23
  #
22
- # x = NMatrix.seq [10]
24
+ # x = (1..10).step(1).to_a
23
25
  # y = x.exp
24
26
  #
25
- # f = NMatrix::Interpolation::OneDimensional.new x, y, {kind: :linear, sorted: true}
27
+ # f = Interpolation::OneDimensional.new x, y, {kind: :linear, sorted: true}
26
28
  # i = f.interpolate 2.5
27
29
  #
28
30
  # puts "Interpolated value for 2.5 is #{i}"
29
31
  class OneDimensional < Interpolation::Base
30
32
 
33
+ # !@attribute return_type
34
+ # The data type of the returned data. Set to :array, :matrix, nmatrix.
35
+ # :array by default (only supports Arrray as of now).
36
+ # @return [Array] Returns data as a ruby Array if set to :array
37
+ # @return [Matrix] Returns data as a ruby Matrix if set to :matrix
38
+ # @return [NMatrix] Returns data as an NMatrix if set to :nmatrix. Needs
39
+ # the NMatrix gem installed.
40
+ attr_writer :return_type
41
+
31
42
  # Constructor for all One Dimensional interpolation operations.
32
43
  #
33
44
  # The function values to be supplied to this class are of the form y = f(x).
@@ -45,28 +56,41 @@ module Interpolation
45
56
  # multiple columns, the interpolation is carried out on each column,
46
57
  # unless specified.
47
58
  #
48
- # * +opts+ - Various options for carrying out the interpolation, to be specified as
49
- # a hash.
59
+ # * +opts+ - Various options for carrying out the interpolation.
50
60
  #
51
61
  # ==== Options
52
62
  #
53
- # * +:kind+ - The kind of interpolation that the user wants to perform. Should be
54
- # specified as a symbol. This option is compulsory. Only linear
55
- # interpolation supported as of now.
63
+ # * +:type+ - The kind of interpolation that the user wants to perform. Should be
64
+ # specified as a symbol. Defaults to linear. Only linear and cubic
65
+ # interpolation supported as of now. Cubic interpolation done with splines.
56
66
  #
57
67
  # * +:sorted+ - Set this option as *true* if the absicca collection is supplied in
58
68
  # the arguments in a sorted manner. If not supplied, it will be assumed
59
69
  # that absiccas are not sorted and they will sorted be sorted anyway.
60
70
  #
61
71
  # * +:axis+ - In case of a multidimensional ordinate matrix, specify the column over
62
- # which interpolation must be performed. *axis* starts indexing from 0
63
- # and should be lower than the number of columns in the ordinate matrix.
64
- #
72
+ # which interpolation must be performed. *axis* starts indexing from 0 and should be
73
+ # lower than the number of columns in the ordinate matrix.
74
+ #
65
75
  # * +:precision+ - Specifies the precision of the interpolated values returned. Defaults
66
- # to 3.
76
+ # to 3.
77
+ #
78
+ # * +:yp1+ - First derivative of the 0th point (cubic spline).
79
+ #
80
+ # * +:ypn+ - First derivative of the last (n-1)th point (cubic spline).
67
81
  #
82
+ # == Usage
83
+ #
84
+ # x = (0..9).step(1).to_a
85
+ # y = x.map { |n| Math.exp(n) }
86
+ # f = Interpolation::OneDimensional.new x,y, type: :cubic
87
+ # f.interpolate 2.5
88
+ # #=> 12.287
68
89
  def initialize x, y, opts={}
90
+ @return_type = :array
69
91
  super(x,y,opts)
92
+
93
+ compute_second_derivatives if @opts[:type] == :cubic
70
94
  end
71
95
 
72
96
  # Performs the actual interpolation on the value passed as an argument. Kind of
@@ -81,21 +105,28 @@ module Interpolation
81
105
  # all its values. Will return answer in the form of an NMatrix if
82
106
  # *interpolant* is supplied as an NMatrix.
83
107
  def interpolate interpolant
84
- result = case @opts[:kind]
108
+ case @opts[:type]
85
109
  when :linear
86
110
  for_each (interpolant) { |x| linear_interpolation(x) }
111
+ when :cubic
112
+ cubic_spline_interpolation interpolant
87
113
  else
88
- raise(ArgumentError, "1 D interpolation of kind #{@opts[:kind]} \
89
- not supported")
114
+ raise ArgumentError, "1 D interpolation of type #{@opts[:type]} not supported"
90
115
  end
91
-
92
- # return result.to_nm(result.size) if interpolant.is_a?(NMatrix)
93
-
94
- result
95
116
  end
96
117
 
118
+ alias_method :[], :interpolate
119
+
120
+ # Return the data passed for interpolation alongwith the interpolated values.
121
+ # @param [Numeric, Array, NMatrix] interpolant the value of the X co-ordinate
122
+ # @return [Array, NMatrix] returns data based on the value of return_type
123
+ # def interp interpolant
124
+
125
+ # end
97
126
  private
98
127
 
128
+ # Linear interpolation functions
129
+
99
130
  def for_each interpolant
100
131
  result = []
101
132
 
@@ -137,5 +168,131 @@ module Interpolation
137
168
  ((interpolant - @x[index]) / (@x[index + 1] - @x[index])) *
138
169
  (y[index + 1] - y[index])).round(@opts[:precision])
139
170
  end
171
+
172
+ # Cubic spline interpolation functions
173
+
174
+ def compute_second_derivatives
175
+ @opts.merge!({
176
+ yp1: 1E99,
177
+ ypn: 1E99
178
+ })
179
+
180
+ if @opts[:axis] == :all
181
+ compute_multi_axis_second_derivatives
182
+ else
183
+ compute_single_axis_second_derivatives
184
+ end
185
+ end
186
+
187
+ def compute_single_axis_second_derivatives
188
+ @y_sd = compute_second_derivatives_for(axis_or_array_for(@y))
189
+ end
190
+
191
+ def compute_multi_axis_second_derivatives
192
+ @y_sd = []
193
+ @y.each_column do |column|
194
+ @y_sd << compute_second_derivatives_for(column)
195
+ end
196
+
197
+ @y_sd = Matrix.columns @y_sd
198
+ end
199
+
200
+ def cubic_spline_interpolation interpolant
201
+ if @opts[:axis] == :all
202
+ multi_axis_evaluation_for interpolant
203
+ else
204
+ single_axis_evaluation_for interpolant
205
+ end
206
+ end
207
+
208
+ def axis_or_array_for object
209
+ object.is_a?(Array) ? object : object.column(@opts[:axis])
210
+ end
211
+
212
+ def interpolate_over_all_y_columns interpolant
213
+ results = []
214
+ 0.upto(@y.column_count - 1) do |col_num|
215
+ results << evaluate_cubic_spline_polynomial(interpolant, @y.column(col_num), @y_sd.column(col_num))
216
+ end
217
+
218
+ results
219
+ end
220
+
221
+ def multi_axis_evaluation_for interpolant
222
+ if interpolant.is_a?(Array)
223
+ interpolant.inject([]) do |acc, int|
224
+ acc << interpolate_over_all_y_columns(int)
225
+ end
226
+ else
227
+ interpolate_over_all_y_columns interpolant
228
+ end
229
+ end
230
+
231
+ def single_axis_evaluation_for interpolant
232
+ y = axis_or_array_for @y
233
+ y_sd = axis_or_array_for @y_sd
234
+
235
+ if interpolant.is_a?(Array)
236
+ interpolant.inject([]) do |results, int|
237
+ results << evaluate_cubic_spline_polynomial(int, y, y_sd)
238
+ end
239
+ else
240
+ evaluate_cubic_spline_polynomial interpolant, y, y_sd
241
+ end
242
+ end
243
+
244
+ def evaluate_cubic_spline_polynomial interpolant, y, y_sd
245
+ klo = locate interpolant
246
+ khi = klo + 1
247
+
248
+ h = @x[khi] - @x[klo]
249
+
250
+ raise StandardError, "Wrong input at X index #{klo} and #{khi} for cubic spline" if h == 0
251
+
252
+ a = (@x[khi] - interpolant) / h
253
+ b = (interpolant - @x[klo]) / h
254
+ (a * y[klo] + b * y[khi] + ((a * a * a - a) * y_sd[klo] +
255
+ ( b * b * b - b) * y_sd[khi]) * ( h * h ) / 6.0).round(@opts[:precision])
256
+ end
257
+
258
+ # References: Numerical Recipes Edition 3. Chapter 3.3
259
+ def compute_second_derivatives_for y
260
+ y_sd = Array.new(@size)
261
+
262
+ n = y_sd.size
263
+ u = Array.new(n-1)
264
+ yp1 = @opts[:yp1] # first derivative of the 0th point as specified by the user
265
+ ypn = @opts[:ypn] # first derivative of the nth point as specified by the user
266
+ qn, un = nil, nil
267
+
268
+ if yp1 > 0.99E30
269
+ y_sd[0], u[0] = 0.0, 0.0
270
+ else
271
+ y_sd[0] = -0.5
272
+ u[0] = (3.0 / (@x[1] - @x[0])) * ((y[1] - y[0]) / (@x[1] - @x[0]) - yp1)
273
+ end
274
+
275
+ 1.upto(n-2) do |i| # decomposition loop for tridiagonal algorithm
276
+ sig = ( @x[i] - @x[i-1] ) / ( @x[i+1] - @x[i-1] )
277
+ p = sig * y_sd[i-1] + 2
278
+ y_sd[i] = ( sig - 1) / p
279
+ u[i] = (( y[i+1] - y[i]) / (@x[i+1] - @x[i])) - ((y[i] - y[i-1]) / (@x[i] - @x[i-1]))
280
+ u[i] = ( 6 * u[i] / ( @x[i+1] - @x[i-1] ) - sig * u[i-1] ) / p;
281
+ end
282
+
283
+ if ypn > 0.99E30
284
+ qn, un = 0.0, 0.0
285
+ else
286
+ qn = 0.5
287
+ un = (3.0 / ( @x[n-1] - @x[n-2] )) * ( ypn - ( y[n-1] - y[n-2] ) / ( @x[n-1] - @x[n-2] ))
288
+ end
289
+ y_sd[n-1] = ( un - qn * u[n-2] ) / ( qn * y_sd[n-2] + 1.0 )
290
+
291
+ (n-2).downto(0) do |k|
292
+ y_sd[k] = y_sd[k] * y_sd[k+1] + u[k]
293
+ end
294
+
295
+ y_sd
296
+ end
140
297
  end
141
298
  end
@@ -0,0 +1,5 @@
1
+ class Matrix
2
+ def each_column(&block)
3
+ self.column_vectors.each(&block)
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Interpolation
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,8 +1,10 @@
1
1
  #--
2
- # = Interpolation
2
+ # = Interpolation
3
+ # Copyright (c) 2014, Sameer Deshmukh
4
+ # All rights reserved.
3
5
  #
4
6
  # Interpolation is a library for executing various interpolation
5
- # functions in Ruby. Works with NMatrix.
7
+ # functions in Ruby.
6
8
  #
7
9
  # == spec/lib/1d_interpolation_spec.rb
8
10
  #
@@ -13,66 +15,119 @@ require 'spec_helper.rb'
13
15
 
14
16
  describe Interpolation::OneDimensional do
15
17
  before :each do
16
- @x = NMatrix.seq [10]
17
- @y = @x.exp
18
- @nd = NMatrix.new([10,3]).each_column { |c| c[0..9] = @y }
18
+ @x = (0..9).step(1).to_a
19
+ @y = @x.map { |e| Math.exp(e) }
20
+ @nd = Matrix.columns [@y, @y, @y]
19
21
  end
20
22
 
21
- it "tests if OneDimensional accepts Array inputs" do
22
- f = Interpolation::OneDimensional.new([0,1,2,3,4,5,6,7,8,9], [1.0,
23
- 2.718281828459045, 7.38905609893065, 20.085536923187668, 54.598150033144236,
24
- 148.4131591025766, 403.4287934927351, 1096.6331584284585, 2980.9579870417283,
25
- 8103.083927575384], {kind: :linear, sorted: true})
23
+ context :linear do
24
+ context "#interpolate" do
25
+ it "interpolates with 1-D ruby Array" do
26
+ f = Interpolation::OneDimensional.new([0,1,2,3,4,5,6,7,8,9], [1.0,
27
+ 2.718281828459045, 7.38905609893065, 20.085536923187668, 54.598150033144236,
28
+ 148.4131591025766, 403.4287934927351, 1096.6331584284585, 2980.9579870417283,
29
+ 8103.083927575384], {type: :linear, sorted: true})
26
30
 
27
- expect(f.interpolate(2.5)).to eq 13.737
28
- end
31
+ expect(f.interpolate(2.5)).to eq 13.737
32
+ end
29
33
 
30
- it "tests for linear interpolation for 1-dimensional y values" do
31
- f = Interpolation::OneDimensional.new(@x, @y, {kind: :linear,
32
- precision: 3})
34
+ it "interpolates with single axis inout" do
35
+ f = Interpolation::OneDimensional.new(@x, @y, {type: :linear,
36
+ precision: 3})
33
37
 
34
- expect(f.interpolate(2.5)) .to eq 13.737
38
+ expect(f.interpolate(2.5)) .to eq 13.737
35
39
 
36
- expect(f.interpolate([2.5,6.7,0.3,8.6])).to eq [13.737, 888.672,
37
- 1.515, 6054.234]
40
+ expect(f.interpolate([2.5,6.7,0.3,8.6])).to eq [13.737, 888.672,
41
+ 1.515, 6054.234]
38
42
 
39
- # expect(f.interpolate(NMatrix.new([4,1], [2.5,6.7,0.3,8.6]))).to eq NMatrix.new(
40
- # [4], [13.737, 888.672, 1.515, 6054.234])
41
- end
43
+ # expect(f.interpolate(NMatrix.new([4,1], [2.5,6.7,0.3,8.6]))).to eq NMatrix.new(
44
+ # [4], [13.737, 888.672, 1.515, 6054.234])
45
+ end
42
46
 
43
- it "tests linear interpolation for N-dimensional y values" do
47
+ it "interpolates over all axes" do
48
+ f = Interpolation::OneDimensional.new(@x,@nd, {type: :linear,
49
+ sorted: true, precision: 3})
44
50
 
45
- f = Interpolation::OneDimensional.new(@x,@nd, {kind: :linear,
46
- sorted: true, precision: 3})
51
+ expect(f.interpolate(2.5)) .to eq [13.737,13.737,13.737]
52
+
53
+ expect(f.interpolate([2.5,6.7,0.3,8.6])).to eq \
54
+ [ [13.737 , 13.737 , 13.737 ],
55
+ [888.672 , 888.672 , 888.672],
56
+ [1.515 , 1.515 , 1.515 ],
57
+ [6054.234, 6054.234, 6054.234 ]
58
+ ]
47
59
 
48
- expect(f.interpolate(2.5)) .to eq [13.737,13.737,13.737]
49
-
50
- expect(f.interpolate([2.5,6.7,0.3,8.6])).to eq \
51
- [ [13.737 , 13.737 , 13.737 ],
52
- [888.672 , 888.672 , 888.672],
53
- [1.515 , 1.515 , 1.515 ],
54
- [6054.234, 6054.234, 6054.234 ]
55
- ]
56
-
57
- # expect(f.interpolate(NMatrix.new([4,1], [2.5,6.7,0.3,8.6]))).to eq \
58
- # NMatrix.new([4,3],
59
- # [ 13.737 , 13.737 , 13.737 ,
60
- # 888.672 , 888.672 , 888.672,
61
- # 1.515 , 1.515 , 1.515 ,
62
- # 6054.234, 6054.234, 6054.234
63
- # ])
60
+ # expect(f.interpolate(NMatrix.new([4,1], [2.5,6.7,0.3,8.6]))).to eq \
61
+ # NMatrix.new([4,3],
62
+ # [ 13.737 , 13.737 , 13.737 ,
63
+ # 888.672 , 888.672 , 888.672,
64
+ # 1.515 , 1.515 , 1.515 ,
65
+ # 6054.234, 6054.234, 6054.234
66
+ # ])
67
+ end
68
+
69
+ it "interpolates on specified axis" do
70
+ f = Interpolation::OneDimensional.new(@x, @nd, {type: :linear, axis: 1,
71
+ sorted: true, precision: 3})
72
+
73
+ expect(f.interpolate(3.5)) .to eq 37.342
74
+
75
+ expect(f.interpolate([2.5,6.7,0.3,8.6])).to eq [13.737, 888.672,
76
+ 1.515, 6054.234]
77
+
78
+ # expect(f.interpolate(NMatrix.new([4,1], [2.5,6.7,0.3,8.6]))).to eq NMatrix.new(
79
+ # [4], [13.737, 888.672, 1.515, 6054.234])
80
+ end
64
81
  end
65
82
 
66
- it "tests linear interpolation for N-dimensional y on another axis" do
67
- f = Interpolation::OneDimensional.new(@x, @nd, {kind: :linear, axis: 1,
68
- sorted: true, precision: 3})
69
-
70
- expect(f.interpolate(3.5)) .to eq 37.342
83
+ context "#interp"
84
+ end
85
+
86
+ context :slinear do
87
+
88
+ end
89
+
90
+ context :quadratic do
91
+
92
+ end
93
+
94
+ context :cubic do
95
+ context "#interpolation" do
96
+ it "correctly interpolates for single axis co-ordinates" do
97
+ f = Interpolation::OneDimensional.new(@x, @y, type: :cubic, sorted: true)
98
+
99
+ expect(f.interpolate(2.5)).to eq(12.287)
100
+ end
101
+
102
+ it "interpolates for multiple points" do
103
+ f = Interpolation::OneDimensional.new(@x, @y, type: :cubic, sorted: true)
104
+
105
+ expect(f.interpolate([2.5,3.5,4,6.5])).to eq([12.287, 32.577, 54.598, 688.288])
106
+ end
107
+
108
+ it "interpolates over all axes" do
109
+ f = Interpolation::OneDimensional.new(@x, @nd, type: :cubic, sorted: true, axis: :all)
71
110
 
72
- expect(f.interpolate([2.5,6.7,0.3,8.6])).to eq [13.737, 888.672,
73
- 1.515, 6054.234]
111
+ expect(f.interpolate(2.5)).to eq([12.287, 12.287, 12.287])
74
112
 
75
- # expect(f.interpolate(NMatrix.new([4,1], [2.5,6.7,0.3,8.6]))).to eq NMatrix.new(
76
- # [4], [13.737, 888.672, 1.515, 6054.234])
113
+ expect(f.interpolate([2.5,3.5,4,6.5])). to eq([
114
+ [12.287, 12.287, 12.287],
115
+ [32.577, 32.577, 32.577],
116
+ [54.598, 54.598, 54.598],
117
+ [688.288, 688.288, 688.288]
118
+ ]
119
+ )
120
+ end
121
+
122
+ it "interpolates only on the specified axis" do
123
+ f = Interpolation::OneDimensional.new(@x, @nd, type: :cubic, sorted: true, axis: 1)
124
+
125
+ expect(f.interpolate([2.5,3.5,4,6.5])).to eq([12.287, 32.577, 54.598, 688.288])
126
+ end
127
+ end
128
+
129
+ context "#interp" do
130
+ # TODO
131
+ end
77
132
  end
78
133
  end
@@ -0,0 +1,17 @@
1
+ #--
2
+ # = Interpolation
3
+ # Copyright (c) 2014, Sameer Deshmukh
4
+ # All rights reserved.
5
+ #
6
+ # Interpolation is a library for executing various interpolation
7
+ # functions in Ruby.
8
+ #
9
+ # == spec/lib/2d_interpolation_spec.rb
10
+ #
11
+ # Tests for 2D interpolation.
12
+ #++
13
+
14
+
15
+ # describe Interpolation::TwoDimensional do
16
+
17
+ # end
@@ -1 +1,15 @@
1
+ #--
2
+ # = Interpolation
3
+ # Copyright (c) 2014, Sameer Deshmukh
4
+ # All rights reserved.
5
+ #
6
+ # Interpolation is a library for executing various interpolation
7
+ # functions in Ruby.
8
+ #
9
+ # == spec/lib/1d_interpolation_spec.rb
10
+ #
11
+ # Tests for 1D interpolation.
12
+ #++
13
+
14
+ require 'matrix'
1
15
  require 'interpolation'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interpolation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sameer Deshmukh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-08 00:00:00.000000000 Z
11
+ date: 2014-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: nmatrix
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: 0.1.0.rc5
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: 0.1.0.rc5
55
41
  description: Interpolation is a library for executing various interpolation functions
56
42
  in Ruby.
57
43
  email:
@@ -60,6 +46,7 @@ executables: []
60
46
  extensions: []
61
47
  extra_rdoc_files: []
62
48
  files:
49
+ - ".gitignore"
63
50
  - ".rspec"
64
51
  - Gemfile
65
52
  - Gemfile.lock
@@ -70,8 +57,10 @@ files:
70
57
  - lib/interpolation.rb
71
58
  - lib/interpolation/base.rb
72
59
  - lib/interpolation/one_dimensional.rb
60
+ - lib/monkeys.rb
73
61
  - lib/version.rb
74
62
  - spec/lib/1d_interpolation_spec.rb
63
+ - spec/lib/2d_interpolation_spec.rb
75
64
  - spec/spec_helper.rb
76
65
  homepage: https://github.com/v0dro/interpolation
77
66
  licenses:
@@ -98,3 +87,4 @@ signing_key:
98
87
  specification_version: 4
99
88
  summary: Interpolation routines in ruby.
100
89
  test_files: []
90
+ has_rdoc: