Анимированный апплет
позволяет получить наглядное решение нестационарного уравнения Шредингера в
различные моменты времени с различными потенциалами. Также выполненный апплет
может быть размещен на Internet-сервере и являться частью jsp-странички, что позволит использовать
результаты его вычислений различным пользователям сети Internet, используя
Internet-браузер для просмотра данной странички.
Программный код
public class
Shreding {
final double
K0 = 1.0;
final double
C = 0.893;
double
i = Math.sqrt(-1);
double
hx = (XMax-XMin)/N;
double
hp = 2*PMax/N;
double[]
x = new double[N+1];{
Wave ob = new Wave();
x = ob.x();}
double[]
p = new double[N+1];{
Wave ob = new Wave();
p = ob.p();}
double[]
w = new double[N+1];{
Wave ob = new Wave();
w = ob.w();}
double[]
rePsyX0 = new double[N+1];{
Wave ob = new Wave();
rePsyX0 = ob.rePsyX0();}
double[]
imPsyX0 = new double[N+1];{
Wave ob = new Wave();
imPsyX0 = ob.imPsyX0();}
double[]
psyX02 = new double[N+1];{
Wave ob = new Wave();
psyX02 = ob.psyX02();}
double[]
rePsyP0 = new double[N+1];{
Wave ob = new Wave();
rePsyP0 = ob.rePsyP0();}
double[]
imPsyP0 = new double[N+1];{
Wave ob = new Wave();
imPsyP0 = ob.imPsyP0();}
double[]
rePsyPt2 = new double[N+1];{
Wave ob = new Wave();
rePsyPt2 = ob.rePsyPt2();}
double[]
imPsyPt2 = new double[N+1];{
Wave ob = new Wave();
imPsyPt2 = ob.imPsyPt2();}
double[]
rePsyX1t2 = new double[N+1];{
Wave ob = new Wave();
rePsyX1t2 = ob.rePsyX1t2();}
double[]
imPsyX1t2 = new double[N+1];{
Wave ob = new Wave();
imPsyX1t2 = ob.imPsyX1t2();}
double[]
rePsyX1t2V = new double[N+1];{
Wave ob = new Wave();
rePsyX1t2V = ob.rePsyX1t2V();}
double[]
imPsyX1t2V = new double[N+1];{
Wave ob = new Wave();
imPsyX1t2V = ob.imPsyX1t2V();}
double[]
rePsyP1t = new double[N+1];{
Wave ob = new Wave();
rePsyP1t = ob.rePsyP1t();}
double[]
imPsyP1t = new double[N+1];{
Wave ob = new Wave();
imPsyP1t = ob.imPsyP1t();}
double[]
rePsyP1te = new double[N+1];{
Wave ob = new Wave();
rePsyP1te = ob.rePsyP1te();}
double[]
imPsyP1te = new double[N+1];{
Wave ob = new Wave();
imPsyP1te = ob.imPsyP1te();}
double[]
rePsyX2t = new double[N+1];{
Wave ob = new Wave();
rePsyX2t = ob.rePsyX2t();}
double[]
imPsyX2t = new double[N+1];{
Wave ob = new Wave();
imPsyX2t = ob.imPsyX2t();}
double[]
psyX2t = new double[N+1];{
Wave ob = new Wave();
psyX2t = ob.psyX2t();}
/**
*
*
Метод осуществляющий вычисление всех моментов времени
*/
public double[][]
time(){
double
M[][]= new double[N+1][20+15*(NT+1)];
double
L[][]= new double[N+1][NT+1];
for (int
m = 0; m < N+1; m++){
M[m][0] = x[m];
M[m][1] = p[m];
M[m][2] = w[m];
M[m][3] = rePsyX0[m];
M[m][4] = imPsyX0[m];
M[m][5] = psyX02[m];
}
for (int
k = 1; k < NT+1; k++){
for (int
j = 0; j < N+1; j++){
M[j][6+15*(k-1)] = rePsyP0[j];
M[j][7+15*(k-1)] = imPsyP0[j];
M[j][8+15*(k-1)] = rePsyPt2[j];
M[j][9+15*(k-1)] = imPsyPt2[j];
}
for (int
m = 0; m < N+1; m++){
M[m][10+15*(k-1)] = rePsyX1t2[m];
M[m][11+15*(k-1)] = imPsyX1t2[m];
M[m][12+15*(k-1)] = rePsyX1t2V[m];
M[m][13+15*(k-1)] = imPsyX1t2V[m];
}
for (int
j = 0; j < N+1; j++){
M[j][14+15*(k-1)] = rePsyP1t[j];
M[j][15+15*(k-1)] = imPsyP1t[j];
M[j][16+15*(k-1)] = rePsyP1te[j];
M[j][17+15*(k-1)] = imPsyP1te[j];
}
for (int
m = 0; m < N+1; m++){
M[m][18+15*(k-1)] = rePsyX2t[m];
M[m][19+15*(k-1)] = imPsyX2t[m];
M[m][20+15*(k-1)] = psyX2t[m];
rePsyX0 = rePsyX2t;
imPsyX0 = imPsyX2t;
L[m][k] = M[m][20+15*(k-1)];
}
}return L;
}
}
class
Wave{
final double
K0 = 1.0;
final double
C = 0.893;
double
i = Math.sqrt(-1);
double
hx = (XMax-XMin)/N;
double
hp = 2*PMax/N;
/**
*
*
Вычисление координат x
*/
double[] x(){
double
X[] = new double[N+1];
for (int
j = 0; j < N+1; j++){
X[j] = XMin+j*hx;
}return X;
}
double[]
x = new double[N+1];{
x =
x();}
**
*
*
Вычисление импульсов p
*/
double[] p(){
double
P[] = new double[N+1];
for (int
j = 0; j < N+1; j++){
P[j] = -1*PMax + j*hp;
}return P;
}
double[]
p = new double[N+1];{
p =
p();}
/**
*
*
Построение потенциального барьера
*/
double[]
w(double a, double b, double VMax){
double
W[]= new double[N+1];
for (int
j = 0; j < N+1; j++){
double
V = 0;
if
(x[j]>a && x[j]<b){
V = VMax;
}W[j] = V;
}return W;
}
double[]
w = new double[N+1];{
w =
w();}
/**
*
*
Действительная часть функци Psy в начальный момент времени
*/
double[]
rePsyX0(){
double
RePsyX0[]= new double[N+1];
for (int
j = 0; j < N+1; j++){
RePsyX0[j] = C*Math.exp(-x[j]*x[j])*Math.cos(K0*x[j]);
}return RePsyX0;
}
double[]
rePsyX0 = new double[N+1];{
rePsyX0
= rePsyX0();}
/**
*
*
Мнимая часть функци Psy в начальный момент времени
*/
double[]
imPsyX0(){
double
ImPsyX0[]= new double[N+1];
for (int
j = 0; j < N+1; j++){
ImPsyX0[j] = C*Math.exp(-x[j]*x[j])*Math.sin(K0*x[j]);
}return ImPsyX0;
}
double[]
imPsyX0 = new double[N+1];{
imPsyX0
= imPsyX0();}
/**
*
*
Вероятность в нвчальный момент времени
*/
double[]
psyX02(){
double[]
L = new double[N+1];
double[]
K = new double[N+1];
double[]
PsyX02 = new double[N+1];
L = rePsyX0;
K = imPsyX0;
for (int
j = 0; j < N+1; j++){
PsyX02[j] = L[j]*L[j] + K[j]*K[j];
}return PsyX02;
}
double[]
psyX02 = new double[N+1];{
psyX02
= psyX02();}
/**
*
*
Первое преобразование Фурье и вычисление действительной части функции Psy
*/
double[]
rePsyP0(){
double
RePsyP0[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += rePsyX0[s]*Math.cos(p[j]*x[s]) + imPsyX0[s]*Math.sin(p[j]*x[s]);
}
RePsyP0[j] = hx*S/Math.sqrt(2*Math.PI);}
//rePsyX0 = rePsyX2t;
//imPsyX0 = imPsyX2t;
return
RePsyP0;
}
double[]
rePsyP0 = new double[N+1];{
rePsyP0
= rePsyP0();}
/**
*
*
Первое преобразование Фурье и вычисление мнимой части функции Psy
*/
double[]
imPsyP0(){
double
ImPsyP0[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += imPsyX0[s]*Math.cos(p[j]*x[s]) - rePsyX0[s]*Math.sin(p[j]*x[s]);
}
ImPsyP0[j] = hx*S/Math.sqrt(2*Math.PI);}
//rePsyX0 = rePsyX2t;
//imPsyX0 = imPsyX2t;
return
ImPsyP0;
}
double[]
imPsyP0 = new double[N+1];{
imPsyP0
= imPsyP0();}
/**
*
*
Произведение действительной части функции Psy и первой составляющей оператора
расщепления
*/
double[]
rePsyPt2(){
double
RePsyPt2[]= new double[N+1];
for (int
j=0; j<N+1; j++){
RePsyPt2[j] = rePsyP0[j]*Math.cos(p[j]*p[j]*DT/2) + imPsyP0[j]*Math.sin(p[j]*p[j]*DT/2);
}return RePsyPt2;
}
double[]
rePsyPt2 = new double[N+1];{
rePsyPt2
= rePsyPt2();}
/**
*
*
Произведение мнимой части функции Psy и первой составляющей оператора
расщепления
*/
double[]
imPsyPt2(){
double
ImPsyPt2[]= new double[N+1];
for (int
j=0; j<N+1; j++){
ImPsyPt2[j] = imPsyP0[j]*Math.cos(p[j]*p[j]*DT/2) - rePsyP0[j]*Math.sin(p[j]*p[j]*DT/2)*0;
}return ImPsyPt2;
}
double[]
imPsyPt2 = new double[N+1];{
imPsyPt2
= imPsyPt2();}
/**
*
*
Второе преобразование Фурье и вычисление действительной части функции Psy
*/
double[]
rePsyX1t2(){
double
RePsyX1t2[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += rePsyPt2[s]*Math.cos(p[s]*x[j]) - imPsyPt2[s]*Math.sin(p[s]*x[j]);
}
RePsyX1t2[j] = hp*S/Math.sqrt(2*Math.PI);
}return RePsyX1t2;
}
double[]
rePsyX1t2 = new double[N+1];{
rePsyX1t2
= rePsyX1t2();}
/**
*
*
Второе преобразование Фурье и вычисление мнимой части функции Psy
*/
double[]
imPsyX1t2(){
double
ImPsyX1t2[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += imPsyPt2[s]*Math.cos(p[s]*x[j]) + rePsyPt2[s]*Math.sin(p[s]*x[j]);
}
ImPsyX1t2[j] = hp*S/Math.sqrt(2*Math.PI);
}return ImPsyX1t2;
}
double[]
imPsyX1t2 = new double[N+1];{
imPsyX1t2
= imPsyX1t2();}
/**
*
*
Произведение действительной части функции Psy и второй составляющей оператора
расщепления
*/
double[]
rePsyX1t2V(){
double
RePsyX1t2V[]= new double[N+1];
for (int
j=0; j<N+1; j++){
RePsyX1t2V[j] = rePsyX1t2[j]*Math.cos(w[j]*DT) + imPsyX1t2[j]*Math.sin(w[j]*DT);
}return RePsyX1t2V;
}
double[]
rePsyX1t2V = new double[N+1];{
rePsyX1t2V
= rePsyX1t2V();}
/**
*
*
Произведение мнимой части функции Psy и второй составляющей оператора
расщепления
*/
double[]
imPsyX1t2V(){
double
ImPsyX1t2V[]= new double[N+1];
for (int
j=0; j<N+1; j++){
ImPsyX1t2V[j] = imPsyX1t2[j]*Math.cos(w[j]*DT) - rePsyX1t2[j]*Math.sin(w[j]*DT);
}return ImPsyX1t2V;
}
double[]
imPsyX1t2V = new double[N+1];{
imPsyX1t2V
= imPsyX1t2V();}
/**
*
*
Третье преобразование Фурье и вычисление действительной части функции Psy
*/
double[]
rePsyP1t(){
double
RePsyP1t[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += rePsyX1t2V[s]*Math.cos(p[j]*x[s]) + imPsyX1t2V[s]*Math.sin(p[j]*x[s]);
}
RePsyP1t[j] = hx*S/Math.sqrt(2*Math.PI);
}return RePsyP1t;
}
double[]
rePsyP1t = new double[N+1];{
rePsyP1t
= rePsyP1t();}
/**
*
*
Третье преобразование Фурье и вычисление мнимой части функции Psy
*/
double[]
imPsyP1t(){
double
ImPsyP1t[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += imPsyX1t2V[s]*Math.cos(p[j]*x[s]) - rePsyX1t2V[s]*Math.sin(p[j]*x[s]);
}
ImPsyP1t[j] = hx*S/Math.sqrt(2*Math.PI);
}return ImPsyP1t;
}
double[]
imPsyP1t = new double[N+1];{
imPsyP1t
= imPsyP1t();}
/**
*
*
Произведение действительной части функции Psy и третьей составляющей оператора
расщепления
*/
double[]
rePsyP1te(){
double
RePsyP1te[]= new double[N+1];
for (int
j=0; j<N+1; j++){
RePsyP1te[j] = rePsyP1t[j]*Math.cos(p[j]*p[j]*DT/2) + imPsyP1t[j]*Math.sin(p[j]*p[j]*DT/2);
}return RePsyP1te;
}
double[]
rePsyP1te = new double[N+1];{
rePsyP1te
= rePsyP1te();}
/**
*
* Произведение
мнимой части функции Psy и третьей составляющей оператора расщепления
*/
double[]
imPsyP1te(){
double
ImPsyP1te[]= new double[N+1];
for (int
j=0; j<N+1; j++){
ImPsyP1te[j] = imPsyP1t[j]*Math.cos(p[j]*p[j]*DT/2) - rePsyP1t[j]*Math.sin(p[j]*p[j]*DT/2);
}return ImPsyP1te;
}
double[]
imPsyP1te = new double[N+1];{
imPsyP1te
= imPsyP1te();}
/**
*
*
Четвертое преобразование Фурье и вычисление действительной части функции Psy
*/
double[]
rePsyX2t(){
double
RePsyX2t[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += rePsyP1te[s]*Math.cos(p[s]*x[j]) - imPsyP1te[s]*Math.sin(p[s]*x[j]);
}
RePsyX2t[j] = hp*S/Math.sqrt(2*Math.PI);
}return RePsyX2t;
}
double[]
rePsyX2t = new double[N+1];{
rePsyX2t
= rePsyX2t();}
/**
*
*
Четвертое преобразование Фурье и вычисление мнимой части функции Psy
*/
double[]
imPsyX2t(){
double
ImPsyX2t[]= new double[N+1];
for (int
j=0; j<N+1; j++){
double
S = 0;
for (int
s=0; s<N+1; s++){
S += imPsyP1te[s]*Math.cos(p[s]*x[j]) + rePsyP1te[s]*Math.sin(p[s]*x[j]);
}
ImPsyX2t[j] = hp*S/Math.sqrt(2*Math.PI);
}return ImPsyX2t;
}
double[]
imPsyX2t = new double[N+1];{
imPsyX2t
= imPsyX2t();}
/**
*
*
Вычисление вероятности в момент DT
*/
double[]
psyX2t(){
double[]
L = new double[N+1];
double[]
K = new double[N+1];
double[]
PsyX2t = new double[N+1];
L = rePsyX2t;
K = imPsyX2t;
for (int
j = 0; j < N+1; j++){
PsyX2t[j] = L[j]*L[j] + K[j]*K[j];
}return
PsyX2t;
}
}
Графики поведения
волновых функций
Прямоугольный
потенциальный барьер
Барьер гауссова функция
Заключение
Численное решение
нестационарного уравнения Шредингера имеет важное значение для компьютерного
исследования квантовых систем. В данной работе рассмотрены два метода
численного решения одномерного нестационарного уравнения Шредингера: метод
конечных разностей и метод аппроксимации оператора эволюции. По результатам
вычислений построены графики поведения волновой функции в зависимости от времени
для ступенчатого потенциала.
Полученные значения
полностью соответствуют теоретическим данным для квантовомеханической задачи со
ступенчатым потенциалом и наглядно отражают процессы отражения и прохождения
частицы через потенциальный барьер. Также рассмотренные численные методы могут
использоваться для расчета других видов волновых функций и потенциалов.
Список использованных
источников
1. А.С. Давыдов. Квантовая механика//М.,: "Наука",
1973г., 704 с
2. З. Флюгге. Задачи по квантовой механике//М.: "Мир",
Т.1, 1974г., 343 с
3. Е.А. Волкова, А.М. Попов, А.Т. Рахимов, "Квантовая
механика на персональном компьютере"//Москва.: "УРСС", 1995.
4. Дж. Мэтьюз, Р. Уокер "Математические методы физики".
4. С.В. Поршнев Моделирование квантовых систем //www.exponenta.ru
6. П.Ноутон, Г.Шилдт Java 2 Наиболее полное
руководство//С-Петербург: "БХВ-Петербург" 2007.
Страницы: 1, 2, 3
|