Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fortran中稳健局部回归的数据平滑_Fortran_Regression_Smoothing - Fatal编程技术网

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