| 1 | PROGRAM SPLINEINTERPOLATION(INPUT,OUTPUT); |
| 2 | |
| 3 | CONST NMAX=25; |
| 4 | |
| 5 | VAR N,I: INTEGER; |
| 6 | X,Y,Z, |
| 7 | LAMBDA,MY,DELTA,P,Q,U: ARRAY[0..NMAX] OF REAL; |
| 8 | S: REAL; |
| 9 | H, |
| 10 | A,B,C,D: ARRAY[1..NMAX] OF REAL; |
| 11 | |
| 12 | BEGIN READ(N); N := N-1; |
| 13 | WRITELN; |
| 14 | WRITELN("S P L I N E - I N T E R P O L A T I O N"); |
| 15 | WRITELN; |
| 16 | (* |
| 17 | EINLESEN DER GEGEBENEN PUNKTE, BERECHNUNG DER |
| 18 | LAENGEN H[I] DER EINZELNEN INTERVALLE. |
| 19 | *) |
| 20 | READ(X[0],Y[0]); |
| 21 | FOR I := 1 TO N DO |
| 22 | BEGIN READ(X[I],Y[I]); |
| 23 | H[I] := X[I] - X[I-1] |
| 24 | END; |
| 25 | (* |
| 26 | BERECHNUNG DER KOEFF. LAMBDA[I], MY[I] SOWIE RECHTEN SEITEN DELTA[I] |
| 27 | DES GLEICHUNGSSYSTEMS ZUR BESTIMMUNG DER ZWEITEN ABLEITUNGEN |
| 28 | IN DEN GEGEBENEN PUNKTEN. (TRIDIAGONALMATRIX!) |
| 29 | *) |
| 30 | LAMBDA[0] := 0; MY[0] := 0; DELTA[0] := 0; |
| 31 | FOR I := 1 TO N-1 DO |
| 32 | BEGIN S := H[I] + H[I+1]; |
| 33 | LAMBDA[I] := H[I+1]/S; MY[I] := 1 - LAMBDA[I]; |
| 34 | DELTA[I] := ( (Y[I+1]-Y[I])/H[I+1] - (Y[I]-Y[I-1])/H[I] )*6/S |
| 35 | END; |
| 36 | LAMBDA[N] := 0; MY[N] := 0; DELTA[N] := 0; |
| 37 | (* |
| 38 | BERECHNUNG DER ZWEITEN ABLEITUNGEN Z[I] |
| 39 | *) |
| 40 | Q[0] := -LAMBDA[0]/2; U[0] := DELTA[0]/2; |
| 41 | FOR I := 1 TO N DO |
| 42 | BEGIN |
| 43 | P[I] := MY[I]*Q[I-1] + 2; |
| 44 | Q[I] := -LAMBDA[I]/P[I]; |
| 45 | U[I] := (DELTA[I] - MY[I]*U[I-1])/P[I] |
| 46 | END; |
| 47 | Z[N] := U[N]; |
| 48 | FOR I := N-1 DOWNTO 0 DO Z[I] := Q[I]*Z[I+1] + U[I]; |
| 49 | (* |
| 50 | BERECHNUNG DER KOEFFIZIENTEN DER KUBISCHEN POLYNOME |
| 51 | A[I]*X^3 + B[I]*X^2 + C[I]*X + D[I] |
| 52 | FUER DIE EINZELNEN INTERVALLE. |
| 53 | *) |
| 54 | FOR I := 1 TO N DO |
| 55 | BEGIN S := X[I] - X[I-1]; |
| 56 | A[I] := (Z[I]-Z[I-1])/(6*S); |
| 57 | B[I] := (Z[I]-6*A[I]*X[I])/2; |
| 58 | C[I] := (Y[I]-Y[I-1])/S - |
| 59 | A[I]*(SQR(X[I]) + X[I]*X[I-1] + SQR(X[I-1])) - |
| 60 | B[I]*(X[I]+X[I-1]); |
| 61 | D[I] := Y[I] - ((A[I]*X[I]+B[I])*X[I]+C[I])*X[I] |
| 62 | END; |
| 63 | (* |
| 64 | AUSGABE |
| 65 | *) |
| 66 | WRITELN("P 0:", X[0] :8:2, Y[0] :8:2); |
| 67 | FOR I := 1 TO N DO |
| 68 | BEGIN |
| 69 | WRITELN(" ":5, A[I],B[I],C[I],D[I]); |
| 70 | WRITELN("P", I:2, ":", X[I] :8:2, Y[I] :8:2) |
| 71 | END; |
| 72 | WRITELN |
| 73 | END. |