用C编码,混淆错误

时间:2016-12-06 05:09:54

标签: c recursion

我正在编写一个代码来数值求解薛定谔量子隧道方程。这在很大程度上是无关紧要的,因为我得到了解决它的递归关系,我有一个初始高斯。我打印我的初始条件并获得高斯,但代码很快崩溃,当我在时间计数器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;
}

0 个答案:

没有答案