procedure FIND GRADIENTS AT NODES(X,Y,GRAD,LBX,UBX);
value LBX,UBX; integer LBX,UBX;
array X,Y,GRAD;
comment X AND Y ARE ARRAYS WITH SUBSCRIPTS FROM LBX
TO UBX GIVING THE ABSCISSAE AND ORDINATES RESPECT-
IVELY OF THE DATA POINTS. THESE SHOULD BE IN
ASCENDING ORDER OF ABSCISSAE, WITH NO TWO ABSCISSAE
EQUAL. THE ARRAYS MUST CONTAIN AT LEAST FOUR
POINTS.
GRAD IS AN ARRAY HAVING THE SAME SUBSCRIPTS AS X
AND Y INTO WHICH WILL BE PLACED THE CALCULATED
GRADIENTS OF THE REQUIRED CUBICS AT EACH OF THE
DATA POINTS.
LBX AND UBX ARE INTEGERS GIVING THE MINIMUM AND
MAXIMUM VALUES RESPECTIVELY OF THE SUBSCRIPTS OF
THE ARRAYS X, Y, AND GRAD;
begin
integer I,ILESS2,ILESS1,IPLUS1,IPLUS2;
real X0,X1,X2,X3,X4,Y2,PROD1,PROD2,NUM,DENOM,G,
COEFF2,XDIFF,XPROD,WEIGHT;
for I ≔ LBX step 1 until UBX do
begin
comment SPECIAL TREATMENT IS NEEDED AT END POINT;
ILESS1 ≔ if I>LBX then I-1 else I+3;
IPLUS1 ≔ if I<UBX then I+1 else I-3;
X2 ≔ X[I]; Y2 ≔ Y[I];
X1 ≔ X[ILESS1]-X2; X3 ≔ X[IPLUS1]-X2;
comment FIRST FIT A QUADRATIC THROUGH X1,X2,X3;
PROD1 ≔ (Y[ILESS1]-Y2)×X3;
PROD2 ≔ (Y[IPLUS1]-Y2)×X1;
DENOM ≔ X1×X3×(X[ILESS1]-X[IPLUS1]);
G ≔ (X1×PROD2-X3×PROD1)/DENOM;
COEFF2 ≔ (PROD1-PROD2)/DENOM;
comment IF X0 EXISTS, FIND ITS CONTRIBUTION TO THE
CUBIC ADJUSTMENT;
if I ⩽ LBX+1 then NUM ≔ DENOM ≔ 0·0 else
begin
ILESS2 ≔ I-2; X0 ≔ X[ILESS2]-X2;
XDIFF ≔ X[ILESS2]-X[ILESS1];
XPROD ≔ X0×XDIFF×(X[ILESS2]-X[IPLUS1]);
WEIGHT ≔ XPROD/(XDIFF×XDIFF);
NUM ≔ WEIGHT×(Y[ILESS2]-Y2-X0×(G+X0×COEFF2));
DENOM ≔ WEIGHT×XPROD
end;
comment IF X4 EXISTS, FIND ITS CONTRIBUTION TO THE
CUBIC ADJUSTMENT;
if I<UBX-1 then
begin
IPLUS2 ≔ I+2; X4 ≔ X[IPLUS2]-X2;
XDIFF ≔ X[IPLUS2]-X[IPLUS1];
XPROD ≔ X4×XDIFF×(X[IPLUS2]-X[ILESS1]);
WEIGHT ≔ XPROD/(XDIFF×XDIFF);
NUM ≔ NUM+WEIGHT×(Y[IPLUS2]-Y2-X4×(G+X4×COEFF2));
DENOM ≔ DENOM+WEIGHT×XPROD
end;
GRAD[I] ≔ G+NUM×X1×X3/DENOM
end
end OF PROCEDURE FIND GRADIENTS AT NODES;
procedure COEFFS(X,Y,GRAD,I,C0,C1,C2,C3);
value I; integer I;
real C0,C1,C2,C3;
array X,Y,GRAD;
comment THIS PROCEDURE CALCULATES THE COEFFICIENTS
OF THE CUBIC (IN THE RANGE X[I] TO X[I+1]) WHICH
HAS VALUES Y[I], Y[I 1] AND GRADIENTS GRAD[I],
GRAD[I+1] AT X[I], X[I+1] RESPECTIVELY.
THE CUBIC TAKES THE FORM
C0 + C1*(X-X[I]) + C2*(X-X[I])'2 + C3*(X-X[I])'3;
begin
real H,DY;
C0 ≔ Y[I];
H ≔ X[I+1]-X[I]; DY ≔ Y[I+1]-C0;
C1 ≔ GRAD[I];
C2 ≔ (3·0×DY-H×(2·0×C1+GRAD[I+1]))/(H×H);
C3 ≔ (H×(C1+GRAD[I+1])-2·0×DY)/H;
end OF PROCEDURE COEFFS;