! lsfdemo - Program for demonstrating least squares fit routines program lsfdemo integer*4 MAXN, MAXM parameter( MAXN = 10000, MAXM = 50 ) integer*4 i, N, seed, M real*8 c(3), alpha, x(MAXN), y(MAXN), sigma(MAXN) real*8 a_fit(MAXM), sig_a(MAXM), yy(MAXN), chisqr real*8 randn !* Initialize data to be fit. Data is quadratic plus random number. write(*,*) 'Curve fit data is created using the quadratic' write(*,*) ' y(x) = c(1) + c(2)*x + c(3)*x^2' write(*,*) 'Enter the coefficients:' write(*,*) 'c(1), c(2), c(3) = ' read(*,*) c(1), c(2), c(3) write(*,*) 'Enter estimated error bar: ' read(*,*) alpha N = 50 ! Number of data points seed = 1234 ! Seed for random number generator (DO NOT USE ZERO) do i=1,N x(i) = i ! x = [1, 2, ..., N] y(i) = c(1) + c(2)*x(i) + c(3)*x(i)**2 + alpha*randn(seed) sigma(i) = alpha ! Constant error bar enddo !* Fit the data to a straight line or a more general polynomial write(*,*) 'Enter number of fit parameters (=2 for line): ' read(*,*) M if( M .eq. 2 ) then !* Linear regression (Straight line) fit call linreg( x, y, sigma, N, a_fit, sig_a, yy, chisqr) else !* Polynomial fit call pollsf( x, y, sigma, N, M, a_fit, sig_a, yy, chisqr) endif !* Print out the fit parameters, including their error bars. write(*,*) 'Fit parameters:' do i=1,M write(*,*) ' a(', i, ') = ', a_fit(i), ' +/- ', sig_a(i) enddo write(*,*) 'Chi square = ', chisqr, '; N-M = ', N-M !* Print out the plotting variables: x, y, sigma, yy open(11,file='x.txt',status='unknown') open(12,file='y.txt',status='unknown') open(13,file='sigma.txt',status='unknown') open(14,file='yy.txt',status='unknown') do i=1,N write(11,*) x(i) write(12,*) y(i) write(13,*) sigma(i) write(14,*) yy(i) enddo stop end !***** To plot in MATLAB; use the script below ******************** !load x.txt; load y.txt; load sigma.txt; load yy.txt !%* Graph the data, with error bars, and fitting function. !figure(1); clf; % Bring figure 1 window forward !errorbar(x,y,sigma,'o'); % Graph data with error bars !hold on; % Freeze the plot to add the fit !plot(x,yy,'-'); % Plot the fit on same graph as data !xlabel('x_i'); ylabel('y_i and Y(x)'); !******************************************************************