Calculation of the Earth's size - Noon project

The following program was written to calculate the circumference of the Earth from data collected during the spring noon project. This program has an advantage over the spreadsheet approach since the values for every site can be calculated at once. It is then possible to compare sites and ask questions about the data. Any feedback regarding this program would be greatly appreciated.


% This program acccepts data from the Noon project and calculates
% the circumference of Earth.

% Data should be in the form of a matrix with the first column being
% the latitude of the site, with negative signs for southern
% latitudes, the second column being the longitude, with negative signs
% for western longitudes and the third column being the length of a shadow
% cast from a 1-meter standard.

clear

% Read the file
% Change these 2 lines to match your data file!!!
load('noon.dat');

% Assign columns of file to vectors
n=size(noon,1);
lat=noon(:,1);
long=noon(:,2);
shad=noon(:,3);

% Calculate circumference comparing each site (i) to all 
% other sites (j)
for i=1:n;
        for j=1:n;
                if lat(j)<1; 
                
% Calculate angle from shadow length
% assumes 1 meter gnomon, 57.3 converts radians to degrees 
                        ang(j)=90+atan(shad(j)/100)*57.3;
                else
                        ang(j)=90-atan(shad(j)/100)*57.3;
                end
% if at same latitude, skip calculations and put zero in                
                if lat(i)==lat(j);
                        ns(i,j)=0;
                        cir(i,j)=0;
                        
%If two different latitudes, but same shadow, skip calcs
                elseif shad(i)==shad(j);
                        ns(i,j)=0;
                        cir(i,j)=0;
                else
                
% Calculate north-south latitude, 111.133 km per degree of latitude
                        ns(i,j)=abs(lat(i)-lat(j))*111.133;

%Calculate circumference of earth
                        cir(i,j)=abs(ns(i,j)*360/(ang(j)-ang(i)));
                        
% Calculate percent error based on 40008 as true circumference
                        per(i,j)=(cir(i,j)-40008)*100/40008;
                end
        end
end

% Calculate averages and standard deviation for nonzero circumferences

for i=1:n
        circ2=nonzeros(cir(:,i));
        avg(i)=mean(circ2);     
        stdev(i)=std(circ2);
end

% Printout results
disp('     Summary of Circumference Results');
disp('Lat       Long     Avg.Cir   St.Dev  Perc.Err');
result(1,:)=reshape(lat,1,n);
result(2,:)=reshape(long,1,n);
result(3,:)=avg;
result(4,:)=stdev;
perct=(avg-40008)*100/40008;
result(5,:)=perct;
fid = fopen('noonresult','w');
fprintf(fid,'%4.2f  %4.2f  %5.0f  %3.0f  %3.0f\n',result);
fclose(fid);
fprintf('%4.2f    %4.2f    %5.0f      %3.0f      %3.0f\n',result);

disp('Average Circumference from all site averages');
avgall=sum(avg)/n;
disp(avgall);
disp ('Overall Percent error');
perctall=(avgall-40008)*100/40008;
disp (perctall);

% Plot the Average Circumference plotted by each site
% vs. the latitude of that site

plot(lat,avg);
title('Average Circumference by Site');
xlabel('Latitude');
ylabel('Avg. Circumference');