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