home *** CD-ROM | disk | FTP | other *** search
- program cfit4; {164}
-
- { plot service included }
- { Pascal program to perform a linear least-squares fit }
-
- const max = 20;
-
- type index = 1..max;
- ary = array[index] of real;
-
- var x,y,y_calc : ary;
- n : integer;
- first,done : boolean;
- a,b,correl_coef,
- sigma_a,sigma_b,
- see,seed : real;
-
- external procedure cls;
-
- function random(dummy: integer): real;
- { random number 0-1 }
- { define seed=4.0 as global }
-
- const pi = 3.14159;
-
- var x : real;
- i : integer;
-
- begin { RANDOM }
- x:=seed+pi;
- x:=exp(5.0*ln(x));
- seed:=x-trunc(x);
- random:=seed
- end; { RANDOM }
-
-
-
- procedure get_data(var x,y: ary;
- var n: integer);
- { get values for n and arrays x,y }
- { y is randomly scattered about a straight line }
-
- const a = 2.0;
- b = 5.0;
-
- var i,j : integer;
- fudge : real;
-
- begin
- write('Fudge? ');
- readln(fudge);
- if fudge<0.0 then done:=true
- else
- begin
- repeat
- write('How many points? ');
- readln(n)
- until (n>2) and (n<=max);
- if first then first:=false else cls;
- for i:=1 to n do
- begin
- j:=n+1-i;
- x[i]:=j;
- y[i]:=(a+b*j)*(1.0+(2.0*random(0)-1.0)*fudge)
- end { for-loop }
- end { if }
- end; { procedure get_data }
-
-
- procedure write_data;
- { print out the answers }
- var i,j : integer;
-
- begin
- writeln;
- writeln(' I X Y YCALC');
- for i:=1 to n do
- writeln(i:3,x[i]:8:1,y[i]:9:2,y_calc[i]:9:2);
- writeln;
- writeln('Intercept is ',a:8:3,', sigma is ',sigma_a:8:3);
- writeln(' Slope is ',b:8:2,', sigma is ',sigma_b:8:3);
- writeln;
- writeln('Correlation coeffizient is ',correl_coef:7:4);
- for j:=1 to 40 do for i:=1 to 10000 do; cls
- end; { write_data }
-
- {$I C:LINFIT2.LIB }
-
- {$I PLOT.LIB }
-
- begin { MAIN program }
- seed:=4.0;
- cls;
- first:=true;
- done:=false;
- repeat
- get_data(x,y,n);
- if not done then
- begin
- linfit(x,y,y_calc,a,b,n);
- write_data;
- plot(x,y,y_calc,n);
- end
- until done
- end.