时间相关的Schrödinger方程酷儿解

时间:2019-04-24 08:13:15

标签: fortran physics gfortran

我正在求解谐波势和初始高斯波函数下随时间变化的薛定inger方程的演化。处理hcut=12m=1,并分离实部和虚部的波函数,就实部和虚部获得两个耦合方程,分别称为yryc分别。

xrange[xi,xf] trange[0,tf]

我使用的方法是:

首先分离实部和虚部的波函数,即yr(x,t)和yc(x,t)。 然后将hcut = 2m = 1对待,并将波函数写为yr[x,t]+i*yc[x,t],从TDSE得到两个耦合方程。

1.D[yr[x,t],t]=-D[yc[x,t],x,x]+V[x]*yc[x,t]
2.D[yc[x,t],t]=D[yc[x,t],x,x]-V[x]*yc[x,t]

然后我将初始波形函数指定为

yr[x,0]=exp[-x^2]
yc[x,0]=0

之后,我尝试使用有限差分方案从y [x,0]中找到y [x,t] 即

yr[x,t+d]=yr[x,t]+d*D[yr[x,t],t]
        =yr[x,t]+d*(D[yc[x,t],x,x]+V[x]*yc[x,t])

在代码中索引为“ a”,在复杂部分索引为“ b”。

y[x[i],t[j]]的值存储为y[i,j],因为数组不能具有真实索引。

我使用的代码如下:

    function v(x) result(s)
    real::s,x
    s=x**2
    end function v

    real::t(10000),x(10000),yc(10000,10000),yr(10000,10000),tf,xi,xf,d
    integer::i,j,k,l,m,n,time
    write(*,*) "time of plot divided by step size"
    read(*,*) time

    tf=50
    xi=-10
    xf=10
    d=0.01
    x(1)=xi
    t(1)=0

    i=1
    do while(x(i).lt.xf)        !input all values of x in x(i) array
    x(i+1)=x(i)+d
    i=i+1
    end do

    n=1
    do while(t(n).lt.tf)        !input all values of t in t(i) array
    t(n+1)=t(n)+d
    n=n+1
    end do




    do j=1,i
    yr(j,1)=exp(-(x(j)-5)**2)       !input of initial wavefunction    
    yc(j,1)=0
    end do

    !calculation of wavefunction at higher time using finite element technique[y[x,t+d]=y[x]+d*D[y[x,t],t] and then replacing the partial derivative with time 
    !using equation 1 and 2 .

    l=1
    do while(l.le.i-2)
    k=1
         do while(t(k).lt.tf)
            yr(l,k+1)=yr(l,k)-(yc(l+2,k)-2*yc(l+1,k)+yc(l,k))/d&    
            +v(x(l))*yc(l,k)*d                                                                             

            yc(l,k+1)=yc(l,k)+(yr(l+2,k)-2*yr(l+1,k)+yr(l,k))/d&   
            -v(x(l))*yr(l,k)*d

            k=k+1

         end do
    l=l+1
    end do




    open(1,file="q.dat")
    do m=1,i-2
    write(1,*) x(m),(yr(m,time))**2+(yc(m,time))**2
    end do
    close(1)

    end

预期结果:y(x,t)^ 2 = yr(x,t)^ 2 + yc(x,t)^ 2

错误:仅t=0.050.06之后,波动函数就没有保持规律,尽管如此,波动函数变得巨大并且最大值变为e30的量级高斯形状几乎保持了预期的不变,因为仅经过了0.05秒。

1 个答案:

答案 0 :(得分:-1)

这实际上不是编码问题,而是数字数学问题,我建议您首先研究一些有关Schrödinger方程和类似PDE的数值方法的教程,然后在专门研究scientific computation的站点上寻求更多知识

首先,您选择的方法不符合解决方案的规范。可以通过在每个时间步进行归一化来节省该费用,但这非常难看。

第二,您选择的方法是显式的(实际上,它可能是无条件不稳定的正向Euler方法)。这意味着可允许的时间步长将受到类似扩散的术语的严格限制(即使在这里很复杂)。 Crank-Nicolson method是一个也可以很好地保留准则的简单隐式方法。这是一种隐式方法,您将必须在每个时间步求解线性方程组。一维系统非常简单,因为系统是三对角线的。还有一些explicit schemes that may work,但它们涉及的更多,而不是您尝试过的幼稚方案。

第三,您不必将系统分为实部和虚部,可以使用复数来完成。

第四,应该将空间网格步长dx和时间步长dt保持为具有已知值的单独变量。您可以计算最终系数d作为它们的比率,但是至少应该知道od dx和dt的值。

第五,您不必在所有时间步中都存储解决方案的所有值。在较大的问题所需的存储时间中,这将很快成为难以置信的费用。存储最后一个时间步长和当前时间步长就足够了。有关多步方法的更多信息,以及有关Runge-Kutta方法的一些辅助步骤。