Anterior

Algoritmo de Metrópolis

Modelo unidimiensional

import java.util.*;
public class Ferromagnetico {
     static final int DIM=100;
     int espin[]=new int[DIM];
//semilla de números aleatorios
     Random rnd=new Random();
     final double J=-1.0; //energia de interacción
     double T;

  public Ferromagnetico() {
//situación inicial 
     for(int i=0; i<DIM; i++){
        espin[i]=1;
     }
  }
   void setNuevo(double T){
     for(int i=0; i<DIM; i++){
        espin[i]=1;
     }
      this.T=T;
   }
  void configuracion(){
       double anteriorEnergia, actualEnergia;
       int elemento;
       for(int i=0; i<espin.length-1; i++){
            anteriorEnergia=energia();
            elemento=(int)((espin.length-1)*rnd.nextDouble());
            espin[elemento]*=-1;             //se acepta el cambio
            actualEnergia=energia();
            if((actualEnergia>anteriorEnergia) && 
(Math.exp((-actualEnergia+anteriorEnergia)/T)<=rnd.nextDouble())){ espin[elemento]=espin[elemento]*(-1); //rechaza el cambio } } espin[espin.length-1]=espin[0]; //toriodal 99 espines } double energia(){ int suma=0; for(int i=0; i<espin.length-1; i++){ suma+=espin[i]*espin[i+1]; } return (J*suma); } }

Modelo bidimiensional

import java.util.*;
public class Ferromagnetico {
     static final int DIM=25;
     int espin[][]=new int[DIM+2][DIM+2];
//semilla de números aleatorios
     Random rnd=new Random();
     private double p[]=new double[5];

  public Ferromagnetico() {
//situación inicial 
     for(int i=1; i<=DIM; i++){
          for(int j=1; j<=DIM; j++){
                    espin[i][j]=1;
          }
     }
     toroidal();
  }
//condiciones de contorno toroidales
  private void toroidal(){
     for(int i=1; i<=DIM; i++){
          espin[i][0]=espin[i][DIM];
          espin[i][DIM+1]=espin[i][1];
     }
     for(int j=1; j<=DIM; j++){
          espin[0][j]=espin[DIM][j];
          espin[DIM+1][j]=espin[1][j];
     }
  }
  void setNuevo(double T, double eInteraccion){
 //0.01 eV/cte Boltzman da 115.492
     double E=eInteraccion*115.492;
     p[4]=Math.exp(-4*E/T);
     p[2]=Math.exp(-2*E/T);
     p[0]=1.0;
  }
  void configuracion(){
     int suma;   //suma de los espines de cuatro elementos
     int i, j;
     for(int k=0; k<DIM*DIM; k++){
          i=1+(int)(rnd.nextDouble()*DIM);
          j=1+(int)(rnd.nextDouble()*DIM);
          suma=espin[i+1][j]+espin[i-1][j]+espin[i][j-1]+espin[i][j+1];
          if(espin[i][j]*suma<=0){
               aceptar(i, j);
          }else if(rnd.nextDouble()<p[Math.abs(suma)]){
               aceptar(i, j);
          }
     }
  }
  void aceptar(int i, int j){
     espin[i][j]=-espin[i][j];
//condiciones de contorno toroidales
     if(i==1)            espin[DIM+1][j]=espin[1][j];
     if(i==DIM)          espin[0][j]=espin[DIM][j];
     if(j==1)            espin[i][DIM+1]=espin[i][1];
     if(j==DIM)          espin[i][0]=espin[i][DIM];
 }
}

 

Anterior