home *** CD-ROM | disk | FTP | other *** search
- { --------------------------------------------------------------- }
- { File : REGQUAD.PAS ( gehört zu REG.PAS ) }
- { Copyright (c) : 1988 Heinz Hagemeyer & TOOLBOX }
- { Sprache : TURBO PASCAL 4.0 (oder 3.0) }
- { Ein Programm zur Auswertung von Meßwerten }
- { mit Hilfe von GRAPH.PAS }
- { --------------------------------------------------------------- }
-
- FUNCTION Quadratische_Regression
- ( n1,n2 : Index ;
- x,y : messwerte ;
- VAR Datei : TEXT ) : BOOLEAN ;
-
- { Berechnet die Koeffizienten der quadratischen Funktion : }
- { f(x) = ax^2 + bx + c }
- { nach der Methode der kleinsten Fehlerquadrate }
-
- FUNCTION Berechne_a_b_c ( n : index ;
- x,y : messwerte ;
- VAR x1,x2,x3 : REAL ) : BOOLEAN ;
- VAR i,k : Index ;
- A : ARRAY [1 .. 3,1 .. 3] OF REAL;
- B : ARRAY [1 .. 3] OF REAL;
- D,xr,yr : REAL ;
-
- BEGIN
-
- FOR i := 1 TO 3 DO { Definiertes Besetzen der Variablen }
- BEGIN
- FOR k := 1 TO 3 DO A [i,k] := 0;
- B [i] := 0;
- END;
-
- FOR i := 1 TO n DO { Berechnung der Summen }
- BEGIN
- xr := x[i] ; { Damit geht's leichter }
- yr := y[i] ;
- A[1,1] := A[1,1] + Sqr(xr) ; { Σ x ² }
- A[1,2] := A[1,2] + xr ; { Σ x }
- A[2,1] := A[2,1] + xr*sqr(xr) ; { Σ x ^ 3 }
- A[3,1] := A[3,1] + Sqr (Sqr (xr)) ; { Σ x ^ 4 }
-
- B[1] := B[1] + yr ; { Σ y }
- B[2] := B[2] + xr*yr ; { Σ x*y }
- B[3] := B[3] + yr*sqr(xr) ; { Σ y*x ² }
- END;
-
- A[1,3] := n ; { Besetzen der restlichen }
- A[2,2] := A[1,1] ; { Koeffizienten }
- A[2,3] := A[1,2] ;
- A[3,2] := A[2,1] ;
- A[3,3] := A[1,1] ;
-
- { Lösen des Linearen Gleichungssystem mit Hilfe von 3 Reihigen Deter- }
- { minanten. Eine eindeutige Kösung existiert dann, wenn die Koeffizi- }
- { entendeterminante D <> 0 ist. Daher => }
-
- D := A[1,1]*A[2,2]*A[3,3] + A[1,2]*A[2,3]*A[3,1] + A[1,3]*A[2,1]*A[3,2]
- - A[3,1]*A[2,2]*A[1,3] - A[3,2]*A[2,3]*A[1,1] - A[3,3]*A[2,1]*A[1,2] ;
-
- IF D=0 THEN Berechne_a_b_c := FALSE
- ELSE
- BEGIN
- Berechne_a_b_c := TRUE;
-
- X1 := B[1]*A[2,2]*A[3,3] + A[1,2]*A[2,3]*B[3] + A[1,3]*B[2]*A[3,2]
- - B[3]*A[2,2]*A[1,3] - A[3,2]*A[2,3]*B[1] - A[3,3]*B[2]*A[1,2] ;
-
- X2 := A[1,1]*B[2]*A[3,3] + B[1]*A[2,3]*A[3,1] + A[1,3]*A[2,1]*B[3]
- - A[3,1]*B[2]*A[1,3] - B[3]*A[2,3]*A[1,1] - A[3,3]*A[2,1]*B[1] ;
-
- X3 := A[1,1]*A[2,2]*B[3] + A[1,2]*B[2]*A[3,1] + B[1]*A[2,1]*A[3,2]
- - A[3,1]*A[2,2]*B[1] - A[3,2]*B[2]*A[1,1] - B[3]*A[2,1]*A[1,2] ;
-
- X1 := X1/D ; X2 := X2/D ; X3 := X3/D ;
- END;
- END; { Berechne_a_b_c }
-
- { ------------------------------------------------------------------------- }
-
- VAR a, b, c, xr, xa, xe, yr : REAL;
-
- BEGIN
- IF NOT Berechne_a_b_c (n2-n1+1,x,y,a,b,c)
- THEN BEGIN Quadratische_Regression := FALSE; EXIT END;
-
- Quadratische_Regression := TRUE;
-
- xa := Minimum (n1,n2,x) - 2*Step ; { Über den 1. und 2. Punkt hinaus }
- xe := Maximum (n1,n2,x) + 2*Step ;
- xr := xa ;
-
- REPEAT
- yr := xr * ( a*xr + b ) + c ; { Berechnung der Werte mit dem HORNER }
- WriteLn (Datei, xr,' ',yr) ; { Schema und in die Datei schreiben }
- xr := xr + Step ;
- UNTIL xr > xe ;
- WriteLn (Datei);
- END;
-
- { -------------------------------------------------------------------- }
- { Ende von REGQUAD.PAS }