我正在编写一个代码来数值求解薛定谔量子隧道方程。这在很大程度上是无关紧要的,因为我得到了解决它的递归关系,我有一个初始高斯。我打印我的初始条件并获得高斯,但代码很快崩溃,当我在时间计数器b = 20打印它已经完全搞砸了。有人可以帮忙吗?有别人的代码是成功的,但我无法弄清楚我做错了什么:http://helium.bradley.edu/PICUP/code/tdse/tdse_tunneling_Leapfrog.c
编辑:对不起,我不是很擅长这个。我修改了我在代码中更改的部分以进行调试。我已经尝试以不同的时间间隔打印出Psi,其中b ==的if语句总是给我奇怪的数据,应该是绝对正面的但是我得到一些负值等等。我打印的数据经常含糊不清高斯,但根本不是我所期待的。它应该在每个点输出一个正常的平移高斯,除了在线下相当远的电位v附近。 c == 999语句是捕获最终的Psi并确保它不超过输入数组的大小。这是我的代码:
int main(){
double s, dt, dx, w, xc, k0, RePsi[1000], v[1000], RePsi0[1000], ImPsi[1000], ImPsi0[1000], x[1000], Psi[1000];
int tstep, xstep, a, b, c;
FILE *P, *Q;
dt=.001;
dx=.01;
w=1;
xc=2;
k0=1;
a=0;
b=1;
c=1;
s=(dt)/(dx*dx);
tstep=1000;
xstep=1000; //up to this point we call and define variables
Q=fopen("Init.txt", "w");
while(a<=500) {
if((a>=((double)xstep*.5)) && (a<=((double)xstep*.51))){
v[a]=6000;
}
else(v[a]=0); //this loop establishes the potential wall
x[a]=((double)a)*dx; //this establishes the x-axis in appropriate units
RePsi[a]=(exp(-(pow((x[a]-xc),2))/(pow(w,2))))*(cos(k0*x[a]));
if(RePsi[a]<.0000001){RePsi[a]=0;}
RePsi0[a]=RePsi[a]; //This establishes initial RePsi and gives a RePsi0 for the leapfrog
ImPsi[a]=(exp(-(pow((x[a]-xc),2))/(pow(w,2))))*(sin(k0*x[a]));
if(ImPsi[a]<.0000001){ImPsi[a]=0;}
ImPsi0[a]=ImPsi[a]; //Same as above for ImPsi
Psi[a]=pow(RePsi[a],2)+pow(ImPsi[a],2);
if(Psi[a]<.00001){Psi[a]=0;} //This establishes the initial |Psi|^2
a++;
}
for(a=1; a<xstep; a++){
fprintf(Q, "%lf, ", Psi[a]);
}
P=fopen("Psii.txt","w");
for(b=1; b<tstep; b++){
for(c=1; c<xstep; c++){
if(c==999){
ImPsi[c]=(ImPsi[c]) + (s*RePsi[c]) + ((s*RePsi[c-1]-2*(s+v[c]*dt))*RePsi[c]); //Leapfrog for ImPsi
Psi[c]=pow(RePsi0[c],2)+ImPsi[c]*ImPsi0[c]; //Calculate |Psi|^2
ImPsi0[c]=ImPsi[c]; //Update ImPsi0
}
else if(fmod(b,2)==0){
RePsi[c]=(RePsi[c]) - (s*ImPsi[c+1]) - (s*ImPsi[c-1]) + ((2*(s+v[c]*dt))*ImPsi[c]); //Leapfrog for RePsi
Psi[c]=(RePsi[c]*RePsi0[c])+(pow(ImPsi0[c],2)); //Calculate |Psi|^2
RePsi0[c]=RePsi[c]; //Update RePsi0
}
if(b==20){
fprintf(P, "%lf, ", Psi[c]);
break;
}
else if(fmod(b,2)==1){
ImPsi[c]=(ImPsi[c]) + (s*RePsi[c+1]) + (s*RePsi[c-1]) - (2*(s+v[c]*dt)*(RePsi[c])); //Leapfrog for ImPsi
Psi[c]=pow(RePsi0[c],2)+ImPsi[c]*ImPsi0[c]; //Calculate |Psi|^2
ImPsi0[c]=ImPsi[c]; //Update ImPsi0
}
}
}
return 0;
}