x(i), y(i) のデータが、
x(1) y(1) x(2) y(2) x(3) y(3) : :と並んでいる時に、標準入力から読み込んで、 対数軸で見て等間隔 (xが) で、ブロック平均をとるプログラム例
program logsmoothing
implicit none
integer, parameter :: n=10000, ndiv = 100
real :: x(n), y(n), xm(n), ym(n)
! in: x(n), y(n) ---> smoothed data xm, ym
real*8 :: sx, sy
real :: xmin, xmax, ldx
integer::i,j,num, count(n), i1, i2
i=1
open(unit=10, file='30minsyuki_ch7.csv')
do while( 1==1 )
read(10, *, END=900) x(i), y(i)
i=i+1
if( i > n ) then
write(0,*) 'Too many data, please change n'
stop
end if
end do
close(10)
900 num=i-1
!do i=1, num
! write(*,*) x(i), y(i)
!end do
!
!stop
! determin xmin xmax
ldx = (log(x(num)) - log(x(1)))/ndiv
xmin = x(1); i1=1
do j=1, ndiv
xmax = exp( ldx*j+log(x(1)) )
sx = 0 ; sy = 0; count(j) = 0
i = i1
! write(*, *) xmin, xmax, 'Averaging'
do while( x(i) >= xmin .AND. x(i) 0) then
xm(j) = sx/count(j)
ym(j) = sy/count(j)
else
xm(j)= -9999
ym(j)= -9999
end if
xmin = xmax
end do
do j=1, ndiv
if(count(j)>0) then
write(*,*) xm(j), ym(j)
end if
end do
end
log_smoothing_mk2.f90
プログラム例をダウンロードするのはここ
玉川 2008.11