我正在求解谐波势和初始高斯波函数下随时间变化的薛定inger方程的演化。处理hcut=1
和2m=1
,并分离实部和虚部的波函数,就实部和虚部获得两个耦合方程,分别称为yr
和yc
分别。
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.05
或0.06
之后,波动函数就没有保持规律,尽管如此,波动函数变得巨大并且最大值变为e30
的量级高斯形状几乎保持了预期的不变,因为仅经过了0.05
秒。
答案 0 :(得分:-1)
这实际上不是编码问题,而是数字数学问题,我建议您首先研究一些有关Schrödinger方程和类似PDE的数值方法的教程,然后在专门研究scientific computation的站点上寻求更多知识
首先,您选择的方法不符合解决方案的规范。可以通过在每个时间步进行归一化来节省该费用,但这非常难看。
第二,您选择的方法是显式的(实际上,它可能是无条件不稳定的正向Euler方法)。这意味着可允许的时间步长将受到类似扩散的术语的严格限制(即使在这里很复杂)。 Crank-Nicolson method是一个也可以很好地保留准则的简单隐式方法。这是一种隐式方法,您将必须在每个时间步求解线性方程组。一维系统非常简单,因为系统是三对角线的。还有一些explicit schemes that may work,但它们涉及的更多,而不是您尝试过的幼稚方案。
第三,您不必将系统分为实部和虚部,可以使用复数来完成。
第四,应该将空间网格步长dx和时间步长dt保持为具有已知值的单独变量。您可以计算最终系数d
作为它们的比率,但是至少应该知道od dx和dt的值。
第五,您不必在所有时间步中都存储解决方案的所有值。在较大的问题所需的存储时间中,这将很快成为难以置信的费用。存储最后一个时间步长和当前时间步长就足够了。有关多步方法的更多信息,以及有关Runge-Kutta方法的一些辅助步骤。