Niveles discretos de energía

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1232 bytes)next.gif (1211 bytes)

Métodos de Montecarlo

Niveles discretos de energía

El código fuente


Niveles discretos de energía

Examinemos ahora, un sistema cuyas partículas solamente pueden tener ciertos valores de la energía, E0, E1, E2 ... Diremos que las partículas se distribuyen entre los distintos niveles accesibles al sistema, contando el número de partículas que tienen una energía E0, el número de partículas que tienen una energía E1, y así sucesivamente. E0 se denomina el nivel fundamental.

Muchos sistemas físicos se comportan de esta manera, por ejemplo, los átomos de una sustancia paramagnética. La ley de Boltzmann, la más importante de las leyes de la Física Estadística, dice que la probabilidad pi de que una partícula que forma parte de un sistema cuya temperatura es T, esté en un estado de energía Ei es

La constante C se obtiene de la condición de que

Luego,

Se obtendrá el resultado Ei, es decir, una partícula del sistema estará en el nivel de energía Ei, si al sortear un número aleatorio g uniformemente distribuido en el intervalo [0, 1), se cumple la condición (1) definida en el apartado variable aleatoria discreta

        (1)

 

La clase que describe el sistema físico

Veamos ahora el procedimiento que nos calcula el número de partículas en cada nivel de energía cuando se especifica la temperatura y el tamaño del sistema.

FIG17_07.gif (1361 bytes)

La clase que va a describir el comportamiento del sistema la denominaremos Niveles. Sus miembros dato serán, el número de partículas del sistema nParticulas, el número de niveles nNiveles accesibles, un array que guarda la energía de cada nivel energia, un array que guarda la probabilidad p de que una partícula esté situada en cada uno de los niveles de energía, y por último, un array n que guarda el número de partículas en cada nivel de energía. La constante COEFICIENTE es el cociente entre la energía de los niveles expresada en electrón-voltios y la constante de Boltzmann.

Se le pasará al constructor los parámetros que definen el sistema, es decir, el número de partículas y el array que guarda las energías de cada uno de los niveles accesibles.

public class Niveles {
    private static final double COEFICIENTE=11594.2;   //ev/k= 1.6 exp-19/1.38 exp-23
    private int nNiveles;       //número de niveles
    private double[] energia;  	//energía de cada nivel
    public int nParticulas;     //número de partículas del sistema
    public int[] n;        	//número de partículas en cada nivel
    private double[] p;  	//distribución de probabilidades de ocupación
//números aleatorios
    private Random rnd=new Random();

    public Niveles(int nParticulas, double[] energia) {
        this.nParticulas=nParticulas;
        this.energia=energia;
        nNiveles=energia.length;
        n=new int[nNiveles];
        p=new double[nNiveles];
    }
//funciones miembro...
}

La función miembro privada probabilidades, calculará las probabilidades pi cuando se conoce la temperatura T del sistema, y las guardará en el array p. La suma de todas las probabilidades debe de dar la unidad, por lo que se divide p[i] por el último elemento del array p[nNiveles-1].

    private void probabilidades(double T){
        for(int i=0; i<nNiveles; i++){
            p[i]=Math.exp(-energia[i]*COEFICIENTE/T);
            n[i]=0;
        }
//acumulada
        for(int i=1; i<nNiveles; i++){
            p[i]+=p[i-1];
        }
//normalizar
        for(int i=0; i<nNiveles; i++){
            p[i]/=p[nNiveles-1];
        }
    }

La función miembro distribucion, conocerá la temperatura del sistema a través de su parámetro temperatura, llamará a la función  probabilidades, y efectuará el sorteo de las nParticulas partículas del sistema, obteniendo el número n[i] de partículas en cada estado Ei.

Para que una partícula ocupe el nivel de energía Ei se debe cumplir la desigualdad expresada en la fórmula (1)

            aleatorio=rnd.nextDouble();
            for(int j=0; j<nNiveles; j++){
                if(aleatorio<p[j]){
                    n[j]++;

En la definición de la función distribucion se llamará a la función probabilidades y se insertará esta porción de código que se deberá repetir para las nParticulas partículas del sistema.

   public void distribucion(double temperatura){
        double aleatorio;
        probabilidades(temperatura);
        for(int i=0; i<nParticulas; i++){
            aleatorio=rnd.nextDouble();
            for(int j=0; j<nNiveles; j++){
                if(aleatorio<p[j]){
                    n[j]++;
                    break;
                }
            }
        }
    }

Finalmente, la función miembro mostrarOcupacion llamará a la función distribucion y mostrará la distribución de las nParticulas del sistema entre los distintos niveles de energía.

    public void mostrarOcupacion(double temperatura){
        distribucion(temperatura);
        System.out.println("nivel \t ocupación ");
        for(int i=0; i<nNiveles; i++){
            System.out.println(" "+i+" \t "+n[i]);
        }
    }

Para usar la clase Niveles, primero creamos el array energia que guarda la energía de los niveles ordenadas de menor a mayor. Posteriormente, se crea un objeto sistema de la clase Niveles y se le pasa el número de partículas del sistema y el array de los niveles de energía. Por último, se llama desde dicho objeto la función mostrarOcupacion, pasándole en su único parámetro la temperatura absoluta del sistema.

        double[] energia={0.0, 1.0, 2.0, 3.0}; //energía en electrón-voltios
        Niveles sistema=new Niveles(1000, energia);
        sistema.mostrarOcupacion(10000);	//ocupación a 10000 ºK

Si deseamos trazar una gráfica en la que se muestre la ocupación de los distintos niveles en función de la temperatura, escribimos un código similar al siguiente

        double[] energia={0.0, 1.0, 2.0, 3.0}; //energía en eV
        Niveles sistema=new Niveles(1000, energia);
        for(double temp=1000; temp<40000; temp+=1000){ 
		sistema.mostrarOcupacion(temp);
	}

 

El código fuente

disco.gif (1035 bytes) Niveles.java, NivelesApp.java