www.pudn.com > Fortran.zip > JCPLX.FOR, change:1994-06-10,size:2337b


 
	SUBROUTINE JCPLX(N,K,M,A,B,C,D,W,ALPHA,EPS, 
     *                   FJ,FCN,XX,F,X,Z,L,XT,XF) 
	DIMENSION A(N),B(N),C(K),D(K),W(K),X(N) 
	DIMENSION XX(N,M),F(M),XT(N),XF(N) 
	DOUBLE PRECISION A,B,C,D,W,XX,F,X,Z,XT,XF,FJ,FR,FG,T 
	REAL NRND1 
	INTEGER R,G 
	DO 10 I=1,N 
10	XX(I,1)=X(I) 
	F(1)=FJ(N,X) 
	DO 100 J=2,M 
	  DO 20 I=1,N 
	    XX(I,J)=A(I)+(B(I)-A(I))*NRND1(T) 
	    X(I)=XX(I,J) 
20	  CONTINUE 
30	  R=1 
	  G=0 
40	  IF ((A(R).LE.X(R)).AND.(B(R).GE.X(R))) THEN 
	    R=R+1 
	    IF (R.LE.N) GOTO 40 
	  ELSE 
	    G=1 
	  END IF 
	  IF (G.EQ.0) THEN 
	    CALL FCN(N,K,X,C,D,W) 
	    R=1 
60	    IF ((C(R).LE.W(R)).AND.(D(R).GE.W(R))) THEN 
	      R=R+1 
	      IF (R.LE.K) GOTO 60 
	    ELSE 
	      G=1 
	    END IF 
	  END IF 
	  IF (G.NE.0) THEN 
	    DO 80 R=1,N 
	      Z=0.0 
	      DO 70 G=1,J-1 
70	      Z=Z+XX(R,G)/(J-1.0) 
	      XX(R,J)=(XX(R,J)+Z)/2.0 
	      X(R)=XX(R,J) 
80	    CONTINUE 
	    GOTO 30 
	  END IF 
	  F(J)=FJ(N,X) 
100	CONTINUE 
 
	L=1 
110	FR=F(1) 
	R=1 
	DO 120 I=2,M 
	  IF (F(I).GT.FR) THEN 
	    R=I 
	    FR=F(I) 
	  END IF 
120	CONTINUE 
	G=1 
	J=1 
	FG=F(1) 
	IF (R.EQ.1) THEN 
	  G=2 
	  J=2 
	  FG=F(2) 
	END IF 
	DO 130 I=J+1,M 
	  IF (I.NE.R) THEN 
	    IF (F(I).GT.FG) THEN 
	      G=I 
	      FG=F(I) 
	    END IF 
	  END IF 
130	CONTINUE 
	DO 150 I=1,N 
	  XF(I)=0.0 
	  DO 140 J=1,M 
	    IF (J.NE.R) XF(I)=XF(I)+XX(I,J)/(M-1.0) 
140	  CONTINUE 
	  XT(I)=(1.0+ALPHA)*XF(I)-ALPHA*XX(I,R) 
150	CONTINUE 
160	Z=FJ(N,XT) 
	IF (Z.GT.FG) THEN 
	  DO 180 I=1,N 
180	  XT(I)=(XT(I)+XF(I))/2.0 
	  GOTO 160 
	END IF 
	J=0 
	DO 190 I=1,N 
	  IF (A(I).GT.XT(I)) THEN 
	    XT(I)=XT(I)+0.000001 
	    J=1 
	  END IF 
	  IF (B(I).LT.XT(I)) THEN 
	    XT(I)=XT(I)-0.000001 
	    J=1 
	  END IF 
190	CONTINUE 
 
	IF (J.NE.0) GOTO 160 
	CALL FCN(N,K,XT,C,D,W) 
	J=1 
200	IF ((C(J).LE.W(J)).AND.(D(J).GE.W(J))) THEN 
	  J=J+1 
	  IF (J.LE.K) GOTO 200 
	END IF 
	IF (J.LE.K) THEN 
	  DO 210 I=1,N 
210	  XT(I)=(XT(I)+XF(I))/2.0 
	  GOTO 160 
	END IF 
	DO 220 I=1,N 
220	XX(I,R)=XT(I) 
	F(R)=Z 
	FR=0.0 
	FG=0.0 
	DO 230 J=1,M 
	  FR=FR+F(J)/M 
	  FG=FG+F(J)*F(J) 
230	CONTINUE 
	FR=(FG-M*FR*FR)/(M-1.0) 
	IF (FR.GE.EPS) THEN 
	  L=L+1 
	  IF (L.LT.201) GOTO 110 
	END IF 
	DO 250 I=1,N 
	  X(I)=0.0 
	  DO 240 J=1,M 
240	  X(I)=X(I)+XX(I,J)/M 
250	CONTINUE 
	Z=FJ(N,X) 
	RETURN 
	END