物理

差分化表示

天下武功出少林,物理中经典光学问题都全部用麦克斯韦方程组描述,量子力学的关键则是薛定谔方程。很多经典的量子物理模型如无限深势阱、简谐振子等模型,薛定谔方程的解都可以解析的表示,但是大部分物理系统得用数值方法来计算。

本篇笔记将会总结如何通过数值方法分析特定物理系统的本征值以及本征矢量。主要参考了该回答:
Numerical solution to Schrödinger equation - eigenvalues

一维空间中一般薛定谔方程可以表示为:

我们假设势能项不含时间,考虑稳态的薛定谔方程,并且近似认为,此时相应的方程变为

采用差分方法,格点化

同时二阶求导近似为

将 $\Psi(x{0}),\Psi(x{1}),…,\Psi(x_{N})$ 写成矩阵形式

那么原方程可以写为

此时可以写为矩阵形式,

此时就是差分离散后的微分方程,通过求解H的本征值,就可以计算量子系统的本质值以及本征矢量了。

无限深势阱模型

现在一无限深势阱模型为例,演示如何通过上述的本征方法数值计算本征模式,并与解析结果进行对比。无限深势阱的势函数为

无限深势阱的薛定谔方程可以表示为

其本征函数可以直接写出来

为了计算方便,令

下面是用Mathematica数值计算的本征值和理论结果的对比,结果是符合的很好的。

如果将势能改成抛物线形状,也是可以计算的

附录:Mathematica代码

本征矩阵函数

1
2
3
4
5
6
7
8
9
Potential1DMatrix[Vx_,d_]:=Module[{dim,\[ScriptCapitalH],\[ScriptCapitalV],\[ScriptCapitalA]},
dim=Dimensions[Vx][[1]];
\[ScriptCapitalH]=ConstantArray[0,{dim,dim}];
Table[\[ScriptCapitalH][[l,l+1]]=1;\[ScriptCapitalH][[l+1,l]]=1;,{l,dim-1}];
\[ScriptCapitalV]=ConstantArray[0,{dim,dim}];
Table[\[ScriptCapitalH][[l,l]]=-2;\[ScriptCapitalV][[l,l]]=Vx[[l]],{l,dim}];
\[ScriptCapitalA]=-\[ScriptCapitalH]/d^2+\[ScriptCapitalV];
Return[\[ScriptCapitalA]];
]

无限深势阱模型计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
numx = 501;
x = N@Subdivide[-10, 10, numx - 1];
d = x[[2]] - x[[1]];
Vx = ConstantArray[bound, numx];
L = 5;
bound = 1001;
Table[If[x[[l]] < L && x[[l]] > 0, Vx[[l]] = 0], {l, numx}];
\[ScriptCapitalA] = Potential1DMatrix[Vx, d];
{\[Lambda]Mat, VecMat} = Eigensystem[\[ScriptCapitalA]];
p1 = ListPlot[{Thread[{x, VecMat[[-1]]}], Thread[{x, VecMat[[-2]]}],
Thread[{x, VecMat[[-3]]}]}, PlotMarkers -> "OpenMarkers",
PlotRange -> {{0, L}, {-0.3, 0.3}},
PlotLegends -> {"\!\(\*SubscriptBox[\(\[Psi]\), \(0\)]\) \
Simulated", "\!\(\*SubscriptBox[\(\[Psi]\), \(1\)]\) Simulated",
"\!\(\*SubscriptBox[\(\[Psi]\), \(2\)]\) Simulated"},
AxesLabel -> {"x", "\[Psi](x)"}];
p2 = ListLinePlot[{Thread[{x, Sqrt[2*d/L]*Sin[\[Pi]/L*x]}],
Thread[{x, -Sqrt[2*d/L]*Sin[(2 \[Pi])/L*x]}],
Thread[{x, Sqrt[2*d/L]*Sin[(3*\[Pi])/L*x]}]},
PlotRange -> {{0, L}, {-0.3, 0.3}},
PlotLegends -> {"\!\(\*SubscriptBox[\(\[Psi]\), \(0\)]\) \
Theoretical", "\!\(\*SubscriptBox[\(\[Psi]\), \(1\)]\) Theoretical",
"\!\(\*SubscriptBox[\(\[Psi]\), \(2\)]\) Theoretical"},
AxesLabel -> {"x", "\[Psi](x)"}];
p3 = Show[{p1, p2}]
p1 = ListPlot[{Sort@\[Lambda]Mat}, PlotRange -> {{1, 20}, {0, 100}},
PlotMarkers -> "OpenMarkers", PlotLegends -> {"Simulated"}
, AxesLabel -> {"n", "Energy"}];
p2 = Plot[(n)^2/(2*L)^2*4*\[Pi]^2, {n, 0, 21},
PlotLegends -> {"Theoretical"}];
p3 = Show[{p1, p2}]

抛物线形计算

1
2
3
4
5
6
7
8
numx = 1001;
x = N@Subdivide[-10, 10, numx - 1];
d = x[[2]] - x[[1]];
Vx = -N@x^4/100;
\[ScriptCapitalA] = Potential1DMatrix[Vx, d];
{\[Lambda]Mat, VecMat} = Eigensystem[\[ScriptCapitalA]];
ListLinePlot[{Thread[{x, VecMat[[-1]]}], Thread[{x, VecMat[[-2]]}],
Thread[{x, VecMat[[-3]]}]}]