tuscan 0.0.1 → 0.0.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: 2543badcdb3312b2f5b8137766cddc323887e10f
4
- data.tar.gz: 5dc2685148190c63c30277e384fc5b272631bd91
3
+ metadata.gz: ad738c50ed39a35ff52fcef068d2b6aa9b59a549
4
+ data.tar.gz: 05d787b303178093ae55ce8fe0e92622f9faa79c
5
5
  SHA512:
6
- metadata.gz: 3d3dd9a95da487edd7a192cc273df640d9599ef068ec26ad7214e6c0abfb6369a96815cc196f736dbc07343db35d6fb10e68c78bf84930ed865fb75198701665
7
- data.tar.gz: 159021a9b23eaa493f9462fde5b363819181364840a878a77f66fb2b8d92ca93d05ad3271545efdfea30a4519b80c642ef3226ce77bd45615593da49d09f0062
6
+ metadata.gz: 0eed9648923f011a331c3652b08f3e634d99c4ebcde32c13a535121d27f1fc43389f942aa4ea85220c5836ace14404a7d82d6e963f05a3b97f6e6c2e01bdcc8b
7
+ data.tar.gz: de21fa4fd6d4af6822410735b6840f2ded1dce8a2b8e1e4f07a9158ca71888d3ee7ee76e54772d07159fbf76cb99d4a1bcd9f200db4c84ee02556a817149a364
@@ -10,12 +10,20 @@ module Tuscan
10
10
  result += a[0] * exp(a[1] * (t90 - a[2])**2)
11
11
  end
12
12
 
13
- def t90r emf, type, err_limit: 0.1, num_iter: 1000
14
- t90_coeffs(emf, type).each_with_index.map{ |d,i| d*emf**i }.reduce(:+)
13
+ def t90r emf, type, err: 1e-3, num: 100
14
+ guess = t90r_guess emf, type
15
+ Rical.inverse_for f: method(:emfr), fargs: type,
16
+ x0: guess - 0.5, x1: guess + 0.5,
17
+ y: emf, method: :secant,
18
+ num: num, err: err * 1e-3
15
19
  end
16
20
 
17
21
 
18
22
  private
23
+ def t90r_guess emf, type
24
+ t90_coeffs(emf, type).each_with_index.map{ |d,i| d*emf**i }.reduce(:+)
25
+ end
26
+
19
27
  def emf_c_coeffs t90, type
20
28
  case type
21
29
  when :b then emf_c_coeffs_b t90
@@ -1,8 +1,15 @@
1
+ require 'rical'
2
+
1
3
  module Tuscan
2
4
  module Iec60751
5
+ R0 = 100.0
6
+ A = 3.9083e-03
7
+ B = -5.7750e-07
8
+ C = -4.1830e-12
9
+
3
10
  extend self
4
11
 
5
- def r t90, r0: 100.0, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e-12
12
+ def r t90, r0: R0, a: A, b: B, c: C
6
13
  t90 >= 0 ?
7
14
  r0*(1 + a*t90 + b*t90**2) :
8
15
  r0*(1 + a*t90 + b*t90**2 - 100*c*t90**3 + c*t90**4)
@@ -10,26 +17,29 @@ module Tuscan
10
17
  alias_method :res, :r
11
18
  alias_method :resistance, :r
12
19
 
13
- def t90 r, r0: 100.0, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e-12, err_limit: 1e-4, num_iter: 10
14
- return 0 if r == r0
15
- t = t90_approximation r
16
- return Float::NAN if t.is_a? Complex
17
- num_iter.times do
18
- slope = (r - r0) / t
19
- r_calc = r(t)
20
- break if (r_calc - r).abs < slope * err_limit
21
- t -= (r_calc - r) / slope
22
- end
23
- t
20
+ def t90 r, r0: R0, a: A, b: B, c: C, num: 10, err: 1e-4
21
+ if r >= r0
22
+ (-a + (a**2 - 4 * b * (1 - r / r0))**(0.5)) / (2 * b)
23
+ else
24
+ args = { r0: r0, a: a, b: b, c: c }
25
+ Rical.inverse_for f: method(:r), fargs: args,
26
+ df: method(:dr), dfargs: args,
27
+ x0: t90_guess(r, args), y: r,
28
+ method: :n, num: num, err: err
29
+ end.to_f
30
+ rescue RangeError
31
+ Float::NAN
24
32
  end
25
33
  alias_method :t, :t90
26
34
  alias_method :temperature, :t90
27
35
 
28
36
  private
29
- def t90_approximation r, r0: 100.0, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e-12
30
- r >= r0 ?
31
- (-a + (a**2 - 4 * b * (1 - r / r0))**(0.5)) / (2 * b) :
32
- ((r / r0) - 1) / (a + 100 * b)
37
+ def t90_guess r, r0:, a:, b:, c:
38
+ ((r / r0) - 1) / (a + 100 * b) # valid for r < r0
39
+ end
40
+
41
+ def dr t90, r0:, a:, b:, c:
42
+ r0 * (a + 2*b*t90 - 300*c*t90**2 + 4*c*t90**3) # valid for t90 < 0
33
43
  end
34
44
  end
35
45
  end
@@ -1,3 +1,3 @@
1
1
  module Tuscan
2
- VERSION = "0.0.1"
2
+ VERSION = '0.0.2'
3
3
  end
@@ -2,89 +2,88 @@ require 'spec_helper'
2
2
 
3
3
  #
4
4
  # TODO:
5
- # 1. compute inverse of emfr by iterative process (will pass R, B examples)
6
- # 2. get aproximate t90 valid fro -270.0..-200.0 (will pass E, K, N, T examples)
7
- # 3. implement deviation function (polynomial)
5
+ # 1. implement deviation function (polynomial)
6
+ # 2. check B, 0 mV t90 computation (errorin inverse coeffs?)
8
7
  #
9
8
  module Tuscan
10
9
  describe Iec60584 do
11
10
  context 'reference functions' do
12
11
  examples = {
13
12
  b: [
14
- # { emf: 0.000, t90: 0.0 },
15
- { emf: 0.291, t90: 250.0 },
16
- { emf: 1.975, t90: 630.0 },
17
- { emf: 1.981, t90: 631.0 },
18
- { emf: 5.780, t90:1100.0 },
19
- { emf: 13.820, t90:1820.0 }
13
+ # { emf: 0.000000, t90: 0.0 },
14
+ { emf: 0.291279, t90: 250.0 },
15
+ { emf: 1.974546, t90: 630.0 },
16
+ { emf: 1.980771, t90: 631.0 },
17
+ { emf: 5.779517, t90:1100.0 },
18
+ { emf: 13.820279, t90:1820.0 }
20
19
  ],
21
20
  c: [
22
- { emf: 0.000, t90: 0.0 },
23
- { emf: 1.451, t90: 100.0 },
24
- { emf: 11.778, t90: 660.0 },
25
- { emf: 20.066, t90:1100.0 },
26
- { emf: 29.402, t90:1680.0 },
27
- { emf: 37.107, t90:2320.0 }
21
+ { emf: -0.000311, t90: 0.0 },
22
+ { emf: 1.450711, t90: 100.0 },
23
+ { emf: 11.778492, t90: 660.0 },
24
+ { emf: 20.066070, t90:1100.0 },
25
+ { emf: 29.402461, t90:1680.0 },
26
+ { emf: 37.106593, t90:2320.0 }
28
27
  ],
29
28
  e: [
30
- # { emf: -9.835, t90:-270.0 },
31
- { emf: -8.825, t90:-200.0 },
32
- { emf: -5.237, t90:-100.0 },
33
- { emf: 0.000, t90: 0.0 },
34
- { emf: 6.319, t90: 100.0 },
35
- { emf: 49.917, t90: 660.0 },
36
- { emf: 76.373, t90:1000.0 }
29
+ { emf: -9.834951, t90:-270.0 },
30
+ { emf: -8.824581, t90:-200.0 },
31
+ { emf: -5.237184, t90:-100.0 },
32
+ { emf: 0.000000, t90: 0.0 },
33
+ { emf: 6.318930, t90: 100.0 },
34
+ { emf: 49.917224, t90: 660.0 },
35
+ { emf: 76.372826, t90:1000.0 }
37
36
  ],
38
37
  j: [
39
- { emf: -8.095, t90:-210.0 },
40
- { emf: -4.633, t90:-100.0 },
41
- { emf: 0.000, t90: 0.0 },
42
- { emf: 36.675, t90: 660.0 },
43
- { emf: 43.559, t90: 770.0 },
44
- { emf: 69.553, t90:1200.0 }
38
+ { emf: -8.095380, t90:-210.0 },
39
+ { emf: -4.632524, t90:-100.0 },
40
+ { emf: 0.000000, t90: 0.0 },
41
+ { emf: 36.675405, t90: 660.0 },
42
+ { emf: 43.559497, t90: 770.0 },
43
+ { emf: 69.553180, t90:1200.0 }
45
44
  ],
46
45
  k: [
47
- # { emf: -6.458, t90:-270.0 },
48
- { emf: -5.891, t90:-200.0 },
49
- { emf: -3.554, t90:-100.0 },
50
- { emf: 0.000, t90: 0.0 },
51
- { emf: 5.206, t90: 127.0 },
52
- { emf: 27.447, t90: 660.0 },
53
- { emf: 54.886, t90:1372.0 }
46
+ { emf: -6.457738, t90:-270.0 },
47
+ { emf: -5.891404, t90:-200.0 },
48
+ { emf: -3.553631, t90:-100.0 },
49
+ { emf: 0.000000, t90: 0.0 },
50
+ { emf: 5.206093, t90: 127.0 },
51
+ { emf: 27.447068, t90: 660.0 },
52
+ { emf: 54.886364, t90:1372.0 }
54
53
  ],
55
54
  n: [
56
- # { emf: -4.345, t90:-270.0 },
57
- { emf: -3.990, t90:-200.0 },
58
- { emf: -2.407, t90:-100.0 },
59
- { emf: 0.000, t90: 0.0 },
60
- { emf: 2.774, t90: 100.0 },
61
- { emf: 22.958, t90: 660.0 },
62
- { emf: 47.513, t90:1300.0 }
55
+ { emf: -4.3451354, t90:-270.0 },
56
+ { emf: -3.990376, t90:-200.0 },
57
+ { emf: -2.406811, t90:-100.0 },
58
+ { emf: 0.000000, t90: 0.0 },
59
+ { emf: 2.774124, t90: 100.0 },
60
+ { emf: 22.957828, t90: 660.0 },
61
+ { emf: 47.512772, t90:1300.0 }
63
62
  ],
64
63
  r: [
65
- # { emf: -0.226, t90: -50.0 },
66
- { emf: -0.123, t90: -25.0 },
67
- { emf: 0.000, t90: 0.0 },
68
- { emf: 6.273, t90: 660.0 },
69
- { emf: 11.850, t90:1100.0 },
70
- { emf: 21.101, t90:1768.0 }
64
+ { emf: -0.226465, t90: -50.0 },
65
+ { emf: -0.123155, t90: -25.0 },
66
+ { emf: 0.000000, t90: 0.0 },
67
+ { emf: 6.273327, t90: 660.0 },
68
+ { emf: 11.849642, t90:1100.0 },
69
+ { emf: 21.101477, t90:1768.0 }
71
70
  ],
72
71
  s: [
73
- { emf: -0.236, t90: -50.0 },
74
- { emf: -0.127, t90: -25.0 },
75
- { emf: 0.000, t90: 0.0 },
76
- { emf: 5.857, t90: 660.0 },
77
- { emf: 10.757, t90:1100.0 },
78
- { emf: 18.693, t90:1768.0 }
72
+ { emf: -0.235555, t90: -50.0 },
73
+ { emf: -0.126831, t90: -25.0 },
74
+ { emf: 0.000000, t90: 0.0 },
75
+ { emf: 5.856769, t90: 660.0 },
76
+ { emf: 10.756545, t90:1100.0 },
77
+ { emf: 18.692510, t90:1768.0 }
79
78
  ],
80
79
  t: [
81
- # { emf: -6.258, t90:-270.0 },
82
- { emf: -5.603, t90:-200.0 },
83
- { emf: -3.379, t90:-100.0 },
84
- { emf: 0.000, t90: 0.0 },
85
- { emf: 4.279, t90: 100.0 },
86
- { emf: 9.288, t90: 200.0 },
87
- { emf: 20.872, t90: 400.0 }
80
+ { emf: -6.257505, t90:-270.0 },
81
+ { emf: -5.602961, t90:-200.0 },
82
+ { emf: -3.378582, t90:-100.0 },
83
+ { emf: 0.000000, t90: 0.0 },
84
+ { emf: 4.278519, t90: 100.0 },
85
+ { emf: 9.288102, t90: 200.0 },
86
+ { emf: 20.871970, t90: 400.0 }
88
87
  ]
89
88
  }
90
89
 
@@ -93,7 +92,7 @@ module Tuscan
93
92
  context "on a type #{type.upcase} thermocouple" do
94
93
  examples[type].each do |example|
95
94
  it "yields #{example[:emf]} mV when t90 equals #{example[:t90]} ºC" do
96
- expect(Iec60584.emfr(example[:t90], type)).to be_within(1e-3).of(example[:emf])
95
+ expect(Iec60584.emfr(example[:t90], type)).to be_within(1e-6).of(example[:emf])
97
96
  end
98
97
  end
99
98
  end
@@ -105,7 +104,7 @@ module Tuscan
105
104
  context "on a type #{type.upcase} thermocouple" do
106
105
  examples[type].each do |example|
107
106
  it "yields #{example[:t90]} ºC when emf equals #{example[:emf]} mV" do
108
- expect(Iec60584.t90r(example[:emf], type)).to be_within(0.1).of(example[:t90])
107
+ expect(Iec60584.t90r(example[:emf], type)).to be_within(1e-3).of(example[:t90])
109
108
  end
110
109
  end
111
110
  end
data/tuscan.gemspec CHANGED
@@ -4,22 +4,25 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'tuscan/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "tuscan"
7
+ spec.name = 'tuscan'
8
8
  spec.version = Tuscan::VERSION
9
- spec.authors = ["Luis Bacelar"]
10
- spec.email = ["lmbacelar@gmail.com"]
9
+ spec.authors = ['Luis Bacelar']
10
+ spec.email = ['lmbacelar@gmail.com']
11
11
  spec.summary = %q{Converts to and from temperature for standard (S)PRT's and thermocouples}
12
- spec.description = %q{Converts from electrical signal to temperature and vice-versa for ITS-90 SPRT's, IEC 60751 PRT's and IEC 60584 thermocouples}
13
- spec.homepage = ""
14
- spec.license = "MIT"
12
+ spec.description = <<-DESC
13
+ Converts from from temperature sensor's electrical signal to temperature and vice-versa.
14
+ Allowable sensors: ITS-90 compliant SPRT's, IEC 60751 compliant PRT's and IEC 60584 compliant thermocouples.
15
+ DESC
16
+ spec.homepage = ''
17
+ spec.license = 'MIT'
15
18
 
16
19
  spec.files = `git ls-files -z`.split("\x0")
17
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
23
+ spec.add_development_dependency 'rical', '~> 1.2'
20
24
 
21
- spec.add_development_dependency "bundler", "~> 1.7"
22
- spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency 'bundler', '~> 1.7'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
23
27
  spec.add_development_dependency 'rspec'
24
- spec.add_development_dependency 'byebug'
25
28
  end
metadata CHANGED
@@ -1,59 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tuscan
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
  - Luis Bacelar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-13 00:00:00.000000000 Z
11
+ date: 2015-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: rical
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '1.2'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '1.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '1.7'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: byebug
56
+ name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -66,8 +66,9 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Converts from electrical signal to temperature and vice-versa for ITS-90
70
- SPRT's, IEC 60751 PRT's and IEC 60584 thermocouples
69
+ description: |
70
+ Converts from from temperature sensor's electrical signal to temperature and vice-versa.
71
+ Allowable sensors: ITS-90 compliant SPRT's, IEC 60751 compliant PRT's and IEC 60584 compliant thermocouples.
71
72
  email:
72
73
  - lmbacelar@gmail.com
73
74
  executables: []