- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过 Numerov 方法解决薛定谔问题,但我遇到了一些麻烦。我正在用 C++ 编程,所以这是我的代码:
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
double x_min=-4.0 , x_max=4.0;
int N=2000;
double r=(x_max-x_min)/(1.0*N);
double d=2.0;
double p=0.4829; // 2m/(hbar^2)
double Vo=20.0; // Altura del pozo
double x_m=0.1; //Matching point
int i_x_m=(x_m-x_min)/r;
double Control=-123456789;
double SlopeLeft,SlopeRight;
double PAR;
double K2(double x, double E);
double NumerovL(int i, double k21, double k22, double k23, double Y[]);
double NumerovR(int i, double k21, double k22, double k23, double Y[]);
double FuncLeft(double E, double Y[]);
double FuncRight(double E, double Y[]);
void PrintFunc(double Y[]);
void Normalizar(double Y[]);
double f(double E, double Y[]);
double Biseccion(double a, double b, double Y[]);
//=========================MAIN===============================
int main(int argc, char **argv)
{
double Y[N+1]; // Función de Onda
double paso=0.02; // Escala en la que se varia la energía
double Eo=0;
for(double E=0 ; E<=Vo ; E+=paso) // Cálculo de las funciones IMPARES
{
PAR=-1;
Eo=Biseccion(E,E+paso,Y);
if(Eo != Control && SlopeRight*SlopeLeft<0.)
{
Y[i_x_m]=FuncRight(Eo,Y);
Y[i_x_m]=FuncLeft(Eo,Y);
Normalizar(Y);
PrintFunc(Y);
}
}
for(double E=0 ; E<=Vo ; E+=paso) // Cálculo de las funciones PARES
{
PAR=1;
Eo=Biseccion(E,E+paso,Y);
if(Eo != Control && SlopeRight*SlopeLeft>0.)
{
Y[i_x_m]=FuncRight(Eo,Y);
Y[i_x_m]=FuncLeft(Eo,Y);
Normalizar(Y);
PrintFunc(Y);
}
}
return 0;
}
//=========================FUNCIONES===============================
double K2(double x, double E)
{
double k2;
if(fabs(x)<=d)
{
k2=p*E;
return k2;
}
else
{
k2=p*(E-Vo);
return k2;
}
}
double NumerovL(int i, double k21, double k22, double k23, double Y[])
{ // Para la función de Onda Izquierda
double A1,B1,C1,N;
A1=2.0*(1.0-(5.0/12.0)*r*r*k21)*Y[i-1];
B1=(1.0+(1.0/12.0)*r*r*k22)*Y[i-2];
C1=1.0+(1.0/12.0)*r*r*k23;
N=(A1-B1)/(C1);
return N;
}
double NumerovR(int i, double k21, double k22, double k23, double Y[])
{ // Para la función de Onda Derecha
double A1,B1,C1,N;
A1=2.0*(1.0-(5.0/12.0)*r*r*k21)*Y[i+1];
B1=(1.0+(1.0/12.0)*r*r*k22)*Y[i+2];
C1=1.0+(1.0/12.0)*r*r*k23;
N=PAR*(A1-B1)/(C1);
return N;
}
double FuncLeft(double E, double Y[])
{
double k21,k22,k23,Yleft,b;
b=sqrt(p*(Vo-E));
Y[0]=exp(b*x_min);
Y[1]=exp(b*(x_min+r));
for(int i=2 ; i<i_x_m ; i++) // Se calcula la función de Onda Izquierda
{
k21=K2(x_min+(i-1)*r,E);
k22=K2(x_min+(i-2)*r,E);
k23=K2(x_min+i*r,E);
Y[i]=NumerovL(i,k21,k22,k23,Y);
if(i==i_x_m-1) //Función de Onda Izquierda en el Matching point
{
k21=K2(x_min+(i)*r,E);
k22=K2(x_min+(i-1)*r,E);
k23=K2(x_min+(i+1)*r,E);
Yleft=NumerovL(i+1,k21,k22,k23,Y);
}
}
SlopeLeft=(Yleft-Y[i_x_m-1])/r;
return Yleft;
}
double FuncRight(double E, double Y[])
{
double k21,k22,k23,Yright,b;
b=sqrt(p*(Vo-E));
Y[N]=PAR*exp(-b*(x_min+N*r));
Y[N-1]=PAR*exp(-b*(x_min+(N-1)*r));
for(int i=N-2 ; i>i_x_m; i--) // Se calcula la función de Onda Derecha
{
k21=K2(x_min+(i+1)*r,E);
k22=K2(x_min+(i+2)*r,E);
k23=K2(x_min+i*r,E);
Y[i]=PAR*NumerovR(i,k21,k22,k23,Y);
if(i==i_x_m+1) //Función de Onda Derecha en el Matching point
{
k21=K2(x_min+(i)*r,E);
k22=K2(x_min+(i+1)*r,E);
k23=K2(x_min+(i-1)*r,E);
Yright=NumerovR(i-1,k21,k22,k23,Y);
}
}
SlopeRight=PAR*(Y[i_x_m+1]-Yright)/r;
return Yright;
}
void PrintFunc(double Y[])
{
for(int i=0 ; i<=N+1 ; i++)
{
cout << x_min+i*r << "\t" << Y[i] << endl;
}
}
void Normalizar(double Y[])
{
double S=0;
for(int i=0 ; i<=N+1 ; i++)
{
S += Y[i]*Y[i]*r;
}
S=sqrt(S);
for (int i=0 ; i<=N+1 ; i++)
{
Y[i]=Y[i]/S;
}
}
double f(double E, double Y[])
{
double F;
F=FuncLeft(E,Y)-PAR*FuncRight(E,Y);
return F;
}
double Biseccion(double a, double b, double Y[])
{
double Tol=0.00001; //Tolerancia para encontrar la raiz
double RET=-123456789;
if(f(a,Y)*f(b,Y)<0)
{
while(fabs(a-b)>Tol)
{
double x_m,fa,fm;
fa=f(a,Y);
x_m=(a+b)/2.0;
fm=f(x_m,Y);
//fb=f(b);
if(fa*fm<0)
{
b=x_m;
//RET=b;
}
else
{
a=x_m;
//RET=a;
}
}
RET=a;
}
return RET;
}
基本上代码会占用所有能量,即 0<E<Vo
和函数“Biseccion”在能量 E
和 E+step
之间应用二分法算法。因此,该函数找到左右(来自 Numerov Method )波函数匹配的特征能量。
代码编译完美,但当我想绘制奇怪的解决方案时,问题就出现了。我得到了两个令人满意的解决方案,但另外两个它的函数是连续的而不是导数。我获得的情节的 Here is an example。
如您所见,有两个图表不是问题的令人满意的解决方案。
如果有人能帮我解决这个问题,我将不胜感激。
最佳答案
您的代码没有任何问题。您得到的本征函数存在歧义,因为重新缩放的本征函数也将是一个解决方案(当然在施加归一化条件之前)。
在某些情况下,匹配条件会失败,您无法在匹配点处获得连续导数,但在这些情况下,您只需重新调整左侧或右侧特征函数之一,即可获得平滑的导数。然后您将整个事情标准化,瞧。
关于C++:一维方孔的 Numerov 方法的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025739/
我想检测(并关闭)封闭网格的开口和孔洞/镂空部分。我知道对于一个开放的网格,这可以通过找到边界边(只属于一个三角形的边)来完成,如 here 所述。 . 但是对于不存在此类边界边的封闭网格呢?下面是一
我试过https://docs.konghq.com/getting-started-guide/2.1.x/expose-services/我也有本地服务器:kong/2.2.1我可以同时注册服务和
我在我的应用程序中使用 logback(SiftingAppender 和 RollingFileAppender)。每当请求进来时,它们将根据 url 查询中的 id 记录到不同的文件中。 这工作得
我在 ARKit 上遇到了一个问题,我需要帮助。我正在做一个小演示,我在场景中放置了一个简单的 SCNTorus 几何体,我试图将一个小球 (SCNSphere) 扔进环面孔中。问题是球在中间弹跳而不
编辑 经过更多研究但仍然没有解决方案,我添加了实质性编辑以及指向 .shp 文件的链接。 The shape file is included here 我有一个包含 9 个多边形的 SpatialP
有没有一种简单直接的方法可以使用 opencv 3.1 python 从图像中提取内部轮廓(孔)? 我知道我可以使用“区域”作为条件。但是,如果我更改图像分辨率,“区域”就不一样了。 例如,这张图片:
我正在审查 Angular 中的模板项目 引导组件有一个如下所示的 HTML 模板。很有道理。应用程序标题、应用程序侧边栏等标签将包含由带有匹配选择器的组件提供的内容。这一切都检查出来了。
案例场景: $ cat Status.txt 1,connected 2,connected 3,connected 4,connected 5,connected 6,connected 7,dis
我是一名优秀的程序员,十分优秀!