风花雪月 发表于 2006-11-21 10:27

打靶法求解非线性常微分方程边值问题

!C      *********************************************************
!C      *               fixed-fixed            *
!C      *********************************************************
      PARAMETER (NVAR=8,N2=3,DELTA=0.1E-1,EPS=0.1E-3)
      DIMENSION V(3),DELV(3),F(3),DV(3),YS(8)
      COMMON HL,Wmax,T
      OPEN(1,FILE='xb1.DAT')
      OPEN(2,FILE='xb2.DAT')
      OPEN(3,FILE='xb3.DAT')
      OPEN(4,FILE='xb4.DAT')
      OPEN(5,FILE='xb5.DAT')
          !WRITE(*,*) ' V(1),V(2),V(3)='
          !READ(*,*)V(1),V(2),V(3)
                V(1)=0.1
                V(2)=0.2
                V(3)=1.0
                HL=40.0
          T=50.0
                X1=0.5
      H1=0.1
      HMIN=1.0E-30
      X2=1.0
                DO 10 J=10,150,1
      W=J/100.0
          Wmax=W/HL
      DELV(1)=DELTA*V(1)
      DELV(2)=DELTA*V(2)
      DELV(3)=DELTA*V(3)
9       CALL SHOOT(NVAR,YS,V,DELV,N2,X1,X2,EPS,H1,HMIN,F,DV)
      WRITE(*,*) W,V(1),V(2),v(3)
      IF(ABS(DV(1)).GT.ABS(EPS*V(1)).OR.ABS(DV(2)).GT.ABS(EPS*V(2)).OR.ABS(DV(3)).GT.ABS(EPS*V(3))) GOTO 9
      WRITE(1,*) W,V(1),V(2),v(3)
      WRITE(2,*) V(3),W
          WRITE(3,*) v(3),v(1)
      WRITE(5,*) v(3),V(2)
10      CONTINUE
      END
      
                SUBROUTINE LOAD(X1,V,Y)
      DIMENSION V(3),Y(8)
      COMMON HL,Wmax,T
      Y(1)=0.0
      Y(2)=0.0
      Y(3)=Wmax
      Y(4)=0.0                                                       
      Y(5)=V(1)          
      Y(6)=V(2)          
      Y(7)=0.0          
          Y(8)=V(3)          
                RETURN
      END
      
                SUBROUTINE SCORE(X2,Y,F)
      DIMENSION Y(8),F(3)
      COMMON HL,Wmax,T
      F(1)=Y(2)
      F(2)=Y(3)
      F(3)=Y(4)
      RETURN
          END
!C
      SUBROUTINE DERIVS(X,Y,DYDX)
      DIMENSION Y(8),DYDX(8)
      COMMON HL,Wmax,T
      R=(T-Y(6)*COS(Y(4))-Y(7)*SIN(Y(4)))/(12.0*HL**2)+1.0
      DYDX(1)=R
      DYDX(2)=R*COS(Y(4))-1.0
      DYDX(3)=R*SIN(Y(4))
      DYDX(4)=Y(5)
          DYDX(5)=R*(-Y(6)*sin(Y(4))+Y(7)*cos(Y(4)))
      DYDX(6)=0.0
      DYDX(7)=R*Y(8)
      DYDX(8)=0.0
          RETURN
      END

                SUBROUTINE SHOOT(NVAR,YS,V,DELV,N2,X1,X2,EPS,H1,HMIN,F,DV)
          EXTERNAL DERIVS,RKQC
          PARAMETER (NP=20)
          DIMENSION V(N2),DELV(N2),F(N2),DV(N2),Y(NP),DFDV(NP,NP),INDX(NP),YS(NVAR)
      CALL LOAD(X1,V,Y)
          CALL ODEINT(Y,NVAR,X1,X2,EPS,H1,HMIN,NOK,NBAD,DERIVS,RKQC)
          CALL SCORE(X2,Y,F)
          DO 12 IV=1,N2
          SAV=V(IV)
          V(IV)=V(IV)+DELV(IV)
          CALL LOAD(X1,V,Y)
      CALL ODEINT(Y,NVAR,X1,X2,EPS,H1,HMIN,NOK,NBAD,DERIVS,RKQC)
      DO 222 J=1,NVAR
222         YS(J)=Y(J)
          CALL SCORE(X2,Y,DV)
          DO 11 I=1,N2
            DFDV(I,IV)=(DV(I)-F(I))/DELV(IV)
11          CONTINUE
          V(IV)=SAV
12          CONTINUE
          DO 13 IV=1,N2
          DV(IV)=-F(IV)
13          CONTINUE
          CALL LUDCMP(DFDV,N2,NP,INDX,DET)
          CALL LUBKSB(DFDV,N2,NP,INDX,DV)
          DO 14 IV=1,N2
          V(IV)=V(IV)+DV(IV)
14           CONTINUE
          RETURN
          END

             SUBROUTINE ODEINT(YSTART,NVAR,X1,X2,EPS,H1,HMIN,NOK,NBAD,DERIVS,RKQC)
      PARAMETER (MAXSTP=10000,NMAX=20,TWO=2.0,ZERO=0.0,TINY=1.E-30)
      COMMON /PATH/KMAX,KOUNT,DXSAV,XP(350),YP(15,350)
      DIMENSION YSTART(NVAR),YSCAL(NMAX),Y(NMAX),DYDX(NMAX)
      X=X1
      H=SIGN(H1,X2-X1)
      NOK=0
      NBAD=0
      KOUNT=0
      DO 11 I=1,NVAR
            Y(I)=YSTART(I)
11      CONTINUE
      XSAV=X-DXSAV*TWO
      DO 16 NSTP=1,MAXSTP
            CALL DERIVS(X,Y,DYDX)
            DO 12 I=1,NVAR
                YSCAL(I)=ABS(Y(I))+ABS(H*DYDX(I))+TINY
12          CONTINUE
            IF (KMAX.GT.0) THEN
                IF (ABS(X-XSAV).GT.ABS(DXSAV)) THEN
                  IF (KOUNT.LT.KMAX-1) THEN
                        KOUNT=KOUNT+1
                        XP(KOUNT)=X
                        DO 13 I=1,NVAR
                        YP(I,KOUNT)=Y(I)
13                      CONTINUE
                        XSAV=X
                  ENDIF
                ENDIF
            ENDIF
            IF ((X+H-X2)*(X+H-X1).GT.ZERO) H=X2-X
            CALL RKQC(Y,DYDX,NVAR,X,H,EPS,YSCAL,HDID,HNEXT,DERIVS)
            IF (HDID.EQ.H) THEN
                NOK=NOK+1
            ELSE
                NBAD=NBAD+1
            ENDIF
            IF ((X-X2)*(X2-X1).GE.ZERO) THEN
                DO 14 I=1,NVAR
                  YSTART(I)=Y(I)
14            CONTINUE
                IF (KMAX.NE.0) THEN
                  KOUNT=KOUNT+1
                  XP(KOUNT)=X
                     DO 15 I=1,NVAR
                        YP(I,KOUNT)=Y(I)
                        IF(I.GT.1) GO TO 15
15                  CONTINUE
                ENDIF
                          RETURN
            ENDIF
            IF (ABS(HNEXT).LT.HMIN)    PAUSE 'Stepsize smaller then minimun.'
            H=HNEXT
16      CONTINUE
      PAUSE'Too many steps.'
      RETURN
      END
         SUBROUTINE RKQC(Y,DYDX,N,X,HTRY,EPS,YSCAL,HDID,HNEXT,DERIVS)
      PARAMETER (NMAX=20,ONE=1.,SAFETY=0.9,ERRCON=6.E-4, FCOR=6.6667E-2)
      EXTERNAL DERIVS
      DIMENSION Y(N),DYDX(N),YSCAL(N),YTEMP(NMAX),YSAV(NMAX),DYSAV(NMAX)
      PGROW=-0.20
      PSHRNK=-0.25
      XSAV=X
      DO 11 I=1,N
            YSAV(I)=Y(I)
            DYSAV(I)=DYDX(I)
11      CONTINUE
      H=HTRY
1       HH=0.5*H
      CALL RK4(YSAV,DYSAV,N,XSAV,HH,YTEMP,DERIVS)
      X=XSAV+HH
      CALL DERIVS(X,YTEMP,DYDX)
      CALL RK4(YTEMP,DYDX,N,X,HH,Y,DERIVS)
      X=XSAV+H
      IF (X.EQ.XSAV) PAUSE 'Stepsize not significant in RKQC.'
      CALL RK4(YSAV,DYSAV,N,XSAV,H,YTEMP,DERIVS)
      ERRMAX=0.
      DO 12 I=1,N
            YTEMP(I)=Y(I)-YTEMP(I)
            ERRMAX=MAX(ERRMAX,ABS(YTEMP(I)/YSCAL(I)))
12      CONTINUE
      ERRMAX=ERRMAX/EPS
      IF (ERRMAX.GT.ONE) THEN
            H=SAFETY*H*(ERRMAX**PSHRNK)
            GOTO 1
      ELSE
            HDID=H
            IF (ERRMAX.GT.ERRCON) THEN
                HNEXT=SAFETY*H*(ERRMAX**PGROW)
            ELSE
                HNEXT=4.*H
            ENDIF
      ENDIF
      DO 13 I=1,N
      Y(I)=Y(I)+YTEMP(I)*FCOR
13      CONTINUE
          !write(4,*) X,y(1)
      !write(5,*) 1-X,y(1)
      RETURN
      END
          SUBROUTINE RK4(Y,DYDX,N,X,H,YOUT,DERIVS)
      PARAMETER (NMAX=20)
      DIMENSION Y(N),DYDX(N),YOUT(N),YT(NMAX),DYT(NMAX),DYM(NMAX)
      HH=H*0.5
      H6=H/6.
      XH=X+HH
      DO 11 I=1,N
            YT(I)=Y(I)+HH*DYDX(I)
11      CONTINUE
      CALL DERIVS(XH,YT,DYT)
      DO 12 I=1,N
            YT(I)=Y(I)+HH*DYT(I)
12      CONTINUE
      CALL DERIVS(XH,YT,DYM)
      DO 13 I=1,N
            YT(I)=Y(I)+H*DYM(I)
            DYM(I)=DYT(I)+DYM(I)
13      CONTINUE
      CALL DERIVS(X+H,YT,DYT)
      DO 14 I=1,N
            YOUT(I)=Y(I)+H6*(DYDX(I)+DYT(I)+2.*DYM(I))
14      CONTINUE
      RETURN
      END
          
          SUBROUTINE LUBKSB(A,N,NP,INDX,B)
      DIMENSION A(NP,NP),INDX(N),B(N)
      II=0
      DO 12 I=1,N
            LL=INDX(I)
            SUM=B(LL)
            B(LL)=B(I)
            IF (II.NE.0) THEN
                DO 11 J=II,I-1
                  SUM=SUM-A(I,J)*B(J)
11            CONTINUE
            ELSE IF (SUM.NE.0.) THEN
                II=I
            ENDIF
            B(I)=SUM
12      CONTINUE
      DO 14 I=N,1,-1
            SUM=B(I)
            IF (I.LT.N) THEN
                DO 13 J=I+1,N
                  SUM=SUM-A(I,J)*B(J)
13            CONTINUE
            ENDIF
            B(I)=SUM/A(I,I)
14      CONTINUE
      RETURN
             END
                  SUBROUTINE LUDCMP(A,N,NP,INDX,D)
      PARAMETER (NMAX=100,TINY=1.0E-20)
      DIMENSION A(NP,NP),INDX(N),VV(NMAX)
      D=1.
      DO 12 I=1,N
            AAMAX=0.
            DO 11 J=1,N
                IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J))
11          CONTINUE
            IF (AAMAX.EQ.0.) PAUSE'Singular matrix.'
            VV(I)=1./AAMAX
12      CONTINUE
      DO 19 J=1,N
            IF (J.GT.1) THEN
                DO 14 I=1,J-1
                  SUM=A(I,J)
                  IF (I.GT.1) THEN
                        DO 13 K=1,I-1
                            SUM=SUM-A(I,K)*A(K,J)
13                      CONTINUE
                        A(I,J)=SUM
                  ENDIF
14            CONTINUE
            ENDIF
            AAMAX=0.
            DO 16 I=J,N
                SUM=A(I,J)
                IF (J.GT.1) THEN
                  DO 15 K=1,J-1
                        SUM=SUM-A(I,K)*A(K,J)
15                  CONTINUE
                  A(I,J)=SUM
                ENDIF
                DUM=VV(I)*ABS(SUM)
                IF (DUM.GE.AAMAX) THEN
                  IMAX=I
                  AAMAX=DUM
                ENDIF
16          CONTINUE
            IF (J.NE.IMAX) THEN
                DO 17 K=1,N
                  DUM=A(IMAX,K)
                  A(IMAX,K)=A(J,K)
                  A(J,K)=DUM
17            CONTINUE
                D=-D
                VV(IMAX)=VV(J)
            ENDIF
            INDX(J)=IMAX
            IF (J.NE.N) THEN
                IF (A(J,J).EQ.0.) A(J,J)=TINY
                DUM=1./A(J,J)
                DO 18 I=J+1,N
                  A(I,J)=A(I,J)*DUM
18            CONTINUE
            ENDIF
19      CONTINUE
      IF (A(N,N).EQ.0.) A(N,N)=TINY
      RETURN
      END

风花雪月 发表于 2006-11-21 10:27

程序的相关说明我没有看到,大家慢慢看吧

julian 发表于 2008-9-29 00:22

好人啊,要是有matlab的就是安逸了哦

风花雪月 发表于 2008-10-4 09:32

原帖由 julian 于 2008-9-29 00:22 发表 http://www.chinavib.com/forum/images/common/back.gif
好人啊,要是有matlab的就是安逸了哦

呵呵,自己翻译一下吧,最好翻译完了贴出来大家分享

dgl0611 发表于 2009-1-1 20:14

楼主,这只是求一个未知值得,要是有两个未知值,能不能用打靶法?

szwstar 发表于 2009-3-23 10:36

有无matlab的相关程序啊

ChaChing 发表于 2009-3-23 11:39

回复 7楼 szwstar 的帖子

搜一下嘛!
http://forum.vibunion.com/forum/thread-19722-1-1.html
http://forum.vibunion.com/forum/thread-19723-1-1.html

小菜 发表于 2009-4-29 01:34

西安交大周纪卿,朱因远的书《非线性振动》,2001年
里面有程序

fanghuikeer 发表于 2009-12-1 16:48

现在正在应用打靶法解决一个问题,特别想知道怎么输出Y(1),Y(2),Y(3),Y(4),Y(5),Y(6),Y(7) ??有没有人做过相关的算例,急死人了!

lylyllly 发表于 2012-5-18 15:41

这里面都是高人那
页: [1]
查看完整版本: 打靶法求解非线性常微分方程边值问题