Anterior

Procedimiento numérico

Código del procedimiento numérico que calcula las bandas de energía de un sólido lineal.

1 cos ( k 2 a ) cosh ( k 3 b ) + k 3 2 k 2 2 2 k 2 k 3 sin ( k 2 a ) sinh ( k 3 b ) 1 .

public abstract class Raices {
     static final double E1=1.0e-15;     //cota de errores
     static final double E2=0.0001;
     static final int MAXITERACCION=100;
     static final int MAXNIVELES=10;
	double a;	                                //anchura
     double b;                               //separación
	static final double H=5.0  //profundidad del pozo;
 //resultados
	double Ceros[]=new double[MAXNIVELES];      // ceros de la funcóón
	int nCeros=0;     // número de ceros de la función
     double DE=0.05;   //paso de exploración en la búsqueda de ceros

	abstract double f(double E);

  public Raices(double a, double b) {
     this.a=a;
     this.b=b;
  }
//procedimiento del punto medio
 double punto_medio(double inf, double sup, Boolean bError){
	double med, inter, ini;
	int j=0;   //cuenta el úúmero de iteraciones
	ini=f(inf);

	do{
		med=(inf+sup)/2;
		inter=f(med);
		if(Math.abs(inter)<E1) 					return med;
		if(Math.abs((sup-inf)/med)<E2) 		     return med;

		if(inter*ini<0)
			sup=med;
		else{
			inf=med;
			ini=inter;
		}
		j++;
	}while(!(j==MAXITERACCION));
	bError=new Boolean(true);
	return med;
}
 //calcula en un intervalo entre dos discontinuidades
 void calcular(double E_inf, double E_sup){
     if((E_inf>E_sup)||(Math.abs(E_sup-E_inf)<=DE))   return;

	double inf, sup;
	double ini, fin;
	double raiz;
	Boolean Error=new Boolean(false);

	inf=E_inf+DE;
	ini=f(inf);
     sup=inf+DE;
     while(sup<E_sup-DE){
          fin=f(sup);
          if(ini*fin>0){
               ini=fin;
               inf=sup;
               sup=inf+DE;
               continue;
          }
          raiz=punto_medio(inf, sup, Error);
          if (!Error.booleanValue()){
               Ceros[nCeros]=raiz;
               nCeros++;
          }
          Error=new Boolean(false);
          ini=fin;
          inf=sup;
          sup=inf+DE;
     }
 }
}
public class SolidoKp extends Raices {
     double cte;
     int nBanda;
     double banda[]=new double[7];

  public SolidoKp(double a, double b) {
     super(a, b);
     nBanda=0;
     cte=0;
  }
  double f(double E){
     double q=Math.sqrt(E);
     double k=Math.sqrt(H-E);
     double sinh=(Math.exp(k*b)-Math.exp(-k*b))/2;
     double cosh=(Math.exp(k*b)+Math.exp(-k*b))/2;
     return(Math.cos(q*a)*cosh+(k*k-q*q)/(2*q*k)*Math.sin(q*a)*sinh+cte);
  }
  void hallarBandas(){
     cte=-1.0;
     nCeros=0;
     calcular(0.0, H);

     cte=1.0;
     calcular(0.0, H);
     for(int i=0; i<nCeros; i++){
          banda[i]=Ceros[i];
     }
     nBanda=nCeros;
     if(nBanda%2==1){
          banda[nBanda]=H;
          nBanda++;
     }
     ordenar();
     cte=0;
  }
//ordena según el valor de la energía
 void ordenar(){
     double d;
     for(int izq=1; izq<nBanda; ++izq){
          for(int der=nBanda-1; der>=izq; --der){
               if(banda[der-1]>banda[der]){
                    d=banda[der-1];
                    banda[der-1]=banda[der];
                    banda[der]=d;
               }
          }
     }
 }

 }
Anterior