Взяв двумерное уравнение Шрёдингера с потенциалом
и поиграв в конечные разности, написал такое:
Код:
MakeSchrodingerTimeStep[V_, m_, \[HBar]_, \[CapitalDelta]t_, \[CapitalDelta]x_] := Module[
{a1, a2, V1},
a1 = I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/(2 m);
a2 = 2 I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/m;
V1 = (-((I \[CapitalDelta]t)/\[HBar]) # &) /@ V;
Function[\[Psi],
Block[{xnm1, ynm1, \[Psi]1},
\[Psi]1 = Array[0 &, Dimensions[\[Psi]]];
{xnm1, ynm1} = Dimensions[\[Psi]] - 1;
Do[
\[Psi]1[[xi, yi]] = a1 (\[Psi][[xi - 1, yi]] + \[Psi][[xi + 1, yi]] + \[Psi][[xi, yi - 1]] + \[Psi][[xi, yi + 1]]) + \[Psi][[xi, yi]] (1 - a2 + V1[[xi, yi]]),
{xi, 2, xnm1}, {yi, 2, ynm1}];
\[Psi]1
]
]
]
И используется оно примерно так:
Код:
n = 100;
V = Array[5 ((#1/n - .5)^2 + (#2/n - .5)^2) &, {n, n}];
step = MakeSchrodingerTimeStep[V, 1., 1., .3, 1.]; (* V, m, \[HBar], \[CapitalDelta]t, \[CapitalDelta]x *)
\[Psi] = Array[Sin[6.28 4 #2/n] Exp[-((#1 - .3 n)^2 + (#2 - .3 n)^2)/(.3 n)]/Sqrt[2. \[Pi] (.3 n)] &, {n, n}];
grs = {};
Do[
AppendTo[grs,
ArrayPlot[\[Psi], ColorFunctionScaling -> False,
ColorFunction -> AmplitudeCF[.05] (* моя *)]];
\[Psi] = step[\[Psi]],
{80}]
ListAnimate[grs, AnimationRunning -> False]
Как бы оптимизировать? Долго слишком (несколько минут приведённый пример работает). Да ещё и, боюсь, я написал что-то неправильно. Ну и в общем код может быть где-то неестественным — сам себя не поправишь, приму все замечания.
-- Ср авг 20, 2014 03:50:36 --Кстати, разбирающиеся в численных методах, может быть, подскажут, какие соотношения должны тут выполняться между параметрами, чтобы не было того, что тут появляется на последних шагах по времени? Что-то я как будто соблюдал, но, видимо, или не то, или не так, или того недостаточно.