tuscan 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: 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: []