Gauge block measurement (GUM H1)

An example from Appendix H1 of the GUM [1].

Code

from __future__ import print_function
from GTC import *

print("""
-------------------------------
Example from Appendix H1 of GUM
-------------------------------
""")

# Lengths are in nm
d0 = ureal(215,5.8,24,label='d0')  
d1 = ureal(0.0,3.9,5,label='d1')  
d2 = ureal(0.0,6.7,8,label='d2')

# Intermediate quantity 'd'
d = d0 + d1 + d2

alpha_s = ureal(11.5E-6, type_b.uniform(2E-6),label='alpha_s')
d_alpha = ureal(0.0, type_b.uniform(1E-6), 50,label='d_alpha')
d_theta = ureal(0.0, type_b.uniform(0.05), 2,label='d_theta')

theta_bar = ureal(-0.1,0.2,label='theta_bar')
Delta = ureal(0.0, type_b.arcsine(0.5),label='Delta')

# Intermediate quantity 'theta'
theta = theta_bar + Delta

l_s = ureal(5.0000623E7,25,18,label='l_s')   

# two more intermediate steps
tmp1 = l_s * d_alpha * theta
tmp2 = l_s * alpha_s * d_theta

# Final equation for the measurement result
l = result( l_s + d - (tmp1 + tmp2), label='l')

print( "Measurement result for l={}".format(l) )

print("""
Components of uncertainty in l (nm)
-----------------------------------""")

for i in reporting.budget(l):
    print( "  {!s}: {:G}".format(i.label,i.u) )

Explanation

The measurand is the length of an end-gauge at \(20\,^\circ\mathrm{C}\). The measurement equation is [2]

\[l = l_\mathrm{s} + d - l_\mathrm{s}(\delta_\alpha \theta + \alpha_\mathrm{s} \delta_\theta) \;,\]

where

  • \(l_\mathrm{s}\) - the length of the standard

  • \(d\) - the difference in length between the standard and the end-gauge

  • \(\delta_\alpha\) - the difference between coefficients of thermal expansion for the standard and the end-gauge

  • \(\theta\) - the deviation in temperature from \(20\,^\circ\mathrm{C}\)

  • \(\alpha_\mathrm{s}\) - the coefficient of thermal expansion for the standard

  • \(\delta_\theta\) - the temperature difference between the standard and the end-gauge

The calculation proceeds in stages. First, three inputs are defined:

  • the length difference measurement(d0) using the comparator, which is the arithmetic mean of several indications;

  • an estimate of comparator random errors (d1) and

  • an estimate of comparator systematic errors (d2).

These are used to define the intermediate result d

d0 = ureal(215,5.8,24,label='d0')
d1 = ureal(0.0,3.9,5,label='d1')
d2 = ureal(0.0,6.7,8,label='d2')

# Intermediate quantity 'd'
d = d0 + d1 + d2

Then terms are introduced to account for temperature variability and thermal properties of the gauge blocks.

In particular, the quantity \(\theta\) is defined in terms of two other input quantities

\[\theta = \bar{\theta} + \Delta\]

where

  • \(\bar{\theta}\) is the mean deviation of the test-bed temperature from \(20\,^\circ\mathrm{C}\)

  • \(\Delta\) is a cyclical error in the test-bed temperature

In defining these inputs, functions type_b.uniform() and type_b.arcsine() convert the widths of particular error distributions into standard uncertainties [3].

alpha_s = ureal( 11.5E-6, type_b.uniform(2E-6), label='alpha_s' )
d_alpha = ureal(0.0, type_b.uniform(1E-6), 50, label='d_alpha')
d_theta = ureal(0.0, type_b.uniform(0.05), 2, label='d_theta')

theta_bar = ureal(-0.1,0.2, label='theta_bar')
Delta = ureal(0.0, type_b.arcsine(0.5), label='Delta' )

# Intermediate quantity 'theta'
theta = theta_bar + Delta

The length of the standard gauge block is given in a calibration report

l_s = ureal(5.0000623E7,25,18,label='ls')

two more intermediate results, representing thermal errors, are then

# two more intermediate steps
tmp1 = l_s * d_alpha * theta
tmp2 = l_s * alpha_s * d_theta

Finally, the length of the gauge block is evaluated

# Final equation for the measurement result
l = result( l_s + d - (tmp1 + tmp2), label='l')

The script then evaluates the measurement result

print( "Measurement result for l={}".format(l) )

which displays

Measurement result for l=50000838(32)

and the following commands display the components of uncertainty for l, due to each influence:

print("""
Components of uncertainty in l (nm)
-----------------------------------""")

for l_i,u_i in reporting.budget(l):
    print( "  {!s}: {:G}".format(l_i,u_i) )

The output is

Components of uncertainty in l (nm)
-----------------------------------
  ls: 25
  d_theta: 16.599
  d2: 6.7
  d0: 5.8
  d1: 3.9
  d_alpha: 2.88679
  alpha_s: 0
  theta_bar: 0
  Delta: 0

Footnotes