mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-05 00:41:19 -05:00
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
|