110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
| 
								 | 
							
								subroutine polyfit4(x,y,sigmay,npts,nterms,mode,a,chisqr)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parameter (MAXN=20)
							 | 
						||
| 
								 | 
							
								  implicit real*8 (a-h,o-z)
							 | 
						||
| 
								 | 
							
								  real x(npts), y(npts), sigmay(npts), a(nterms),chisqr
							 | 
						||
| 
								 | 
							
								  real*8 sumx(2*MAXN-1), sumy(MAXN), array(MAXN,MAXN)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Accumulate weighted sums
							 | 
						||
| 
								 | 
							
								  nmax = 2*nterms-1
							 | 
						||
| 
								 | 
							
								  sumx=0.
							 | 
						||
| 
								 | 
							
								  sumy=0.
							 | 
						||
| 
								 | 
							
								  chisq=0.
							 | 
						||
| 
								 | 
							
								  do i=1,npts
							 | 
						||
| 
								 | 
							
								     xi=x(i)
							 | 
						||
| 
								 | 
							
								     yi=y(i)
							 | 
						||
| 
								 | 
							
								     if(mode.lt.0) then
							 | 
						||
| 
								 | 
							
								        weight=1./abs(yi)
							 | 
						||
| 
								 | 
							
								     else if(mode.eq.0) then
							 | 
						||
| 
								 | 
							
								        weight=1
							 | 
						||
| 
								 | 
							
								     else
							 | 
						||
| 
								 | 
							
								        weight=1./sigmay(i)**2
							 | 
						||
| 
								 | 
							
								     end if
							 | 
						||
| 
								 | 
							
								     xterm=weight
							 | 
						||
| 
								 | 
							
								     do n=1,nmax
							 | 
						||
| 
								 | 
							
								        sumx(n)=sumx(n)+xterm
							 | 
						||
| 
								 | 
							
								        xterm=xterm*xi
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     yterm=weight*yi
							 | 
						||
| 
								 | 
							
								     do n=1,nterms
							 | 
						||
| 
								 | 
							
								        sumy(n)=sumy(n)+yterm
							 | 
						||
| 
								 | 
							
								        yterm=yterm*xi
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     chisq=chisq+weight*yi**2
							 | 
						||
| 
								 | 
							
								  enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Construct matrices and calculate coefficients
							 | 
						||
| 
								 | 
							
								  do j=1,nterms
							 | 
						||
| 
								 | 
							
								     do k=1,nterms
							 | 
						||
| 
								 | 
							
								        n=j+k-1
							 | 
						||
| 
								 | 
							
								        array(j,k)=sumx(n)
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								  enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  delta=determ4(array,nterms)
							 | 
						||
| 
								 | 
							
								  if(delta.eq.0) then
							 | 
						||
| 
								 | 
							
								     chisqr=0.
							 | 
						||
| 
								 | 
							
								     a=0.
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								     do l=1,nterms
							 | 
						||
| 
								 | 
							
								        do j=1,nterms
							 | 
						||
| 
								 | 
							
								           do k=1,nterms
							 | 
						||
| 
								 | 
							
								              n=j+k-1
							 | 
						||
| 
								 | 
							
								              array(j,k)=sumx(n)
							 | 
						||
| 
								 | 
							
								           enddo
							 | 
						||
| 
								 | 
							
								           array(j,l)=sumy(j)
							 | 
						||
| 
								 | 
							
								        enddo
							 | 
						||
| 
								 | 
							
								        a(l)=determ4(array,nterms)/delta
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Calculate chi square
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     do j=1,nterms
							 | 
						||
| 
								 | 
							
								        chisq=chisq-2*a(j)*sumy(j)
							 | 
						||
| 
								 | 
							
								        do k=1,nterms
							 | 
						||
| 
								 | 
							
								           n=j+k-1
							 | 
						||
| 
								 | 
							
								           chisq=chisq+a(j)*a(k)*sumx(n)
							 | 
						||
| 
								 | 
							
								        enddo
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     free=npts-nterms
							 | 
						||
| 
								 | 
							
								     chisqr=chisq/free
							 | 
						||
| 
								 | 
							
								  end if
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  return
							 | 
						||
| 
								 | 
							
								end subroutine polyfit4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								real*8 function determ4(array,norder)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parameter (MAXN=20)
							 | 
						||
| 
								 | 
							
								  implicit real*8 (a-h,o-z)
							 | 
						||
| 
								 | 
							
								  real*8 array(MAXN,MAXN)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  determ4=1.
							 | 
						||
| 
								 | 
							
								  do k=1,norder
							 | 
						||
| 
								 | 
							
								     if (array(k,k).ne.0) go to 41
							 | 
						||
| 
								 | 
							
								     do j=k,norder
							 | 
						||
| 
								 | 
							
								        if(array(k,j).ne.0) go to 31
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     determ4=0.
							 | 
						||
| 
								 | 
							
								     go to 60
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								31   do i=k,norder
							 | 
						||
| 
								 | 
							
								        s8=array(i,j)
							 | 
						||
| 
								 | 
							
								        array(i,j)=array(i,k)
							 | 
						||
| 
								 | 
							
								        array(i,k)=s8
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     determ4=-1.*determ4
							 | 
						||
| 
								 | 
							
								41   determ4=determ4*array(k,k)
							 | 
						||
| 
								 | 
							
								     if(k.lt.norder) then
							 | 
						||
| 
								 | 
							
								        k1=k+1
							 | 
						||
| 
								 | 
							
								        do i=k1,norder
							 | 
						||
| 
								 | 
							
								           do j=k1,norder
							 | 
						||
| 
								 | 
							
								              array(i,j)=array(i,j)-array(i,k)*array(k,j)/array(k,k)
							 | 
						||
| 
								 | 
							
								           enddo
							 | 
						||
| 
								 | 
							
								        enddo
							 | 
						||
| 
								 | 
							
								     end if
							 | 
						||
| 
								 | 
							
								  enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								60 return
							 | 
						||
| 
								 | 
							
								end function determ4
							 |