log で当間隔に平均化

Fortran 90

x(i), y(i) のデータが、

x(1) y(1)
x(2) y(2)
x(3) y(3)
 :   :
と並んでいる時に、標準入力から読み込んで、 対数軸で見て等間隔 (xが) で、ブロック平均をとるプログラム例

プログラム

ここでは、ndiv = 100 等分にしている。
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)