Смекни!
smekni.com

Численное решение уравнения Шредингера средствами Java (стр. 6 из 7)

Java был спроектирован так, чтобы выполнить реальное требование — создавать интерактивные сетевые программы. Чтобы выполнить это, Java поддерживает многопоточное программирование, которое позволяет вам писать программы, выполняющие одновременно несколько операций. Исполняющая система Java подходит с изящным и все же искушенным решением к синхронизации мультипроцесса, что дает возможность создавать гладко работающие интерактивные системы. Удобный в работе подход Java к многопоточности позволяет вам поразмыслить над спецификой поведения вашей программы, а не заботиться о многозадачной подсистеме.

Программы Java несут в себе существенное количество информации времени выполнения, которая используется, чтобы проверять и разрешать доступ к объектам в период работы программы. Это дает возможность динамически связывать код в безопасной и целесообразной манере, и имеет решающее значение для устойчивости среды апплета, в которой маленькие фрагменты байт-кода могут динамически обновляться исполнительной системой.

Все компьютерные программы состоят из двух элементов: кода и данных. Любая программа может быть концептуально организована либо вокруг ее кода, либо вокруг ее данных. Иначе говоря, некоторые программы концентрируют свою запись вокруг того, "что делается с данными"1, а другие — вокруг того, "на что этот процесс влияет"2. Существуют две парадигмы (основополагающих подхода), которые управляют конструированием программ. Первый подход называет программу моделью, которая ориентирована на процесс (process-orientedmodel). При этом подходе программу определяют последовательности операторов ее кода. Модель, ориентированную на процесс, можно представлять как кодовое воздействие на данные (codeactingondata). Процедурные языки, такие как С, успешно эксплуатируют такую модель. Однако, при этом подходе возникают проблемы, когда возрастает размер и сложность программ. Второй подход, названный объектно-ориентированным программированием, был задуман для управления возрастающей сложностью программ. Объектно-ориентированное программирование организует программу вокруг своих данных (т. е. вокруг объектов) и набора хорошо определенных интерфейсов (взаимодействий) с этими данными. Объектно-ориентированную программу можно характеризовать как управляемый данными доступ к коду (datacontrollingaccesstocode). Как вы увидите далее, переключая управление на данные, можно получить некоторые организационные преимущества. Опыт показывает, что отсутствие стандартных базовых библиотек для языка С++ чрезвычайно затрудняет работу с ним. В силу того, что любое нетривиальное приложение требует наличия некоторого набора базовых классов, разработчикам приходится пользоваться различными несовместимыми между собой библиотеками или писать свой собственный вариант такого набора. Все это затрудняет как разработку, так и дальнейшую поддержку приложений, затрудняет стыковку приложений, написанных разными людьми. Полная система Java включает в себя готовый набор библиотек, который можно разбить на следующие пакеты:

· java.lang -- базовый набор типов, отраженных в самом языке. Этот пакет обязательно входит в состав любого приложения. Содержит описания классов Object и Class, а также поддержку многопотоковости, исключительных ситуаций, оболочку для базовых типов, а также некоторые фундаментальные классы.

· java.io -- потоки и файлы произвольного доступа. Аналог библиотеки стандартного ввода-вывода системы UNIX. Поддержка сетевого доступа (sockets, telnet, URL) содержится в пакете java.net.

· java.util -- классы-контейнеры (Dictionary, HashTable, Stack) и некоторые другие утилиты. Кодирование и декодирование. Классы Date и Time.

· java.awt -- Abstract Windowing Toolkit, архитектурно-независимый оконный интерфейс, позволяющий запускать интерактивные оконные Java-приложения на любой платформе. Содержит базовые компоненты интерфейса, такие как события, цвета, фонты, а также основные оконные элементы -- кнопки, scrollbars и т.д.. [6]


4.2 Элементы программирования Java 2 используемые в работе

При реализации метода аппроксимации оператора эволюции средствами языка программирования Java 2, использовались основные элементы объектно-ориентированного программирования, позволяющие разбить программу на более мелкие структурные части, для дальнейшего совершенствования и настраивания ее под различные физические задачи. Использование технологии AWT позволило создать графический интерфейс, наиболее удобный и понятный различному кругу пользователей. В данной работе использовался модуль JSci.math предназначенный для проведения вычислений в специализированных физических и математических задачах. В качестве среды разработки данного программно приложения использовался Eclipse 3.2.

Анимированный апплет позволяет получить наглядное решение нестационарного уравнения Шредингера в различные моменты времени с различными потенциалами. Также выполненный апплет может быть размещен на 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);}