fortran中稳健局部回归的数据平滑
我有非常振荡的一维速度数据。我希望平滑处理并从数据中删除一些异常值。我通过互联网了解了如何做到这一点,根据调查结果,我为我的数据编写了以下代码fortran中稳健局部回归的数据平滑,fortran,regression,smoothing,Fortran,Regression,Smoothing,我有非常振荡的一维速度数据。我希望平滑处理并从数据中删除一些异常值。我通过互联网了解了如何做到这一点,根据调查结果,我为我的数据编写了以下代码 program smoothing parameter (ni=775) real ulb(ni), copu(ni), ri(ni), temp(ni),wei(ni) real med open(131,file='copy.txt' ) open(130,f
program smoothing
parameter (ni=775)
real ulb(ni), copu(ni), ri(ni), temp(ni),wei(ni)
real med
open(131,file='copy.txt' )
open(130,file='u.txt' )
read(130,'(10000f10.4)') (ulb(i), i=1,ni)
copu=0.
ri=0.
do i=1,ni
copu(i)=ulb(i)
enddo
print*, copu(200)
write(131,'(10000f10.4)') ( copu(i),i=2,ni)
! first smoothing
do i=4,ni-4
copu(i)=(copu(i-3)+copu(i-2)+copu(i-1)+copu(i)+copu(i+1)
& +copu(i+2)+copu(i+3))/7.
if(i.eq.1.or.i.eq.ni) copu(i)=copu(i)
if(i.eq.2.or.i.eq.ni-1) copu(i)=(copu(i+1)+copu(i)+copu(i-1))/3.
if(i.eq.3.or.i.eq.ni-2) copu(i)=(copu(i+2)+copu(i+1)
& +copu(i)+copu(i-1)+copu(i-2))/5.
enddo
write(131,'(10000f10.4)') ( copu(i),i=2,ni)
do k=1,4 ! iteration
! calculating resudial
do i=1,ni
ri(i)=ulb(i)-copu(i)
enddo
print*, ri(200)
! finding median along resudials
do i=1,ni
temp(i)=copu(i)
enddo
call sort(ri,ni)
if(mod(ni,2).eq.0) then
med=((ri(ni/2))+ri(ni/(2+1)))/2.
else
med=ri(ni/(2+1))
endif
print*, k, med
! calculating robust weigths
do i=1,ni
if(abs(ri(i)).ge.6.*med) then
wei(i)=0.
else if(abs(ri(i)).lt.6.*med) then
wei(i)=(1.-(ri(i)/(6.*med))**2)**2
endif
copu(i)=copu(i)+wei(i)*copu(i)
enddo
enddo ! iteration
write(131,'(10000f10.4)') ( copu(i),i=2,ni)
close (131)
end program
! ---------------------------------------------
subroutine sort(ri,ni)
real ri(ni)
do i=1,ni-1
do j=1,ni-1
if(ri(j).gt.ri(j+1)) then
tempu=ri(j)
ri(j)=ri(j+1)
ri(j+1)=tempu
end if
end do
end do
return
end subroutine
我使用了四次多项式简单平滑作为
“第一次平滑”。由于自旋长度的原因,一些异常值拟合得不恰当。所以我决定在我的代码中应用健壮的局部回归。但到目前为止它还不起作用。我遵守了文件的规定。如有任何更正/建议,将不胜感激 “到目前为止还不起作用”是什么意思?代码是否未编译?您是否遇到运行时错误?或者你的代码只是给了你错误的结果?抱歉,模棱两可。代码可以工作,但通过鲁棒局部回归进行平滑不起作用。换句话说,平滑后的值与平滑前的值相同。我需要关于“沿残差查找中值”注释行下面代码的后半部分的建议。虽然没有尝试过该代码,但“ri(ni/(2+1))”不是“ri(ni/2+1)”的拼写错误吗?没错。中间值应由中间两名成员确定。谢谢但情况仍然是一样的。你计算残差并将它们存储在ri中,然后你对ri进行排序,并在计算权重时继续使用它。我很确定那不是你想要的。而且,在第一次平滑过程中,三个if条件永远不会发生,因为您明确地说是4