使用 Numerov 方法的一维薛定谔方程解

计算科学 计算物理学
2021-12-03 21:13:46

我一直在尝试使用 Numerov 方法在一维中求解时间无关薛定谔方程,正如我在网上找到的这个优秀的讲义中所讨论的那样。

Numerov 方法可以求解以下类型的方程:

d2ydx2=g(x)y(x)+s(x)

我们可以将其与时间无关薛定谔方程进行比较:

d2ψdx2=2mh¯2(EV)ψ

其中g(x)=2mh¯2(EV)

我们可以使用泰勒展开将方程离散化并将迭代公式写为:

ψi+1=ψi[256h2gi]ψi1[1+h212gi1](1+h212gi)

使用已知的谐波振荡器能量,我求解了方程并且我的解决方案运行良好。

我还使用了拍摄方法来确定特定本征状态的能量值,并获得了很好的结果。

谐波振荡器的第一能量状态的解决方案(使用 gnuplot 绘制)

我成功地解决了大多数偶数势的薛定谔方程,包括莫尔斯势和双井势。

如果我尝试采用非对称解决方案,就会出现问题。因为我已经考虑到我的波函数的对称性,并且刚刚 ,然后根据天气通过将奇偶校验乘以 \psi 将输出输出到文件中,所以的函数是奇数或不是。 ψx=0x=xmaxψ

但是当我使用相同的算法解决了从的相同问题时,我可以为 Numerov 方法设计一个通用算法。输出开始变得奇怪。虽然基态解决方案是相同的,但奇态解决方案正在以某种方式反转。x=xmaxx=xmax

跨整个网格计算时相同问题的解决方案


这是我的第一个(工作)Numerov 算法程序的一部分。(忽略signchange计数器我用它来确定拍摄方法的节点数)

cout<<"Enter mesh number"<<endl;
 cin>>n;

 cout<<"Enter maximum value of x"<<endl; 
 cin>>xmax;
 dx=xmax/n;

 if (nodes % 2==0) //Even Nodes, function is even function , i.e. y(-1) =      y(1) and f(-1) = f (1); Thus using algorithm!
        {
      y[0]=1.0;
      y[1]=( y[0]*( 12.0 - 10.0 *f[0] ) )/( 2*f[1] );
    }
  else //nodes are odd, i.e there is a node at x=0;
    {
      y[0]=0;
      y[1]=dx;           //arbitrary small value
    }

    signchange=0;

    //outward integration using algorithm and counting number of sign changes//

 for(int i=1; i <= n; i++) 

    {
      y[ i+1 ]= ( ( 12.0 - 10.0*f[i] )*y[i] -( y[i-1]*f[i-1] ) ) / f[i+1]; 

     if (y[i] != copysign(y[i],y[i+1]))  
       ++signchange;
    }
//For Output :

if (nodes % 2 == 0) 
    p=1;
    else
    p=-1;
    for (int i = n; i > 0; --i)
    file<<setw(1)<<-1*x[i]<<setw(15)<<p*y[i]<<setw(15)<<y[i]*y[i]<<setw(15)<<V[i]<<endl;

    //-------x<0-------//
    for (int i = 0; i <= n; ++i)
    file<<setw(1)<<x[i]<<setw(15)<<y[i]<<setw(15)<<y[i]*y[i]<<setw(15)<<V[i]<<endl;

这是给我反向输出的第二个程序的一部分。我在整个网格中迭代的地方

cout<<"Enter maximum value of x"<<endl;
cin>>xmax;

xmin=-1*xmax;

h=(2*xmax)/n;

y[0]=0;
    y[1]=h;

    /*calculating the wave function psi or y at all points for Energy e*/
        for(int i=1; i <= n; i++) 

    {
      y[ i+1 ]= ( ( 12.0 - 10.0*f[i] )*y[i] -( y[i-1]*f[i-1] ) ) / f[i+1]; 

     if (y[i] != copysign(y[i],y[i+1]))  
       ++signcount;
    }

我很想知道为什么会这样。这对我来说没有意义。但我也是计算物理学的初学者。另外我想知道解决非对称势方程的最佳方法是什么,例如库伦势(逆 R)。

编辑:因为我试图解决谐波振荡器问题,所以波函数应该在两边都绑定。所以我将作为 0。而作为一些随机的小值,稍后将在波函数归一化时将其考虑在内。这适用于我在整个网格中求解方程时的情况,从ψ0ψ1xmaxxmax

但是当我求解对称势方程时(即从 0 到 xmax),我使用的是我已经知道的解的属性,如果我求解奇能量状态,波将始终为零。我也在代码中提供了我的初始值声明。我希望这有助于澄清我的问题。ψx=0

0个回答
没有发现任何回复~