Sunday, October 16, 2016

HP Prime and Casio Prizm: Computation of “As-Built” Circular Alignments

HP Prime and Casio Prizm:  Computation of “As-Built” Circular Alignments

Special thanks to Jason Foose for bringing the topic to my attention.

The program ASBUILT determines radius and center point of an approximate circular curve.  The program uses the least squares method using the following matrices:

A = [ [ 2*x1, 2*y1, -1] [ 2*x2, 2*y2, -1 ] [ 2*x3, 2*y3, - 1] [ 2*x4, 2*y4, -1 ] ]
X = [ [ x0 ] [ y0 ] [ f ] ]
L = [ [ x1^2 + y1^2 ] [ x2^2 + y2^2 ] [ x3^2 + y3^2 ] [ x4^2 + y4^2 ] ]

The matrix X is solved by:  X = ( det(A) * A)¯¹  * det(A) * L

The input for ASBUILT is a 4 x 2 matrix, consisting of each of the four points. 

The example:
(x1, y1) = (6975.82, 6947.93)
(x2, y2) = (7577.11, 6572.6)
(x3, y3) = (8084.03, 6071.29)
(x4, y4) = (8431.38, 5542)

The input matrix is:
[ [ 6975.82, 6947.93 ] [ 7577.11, 6572.6 ] [ 8084.03, 6071.29 ] [ 8431.38, 5542 ] ]



ASBUILT is an approximation program.

HP Prime Program:  ASBUILT
EXPORT ASBUILT(ma)
BEGIN
LOCAL ml,mx,n,r,l{};
// build L
FOR n FROM 1 TO 4 DO
l(n)ABS(ma(n))^2;
END;
mllist2mat(l,1);
// build A
ma2*ma;
ADDCOL(ma,[-1,-1,-1,-1],3);
// compute X
mxCAS.LSQ(ma,ml);
// compute radius
r√(mx(1,1)^2+mx(2,1)^2-mx(3,1));
// results
RETURN {mx,r};
END;

Example Output:  { [ [x0][y0][f]], radius}

{ [ [ 5587.37457087 ] [ 4053.99226137 ] [ 37351007.6568 ] ] , 3209.76637679 }

Casio Prizm Program:  ASBUILT
“4 × 2 Mat [X,Y]”? → Mat A
{4 , 1} → Dim Mat B
For 1 → N To 4
Mat A[N,1]² + Mat A[N,2]² → Mat B[N,1]
Next
2 × Mat A → Mat A
Augment(Mat A, [[-1][-1][-1][-1]]) → Mat A
(Trn Mat A × Mat A)¯¹ × Trn Mat A × Mat B → Mat C
√( Mat C[1,1]² + Mat C[2,1]² - Mat C[3,1] ) → R
“RADIUS”
R
Mat C

Example Output: 
[ [ 5587.3745555 ] [ 4053.992245 ] [ 37351007.55 ] ]
Radius, R = 3209.766346

Source:  Ghilani, Charles D. “Elementary Surveying:  An Introduction to Geomatics” 14th Edition.  Pearson.  2014



This blog is property of Edward Shore, 2016