我一直在尝试使用 Numerov 方法在一维中求解时间无关薛定谔方程,正如我在网上找到的这个优秀的讲义中所讨论的那样。
Numerov 方法可以求解以下类型的方程:
我们可以将其与时间无关薛定谔方程进行比较:
其中
我们可以使用泰勒展开将方程离散化并将迭代公式写为:
使用已知的谐波振荡器能量,我求解了方程并且我的解决方案运行良好。
我还使用了拍摄方法来确定特定本征状态的能量值,并获得了很好的结果。
我成功地解决了大多数偶数势的薛定谔方程,包括莫尔斯势和双井势。
如果我尝试采用非对称解决方案,就会出现问题。因为我已经考虑到我的波函数的对称性,并且刚刚从到 ,然后根据天气通过将奇偶校验乘以 \psi 将输出输出到文件中,所以的函数是奇数或不是。
但是当我使用相同的算法解决了从到的相同问题时,我可以为 Numerov 方法设计一个通用算法。输出开始变得奇怪。虽然基态解决方案是相同的,但奇态解决方案正在以某种方式反转。
这是我的第一个(工作)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 到 xmax),我使用的是我已经知道的解的属性,如果我求解奇能量状态,波将始终为零。我也在代码中提供了我的初始值声明。我希望这有助于澄清我的问题。