📄 pollsf.f
字号:
subroutine pollsf( x, y, sigma, N, M, a_fit, sig_a, yy, chisqr )
integer*4 MAXN, MAXM
parameter( MAXN = 10000, MAXM = 50 )
integer*4 N, M
real*8 x(N), y(N), sigma(N), a_fit(M), sig_a(M)
real*8 yy(N), chisqr
! Function to fit a polynomial to data
! Inputs
! x Independent variable
! y Dependent variable
! sigma Estimate error in y
! M Number of parameters used to fit data
! Outputs
! a_fit Fit parameters; a(1) is intercept, a(2) is slope
! sig_a Estimated error in the parameters a()
! yy Curve fit to the data
! chisqr Chi squared statistic
integer*4 i, j, k
real*8 b(MAXN), A(MAXN,MAXM), C(MAXM,MAXM), Cinv(MAXM,MAXM)
real*8 delta, determ, inv
!* Form the vector b and design matrix A
do i=1,N
b(i) = y(i)/sigma(i)
do j=1,M
A(i,j) = (x(i)**(j-1))/sigma(i)
enddo
enddo
!* Compute the correlation matrix C
do i=1,M ! (C inverse) = (A transpose) * A
do j=1,M
Cinv(i,j) = 0.0
do k=1,N
Cinv(i,j) = Cinv(i,j) + A(k,i)*A(k,j)
enddo
enddo
enddo
! C = ( (C inverse) inverse)
determ = inv( Cinv, M, MAXM, C ) ! Determinant returned but unused
!* Compute the least squares polynomial coefficients a_fit
do k=1,M
a_fit(k) = 0.0
do j=1,M
do i=1,N
a_fit(k) = a_fit(k) + C(k,j) * A(i,j) * b(i)
enddo
enddo
enddo
!* Compute the estimated error bars for the coefficients
do j=1,M
sig_a(j) = sqrt(C(j,j))
enddo
!* Evaluate curve fit at each data point and compute Chi^2
chisqr = 0.0
do i=1,N
yy(i) = 0.0 ! yy is the curve fit
do j=1,M
yy(i) = yy(i) + a_fit(j) * x(i)**(j-1)
enddo
delta = (y(i)-yy(i))/sigma(i)
chisqr = chisqr + delta**2 ! Chi square
enddo
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -