program enshu06d3
implicit none
integer :: seireki,tsuki,joutai,bangou,kosuu
real,dimension(1800) :: kion1retsu,kion1retsu_lowpass
real :: souwa
integer,parameter :: mado_haba=12 ! 移動平均をとる合計のデータ数
integer :: mado_haba_half,bangou_hajime,bangou_owari,souwa_no_kosuu,i
kosuu = 0
do
read(*,'(2i5,i2.2,f6.1)',iostat=joutai)bangou,seireki,tsuki, &
kion1retsu(bangou)
if (joutai /= 0) exit
kosuu = kosuu + 1
end do
mado_haba_half = mado_haba/2 ! 移動平均をとる自分の前後のデータの数
if (mado_haba /= mado_haba_half*2 ) then ! 奇数個のデータで移動平均をとる場合
do bangou = 1,kosuu
bangou_hajime & ! 和をとるデータの最初の番号
= max(bangou-mado_haba_half, 1) ! 必ず 1 以上にとる
bangou_owari & ! 和をとるデータの最後の番号は
= min(bangou+mado_haba_half,kosuu) ! 必ず kosuu 以下にとる
souwa_no_kosuu = bangou_owari-bangou_hajime+1 ! 和をとるデータの総数
souwa = 0.0
do i = bangou_hajime,bangou_owari ! この範囲にあるデータの総和を計算
souwa = souwa + kion1retsu(i)
end do
kion1retsu_lowpass(bangou) = souwa/real(souwa_no_kosuu) ! これが移動平均
end do
else ! 偶数個のデータで移動平均をとる場合
do bangou = 1,kosuu
bangou_hajime & ! 和をとるデータの最初の番号
= max(bangou-mado_haba_half, 1) ! 必ず 1 以上にとる
bangou_owari & ! 和をとるデータの最後の番号は
= min(bangou+mado_haba_half,kosuu) ! 必ず kosuu 以下にとる
souwa_no_kosuu = bangou_owari-bangou_hajime ! 和をとるデータの総数
souwa = 0.0
do i = bangou_hajime,bangou_owari-1
souwa = souwa & ! 台形則による数値積分と似たような方法をとっている
+ 0.5*(kion1retsu(i)+kion1retsu(i+1))
end do
kion1retsu_lowpass(bangou) = souwa/real(souwa_no_kosuu) ! これが移動平均
end do
end if
do bangou = 1,kosuu
write(*,'(i4,2f6.2)')bangou,kion1retsu(bangou),kion1retsu_lowpass(bangou)
end do
end program enshu06d3