Ir ao conteúdo
  • Cadastre-se

Meu programa não funciona, parece estartudo certo


Posts recomendados

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(){
    // declaração de variaveis
    int i, j, L, n,start,ncfi,k1,k2,k3,k4;
    
    double magnet[5000],magnet_med, S[100][100],p,BJ,T,r, somaup[5000], somadown[5000];

    // constantes
    L=100;
    T=1.8;
    BJ=1/T;
    ncfi=5000;
    
    
    printf("start=?");    
    scanf("%d",&start);
     
     
    if(start==1){
        for(i=1;i<=L;i++){
            for(j=1;j<=L;j++){
                S[j]=1.0;
            }
        }
    }
    else {
        for(i=1;i<=L;i++){
            for(j=1;j<=L;j++){
                r=rand()%10;
                if(r<=5) S[j]=1.0;
                else S[j]=-1.0;
                
            }
        }
    }
        
    for(n=1;n<=ncfi;n++){
       somaup[n]=0.0;
       somadown[n]=0.0;
      
       for(i=0;i<=L;i++){ 
        printf("start=?");    
       
            for(j=1;j<=L;j++){          
               //condições de contorno          
               k1=i-1;
               if(i==1) k1=L; 
               
               k2=i+1;
               if(k2>L)  k2=k2-L;
               
               k3=j-1;
               if(j==1) k3=L;
               
               k4=j+1;
               if(k4>L) k4=k4-L;
          
    
        //calcula o probabilidade de mudar de configuração
        
        p=exp(-2*BJ*(S[k3]*S[j]+S[j]*S[k4]+S[k1][j]*S[j]+ S[j]*S[k2][j])); 
        
                if(n==1) S[j]=S[j];
             else if (p>=1) S[j]=-S[j];
             else{               
               r=(rand()%10)/10;
                if(r<=p) S[j]=-S[j];}
        // cálculo da somaup
        if(S[j]==1) somaup[n]=somaup[n]+1;
            
            // cálculo da somadown
        if(S[j]==-1) somaup[n]=somaup[n]+1;

         //cálculo da magnetização    
               
    magnet[n]=(1/pow(L,2))*(somaup[n]-somadown[n]);
  
                    
           }
           
         
       }
        
    }
    
    magnet_med=0;
         
         for(n=1;n<ncfi;n++){
             
          magnet_med=(magnet_med+magnet[n]);

             
         }  
         
           magnet_med=magnet_med/ncfi;
           
        printf("a media e : %e",magnet_med);
        
         
    
}

Link para o comentário
Compartilhar em outros sites

Se S é uma matriz (S[100][100]) como você está tentando fazer uma atribuição como se de um vetor se tratasse justo aqui:
 

//...
    if ( start == 1 ) {
        for ( i = 1; i <= L; i++ ) {
            for ( j = 1; j <= L; j++ ) {
                S[j] = 1.0; //<------vetor? é uma matriz
            }
        }
//...

O certo não seria s[j]= 1.0? Arrume isso e veja se funciona.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(){
    // declaração de variaveis
    int i, j, L, n,start,ncfi,k1,k2,k3,k4;
    
    double magnet[5000],magnet_med, S[100][100],p,BJ,T,r, somaup[5000], somadown[5000];
    // constantes
    L=100;
    T=1.8;
    BJ=1/T;
    ncfi=5000;
    
    
    printf("start=?");    
    scanf("%d",&start);
     
     
    if(start==1){
        for(i=1;i<=L;i++){
            for(j=1;j<=L;j++){
                S[j]=1.0;
            }
        }
    }
    else {
        for(i=1;i<=L;i++){
            for(j=1;j<=L;j++){
                r=rand()%10;
                if(r<=5) S[j]=1.0;
                else S[j]=-1.0;
                
            }
        }
    }
        
    for(n=1;n<=ncfi;n++){
       somaup[n]=0.0;
       somadown[n]=0.0;
      
       for(i=0;i<=L;i++){ 
        printf("start=?");    
       
            for(j=1;j<=L;j++){          
               //condições de contorno          
               k1=i-1;
               if(i==1) k1=L; 
               
               k2=i+1;
               if(k2>L)  k2=k2-L;
               
               k3=j-1;
               if(j==1) k3=L;
               
               k4=j+1;
               if(k4>L) k4=k4-L;
          
    
        //calcula o probabilidade de mudar de configuração
        
        p=exp(-2*BJ*(S[k3]*S[j]+S[j]*S[k4]+S[k1][j]*S[j]+ S[j]*S[k2][j])); 
        
                if(n==1) S[j]=S[j];
             else if (p>=1) S[j]=-S[j];
             else{               
               r=(rand()%10)/10;
                if(r<=p) S[j]=-S[j];}
        // cálculo da somaup
        if(S[j]==1) somaup[n]=somaup[n]+1;
            
            // cálculo da somadown
        if(S[j]==-1) somaup[n]=somaup[n]+1;
         //cálculo da magnetização    
               
    magnet[n]=(1/pow(L,2))*(somaup[n]-somadown[n]);
  
                    
           }
           
         
       }
        
    }
    
    magnet_med=0;
         
         for(n=1;n<ncfi;n++){
  
          magnet_med=(magnet_med+magnet[n]);
             
         }  
         
           magnet_med=magnet_med/ncfi;
           
        printf("a media e : %e",magnet_med);
       
         
    
}

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...