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)log_smoothing_mk2.f90 プログラム例をダウンロードするのはここ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
玉川 2008.11