#include #include #include #include #include #include int ip,n,i,j,k,ns,nn,j1,i1,nunk,jj, nx, ny, ni; double ch, energy, d, offset,dele,delch,dele2; long int indx[10],nsi[10]; double col[10],xcal[10],fit[10],delfit[10],ycal[10]; double y[10],x[10],erry[10]; int running; int graphdriver, graphmode, error; int maxx,maxy,yp; char cho; double xunk[10], errunk[10]; float sumx,sumy,sumxy,sumx2,sumx_sq,slope,yfit,intercept,oset; float sumdif,xscale,yscale,xmin,ymin,xmax,ymax,xi; float delyy, delm, delyi, delxi, dett; void linfit(); void graphit(); void screenin(); void readfl(); void main() { printf(" Welcome to the linear fitting program \n\n"); running=1; printf(" press s to input data from the screen\n"); printf(" press r to read data from a file\n"); do { if (kbhit) { cho=getch(); switch(cho) { case 's' : screenin(); running=2; break; case 'r' : readfl(); running=2; break; default : printf("Try again, s or r\n"); break; } } }while (running==1); running=1; printf("\n\n"); printf(" press l to do a least-square linear fit \n"); printf(" press q to exit the program\n"); do { if (kbhit) { cho=getch(); switch(cho) { case 'q' : closegraph(); running=2; break; case 'l' : closegraph(); linfit(); graphit(); break; default : closegraph(); printf("Try again, q or l\n"); break; } } } while (running==1); } void linfit() { printf("\n\n"); printf(" number x-value y-value \n"); for (i = 1; i<= nn; i++) printf(" %d %8.3f %8.3f \n", i, x[i],y[i]); printf(" How many points from the above list do you \n"); printf(" want to use for your fit? \n"); scanf("%d",&ns); printf(" Which ones? Enter the numbers in order\n"); for (i=1; i<=nn; i++) nsi[i]=0; for (i=1; i<=ns; i++) scanf("%d",&nsi[i]); for (i=1; i<=ns; i++) { xcal[i]=x[nsi[i]]; ycal[i]=y[nsi[i]]; } sumx=0; sumy=0; sumx2=0; sumxy=0; for (i=1; i<=ns; i++) { sumx=sumx+xcal[i]; sumy=sumy+ycal[i]; sumx2=sumx2+xcal[i]*xcal[i]; sumxy=sumxy+xcal[i]*ycal[i]; } sumx_sq=sumx*sumx; dett=ns*sumx2-sumx_sq; slope=(ns*sumxy-sumx*sumy)/(ns*sumx2-sumx_sq); intercept=(sumy*sumx2-sumxy*sumx)/(ns*sumx2-sumx_sq); oset=-intercept/slope; sumdif=0.0; for (i=1; i<=ns; i++) { sumdif=sumdif+pow(slope*xcal[i]+intercept-ycal[i],2); } delyy=sqrt(sumdif/ns); delyi=delyy*sqrt(sumx2/dett); delm=delyy*sqrt(ns/dett); delxi=oset*(delm/slope+delyi/intercept); if (delxi<0) delxi=-delxi; xmax=x[1]; for (i=2; i<=nn; i++) if (x[i]>xmax) xmax=x[i]; ymax=y[1]; for (i=2; i<=nn; i++) if (y[i]>ymax) ymax=y[i]; xmin=x[1]; for (i=2; i<=nn; i++) if (x[i]