Anterior

Niveles de energía de un pozo de potencial

Vamos a resolver un problema clásico de la Física consistente en calcular los niveles de energía de un pozo de potencial de anchura 2a y profundidad H. Los niveles de energía de simetría par se hallan mediante la ecuación trascendente de la energía E.

sin(qa)-k·cos(qa)=0

y los niveles de simetría impar se hallan mediante la ecuación

sin(qa)+q·cos(qa)=0

donde

q= E k= E 0 E

Nuestra estrategia para resolver el problema va a consistir en crear una jerarquía de clases derivadas de la clase base Ecuacion, en las que se redefinan las funciones f(x). En la figura podemos ver la relación jerárquica entre las clases que resuelven este problema.

figura14_05.gif (2050 bytes)

La clase Pozo se deriva de Ecuacion y define las características geométricas de un pozo de potencial, su semianchura a, y de profundidad H. Ya que deriva de una clase abstracta y no redefine la función f(x), es también una clase abstracta. El constructor de la clase derivada Pozo inicializa sus miembros dato a y h, que son la semianchura del pozo de potencial y su profundidad. Ya que los niveles de energía están comprendidos entre 0 y h, definimos la función hallarNiveles para ahorrarnos el pasar los argumentos 0 y h en la llamada a la función miembro hallarRaices de la clase base Ecuacion.

public abstract class Pozo extends Ecuacion {
    protected double a;   //semianchura
    protected double h;   //profundidad
    public Pozo(double a, double h) {
        this.a=a;
        this.h=h;
    }
    public double[] hallarNiveles(double paso){
        hallarRaices(paso, h-paso, paso);
    }
}

Las clases derivadas PozoPar y PozoImpar, de la clase base Pozo, llaman al constructor de la clase base para inicializar los miembros dato comunes a ambas clases: semianchura a del pozo y profundidad h del mismo, y redefinen la función miembro f(x) declarada abstract en la clase base.

public class PozoPar extends Pozo{
    public PozoPar(double a, double h) {
        super(a, h);
    }
    public double f(double x){
        double q=Math.sqrt(x);
        double k=Math.sqrt(h-x);
        double y=k*Math.cos(q*a)-q*Math.sin(q*a);
        return y;
    }
}
public class PozoImpar extends Pozo {
    public PozoImpar(double a, double h) {
        super(a, h);
    }
    public double f(double x){
        double q=Math.sqrt(x);
        double k=Math.sqrt(h-x);
        double y=q*Math.cos(q*a)+k*Math.sin(q*a);
        return y;
    }
}

Para hallar los niveles de energía de un pozo de potencial podemos utilizar varias alternativas. Crear objetos de la clases PozoPar y PozoImpar y llamar desde ellos a la función miembro hallarNiveles de la clase base Pozo.

	PozoPar par=new PozoPar(1, 6);
	double[] nivelesPar=par.hallarNiveles(0.5);
	double[] nivelesImpar=new PozoImpar(1, 6).hallarNiveles(0.5);

Como vimos al estudiar la herencia y el polimorfismo podemos guardar en una variable de la clase base Pozo el valor devuelto por new al crear un objeto de la clase derivada.

	Pozo pozo=new PozoPar(1, 6);
	double[] nivelesPar=pozo.hallarNiveles(0.5);
	pozo=new PozoImpar(1, 6);
	double[] nivelesImpar=pozo.hallarNiveles(0.5);

El polimorfismo, se manifiesta en que la función hallarNiveles llama a la función hallarRaices y ésta a explorar y puntoMedio, todas ellas miembros de la clase base Ecuacion, en estas dos últimas se llama a la función f(x). ¿A cual de las dos funciones f(x) llama?. Justamente a la función f(x) definida en la clase a la que pertenece el objeto que llama a la función hallarNiveles.

Anterior