Estoy buscando un programa de computadora que simule la ecuación de Schrödinger (digamos para una sola partícula) en dos dimensiones y para potenciales y estados iniciales especificados por el usuario. Las situaciones típicas que tengo en mente son el experimento de la doble rendija, el oscilador armónico, Aharonov-Bohm, el efecto túnel, etc. Lamentablemente, solo pude encontrar el caso unidimensional en la web.
Entonces, ¿hay algunos programas 2d disponibles?
PD: No creo que mi pregunta sea un duplicado de esta . Solo pregunto por una sola partícula, no por miles. Por otro lado, quiero libertad en mi elección de potencial. También quiero una solución numérica de una PDE, mientras que la otra pregunta se trata (hasta donde yo entiendo, que no está muy lejos) de una simulación de Monte Carlo. De todos modos, estos son requisitos completamente diferentes.
Probablemente esto no sea exactamente lo que está buscando, pero si está buscando los estados límite independientes del tiempo de un sistema, el método hamiltoniano de cuadrícula de Fourier puede ser aplicable. Aquí hay una aplicación de esto al siguiente pozo potencial de aspecto extraño:
Aquí hay algunos estados ligados de baja energía:
Y aquí están algunos de los estados de alta energía:
Usé una superficie potencial de aspecto bastante simétrico, pero puedes hacer formas arbitrarias o líneas onduladas si realmente quisieras.
Aquí está el código de Mathematica usado para dibujar el potencial y calcular los estados ligados. Tenga en cuenta que en 2D, solo usar 81 puntos de cuadrícula en cada dimensión significa que tiene que diagonalizar un matriz, que puede tardar varios minutos. A continuación se definen los ejes espaciales y se construye la matriz de energía cinética:
$HistoryLength = 0;
hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]),
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]},
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
vec[A_] := Flatten[Transpose[A, Reverse[Range[ArrayDepth[A]]]]];
nx1 = 8;
np1 = 8;
nn1 = nx1 np1;
L1 = 8;
\[CapitalDelta]x1 = L1/nx1;
\[CapitalDelta]p1 = 2 \[Pi]/\[CapitalDelta]x1;
\[Alpha]1 = \[CapitalDelta]p1/(2 \[CapitalDelta]x1);
pMax1 = \[CapitalDelta]p1 np1/2;
axis1 = (Range[nn1] - 1/2) L1/nn1;
TRow1 = If[EvenQ[nn1],
1/2 Append[
Table[(2.0 pMax1^2)/nn1^2 (-1)^j/Sin[\[Pi] j/nn1]^2, {j,
nn1 - 1}], pMax1^2/3 (1 + 2.0/nn1^2)],
1/2 Append[
Table[(2.0 pMax1^2)/nn1^2 ((-1)^j Cos[\[Pi] j/nn1])/
Sin[\[Pi] j/nn1]^2, {j, nn1 - 1}],
pMax1^2/3 (1 + 1.0/nn1^2)]];
T1 = MapIndexed[RotateRight, ConstantArray[TRow1, nn1]];
nx2 = 8;
np2 = 8;
nn2 = nx2 np2;
L2 = 8;
\[CapitalDelta]x2 = L2/nx2;
\[CapitalDelta]p2 = 2 \[Pi]/\[CapitalDelta]x2;
\[Alpha]2 = \[CapitalDelta]p2/(2 \[CapitalDelta]x2);
pMax2 = \[CapitalDelta]p2 np2/2;
axis2 = (Range[nn2] - 1/2) L2/nn2;
TRow2 = If[EvenQ[nn2],
1/2 Append[
Table[(2.0 pMax2^2)/nn2^2 (-1)^j/Sin[\[Pi] j/nn2]^2, {j,
nn2 - 1}], pMax2^2/3 (1 + 2.0/nn2^2)],
1/2 Append[
Table[(2.0 pMax2^2)/nn2^2 ((-1)^j Cos[\[Pi] j/nn2])/
Sin[\[Pi] j/nn2]^2, {j, nn2 - 1}],
pMax2^2/3 (1 + 1.0/nn2^2)]];
T2 = MapIndexed[RotateRight, ConstantArray[TRow2, nn2]];
Lo siguiente le permite ingresar una superficie potencial y trazarla (el código a continuación toma Potential
la extraña superficie en forma de cruz que mostré al principio, pero se puede cambiar a otras formas):
\[Delta] = 0.3;
Potential[x1_,
x2_] := -600 \[Delta]/(Sqrt[(x1 - L1/2)^2] + \[Delta]) \[Delta]/(
Sqrt[(x2 - L2/2)^2] + \[Delta]) -
300 \[Delta]/(
Abs[Sqrt[(x1 - L1/2)^2 + (x2 - L2/2)^2] - 2] + \[Delta]);
Hamiltonian[x1_, p1_, x2_, p2_] := (p1^2 + p2^2)/2 + Potential[x1, x2];
DensityPlot[Hamiltonian[x1, 0, x2, 0], {x1, 0, L1}, {x2, 0, L2},
PlotRange -> All, PlotPoints -> 90, ColorFunction -> GrayLevel]
Lo siguiente construye el hamiltoniano y lo diagonaliza:
V = DiagonalMatrix[
vec[Table[
Potential[axis1[[k1]], axis2[[k2]]], {k1, nn1}, {k2, nn2}]]];
T = KroneckerProduct[T2, IdentityMatrix[nn1]] +
KroneckerProduct[IdentityMatrix[nn2], T1];
H = T + V;
{\[Lambda], \[CapitalLambda]} = {#1[[Ordering[#1]]], \
#2[[Ordering[#1]]]} & @@ Eigensystem[H];
Y lo siguiente traza los estados enlazados:
mat[v_] := Partition[v, nn1]\[Transpose];
interp[m_] :=
8 InverseFourier[
RotateLeft[
PadRight[RotateRight[Fourier[m], Floor[Dimensions[m]/2]],
8 Dimensions[m]], Floor[Dimensions[m]/2]]];
Manipulate[{\[Lambda][[k]],
If[Abs[\[Lambda][[k - 1]] - \[Lambda][[k]]] <= 0.01 ||
Abs[\[Lambda][[k + 1]] - \[Lambda][[k]]] <= 0.01, "Mixed",
"Pure"],
Image[hue[20 interp[mat[\[CapitalLambda][[k]]]]], ColorSpace -> Hue,
Magnification -> 1]}, {k, 1, 500, 1}]
Desafortunadamente, no recuerdo exactamente qué sistema de unidades físicas usa el código, pero sí recuerdo que lo escribí parcialmente basado en la exposición de David Tannor del método FGH como se describe en su libro Quantum Mechanics: A Time-Dependent Perspective .
Mago_nuclear
monovolumen
Emilio Pisanty
Jan Weidner
kyle kanos
qmecanico