home *** CD-ROM | disk | FTP | other *** search
- { --------------------------------------------------------------- }
- { File : REGLIN.PAS ( gehört zu REG.PAS ) }
- { Copyright (c) : 1989 Heinz Hagemeyer & TOOLBOX }
- { Sprache : TURBO PASCAL 4.0 (oder 3.0) }
- { Ein Programm zur Auswertung von Meßwerten }
- { mit Hilfe von GRAPH.PAS }
- { --------------------------------------------------------------- }
-
-
- { -- Berechnet die Steigung m und den y - Achsenabschnitt b -- }
- { -- gibt TRUE zurück, wenn dieses möglich war, sonst FALSE -- }
-
- FUNCTION Berechne_m_b ( n1,n2 : Index ;
- VAR x,y : Messwerte ;
- VAR m,b : Real ) : BOOLEAN ;
-
-
- var i,n : Index ;
- sumx,sumy, { Summe der x - Werte und der y - Werte }
- sumxy,sumxx, { Summe der Produkte x*y und x*x }
- xr, yr : Real; { Mittelwerte }
-
- BEGIN
- sumx := 0; sumy := 0; { Vorbesetzen der Summen }
- sumxy := 0; sumxx := 0;
-
- FOR i:=n1 to n2 DO
- BEGIN
- SumX := SumX + x[i]; SumY := SumY + y[i] ;
- SumXY := SumXY + x[i]*y[i] ;SumXX := SumXX + Sqr (x[i]) ;
-
- END;
-
- n := n2 - n1 + 1; { Anzahl der Meßwerte }
- xr := sumx/n; { Mittelwerte bilden }
- yr := sumy/n;
-
- IF sumxx - n*sqr(xr) = 0
- THEN Berechne_m_b := FALSE { Fehler aufgetreten, }
- ELSE { es droht Division }
- { durch Null. }
-
- BEGIN { Jetzt ist die Berechnung von m und b möglich }
- Berechne_m_b := TRUE;
- m := (sumxy - n*xr*yr) / (sumxx - n*sqr(xr));
- b := yr - m*xr;
- END;
- END { Berechne_m_b } ;
-
- { ------------------------------------------------------------- }
-
- FUNCTION F (a,b,x : Real; Welcher : Art) : Real;
- BEGIN
- CASE Welcher OF
- PotF,RPotF : F := Exp(a+b*Ln(x)) ;
- LogaF,RLogaF : F := a+b*Ln(x) ;
- ExpF,RExpF : F := Exp(a+b*x) ;
- END;
- END;
-
- FUNCTION Lineare_Regression ( Welcher : Art ;
- n1, n2 : Index ;
- VAR x,y : Messwerte ;
- VAR Datei : Text ) : BOOLEAN ;
-
- VAR m,b, { Steigung und y - Achsenabschnitt }
- xa,xe, { Anfangs- und Endpunkt der Geraden }
- d : Real; { Dummy für RobustLinFit, da die }
- { statistischen Berechnungen hier }
- { nicht benötigt werden. }
- i : Index;
- xr,yr : Messwerte; { Zur Umrechnung bei Potenzfkt. usw. }
-
- BEGIN { Lineare Regression }
-
- xr := x; yr := y;
- { Meßwerte ggf. für erschiedene Arten umrechnen }
- FOR i := n1 TO n2 DO
- BEGIN
- CASE Welcher OF
- PotF , RPotF : BEGIN xr[i] := Ln (x[i]); yr[i] := Ln (y[i]); END;
- LogaF,RLogaF : xr[i] := Ln (xr[i]);
- ExpF ,RExpF : yr[i] := Ln (yr[i]);
- END;
- END;
-
- IF Welcher >= RLinF THEN { wurde RobustLinFit gewählt }
- BEGIN
- IF NOT RobustLinFit (xr,yr,n1,n2,b,m,d,d,d) THEN
- BEGIN
- Lineare_Regression := FALSE;
- EXIT;
- END;
- END ELSE
- BEGIN
- IF NOT Berechne_m_b (n1,n2,xr,yr,m,b) THEN
- BEGIN
- Lineare_Regression := FALSE;
- EXIT;
- END;
- END;
-
- Lineare_Regression := TRUE;
-
- xa := Minimum (n1,n2,x) - 0.5; { Berechnung der Anfangs- und }
- xe := Maximum (n1,n2,x) + 0.5; { Endpunkte }
-
- IF (Welcher=LinF) OR (Welcher=RLinF) THEN { genügen 2 Punkte }
- BEGIN
- WriteLn (Datei,xa,' ',m*xa + b); { Hereinschreiben in die }
- WriteLn (Datei,xe,' ',m*xe + b); { Datei zur Auswertung durch }
- END ELSE { WERTE.PAS }
- REPEAT
- WriteLn (Datei,xa,' ', F (b,m,xa,Welcher));
- xa := xa + Step;
- UNTIL xa > xe;
-
- WriteLn (Datei); { Leerzeile zur Trennung }
- END;
-
- { ----------------------------------------------------------------- }
- { -- Ende von REGLIN.PAS -- }