⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kern_reg.f90

📁 The subroutines glkern.f and lokern.f use an efficient and fast algorithm for automatically adapti
💻 F90
📖 第 1 页 / 共 5 页
字号:
      IF(MOD(i-k,2) == 0) ww=ww+a3(i,k)
      xx=xx+ww*sw(k)
    END DO
    sw(i)=xx
  END DO
  sw(1)=a3(1,1)*sw(1)
ELSE
  DO  i=iord,2,-1
    DO  k=1,i-1
      sw(i)=sw(i)+c(i,k)*sw(k)
    END DO
  END DO
END IF
RETURN
END SUBROUTINE lreg



SUBROUTINE freg(sw, nue, kord, iboun, y, c, icall, a)
!------------------------------------------------------------------
!    SHORT-VERSION: MAY, 1995

!    PURPOSE:

!    FINAL COMPUTATION OF A SMOOTHED VALUE VIA LEGENDRE POLYNOMIALS

!    PARAMETERS :
!                       **************   INPUT   *******************

!            SW(KORD+1):  SUM OF DATA WEIGHTS FOR LEGENDRE POLYNOM.
!            NUE       :  ORDER OF DERIVATIVE
!            KORD      :  ORDER OF KERNEL
!            IBOUN     :  0: INTERIOR KERNEL, ELSE BOUNDARY KERNEL
!            C(KORD+1) :  SEQUENCE OF POLYN. COEFF. FOR BOUND. KERNEL
!            ICALL     :  PARAMETER USED TO INITIALISE COMPUTATION
!                      :   OF A MATRIX
!                       **************    WORK    ******************

!            A(7,7)    :  MATRIX OF COEFFICIENTS
!                       **************   OUTPUT   ******************

!            Y          :  COMPUTED ESTIMATE

!--------------------------------------------------------------------

REAL (dp), INTENT(IN)    :: sw(7)
INTEGER, INTENT(IN)      :: nue
INTEGER, INTENT(IN)      :: kord
INTEGER, INTENT(IN)      :: iboun
REAL (dp), INTENT(OUT)   :: y
REAL (dp), INTENT(IN)    :: c(7)
INTEGER, INTENT(IN OUT)  :: icall
REAL (dp), INTENT(OUT)   :: a(7,7)


INTEGER    :: i, j
REAL (dp)  :: ww
!-
!------- DEFINITION OF LEGENDRE COEFFICIENTS FOR BOUNDARY
IF(icall == 0 .AND. iboun /= 0) THEN
  a(2,2)=2./3.
  a(1,3)=.6
  a(3,3)=.4
  a(2,4)=4./7.
  a(4,4)=8./35.
  a(1,5)=27./63.
  a(3,5)=28./63.
  a(5,5)=8./63.
  a(2,6)=110./231.
  a(4,6)=72./231.
  a(6,6)=16./231.
  a(1,7)=143./429.
  a(3,7)=182./429.
  a(5,7)=88./429.
  a(7,7)=16./429.
  icall=1
END IF
IF(iboun /= 0) THEN
!-
!------- COMPUTATION OF THE SMOOTHED VALUE AT BOUNDARY
  y=c(1)*sw(1)+c(2)*a(2,2)*sw(2)
  DO  j=3,kord+1
    ww=a(j,j)*sw(j)
    DO  i=j-2,1,-2
      ww=ww+a(i,j)*sw(i)
    END DO
    y=y+c(j)*ww
  END DO
ELSE
!-
!------- COMPUTATION OF THE SMOOTHED VALUE AT INTERIOR
  IF(nue == 0) THEN
    IF(kord == 2) y=-.1*sw(3)+.6*sw(1)
    IF(kord == 4) y=(sw(5)-4.*sw(3)+9.*sw(1))/12.
    IF(kord == 6) y=-7.2115379E-02*sw(7)+.25961537*sw(5)  &
        -.4375*sw(3)+.75*sw(1)
  END IF
  IF(nue == 1) THEN
    IF(kord == 3) y=(3.*sw(4)-10.*sw(2))/14.
    IF(kord == 5) y=(-15.*sw(6)+48.*sw(4)-55.*sw(2))/44.
  END IF
  IF(nue == 2) THEN
    IF(kord == 4) y=(-5.*sw(5)+14.*sw(3)-9.*sw(1))/6.
    IF(kord == 6) y=2.01923*sw(7)-5.76923*sw(5)+5.25*sw(3) -1.5*sw(1)
  END IF
  IF(nue == 3) y=4.772727*sw(6)-12.272727*sw(4)+7.5*sw(2)
  IF(nue == 4) y=-36.34615*sw(7)+88.84615*sw(5)-52.5*sw(3)
END IF
!-
RETURN
END SUBROUTINE freg



SUBROUTINE kerncl(t, x, n, b, nue, kord, ny, s, tt, m, y)
!-----------------------------------------------------------------------
!       SHORT-VERSION JANUARY 1995

!       KERNEL SMOOTHING, CONVENTIONAL ALGORITHM,GENERAL
!       DESIGN, LOCAL BANDWIDTH ALLOWED

!  PARAMETERS :

!  INPUT    T(N)         INPUT GRID
!  INPUT    X(N)         DATA, GIVEN ON T(N)
!  INPUT    N            LENGTH OF X
!  INPUT    B            ONE SIDED BANDWIDTH (FOR NY=1 MEAN BANDWIDTH)
!  INPUT    NUE          ORDER OF DERIVATIVE (0-4)
!  INPUT    KORD         ORDER OF KERNEL (<=6)
!  INPUT    S(0:N)       HALF POINT INTERPOLATION SEQUENCE
!  INPUT    NY           0: GLOBAL, 1: LOCAL BANDWIDTH INPUTED IN Y
!  INPUT    TT(M)        OUTPUT GRID
!  INPUT    M            NUMBER OF POINTS TO ESTIMATE
!  INPUT    Y(M)         BANDWITH SEQUENCE FOR NY=1, DUMMY FOR NY=0
!  OUTPUT   Y(M)         ESTIMATED REGRESSION FUNCTION

!-----------------------------------------------------------------------

REAL (dp), INTENT(IN)      :: t(:)
REAL (dp), INTENT(IN)      :: x(:)
INTEGER, INTENT(IN)        :: n
REAL (dp), INTENT(IN)      :: b
INTEGER, INTENT(IN)        :: nue
INTEGER, INTENT(IN)        :: kord
INTEGER, INTENT(IN)        :: ny
REAL (dp), INTENT(IN)      :: s(0:n)
REAL (dp), INTENT(IN)      :: tt(:)
INTEGER, INTENT(IN)        :: m
REAL (dp), INTENT(IN OUT)  :: y(:)


REAL (dp)  :: c(7), c1(7)
INTEGER    :: ist, i, iboun, iord
REAL (dp)  :: bb, bmax, wid, s0, s1, sn, bmin
!-
!------  COMPUTE KERNEL COEFFICIENTS FOR INTERIOR AND SOME CONSTANTS
CALL coffi(nue, kord, c)
iord=kord+1
bb=b
s0=1.5*t(1) - 0.5*t(2)
sn=1.5*t(n)-0.5*t(n-1)
bmin=(sn-s0)*.6D0/DBLE(n)*DBLE(kord-1)
bmax=(s(n)-s(0))*.5
IF(kord == 2) bmin=0.1D0*bmin
ist=1
!-
!-------  LOOP OVER OUTPUT GRID
DO  i=1,m
  IF(ny /= 0) bb=y(i)
  IF(bb > bmax) bb=bmax
  IF(bb < bmin) bb=bmin
  wid=bb
  s1=tt(i)-bb
  iboun=0
!-
!-------  COMPUTE LEFT BOUNDARY KERNEL
  IF(s1 < s(0)) THEN
    s1=s(0)
    wid=bb+bb+s(0)-tt(i)
    CALL coffb(nue,kord,(tt(i)-s(0))/wid,1,c1)
    iboun=1
  END IF
!-
!-------  COMPUTE RIGHT BOUNDARY KERNEL
  IF(tt(i)+bb > s(n)) THEN
    s1=s(n)-(bb+bb)
    wid=tt(i)-s1
    CALL coffb(nue,kord,(s(n)-tt(i))/wid,-1,c1)
    iboun=-1
  END IF
!-
!------  SEARCH FIRST S-POINT OF SMOOTHING INTERVAL
  2 IF(s(ist) <= s1) THEN
    ist=ist+1
    GO TO 2
  END IF
  3 IF(s(ist-1) > s1) THEN
    ist=ist-1
    GO TO 3
  END IF
!-
!-------  IF BANDWIDTH IS TOO SMALL NO SMOOTHING
  IF(s(ist) >= tt(i)+wid .OR. ist == n) THEN
    y(i)=x(ist)
    IF(nue > 0) y(i)=0.
  ELSE
!-
!-----  COMPUTE SMOOTHED DATA AT TT(I)
    IF (iboun /= 0) THEN
      CALL smo(s, x, n, tt(i), wid, nue, iord, iboun, ist, s1, c1, y(i))
    ELSE
      CALL smo(s, x, n, tt(i), wid, nue, iord, iboun, ist, s1, c, y(i))
    END IF
  END IF
END DO
!-
RETURN
END SUBROUTINE kerncl



SUBROUTINE smo(s, x, n, tau, wid, nue, iord, iboun, ist, s1, c, y)
!-----------------------------------------------------------------------
!       SHORT-VERSION JANUARY 1995

!       PERFORMS ONE SMOOTHING STEP

!  PARAMETERS :

!  INPUT    S(0:N)       HALF POINT INTERPOLATION SEQUENCE
!  INPUT    X(N)         DATA
!  INPUT    N            LENGTH OF X
!  INPUT    TAU          POINT WHERE FUNCTION IS ESTIMATED
!  INPUT    WID          ONE SIDED BANDWIDTH
!  INPUT    NUE          ORDER OF DERIVATIVE (0-4)
!  INPUT    IORD          ORDER OF KERNEL POLYNOMIAL
!  INPUT    IBOUN         TYPE OF BOUNDARY
!  INPUT    IST          INDEX OF FIRST POINT OF SMOOTHING INTERVAL
!  INPUT    S1           LEFT BOUNDARY OF SMOOTHING INTERVAL
!  INPUT    C(7)         KERNEL COEFFICIENTS
!  OUTPUT   Y            SMOOTHED VALUE AT TAU

!  WORK     WO(7)        WORK ARRAY

!-----------------------------------------------------------------------

REAL (dp), INTENT(IN)   :: s(0:)
REAL (dp), INTENT(IN)   :: x(:)
INTEGER, INTENT(IN)     :: n
REAL (dp), INTENT(IN)   :: tau
REAL (dp), INTENT(IN)   :: wid
INTEGER, INTENT(IN)     :: nue
INTEGER, INTENT(IN)     :: iord
INTEGER, INTENT(IN)     :: iboun
INTEGER, INTENT(IN)     :: ist
REAL (dp), INTENT(IN)   :: s1
REAL (dp), INTENT(IN)   :: c(7)
REAL (dp), INTENT(OUT)  :: y


REAL (dp)  :: wo(7)
INTEGER    :: jend, ibeg, incr, i, j
REAL (dp)  :: yy, yyy, w, widnue
!-
y=0.
jend=0
ibeg=2
IF(iboun /= 0 .OR. (nue /= 1 .AND. nue /= 3)) ibeg=1
incr=2
IF(iboun /= 0) incr=1
!-
!------  COMPUTE INITIAL KERNEL VALUES
IF(iboun > 0) THEN
  yy=(tau-s1)/wid
  wo(ibeg)=yy
  DO  i=ibeg,iord-incr,incr
    wo(i+incr)=wo(i)*yy
  END DO
ELSE
  DO  i=ibeg,iord,incr
    wo(i)=1.
  END DO
END IF
!-
!------  LOOP OVER SMOOTHING INTERVAL
DO  j=ist,n
  yy=(tau-s(j))/wid
  IF(yy < -1.) THEN
    yy=-1.
    jend=1
  END IF
  yyy=yy
  IF(iboun == 0) THEN
    yy=yy*yy
    IF(nue == 1 .OR. nue == 3) yyy=yy
  END IF
!-
!------  LOOP FOR COMPUTING WEIGHTS
  w=0.
  DO  i=ibeg,iord,incr
    w=w+c(i)*(wo(i)-yyy)
    wo(i)=yyy
    yyy=yyy*yy
  END DO
  y=y+w*x(j)
  IF(jend == 1) EXIT
END DO
!-
!-------  NORMALIZING FOR NUE>0
IF(nue > 0) THEN
  widnue=wid**nue
  y=y/widnue
END IF
!-
RETURN
END SUBROUTINE smo



SUBROUTINE kerncp(t, x, n, b, nue, kord, ny, s, tt, m, y)
!-----------------------------------------------------------------------
!       SHORT-VERSION JANUARY 1997

!       KERNEL SMOOTHING, CONVENTIONAL ALGORITHM,GENERAL
!       DESIGN, LOCAL BANDWIDTH ALLOWED, WITHOUT BOUNDARY KERNELS,
!       JUST NORMALIZING

!  PARAMETERS :

!  INPUT    T(N)         INPUT GRID
!  INPUT    X(N)         DATA, GIVEN ON T(N)
!  INPUT    N            LENGTH OF X
!  INPUT    B            ONE SIDED BANDWIDTH (FOR NY=1 MEAN BANDWIDTH)
!  INPUT    NUE          ORDER OF DERIVATIVE (0-4)
!  INPUT    KORD         ORDER OF KERNEL (<=6)
!  INPUT    S(0:N)       HALF POINT INTERPOLATION SEQUENCE
!  INPUT    NY           0: GLOBAL, 1: LOCAL BANDWIDTH INPUTED IN Y
!  INPUT    TT(M)        OUTPUT GRID
!  INPUT    M            NUMBER OF POINTS TO ESTIMATE
!  INPUT    Y(M)         BANDWITH SEQUENCE FOR NY=1, DUMMY FOR NY=0
!  OUTPUT   Y(M)         ESTIMATED REGRESSION FUNCTION

!-----------------------------------------------------------------------

REAL (dp), INTENT(IN)      :: t(:)
REAL (dp), INTENT(IN)      :: x(:)
INTEGER, INTENT(IN)        :: n
REAL (dp), INTENT(IN)      :: b
INTEGER, INTENT(IN)        :: nue
INTEGER, INTENT(IN)        :: kord
INTEGER, INTENT(IN)        :: ny
REAL (dp), INTENT(IN)      :: s(0:n)
REAL (dp), INTENT(IN)      :: tt(:)
INTEGER, INTENT(IN)        :: m
REAL (dp), INTENT(IN OUT)  :: y(:)

REAL (dp)  :: c(7), c1(7)
INTEGER    :: ist, i, iboun, iord
REAL (dp)  :: bb, bmax, wid, s0, s1, sn, bmin
!-
!------  COMPUTE KERNEL COEFFICIENTS FOR INTERIOR AND SOME CONSTANTS
CALL coffi(nue, kord, c)
iord=kord+1
bb=b
s0=1.5*t(1)-0.5*t(2)
sn=1.5*t(n)-0.5*t(n-1)
bmin=(sn-s0)*.6D0/DBLE(n)*DBLE(kord-1)
bmax=(s(n)-s(0))*.5
IF(kord == 2) bmin=0.1D0*bmin
ist=1
!-
!-------  LOOP OVER OUTPUT GRID
DO  i=1,m
  IF(ny /= 0) bb=y(i)
  IF(bb > bmax) bb=bmax
  IF(bb < bmin) bb=bmin
  wid=bb
  s1=tt(i)-bb
  iboun=0
!-
!-------  COMPUTE LEFT BOUNDARY KERNEL
  IF(s1 < s(0)) THEN
    s1=s(0)
    wid=bb+bb+s(0)-tt(i)
    CALL coffb(nue,kord,(tt(i)-s(0))/wid,1,c1)
    iboun=1
  END IF
!-
!-------  COMPUTE RIGHT BOUNDARY KERNEL
  IF(tt(i)+bb > s(n)) THEN
    s1=s(n)-(bb+bb)
    wid=tt(i)-s1
    iboun=-1
  END IF
!-
!------  SEARCH FIRST S-POINT OF SMOOTHING INTERVAL
  2 IF(s(ist) <= s1) THEN
    ist=ist+1
    GO TO 2
  END IF
  3 IF(s(ist-1) > s1) THEN
    ist=ist-1
    GO TO 3
  END IF
!-
!-------  IF BANDWIDTH IS TOO SMALL NO SMOOTHING
  IF(s(ist) >= tt(i)+wid .OR. ist == n) THEN
    y(i)=x(ist)
    IF(nue > 0) y(i)=0.
  ELSE
!-
!-----  COMPUTE SMOOTHED DATA AT TT(I)
    CALL smop(s, x, n, tt(i), wid, nue, iord, iboun, ist, s1, c, y(i))
  END IF
END DO
!-
RETURN
END SUBROUTINE kerncp



SUBROUTINE smop(s, x, n, tau, wid, nue, iord, iboun, ist, s1, c, y)
!-----------------------------------------------------------------------
!       SHORT-VERSION JANUARY 1997

!       PERFORMS ONE SMOOTHING STEP

!  PARAMETERS :

!  INPUT    S(0:N)       HALF POINT INTERPOLATION SEQUENCE
!  INPUT    X(N)         DATA
!  INPUT    N            LENGTH OF X
!  INPUT    TAU          POINT WHERE FUNCTION IS ESTIMATED
!  INPUT    WID          ONE SIDED BANDWIDTH
!  INPUT    NUE          ORDER OF DERIVATIVE (0-4)
!  INPUT    IORD          ORDER OF KERNEL POLYNOMIAL
!  I

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -