-- -- FACILITY: ITT Avionics -- 390 Washington Avenue -- Nutley, NJ 07110 -- -- ABSTRACT: This file contains the following: task LEAST_SQUARES_CALCULATION. -- -- -- -- MODIFICATION HISTORY: -- -- DATE REASON AUTHOR -- -- -- with MATRIX_ROUTINES; separate(UATL_GRAPHICAL_ANALYSIS) task body LEAST_SQUARES_CALCULATION is NUMBER_OF_POINTS : constant INTEGER := 10; X_SUM_INDEX : INTEGER; I : INTEGER; EXPONENT : INTEGER; N : POSITIVE; DET_A : FLOAT; XY : UATL_GRAPHICS.COORDINATES; PREV_XY : UATL_GRAPHICS.COORDINATES; FIRST_X : FLOAT; LASTX : FLOAT; INCREMENT : FLOAT; FIRST : BOOLEAN; LINE_COLOR : COLOR_TYPE; LINE_STYLE : LINE_TYPE; INDEX : INTEGER; begin loop select accept INITIALIZE(DEGREE : in POSITIVE; COLOR : in COLOR_TYPE; LINE : in LINE_TYPE) do LINE_COLOR := COLOR; LINE_STYLE := LINE; N := DEGREE; end INITIALIZE; FIRST := TRUE; declare X_SUMS : array(1 .. (2*N) + 1) of FLOAT := (others => 0.0); -- X_SUMS (I) := Sum of (x ** (I - 1)) XY_SUMS : array(1 .. (N + 1)) of FLOAT := (others => 0.0); -- XY_SUMS (I) := Sum of (x ** (I - 1) y) A, B : MATRIX_ROUTINES.MATRIX(1 .. (N + 1), 1 .. (N + 1)); COEFFICIENT : array(1 .. (N + 1)) of FLOAT; begin loop select accept UPDATE(X, Y : in FLOAT) do XY := (X, Y); end UPDATE; if FIRST then FIRST_X := XY.X; FIRST := FALSE; else LASTX := XY.X; end if; for I in X_SUMS'first .. X_SUMS'last loop X_SUMS(I) := X_SUMS(I) + (XY.X**(I - 1)); end loop; for J in XY_SUMS'first .. XY_SUMS'last loop XY_SUMS(J) := XY_SUMS(J) + (XY.X**(J - 1))*XY.Y; end loop; or accept COMPLETE(LAST_X, LAST_Y : out FLOAT) do -- build base matrix 'A' X_SUM_INDEX := X_SUMS'first; for COLUMN in A'first .. A'last loop I := X_SUM_INDEX; for ROW in A'first .. A'last loop A(ROW, COLUMN) := X_SUMS(I); I := I + 1; end loop; X_SUM_INDEX := X_SUM_INDEX + 1; end loop; -- find determinant of 'A' DET_A := MATRIX_ROUTINES.DETERMINANT(A); -- determine coefficients a (i) using -- Cramer's rule for I in XY_SUMS'first .. XY_SUMS'last loop B := A; INDEX := XY_SUMS'first; for ROW in B'first .. B'last loop B(ROW, I) := XY_SUMS(INDEX); INDEX := INDEX + 1; end loop; COEFFICIENT(I) := MATRIX_ROUTINES.DETERMINANT(B)/DET_A; end loop; -- determine points to plot by calculating value -- of equation Y = a0 + a1 * X + a2 * (X ** 2) + -- ... + an * (X ** n) INCREMENT := (LASTX - FIRST_X)/FLOAT(NUMBER_OF_POINTS); -- first point PREV_XY := (FIRST_X, 0.0); for I in COEFFICIENT'first .. COEFFICIENT'last loop EXPONENT := I - 1; PREV_XY.Y := PREV_XY.Y + COEFFICIENT(I)*(PREV_XY.X**EXPONENT); end loop; -- get rest of points for I in 1 .. NUMBER_OF_POINTS - 2 loop XY := (X => PREV_XY.X + INCREMENT, Y => 0.0); for I in COEFFICIENT'first .. COEFFICIENT'last loop EXPONENT := I - 1; XY.Y := XY.Y + COEFFICIENT(I)*(XY.X**EXPONENT); end loop; UATL_GRAPHICS.CONNECT_POINTS(PREV_XY, XY, LINE_COLOR, LINE_STYLE); PREV_XY := XY; end loop; -- last point XY := (LASTX, 0.0); for I in COEFFICIENT'first .. COEFFICIENT'last loop EXPONENT := I - 1; XY.Y := XY.Y + COEFFICIENT(I)*(XY.X**EXPONENT); end loop; UATL_GRAPHICS.CONNECT_POINTS(PREV_XY, XY, LINE_COLOR, LINE_STYLE); LAST_X := XY.X; LAST_Y := XY.Y; end COMPLETE; exit; end select; end loop; end; or accept TASK_COMPLETION; exit; end select; end loop; end LEAST_SQUARES_CALCULATION;