85 MODULE PROCEDURE linfit_sp, linfit_dp
98 FUNCTION linfit_dp(x, y, a, b, siga, sigb, chi2, model2)
102 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
103 REAL(dp),
OPTIONAL,
INTENT(OUT) :: a, b, siga, sigb, chi2
104 LOGICAL,
OPTIONAL,
INTENT(IN) :: model2
105 REAL(dp),
DIMENSION(:),
allocatable :: linfit_dp
107 REAL(dp) :: sigdat, nx, sx, sxoss, sy, st2
108 REAL(dp),
DIMENSION(size(x)),
TARGET :: t
109 REAL(dp) :: aa, bb, cchi2
111 REAL(dp) :: mx, my, sx2, sy2, sxy, sxy2, syx2, ssigb
114 if (
size(x) /=
size(y)) stop
'linfit_dp: size(x) /= size(y)'
115 if (.not.
allocated(linfit_dp))
allocate(linfit_dp(
size(x)))
116 if (
present(model2))
then
123 nx = real(
size(x), dp)
126 sx2 = sum((x - mx) * (x - mx))
127 sy2 = sum((y - my) * (y - my))
128 sxy = sum((x - mx) * (y - my))
130 bb = sign(sqrt(sy2 / sx2), sxy)
132 linfit_dp(:) = aa + bb * x(:)
133 if (
present(a)) a = aa
134 if (
present(b)) b = bb
135 if (
present(chi2))
then
136 t(:) = y(:) - linfit_dp(:)
137 chi2 = dot_product(t, t)
139 if (
present(siga) .or.
present(sigb))
then
140 syx2 = (sy2 - sxy * sxy / sx2) / (nx - 2.0_dp)
141 sxy2 = (sx2 - sxy * sxy / sy2) / (nx - 2.0_dp)
144 ssigb = sqrt(abs(syx2) / sx2)
145 if (
present(sigb)) sigb = ssigb
146 if (
present(siga))
then
148 siga = sqrt(abs(syx2) * (1.0_dp / nx + mx * mx / sx2))
152 siga = sqrt(siga * siga + bb * bb * abs(sxy2) / nx)
156 nx = real(
size(x), dp)
161 bb = dot_product(t, y)
162 st2 = dot_product(t, t)
164 aa = (sy - sx * bb) / nx
165 linfit_dp(:) = aa + bb * x(:)
166 if (
present(a)) a = aa
167 if (
present(b)) b = bb
168 if (
present(chi2) .or.
present(siga) .or.
present(sigb))
then
169 t(:) = y(:) - linfit_dp(:)
170 cchi2 = dot_product(t, t)
171 if (
present(chi2)) chi2 = cchi2
172 if (
present(siga) .or.
present(sigb))
then
173 sigdat = sqrt(cchi2 / (
size(x) - 2))
174 if (
present(siga))
then
175 siga = sqrt((1.0_dp + sx * sx / (nx * st2)) / nx)
178 if (
present(sigb))
then
179 sigb = sqrt(1.0_dp / st2)
186 END FUNCTION linfit_dp
189 FUNCTION linfit_sp(x, y, a, b, siga, sigb, chi2, model2)
193 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
194 REAL(sp),
OPTIONAL,
INTENT(OUT) :: a, b, siga, sigb, chi2
195 LOGICAL,
OPTIONAL,
INTENT(IN) :: model2
196 REAL(sp),
DIMENSION(:),
allocatable :: linfit_sp
198 REAL(sp) :: sigdat, nx, sx, sxoss, sy, st2
199 REAL(sp),
DIMENSION(size(x)),
TARGET :: t
200 REAL(sp) :: aa, bb, cchi2
202 REAL(sp) :: mx, my, sx2, sy2, sxy, sxy2, syx2, ssigb
205 if (
size(x) /=
size(y)) stop
'linfit_sp: size(x) /= size(y)'
206 if (.not.
allocated(linfit_sp))
allocate(linfit_sp(
size(x)))
207 if (
present(model2))
then
214 nx = real(
size(x), sp)
217 sx2 = sum((x - mx) * (x - mx))
218 sy2 = sum((y - my) * (y - my))
219 sxy = sum((x - mx) * (y - my))
221 bb = sign(sqrt(sy2 / sx2), sxy)
223 linfit_sp(:) = aa + bb * x(:)
224 if (
present(a)) a = aa
225 if (
present(b)) b = bb
226 if (
present(chi2))
then
227 t(:) = y(:) - linfit_sp(:)
228 chi2 = dot_product(t, t)
230 if (
present(siga) .or.
present(sigb))
then
231 syx2 = (sy2 - sxy * sxy / sx2) / (nx - 2.0_sp)
232 sxy2 = (sx2 - sxy * sxy / sy2) / (nx - 2.0_sp)
235 ssigb = sqrt(abs(syx2) / sx2)
236 if (
present(sigb)) sigb = ssigb
237 if (
present(siga))
then
239 siga = sqrt(abs(syx2) * (1.0_sp / nx + mx * mx / sx2))
243 siga = sqrt(siga * siga + bb * bb * abs(sxy2) / nx)
247 nx = real(
size(x), sp)
252 bb = dot_product(t, y)
253 st2 = dot_product(t, t)
255 aa = (sy - sx * bb) / nx
256 linfit_sp(:) = aa + bb * x(:)
257 if (
present(a)) a = aa
258 if (
present(b)) b = bb
259 if (
present(chi2) .or.
present(siga) .or.
present(sigb))
then
260 t(:) = y(:) - linfit_sp(:)
261 cchi2 = dot_product(t, t)
262 if (
present(chi2)) chi2 = cchi2
263 if (
present(siga) .or.
present(sigb))
then
264 sigdat = sqrt(cchi2 / (
size(x) - 2))
265 if (
present(siga))
then
266 siga = sqrt((1.0_sp + sx * sx / (nx * st2)) / nx)
269 if (
present(sigb))
then
270 sigb = sqrt(1.0_sp / st2)
277 END FUNCTION linfit_sp
Fits a straight line to input data by minimizing chi^2.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter dp
Double Precision Real Kind.