home *** CD-ROM | disk | FTP | other *** search
- { --------------------------------------------------------------- }
- { File : ROBLINFI.PAS }
- { Copyright (c) : 1989 Peter Kurzweil, H.H & TOOLBOX }
- { Sprache : TURBO PASCAL 4.0 (oder 3.0) }
- { Ein Programm zur Auswertung von Meßwerten }
- { mit Hilfe von GRAPH.PAS }
- { --------------------------------------------------------------- }
-
- FUNCTION RobustLinFit ( VAR x,y : Vector; k1,k2 : word;
- VAR a,b,da,db,dy : real) : Boolean ;
-
- LABEL 9;
- VAR i,k,n:word; xs,ys,xy,xx,f,f1,f2,b1,b2,d,chi2,h:real;
-
- PROCEDURE HeapSort(VAR a:Vector; n:word); { Zahlen aufsteigend sortieren }
- VAR l,j,k,i:word; h:real;
- BEGIN
- l:=(n DIV 2)+1; k:=n;
- WHILE true DO BEGIN
- IF l>1 THEN BEGIN l:=l-1; h:=a[l]; END
- ELSE BEGIN
- h:=a[k]; a[k]:=a[1]; k:=k-1;
- IF k=1 THEN BEGIN a[1]:=h; Exit; END
- END;
- i:=l; j:=l+l;
- WHILE j<=k DO BEGIN
- IF j<k THEN IF a[j]<a[j+1] THEN j:=j+1;
- IF h<a[j] THEN BEGIN a[i]:=a[j]; i:=j; j:=j+j; END ELSE j:=k+1;
- END;
- a[i]:=h;
- END;
- END;
-
- FUNCTION Theory(b:real; VAR a,dy:real):real; { Rechte Seite von Gl. (1) }
- VAR d,s:real; i,k,n,n1,n2:word; f:Vector;
- BEGIN
- n:=k2-k1+1; n2:=(n+1) DIV 2; n1:=(n+1)-n2; i:=0;
- FOR k:=k1 to k2 DO BEGIN i:=i+1; f[i]:=y[k]-b*x[k]; end;
- HeapSort(f,n);
- a:=0.5*(f[n2]+f[n1]); { Bestimmung des Medians }
- s:=0; i:=0; dy:=0;
- FOR i:=k1 to k2 DO BEGIN
- d:=y[i]-(b*x[i]+a);
- dy:=dy+abs(d);
- IF d>0 THEN s:=s+x[i] ELSE s:=s-x[i];
- END;
- Theory:=s;
- END;
-
- BEGIN
- IF k1>k2 THEN BEGIN n:=k1; k1:=k2; k2:=n; END;
- n:=k2-k1+1; { Stuetzstellenzahl }
- xs:=0; ys:=0; xy:=0; xx:=0; chi2:=0;
-
- FOR i:=k1 to k2 DO { Gaußsummen }
- BEGIN
- xs := xs + x[i] ; ys := ys + y[i];
- xy := xy + x[i]*y[i]; xx := xx + sqr (x[i]);
- END;
-
- d:=n*xx-xs*xs;
-
- IF d = 0 THEN { nur ein Punkt eingegeben }
- BEGIN
- RobustLinFit := FALSE;
- EXIT;
- END;
-
- RobustLinFit := TRUE;
- a:=(xx*ys-xs*xy)/d;
- b:=(n*xy-xs*ys)/d;
- FOR i:=k1 to k2 DO chi2:=chi2+sqr(y[i]-(a+b*x[i])); { Fehlerquadratsumme }
- h:=sqrt(chi2/d);
- b1:=b;
- f1:=Theory(b1,a,dy);
-
- IF f1>0 THEN b2:=b+abs(3*h) ELSE b2:=b-abs(3*h);
- f2:=Theory(b2,a,dy);
- WHILE ((f1*f2>0) and (f1<>f2)) DO BEGIN { Loese Gl. (2) fuer versch. b }
- b :=2*b2-b1;
- b1:=b2; f1:=f2;
- b2:=b; f2:=Theory(b2,a,dy);
- END;
- h:=0.01*h;
- WHILE abs(b2-b1)>h DO BEGIN { Nullstellensuche }
- b:=0.5*(b1+b2);
- IF ((b=b1) OR (b=b2)) THEN GOTO 9;
- f:=Theory(b,a,dy);
- IF f*f1>=0 THEN BEGIN f1:=f; b1:=b; END
- ELSE BEGIN f2:=f; b2:=b; END;
- END;
- 9:
- dy:=dy/n; { Fehler des Fits }
- da:=dy*sqrt(abs(xx/(n*xx-xs*xs)));
- db:=dy*sqrt(abs(n/(n*xx-xs*xs)));
- END;
-