Menu
Links
nils-uni@bluemer.name
|
|
Codes: stats_template.c
#define PROGNAME "stats_template"
#define VERSION "0.1"
#define DATE "30.10.2006"
#define AUTHOR "Nils Bluemer"
/* simplified version of stats - computes average, error etc. */
/* used as template for "Computer Simulations in Statistical Physics */
/* see http://komet337.physik.uni-mainz.de/Bluemer/lectures_WS2006 */
/* expects input on stdin in 1st column */
/* compile with cc -lm -o stats_template stats_template.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define BUFSIZE 100
#define NUMHIST 40
#define MAXDATA 100001
#define MIN(a,b) (a<b?a:b)
void error(char error_text[])
/* standard error handler */
{
fprintf(stderr,"\n%s run-time error\n",PROGNAME);
fprintf(stderr,"--%s--\n",error_text);
fprintf(stderr,"for general help use option -h\n");
fprintf(stderr,"...now exiting to system...\n");
exit(1);
}
void average(char form){
double data[MAXDATA];
double korr[MAXDATA];
char buf[BUFSIZE];
int i,n,numdata,numkorr;
double sum, sqsum,nsum,av, var,korrtime,trans;
numdata=0;
sum=0.0;
sqsum=0.0;
nsum=0;
do {
if (fgets(buf,BUFSIZE,stdin)!=NULL){
numdata++;
if (numdata>=MAXDATA) error ("too many data points");
sscanf(buf,"%lf",&data[numdata]);
/* printf("Nr %d: %f\n",nr,data[numdata]); */
sum +=data[numdata];
sqsum += data[numdata]*data[numdata];
nsum +=numdata*data[numdata];
}
} while (feof(stdin)==0);
if (numdata<2) error ("not enough data");
av=sum/numdata;
var=(sqsum-numdata*av*av)/(numdata-1);
if (form=='l')
printf("Average: %10.8g, variance: %10.8g, error: %10.8g\n",av,var,sqrt(var/numdata));
if (form=='c')
printf("# Autocorrelation function: not yet implemented\n");
/* computation of autocorrelation time */
/* computation of transient */
korrtime=0;
trans=0;
if (form=='l')
printf ("Korrelation time: %10.8g, corrected error: %10.8g, transient: %10.8g (not yet implemented)\n",
korrtime, sqrt(var/numdata)*sqrt(korrtime), trans);
if (form=='s')
printf ("%10.8G %10.8G %10.8G\n", av, sqrt(var/numdata)*sqrt(korrtime), trans);
}
void histogram ()
{
printf("please implement!\n");
}
void printhelp ()
{
printf("**********************************************************\n");
printf("%s: statistics utility (average, histogram, etc.)\n",PROGNAME);
printf("Version: %s, %s by %s\n",VERSION,DATE,AUTHOR);
printf("input: standardin, 1 column\n");
printf("options: -a average\n");
printf(" -s average, short output\n");
printf(" -c autocorrelation function (not implemented)\n");
printf(" -i histogram (not implemented)\n");
printf(" -h this help\n");
}
int main (int argc, char *argv[])
{
char c;
while (--argc > 0 && (*++argv)[0] == '-')
while (c= *++argv[0])
switch (c) {
case 'a':
average('l');
break;
case 's':
average('s');
break;
case 'c':
average('c');
break;
case 'i':
histogram();
break;
case 'h':
printhelp();
exit(0);
default:
error("No valid choice");
}
}
syntax highlighted by Code2HTML, v. 0.9.1
|