x(i) のデータがある時、1次近似で x = a*i+b と a, b を 最小自乗法で求め (calc_ab) 、それを使って、線形のトレンドからの 偏差を x に戻す ( detrend ) サブルーチンの例。 テストのための主プログラムをとりあえずつけてある。
implicit none integer, parameter :: num=100 real :: x(num) integer :: i, j, n i=1 do while( 1==1 ) read(*,*, END=900) x(i) i=i+1 end do 900 n=i-1 do i=1, n write(*,*) i, x(i) end do call detrend( x, n) do i=1, n write(*,*) i, x(i) end do end subroutine detrend( x, n ) implicit none integer :: n real :: x(n) real :: a, b integer :: i call calc_ab( x, n, a, b ) write(*,*) 'a=', a, 'b=', b do i=1, n x(i) = x(i) - (a*i+b) end do end subroutine calc_ab( x, n, a, b) implicit none integer :: n, i real :: x(n), a, b double precision :: sx2, sx, sxy, sy, d sx2 = 0 ; sx = 0 ; sxy = 0; sy = 0 do i=1,n sx2 = sx2 + i*i sx = sx + i sxy = sxy + i*x(i) sy = sy + x(i) end do d = sx2 * n - sx * sx a = (n*sxy-sx*sy)/d ! (2008.1.31 にはここにタイプミスがありました) b = (-sx*sxy+sx2*sy)/d end
玉川 2008.1.20