Procedimiento numérico
Código para calcular el coeficiente de transmisión
Las clases auxiliares Complejo, CMatriz2x2, CVector2 tienen el mismo código que en Sólido lineal
public class Solido {
int N; //número de barreras
static final int MAXBARRERAS=9; //máximo número de barreras
double a=2.0; //separación entre barreras
double b=1.0; //anchura de la barrera
static final double ALTURA=5.0; //altura de la barrera constante
static double MAXENERGIA=10.0;
double x[]; //puntos de discontinuidad de la función potencial
double V[]; //función potencial
Complejo q[];
CVector2 Coef[]; //coeficientes para la función de onda
double Lmax; //máxima longitud de la representación
public Solido(int N, double a, double b){
this.N=N;
this.a=a; //separación entre barreras
this.b=b; //anchura de la barrera
x=new double[2*N+2];
V=new double[2*N+2];
q=new Complejo[2*N+2];
Coef=new CVector2[2*N+2];
Lmax=(MAXBARRERAS+2)*2.0+(MAXBARRERAS+1)*1.0;
for(int j=0; j<2*N+1; j++){
q[j]=new Complejo();
}
for(int j=0; j<2*N+1; j++){
Coef[j]=new CVector2();
}
//puntos de discontinuidad
x[0]=-Lmax/2;
x[2*N+1]=Lmax/2;
x[1]=-N/2*b-((N-1)/2)*a;
if(N%2==1){
x[1]-=b/2;
}else{
x[1]-=a/2;
}
x[2*N]=-x[1];
for(int j=2; j<2*N; j+=2){
x[j]=x[j-1]+b;
x[j+1]=x[j]+a;
}
//potenciales
for(int j=0; j<2*N+1; j+=2){
V[j]=0.0;
if(j==2*N) break;
V[j+1]=ALTURA;
}
}
//calcula el coeficiente de transmisión
double calcular(double E){
CVector2 X=new CVector2(new Complejo(1.0, 0), new Complejo());
Coef[2*N]=X;
CMatriz2x2 R=new CMatriz2x2();
CMatriz2x2 I=new CMatriz2x2();
for(int j=0; j<2*N+1; j++){
q[j]=Complejo.csqrt(E-V[j]);
}
int j=2*N;
while(j>0){
I.inversa(q[j-1], x[j]);
R.matriz(q[j], x[j]);
X=CMatriz2x2.producto(I, CMatriz2x2.producto(R, X));
Coef[j-1]=X;
j--;
};
//coeficiente de trasnmisión
double trans=1.0/Coef[0].a.modulo();
//normaliza los coeficientes, asignado módulo 1
|
