This is linreg.c in view mode; [Download] [Up]
/* Name : LINREG.C Version: 1992-04-07,16:44 mhi Zweck: Soll von einem ASCII-File Daten einlesen, die einfache LINeare REGression berechnen (der Fehler der Werte wird hierbei nicht beachtet) und die Koeffizienten auf einen ASCII-Ausgabefile schreiben. Kommandostruktur: linreg x y < inputfilename > outputfilename wobei x und y die Spaltennummern der Variablen sind (y = a1*x + b1). Die Ausgabe erfolgt in einer Zeile: r a1 b1 a2 b2 mx sx my sy. Dabei ist r der Korrelations-Koeffizient und es gilt x = a2*y + b2. sx, sy, mx, my sind die Standardabweichungen und Mittelwerte fuer x und y. */ #import "stdio.h" #import "string.h" #include <math.h> #define MAXSPALTEN 16 void main(argc, argv) int argc; char *argv[]; { double a1; /* Steigung der Geraden y = a1*x + b1 */ double a2; /* Steigung der Geraden x = a2*y + b2 */ double b1; /* Y-Abschnitt der Geraden y = a1*x + b1 */ double b2; /* Y-Abschnitt der Geraden x = a2*y + b2 */ double hm,hn,hp; /* Hilfsgroessen */ int k = 1; /* Index */ double mx,my; /* Mittelwerte */ int n = 0; /* Anzahl Messwerte */ double r; /* Korrelationskoeffizient */ double sx = -1.0; /* Standardabweichung in x */ double sy = -1.0; /* Standardabweichung in x */ double sumx = 0.0; /* Summe der x-Werte */ double sumxy = 0.0; /* Summe der Produkte x*y */ double sumx2 = 0.0; /* Summe der Quadrate der x-Werte */ double sumy = 0.0; /* Summe der y-Werte */ double sumy2 = 0.0; /* Summe der Quadrate der y-Werte */ double wert[MAXSPALTEN+1]; /* eingelesene Zahlenwerte */ int xspalte; /* Zeilennummer der Abszisse */ int yspalte; /* Zeilennummer der Ordinate */ char zeile[256]; /* einzulesende Zeile */ /* --- gibt es Argumente? */ if (argc > 2) { sscanf(argv[1],"%d",&xspalte); sscanf(argv[2],"%d",&yspalte); } else { printf("Benutzerhinweis zur Kommando-Struktur von LINREG: \n"); printf("linreg xspalte yspalte < inputfilename > outputfilename"); } /* --- Einlesen und Summieren der Werte: */ while (gets(zeile) != NULL) { k = sscanf(zeile,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &wert[1],&wert[2],&wert[3],&wert[4], &wert[5],&wert[6],&wert[7],&wert[8], &wert[9],&wert[10],&wert[11],&wert[12], &wert[13],&wert[14],&wert[15],&wert[16]); if (xspalte > k) { printf("LINREG: keine Spalte %d im input file\n",xspalte); return; } if (yspalte > k) { printf("LINREG: keine Spalte %d im input file\n",yspalte); return; } if ((xspalte > MAXSPALTEN) || (yspalte > MAXSPALTEN)) { printf("LINREG: Maximum von %d Spalten ueberschritten \n",MAXSPALTEN); return; } n++; /* printf("Spalte = %d ",spalte); */ /* printf("%d %lf %lf\n",n,wert[1],wert[2]); */ sumx += wert[xspalte]; sumx2 += wert[xspalte] * wert[xspalte]; sumxy += wert[xspalte] * wert[yspalte]; sumy += wert[yspalte]; sumy2 += wert[yspalte] * wert[yspalte]; } /* --- Berechnen der linearen Regression: */ hm = (n * sumx2) - (sumx * sumx); hn = (n * sumy2) - (sumy * sumy); hp = (n * sumxy) - (sumx * sumy); r = hp /sqrt(hm * hn); a1 = hp / hm; b1 = ((hm * sumy) - (hp * sumx)) / (n * hm); a2 = hp / hn; b2 = ((hn * sumx) - (hp * sumy)) / (n * hn); mx = sumx / n; sx = sqrt( hm / (n*(n-1)) ); my = sumy / n; sy = sqrt( hn / (n*(n-1)) ); /* --- Ausgabe der linearen Regression: */ printf("%lf ",r); printf("%lf ",a1); printf("%lf ",b1); printf("%lf ",a2); printf("%lf ",b2); printf("%lf ",mx); printf("%lf ",sx); printf("%lf ",my); printf("%lf\n",sy); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.