C==========================================================================                                                                            
C
C   DEFINIÇÃO DAS ENTRADAS DO PROGRAMA
C
C==========================================================================                                                                            
      SUBROUTINE FO( X, F )                                                
C     FUNCAO OBJETIVO
C      ENTRADAS:
C          REAL*8  X  : PONTO A SER AVALIADO 
C      SAIDA:
C          REAL*8  F   : VALOR DA FUNCAO OBJETIVO
C==========================================================================  
      REAL*8 F, X(2)
      F= 4*(X(1)-4)*(X(1)-4) + 4*(X(2)+5)*(X(2)+5)                       
      RETURN                                                                    
      END                                                                                                                                         
C==========================================================================                                                                            
      SUBROUTINE GFO (X , N , GRADF )                                   
C     GRADIENTE DA FC. OBJETIVO                                                 
C      ENTRADAS:
C          REAL*8  X  : PONTO A SER AVALIADO 
C          INTEGER N  : DIMENSAO DE X
C      SAIDA:
C          REAL*8  GRADF : VALOR DE CADA UMA DAS RESTRIÇÕES
C                        A DIMENSAO DEFINIDA PREVIAMENTE É 100
C==========================================================================                                                                            
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
      DIMENSION  X(N) , GRADF(N)                                              
      GRADF = 0.D0                                                          
      GRADF(1) = 8*X(1)-32
      GRADF(2) = 50*X(2) +250 
      RETURN                                                                    
      END                                                                       
C==========================================================================                                                                            
      SUBROUTINE FG ( X, G )                                               
C     RETRIÇÕES DE DESIGUALDADE G
C      ENTRADAS:
C          REAL*8  X  : PONTO A SER AVALIADO 
C          INTEGER N  : DIMENSAO DE X
C          INTEGER M  : DIMENSAO DE G
C      SAIDA:
C          REAL*8  G   : VALOR DE CADA UMA DAS RESTRIÇÕES
C==========================================================================                                                                            
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
      DIMENSION X(2),G(3)                                                     

      G(1) = X(1)
      G(2) = X(2)
      G(3) = X(1)*X(1) + 10*X(2)*X(2) - 1
      RETURN                                                                    
      END SUBROUTINE                                                                                  
C==========================================================================                                                    
      SUBROUTINE GFG ( X , N , M , GG)                                          
C     GRADIENTES DAS RESTRICOES                                                 
C      ENTRADAS:
C          REAL*8  X  : PONTO A SER AVALIADO 
C          INTEGER N  : DIMENSAO DE X
C          INTEGER M  : DIMENSÃO DE G (NUMERO DE RESTRICOES)
C      SAIDA:
C          REAL*8  GG : VALOR DE CADA UMA DAS DERIVADAS DAS RESTRIÇÕES
C                        A DIMENSAO M POR N
C==========================================================================
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
      DIMENSION X(N), GG(M,N)                                                 
C FUNCAO RESTRICAO NUMERO 1
      GG(1,1)=1.D0
      GG(1,2)=0.D0
C FUNCAO RESTRICAO NUMERO 2
      GG(2,1)=0.D0
      GG(2,2)=1.D0
C FUNCAO RESTRICAO NUMERO 3
      GG(3,1)=2.D0*X(1)
      GG(3,2)=2.D0*X(2)
      RETURN                                                                    
      END  SUBROUTINE   

C==========================================================================
      SUBROUTINE  FOM ( X , N , M, FVALOR )                            
C     FC. OBJETIVO MODIFICADA 1                                                 
      IMPLICIT REAL*8 (A-H,O-Z)                                                     
      DIMENSION X(N) ,  G(M)
      CALL FO( X, FVALOR )
      CALL FG( X, G )
      DO ND=1,M
     	  FVALOR = FVALOR + FI ( G , ND )
      END DO                              
      RETURN
      END SUBROUTINE       
C==========================================================================
      SUBROUTINE GFOM (X , N , M, GRADFOM )
C     GRADIENTE DA FC. OBJETIVO MODIFICADA                                      
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
      DIMENSION X(N) , GRADF(N),  G(M), GG(M,N)                                    
      DIMENSION GRADFOM(N)
	  
      CALL FG(X , G)     
      CALL GFO(X , N, GRADF)                                                     
      CALL GFG(X , N , M , GG)  
      GRADFOM = GRADF
      DO ND1= 1 , M
         AUX = DFI ( G , ND1 )
         DO ND=1,N
            GRADFOM(ND) = GRADFOM(ND) + GG(ND1,ND)*AUX
         ENDDO
      ENDDO
      RETURN                                                                    
      END SUBROUTINE                                                                       
C==========================================================================
      SUBROUTINE FUNMODA1(N,X,F,GRAD)                                             
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
      DIMENSION X(N),GRAD(N)                                                    
      M = 3
      CALL FOM ( X , N , M, F )                                                    
      CALL GFOM ( X , N ,M, GRAD )                                                
      RETURN                                                                    
      END                                                                       
C==========================================================================
      FUNCTION FI ( G , NI )                                                    
C     FUNCAO PENALIDADE ESCOLHIDA                                               
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
      COMMON /PENHIP/ U(200) , TAL(200)
      DIMENSION G(200)
      AUX=U(NI)*G(NI)
      TAL2=TAL(NI)*TAL(NI)      
      FI= - AUX + DSQRT ( AUX * AUX + TAL2 )            
      RETURN                                                                    
      END                                                                       
C==========================================================================
      FUNCTION DFI ( G , NI )                                                   
C     DERIVADA DA FC. PENALIDADE ESCOLHIDA                                      
      IMPLICIT REAL*8 (A-H,O-Z)                                         
      COMMON /PENHIP/ U(200) , TAL(200)
      DIMENSION G(200)	  
      AUX=U(NI)*G(NI)
      TAL2=TAL(NI)*TAL(NI)
      DFI = U(NI) * ( -1.D0 + AUX / DSQRT( AUX*AUX + TAL2 ) )           
      RETURN                                                                    
      END                                                                       
                                                          
                                                                          
                                                                                

                                                                                
