
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 |
