C $B2<$NNc$G$O(B q = 0, g = 1 $B$H$J$C$F$$$k!%(B
C $B6h4V(B [0,1] $B>e$G(B -u''+qu = g $B$r@F<!%G%#%j%/%l>r7o$N2<$G2r$/(B
      PROGRAM SOLVEQ
      PARAMETER (NMAX=9999)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      DIMENSION A(NMAX,NMAX),F(NMAX),X(NMAX)
      WRITE(*,'(1H ,A5,A5,A23,A18)')
     +        'N','H','Numerical solution','Exact solution'
      N=10
      DO 100 J=1,4
        H=1.0D0/N
        CALL SETMAT(A,H,N-1)
        CALL SETVEC(F,H,N-1)
        CALL SOLVE(A,F,X,N-1)
        WRITE(*,'(I6,F8.5,2F20.15)')N,H,X(N/2),SOLTN(DBLE(1)/2)
        N=N*10
  100 CONTINUE
      END
C
C $B%,%&%9$N>C5nK!(B
C
      SUBROUTINE SOLVE(A,F,X,N)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      DIMENSION A(N,N),F(N),X(N)
C $BA0?J>C5n(B
      DO 300 I=1,N
         IMAX=I
         DO 50 K=I+1,N
            IF (DABS(A(IMAX,I)).LT.DABS(A(K,I)))IMAX=K !$B%T%\%C%H$rC5$9(B
   50    CONTINUE
         IF (IMAX.GT.I) CALL SWAP(A,F,I,IMAX,N)  ! $B%T%\%C%H$r8=:_9T$K0\$9(B
         DO 200 J=I+1,N
            FACTOR=A(J,I)/A(I,I)
            DO 100 K=I+1,N
                A(J,K)=A(J,K)-A(I,K)*FACTOR
  100       CONTINUE
            F(J)=F(J)-F(I)*FACTOR
  200    CONTINUE
C         DO 250 K=I+1,N           ! $B<B:]$K$O;H$o$J$$$N$GITMW(B
C            A(K,I)=0.0D0
C  250    CONTINUE
  300 CONTINUE
C $B8eB`BeF~(B
      DO 600 I=N,1,-1
          X(I)=F(I)
          DO 500 J=I+1,N
              X(I)=X(I)-X(J)*A(I,J)
  500     CONTINUE
          X(I)=X(I)/A(I,I)
  600 CONTINUE
      RETURN
      END
C
      SUBROUTINE SWAP(A,F,I,J,N)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      DIMENSION A(N,N),F(N)
C      WRITE(*,*)'SWAP',I,' AND ',J
      DO 100 K=I,N
          DUMMY=A(I,K)
          A(I,K)=A(J,K)
          A(J,K)=DUMMY
  100 CONTINUE
      DUMMY=F(I)
      F(I)=F(J)
      F(J)=DUMMY
      RETURN
      END
C
C $BHyJ,J}Dx<0$NN%;62=$+$i9TNs$r:n$k(B
C
      SUBROUTINE SETMAT(A,H,N)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      DIMENSION A(N,N)
      DO 100 I=1,N
         DO 100 J=1,N
            A(I,J)=0.0D0
  100 CONTINUE
      X=H
      A(1,1)=2/H/H+Q(X)
      X=X+H
      DO 200 I=2,N
         A(I,I)=2/H/H+Q(X)
         A(I-1,I)=-1/H/H
         A(I,I-1)=-1/H/H
         X=X+H
  200 CONTINUE
      RETURN
      END
C
C $B1&JU$N4{CNH!?t$+$iN%;62=%Y%/%H%k$r:n$k(B
C
      SUBROUTINE SETVEC(F,H,N)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      DIMENSION F(N)
      X=H
      DO 100 I=1,N
          F(I)=G(X)
          X=X+H
  100 CONTINUE
      RETURN
      END
C
C $B1&JU$NH!?t$NDj5A(B
C
      DOUBLE PRECISION FUNCTION G(X)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C      G=1.0D0
      G=-(2-12*X+12*X**2)
      RETURN
      END
C
C $B78?t$NH!?t$NDj5A(B
C
      DOUBLE PRECISION FUNCTION Q(X)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      Q=0.0D0
      RETURN
      END

C $B??$N2r$NDj5A(B
C
      DOUBLE PRECISION FUNCTION SOLTN(X)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C      SOLTN=X*(1-X)/2
      SOLTN=X*X*(1-X)*(1-X)
      RETURN
      END
