Численное решение уравненияШредингера средствами Java
Содержание
Введение
1.Уравнение Шредингера и физический смысл его решений
1.1 Волновое уравнение Шредингера
1.2 Волновые функции в импульсном представлении
2. Методы численного решения нестационарного уравненияШредингера
2.1 Метод конечных разностей для одномерного нестационарногоуравнения Шредингера
2.2 Преобразование Фурье
2.3 Метод аппроксимации оператора эволюции (split-operator method)
3. Методы численного решения стационарного уравненияШредингера
3.1 Метод Нумерова
4. Программная реализация численных методов средствами Java
4.1 Обзор языка программирования Java
4.2 Элементы программирования Java 2 используемые в работе
Заключение
Список использованныхисточников
Введение
Известно, что курсквантовой механики является одним из сложных для восприятия. Это связано нестолько с новым и «необычным» математическим аппаратом, сколькопрежде всего с трудностью осознания революционных, с позиции классическойфизики, идей, лежащих в основе квантовой механики и сложностью интерпретациирезультатов.
В большинстве учебныхпособий по квантовой механике изложение материала основано, как правило, наанализе решений стационарного уравнений Шредингера. Однако стационарный подходне позволяет непосредственно сопоставить результаты решения квантовомеханическойзадачи с аналогичными классическими результатами. К тому же многие процессы,изучаемые в курсе квантовой механики (как, например, прохождение частицы черезпотенциальный барьер, распад квазистационарного состояния и др.) носят впринципе нестационарный характер и, следовательно, могут быть поняты в полномобъеме лишь на основе решений нестационарного уравнения Шредингера. Посколькучисло аналитически решаемых задач невелико, использование компьютера в процессеизучения квантовой механики является особенно актуальным.
1. УравнениеШредингера и физический смысл его решений
1.1Волновое уравнение Шредингера
Однимиз основных уравнений квантовой механики является уравнение Шредингера,определяющее изменение состояний квантовых систем с течением времени. Онозаписывается в виде
/>(1.1)
где Н— оператор Гамильтона системы, совпадающий с оператором энергии, если он независит от времени. Вид оператора /> определяетсясвойствами системы. Для нерелятивистского движения частицы массы /> в потенциальном поле U(r) оператор/> действителен ипредставляется суммой операторов кинетической и потенциальной энергии частицы
/>(1.2)
Есличастица движется в электромагнитном поле, то оператор Гамильтона будеткомплексным.
Хотяуравнение (1.1) является уравнением первого порядка по времени, вследствиеналичия мнимой единицы оно имеет и периодические решения. Поэтому уравнениеШредингера (1.1) часто называют волновым уравнением Шредингера, а его решениеназывают волновой функцией, зависящей от времени. Уравнение (1.1) при известномвиде оператора Н позволяет определить значение волновой функции />в любой последующий моментвремени, если известно это значение в начальный момент времени. Таким образом,волновое уравнение Шредингера выражает принцип причинности в квантовоймеханике.
Волновоеуравнение Шредингера может быть получено на основании следующих формальныхсоображений. В классической механике известно, что если энергия задана какфункция координат и импульсов
/>H/>,(1.3)
топереход к классическому уравнению Гамильтона—Якоби для функции действия S
/>H/>
можнополучить из (1.3) формальным преобразованием
/>, />
Такимже образом уравнение (1.1) получается из (1.3) при переходе от (1.3) коператорному уравнению путем формального преобразования
/>, />(1.4)
если(1.3) не содержит произведений координат и импульсов, либо содержит такие ихпроизведения, которые после перехода к операторам (1.4) коммутируют междусобой. Приравнивая после этого преобразования результаты действия на функцию /> операторов правой и левойчастей полученного операторного равенства, приходим к волновому уравнению(1.1). Не следует, однако, принимать эти формальные преобразования как выводуравнения Шредингера. Уравнение Шредингера является обобщением опытных данных.Оно не выводится в квантовой механике, так же как не выводятся уравнения Максвеллав электродинамике, принцип наименьшего действия (или уравнения Ньютона) вклассической механике.
Легкоубедиться, что уравнение (1.1) удовлетворяется при /> волновойфункцией
/>,
описывающейсвободное движение частицы с определенным значением импульса. В общем случаесправедливость уравнения (1.1) доказывается согласием с опытом всех выводов,полученных с помощью этого уравнения.
Покажем,что из уравнения (1.1) следует важное равенство
/>,(1.5)
указывающеена сохранение нормировки волновой функции с течением времени. Умножим слева (1.1)на функцию />*, a уравнение, комплексно сопряженное к (1.1), на функцию /> и вычтем из первогополученного уравнения второе; тогда находим
/>,(1.6)
Интегрируяэто соотношение по всем значениям переменных и учитывая самосопряженностьоператора />, получаем (1.5).
Еслив соотношение (1.6) подставить явное выражение оператора Гамильтона (1.2) длядвижения частицы в потенциальном поле, то приходим к дифференциальному уравнению(уравнение непрерывности)
/>, (1.7)
где />/> является плотностьювероятности, а вектор
/>(1.8)
можноназвать вектором плотности тока вероятности.
Комплекснуюволновую функцию /> всегда можнопредставить в виде
/>
где /> и />— действительные функциивремени и координат. Таким образом, плотность вероятности
/>,
аплотность тока вероятности
/>.(1.9)
Из(1.9) следует, что j = 0 для всехфункций />, у которых функция Ф независит от координат. В частности, j= 0 для всех действительных функций />.
Решенияуравнения Шредингера (1.1) в общем случае изображаются комплексными функциями.Использование комплексных функций весьма удобно, хотя и не необходимо. Вместоодной комплексной функции /> состояниесистемы можно описать двумя вещественными функциями /> и/>, удовлетворяющими двумсвязанным уравнениям. Например, если оператор Н — вещественный, то, подставив в(1.1) функцию /> и отделиввещественную и мнимую части, получим систему двух уравнений
/>, />,
приэтом плотность вероятности и плотность тока вероятности примут вид
/>, />. [1]
1.2 Волновые функции вимпульсном представлении.
Фурье-образ /> волновой функции /> характеризуетраспределение импульсов в квантовом состоянии />.Требуется вывести интегральное уравнение для /> сФурье-образом потенциала в качестве ядра.
Решение. Между функциями /> и /> имеются два взаимнообратных соотношения.
/>(2.1)
/>(2.2)
Если соотношение (2.1)использовать в качестве определения /> иприменить к нему операцию />, то сучетом определения 3-мерной />-функции,
/>,
в результате, какнетрудно убедиться, получится обратное соотношение (2.2). Аналогичныесоображения использованы ниже при выводе соотношения (2.8).
Положим далее
/>,(2.3)
тогда для Фурье-образапотенциала будем иметь
/>(2.4)
Предполагая, что волноваяфункция /> удовлетворяет уравнениюШредингера
/>(2.5)
Подставляя сюда вместо /> и /> соответственно выражения(2.1) и (2.3), получаем
/>
В двойном интегралеперейдем от интегрирования по переменной /> кинтегрированию по переменной />, азатем эту новую переменную вновь обозначим посредством />. Интеграл по /> обращается в нуль прилюбом значении /> лишь в томслучае, когда само подынтегральное выражение равно нулю, но тогда
/>.(2.6)
Это и есть искомоеинтегральное уравнение с Фурье-образом потенциала /> вкачестве ядра. Конечно, интегральное уравнение (2.6) можно получить только приусловии, что Фурье-образ потенциала (2.4) существует; для этого, например,потенциал /> должен убывать на большихрасстояниях по меньшей мере как />, где />.
Необходимо отметить, чтоиз условия нормировки
/> (2.7)
следует равенство
/>.(2.8)
Это можно показать,подставив в (2.7) выражение (2.1) для функции />:
/>.
Если здесь сначалавыполнить интегрирование по />, то мыбез труда получим соотношение (2.8).[2]
2. Методы численногорешения нестационарного уравнения Шредингера
2.1 Метод конечныхразностей для одномерного нестационарного уравнения Шредингера
В большинстве учебныхпособий по квантовой механике изложение материала основано, как правило, наанализе решений стационарного уравнений Шредингера. Однако стационарный подходне позволяет непосредственно сопоставить результаты решения квантовомеханическойзадачи с аналогичными классическими результатами. К тому же многие процессы,изучаемые в курсе квантовой механики (как, например, прохождение частицы черезпотенциальный барьер, распад квазистационарного состояния и др.) носят впринципе нестационарный характер и, следовательно, могут быть поняты в полномобъеме лишь на основе решений нестационарного уравнения Шредингера. Посколькучисло аналитически решаемых задач невелико, использование компьютера в процессеизучения квантовой механики является особенно актуальным.
Нестационарное уравнениеШредингера, определяющее эволюцию волновой функции во времени, представляетсобой дифференциальное уравнение первого порядка по времени и имеет следующийвид
/>(3.1)
где />оператор полной энергиисистемы. Для одномерного случая
/>
Общее решение уравнения(1) формально можно записать в виде
/>(3.2)
где /> — волновая функция системыв момент времени />
/> — оператор эволюции (пропагатор).
Особенностью выражения(3.2) является то, что в показателе экспоненты стоит оператор. Определитьдействие оператора эволюции на волновую функцию можно, например, разложив ее пособственным функциям оператора /> . Так,в случае дискретного спектра /> выражениедля волновой функции в произвольный момент времени имеет вид
/>/>(3.3)
Аналогичное выражениеможет быть получено и для непрерывного спектра.
Разложение (3.3) удобноиспользовать в тех случаях, когда решения стационарного уравнения Шредингерадля конкретной задачи являются известными. Но к сожалению круг таких задачочень ограничен. Большинство современных численных методов решения уравнения(3.1) основаны на использовании различных аппроксимаций оператора эволюции />. Так, например, разложениеоператора эволюции в ряд Тейлора с сохранением первых двух членов даетследующую схему
/>,(3.4)
здесь />номер шага по времени.Существенным недостатком этого алгоритма является необходимость знать волновуюфункцию в моменты /> и />. Кроме того, для оценкидействия оператора /> на функцию /> нужно вычислять вторуюпроизводную по координате. Простейшая конечно-разностная аппроксимация второйпроизводной
/>(3.5)
дает неудовлетворительныйрезультат. (См. программный блок 1)[3]
2.2 Преобразование Фурье
Начнем с комплексногоряда Фурье
/>
/>
Рассмотрим случай L/>.Тогда сумму можно преобразовать винтеграл следующим образом: определим/> и />=g(y).Так как /> возрастает каждый раз наединицу, то
/>/>где />.
Таким образом, полученныевыше формулы приобретают вид
/>/>
/> />(4.1)
Величина />называется преобразованиемФурье от /> и наоборот. Положениемножителя /> довольно произвольно;часто величины /> и /> определяютболее симметрично:
/> />
/>/> (4.2)
Выражения (4.1) или (4.2)можно скомбинировать следующим образом:
/>(4.3)
Равенство (4.3)удовлетворяется для любой функции /> это позволяет сделать интересный вывод об интеграле /> как функции />. Он равен нулю всюду,кроме точки />, а интеграл от него полюбому промежутку, включающему />, равенединице, т.е. эта функция имеет бесконечно высокий и бесконечно узкий пик вточке />.
Обычно определяют />/> (Дирака) /> следующим образом:
/> />
/> /> />/>(4.4)
Из этих уравненийследует, что
/> (4.5)
для любой функции />, в случае если интервалинтегрирования включает точку />.
Проделанные выше операциинад интегралами Фурье показали, что
/> (4.6)
Это интегральноепредставление />функции.
Дельта – функцию можноиспользовать, чтобы выразить важный интеграл /> черезпреобразование Фурье (4.1) от />:
/>
/>
/>(4.7)
Это равенство называетсятеоремой Парсеваля. Она полезна для понимания физической интерпретациипреобразования Фурье для />, еслиизвестен физический смысл />.
Предположим, что /> четная функция. Тогда
/>
Заметим теперь, что /> — также четная функция.Поэтому
/>(4.9)
Функция />и />/>, определенные теперь толькодля положительных /> и />, называются косинус — преобразованиями Фурье по отношению друг к другу.
Рассматриваяпреобразования Фурье нечетной функции, получаем аналогичные соотношения Фурьемежду синус — преобразованиями Фурье:
/> />(4.10)
Если нужно, можносимметризовать выражения, поставив множитель /> передкаждым интегралом (4.7)-(4.10). [4]
2.3 Метод аппроксимацииоператора эволюции (split-operator method)
Рассмотрим более подробнодругой метод аппроксимации оператора эволюции, в котором отсутствуютнедостатки, свойственные рассмотренной выше схеме. Здесь оператор эволюцииаппроксимируется симметричным расщеплением оператора кинетической энергии(split-operator method)
/>(5.1)
Основная погрешность даннойаппроксимации связана с некоммутативностью операторов кинетической ипотенциальной энергии. Вычисление действия такого оператора на волновую функциювключает следующие шаги. Преобразованная в импульсное представление волновая функцияумножается на /> и преобразуетсяобратно в координатное представление, где умножается на />. Полученный результатснова преобразуется в импульсное представление, умножается на /> преобразуется обратно вкоординатное представление. На этом один шаг по времени завершается. Переход отодного представления к
другому осуществляетсяпосредством преобразования Фурье.
В данной курсовой работеиспользуется Гауссов волновой пакет вида />,а также ступенчатый потенциал. Сначала преобразуем нашу волновую функцию изкоординатного представления в импульсное
/> ,(5.2)
затем умножим полученныйрезультат на />. На этомзавершается половина временного шага. Полученный результат снова преобразуетсяв координатное представление
/>(5.3)
и умножается на />. После чего вновьпреобразуется в импульсное представление
/> (5.4)
и умножается на />. Завершается шаг повремени еще одним преобразованием полученной волновой функции в координатноепредставление
/>.(5.5)
Один шаг по временизавершен.
В данной работе этотметод реализован в среде Java,ниже приведены программный блок и полученные графики поведения волновой функциив различные моменты времени.
Важная особенность этогометода заключается в том, что действие каждого из операторов оценивается в ихсоответствующем локальном представлении.
С методической точкизрения ценность нестационарного подхода состоит в существенно большейнаглядности и информативности результатов, по сравнению с результатами решениястационарного уравнения Шредингера. Круг задач, которые могут быть рассмотренына основе решения нестационарного уравнения Шредингера очень разнообразен.
Для иллюстрациивышесказанного рассмотрим задачу о движении частицы в поле потенциальногобарьера. Хотя стационарный подход позволяет определить коэффициенты прохожденияи отражения частицы он, однако, не позволяет рассмотреть реальнуюпространственно-временную картину движения частицы через потенциальный барьер,которая является существенно нестационарной. Рассмотрение задачи на основерешения нестационарного уравнения Шредингера позволяет не только сопоставитьклассический и квантовый подход к проблеме, но и получить ответы на рядвопросов, представляющих значительный практический интерес (например,длительность процесса туннелирования, скорости прошедших и отраженных частиц ит.д.). Ниже мы приводим результаты решения нестационарного уравнения Шредингерадля данной задачи. Начальное состояние частицы задано в виде пакета гауссовойформы, движущегося в направлении области действия потенциала. На графикахпредставлена временная картина туннелирования такого пакета через потенциальныйбарьер прямоугольной формы в виде «мгновенных снимков» волновогопакета в разные моменты времени. Как видно, при попадании пакета в областьдействия потенциала его форма нарушается в результате формирования отраженноговолнового пакета и его интерференции с падающим на препятствие пакетом. Черезнекоторое время формируются два пакета: отраженный и прошедший черезпрепятствие. Движение падающего и отраженного пакета можно сопоставить с движениеклассической частицы, положение которой совпадает с максимумом в распределениивероятности. В случае протяженного потенциала отраженный пакет «отстает»от отраженной от барьера классической частицы. Физически это связано с тем, чтопакет частично проникает в классически запрещенную область, в то время как вклассике отражение происходит строго в точке скачка потенциала. Образование жепрошедшего пакета представляет собой сугубо квантовый эффект не имеющийклассических аналогий.[3]
3. Методы численногорешения стационарного уравнения Шредингера
3.1 Метод Нумерова
Рассмотрим решенияодномерного стационарного уравнения Шредингера (3.1) частицы, движущейся водномерном потенциале U(x).
/>(3.1)
Будем при этом полагать,что его форма имеет потенциала, представленного на рис.1: в точках xmin, xmax потенциал становитсябесконечно большим. Это означает, что в точках xmin, xmaxрасположены вертикальные стенки, а между ними находится яма конечной глубины.
/>
Рисунок 1.
Для удобства дальнейшегорешения запишем уравнение Шредингера (3.1) в виде:
/>(3.2)
Где
/>(3.3)
С математической точкизрения задача состоит в отыскании собственных функций оператора/>, отвечающим граничнымусловиям
/>(3.4)
и соответствующихсобственных значений энергии E.
Так как />при /> и /> при />, />, то можно ожидать, чтособственному решению данной задачи соответствует собственная функция,осциллирующая в классически разрешенной области движения />/> и экспоненциально затухающим взапрещенных областях, где /> />,/>, при />, /> />. Так как все состояния частицы в потенциальной яме оказываются связанными(т.е. локализованными в конечной области пространства), спектр энергий являетсядискретным. Частица, находящаяся в потенциальной яме конечных размеров /> при />,/> при />, имеет дискретный спектрпри /> и непрерывный спектр при />.
Традиционно для решениизадачи о нахождении собственных значений уравнения Шредингера используетсяметод пристрелки. Идея метода пристрелки состоит в следующем. Допустим, вкачестве искомого значения ищется одно из связанных состояний, поэтому вкачестве пробного начального значения энергии выбираем отрицательноесобственное значение. Проинтегрируем уравнение Шредингера каким-либо известнымчисленным методом на интервале />. Походу интегрирования от /> в сторону большихзначений /> сначала вычисляетсярешение /> , экспоненциальнонарастающее в пределах классически запрещенной области. После перехода черезточку поворота />, ограничивающуюслева область движения разрешенную классической механикой, решение уравнениястановится осциллирующим. Если продолжить интегрирование далее за правую точкуповорота />, то решение становитсячисленно неустойчивым. Это обусловлено тем, что даже при точном выборесобственного значения, для которого выполняется условие />, решение в области /> всегда может содержатьнекоторую примесь экспоненциально растущего решения, не имеющего физическогосодержания. Отмеченное обстоятельство является общим правилом: интегрированиепо направлению вовнутрь области, запрещенной классической механикой, будетнеточным. Следовательно, для каждого значения энергии более разумно вычислитьеще одно решение />, интегрируяуравнение (3.1) от /> в сторонууменьшения />. Критерием совпадения данного значенияэнергии является совпадение значений функций /> и/> в некоторой промежуточнойточке />. Обычно в качестве даннойточки выбирают левую точку поворота />. Таккак функции />,/> являются решениямиоднородного уравнения (3.1), их всегда можно нормировать так, чтобы в точке /> выполнялось условие />. Помимо совпадениязначений функций в точке /> дляобеспечения гладкости сшивки решений потребуем совпадения значений ихпроизводных />
/>(3.5)
Используя в (17)простейшие левую и правую конечно-разностные аппроксимации производных функций />, /> в точке />, находим эквивалентноеусловие гладкости сшивки решений:
/>(3.6)
Число /> является масштабирующиммножителем, который выбирается из условия /> Еслиточки поворота отсутствуют, т.е. />E>0, то в качестве /> можно выбрать любуюточку отрезка />. Дляпотенциалов, имеющих более двух точек поворота и, соответственно, три или болееоднородных решений, общее решение получается сшивкой отдельных кусков. Вописанном ниже документе, для интегрирования дифференциального уравнениявторого порядка мы используем метод Нумерова. Для получения вычислительнойсхемы аппроксимируем вторую производную трехточечной разностной формулой:
/>(3.7)
Из уравнения (3.1) имеем
/>(3.8)
Подставив (3.7) в (3.8) иперегруппировав члены, получаем
/>(3.9)
Разрешив (3.9)относительно /> или />, найдем рекуррентныеформулы для интегрирования уравнения (3.1) вперед или назад по /> c локальной погрешностью />. Отметим, что погрешностьданного метода оказывается на порядок выше, чем погрешность метода Рунге-Куттачетвертого порядка. Кроме того данный алгоритм более эффективен, потому чтозначение функции /> вычисляютсятолько в узлах сетки. Для нахождения численного решения оказывается удобнымпровести обезразмеривание уравнения (3.1), используя в качестве единицизмерения расстояния /> - ширинупотенциальной ямы, в качестве единиц измерения энергии — модуль минимальногозначения потенциала />. В выбранныхединицах измерения уравнение (3.1) имеет вид
/>(3.10)
где
/> /> /> />(3.11)
Таким образом,вычислительный алгоритм для нахождения собственных функций и собственныхзначений уравнения Шредингера реализуется следующей последовательностьюдействий:
1. Задать выражение, описывающее безразмерный потенциал />.
2. Задать значение />.
3. Задать пространственную сетку, на которой проводитсяинтегрирование уравнения (3.1).
4. Задать />, />.
5. Задать начальноезначение энергии />.
6. Задать конечноезначение энергии />.
7. Задать шаг измененияэнергии />.
8. Проинтегрироватьуравнение (3.1) для значения энергии /> слеванаправо на отрезке />.
9. Проинтегрироватьуравнение (3.1) для значения энергии /> справаналево на отрезке />.
10. Вычислить значенияпеременной /> для значения энергии />.
11. Увеличить текущеезначение энергии на />: />.
12. Проинтегрироватьуравнение (3.1) для значения энергии /> слеванаправо на отрезке />.
13. Проинтегрироватьуравнение (3.1) для значения энергии /> справаналево на отрезке />.
14. Вычислить значенияпеременной /> для значения энергии />.
15. Сравнить знаки />, />
16. Если /> и />, увеличить текущеезначение энергии на /> и повторитьдействия, описанные в пп. 8-17.
17. Если />, уточнить методом линейнойинтерполяции.
18. Если />, повторить действия,описанные в пп. 8-18.
19. Если />, закончить вычисления.[5]
4. Программная реализациячисленных методов средствами Java
4.1 Обзор языкапрограммирования Java
Java связан с C++, который являетсяпрямым потомком С. Многое в характере Java унаследовано от этих двух языков. От С Java получил его синтаксис. На многие изобъектно-ориентированных свойств Java повлиялC++. Некоторые из определяющих характеристик Java происходят от его предшественников. Кроме того,создание Java глубоко внедрилось в процессыусовершенствования и адаптации, которые проявились в языках машинногопрограммирования в течение последних трех десятилетий. Каждое новшество впроекте языка управлялось потребностью решить фундаментальную проблему, скоторой не справились предшествующие языки. Java не является исключением.
Internet помогкатапультировать Java на переднийкрай программирования, a Java, в свою очередь, имел глубокоевлияние на Internet. Этому есть простое объяснение: Java разворачивает вселенную объектов,которые могут свободно перемещаться в киберпространстве. В сети две оченьшироких категории объектов передаются между сервером и вашим персональнымкомпьютером — пассивная информация и динамические, активные программы.Например, когда вы читаете вашу электронную почту, то рассматриваете пассивныеданные. Даже, когда вы загружаете программу, ее код — это все еще толькопассивные данные до тех пор, пока вы их не начнете выполнять. Однако на вашкомпьютер может быть передан объект второго типа — динамическая,самовыполняющаяся программа. Такая программа — активный агент на компьютереклиента, все же инициализируется сервером. Например, сервер мог бы предоставить(клиенту) программу, чтобы должным образом отображать данные, посылаемыеклиенту.
Стольже желательными, как и динамические, являются сетевые программы. Они такжепорождают серьезные проблемы в области защиты и мобильности. До. Java, киберпространство было эффективнозакрыто для половины объектов, которые теперь живут там. Кроме того, Java имеет дело с захватывающе новойформой программ — апплетами.
Java можноиспользовать, чтобы создать два типа программ — приложения и апплеты. Приложение— это программа, которая выполняется на вашем компьютере с помощью егооперационной системы. То есть, приложение, созданное спомощью Java, более или менее подобно приложению,созданному с использованием С или C++. При создании приложения Java не намного отличается от любогодругого машинного языка. Более важной является способность Java создавать апплеты. Апплет — этоприложение, разработанное для передачи по Internet и выполняемое совместимым с Java Web-браузером. Апплет — это, фактически, крошечнаяпрограмма Java, динамически загружаемая через сеть,подобная изображению, звуковому файлу, или видеоклипу. Важное отличиезаключается в том, что апплет является интеллектуальной программой, а не простомультипликацией (анимацией) или media-файлом.Другими словами, апплет — это программа, которая может реагировать на вводпользователя и динамически изменять, а не просто выполнять ту же самуюмультипликацию или звук много раз.
Многоплатформнаясреда Web предъявляет экстраординарныетребования к программе, потому что та должна выполниться надежно в самыхразнообразных системах. Поэтому способности создавать устойчивые программы былдан высокий приоритет в проекте Java.Чтобы обеспечить надежность, Javaограничивает вас в нескольких ключевых областях, вынуждая рано находить ошибкипри разработке программы. В то же самое время, Java освобождает от необходимости волноваться относительномногих из наиболее общих причин ошибок программирования. Поскольку Java — язык со строгой типизацией, онпроверяет ваш код во время компиляции. Однако он также проверяет ваш код и вовремя выполнения. В действительности, множество трудно прослеживаемых ошибок,которые часто обнаруживаются в трудно воспроизводимых ситуациях во временя выполнения,просто невозможно создать в Java.Знание того, что программа, которую вы написали, будет вести себя предсказуемымобразом при разных условиях, является ключевым свойством Java.
Чтобы лучше понимать,насколько устойчив Java, рассмотримдве из главных причин отказа программы: ошибки управления памятью инеуправляемые исключительные состояния (т. е. ошибки во время выполнения).Управление памятью может быть трудной и утомительной задачей в традиционныхсредах программирования. Например, на C/C++ программист должен вручнуюраспределять и освобождать всю динамическую память. Это иногда ведет кпроблемам, потому что программисты или забывают освобождать память, котораябыла предварительно распределена, или, хуже, пытаются освободить некоторуюпамять, которую другая часть их кода все еще использует. Java фактически устраняет эти проблемы,управляя распределением и освобождением памяти. (Фактически, освобождениеполностью автоматическое, потому что Java обеспечивает сборку «мусора» для неиспользованных объектов.)Исключительные состояния в традиционных средах часто возникают в ситуациях типаделения на нуль или «файл, не найден», и они должны управлятьсянеуклюжими и трудно читаемыми конструкциями. Java помогает и в этой области, обеспечиваяобъектно-ориентированную обработку особых ситуаций. В хорошо написанной Java-программе все ошибки временивыполнения могут — и должны — управляться вашей программой.
Java был спроектирован так, чтобывыполнить реальное требование — создавать интерактивные сетевые программы. Чтобывыполнить это, Java поддерживает многопоточноепрограммирование, которое позволяет вам писать программы, выполняющиеодновременно несколько операций. Исполняющая система Java подходит с изящным и все же искушенным решением ксинхронизации мультипроцесса, что дает возможность создавать гладко работающиеинтерактивные системы. Удобный в работе подход Java к многопоточности позволяет вам поразмыслить надспецификой поведения вашей программы, а не заботиться о многозадачнойподсистеме.
Программы Java несут в себе существенное количествоинформации времени выполнения, которая используется, чтобы проверять иразрешать доступ к объектам в период работы программы. Это дает возможностьдинамически связывать код в безопасной и целесообразной манере, и имеет решающеезначение для устойчивости среды апплета, в которой маленькие фрагментыбайт-кода могут динамически обновляться исполнительной системой.
Всекомпьютерные программы состоят из двух элементов: кода и данных. Любаяпрограмма может быть концептуально организована либо вокруг ее кода, либовокруг ее данных. Иначе говоря, некоторые программы концентрируют свою записьвокруг того, «что делается с данными»1, а другие — вокругтого, «на что этот процесс влияет»2. Существуют двепарадигмы (основополагающих подхода), которые управляют конструированиемпрограмм. Первый подход называет программу моделью, которая ориентирована напроцесс (process-oriented model). При этом подходе программу определяютпоследовательности операторов ее кода. Модель, ориентированную на процесс,можно представлять как кодовое воздействие на данные (code acting on data). Процедурные языки, такие как С, успешноэксплуатируют такую модель. Однако, при этом подходе возникают проблемы, когдавозрастает размер и сложность программ. Второй подход, названный объектно-ориентированнымпрограммированием, был задуман для управления возрастающей сложностью программ.Объектно-ориентированное программирование организует программу вокруг своихданных (т. е. вокруг объектов) и набора хорошо определенных интерфейсов (взаимодействий)с этими данными. Объектно-ориентированную программу можно характеризовать как управляемыйданными доступ к коду (data controlling access to code). Как вы увидите далее, переключая управление наданные, можно получить некоторые организационные преимущества. Опыт показывает,что отсутствие стандартных базовых библиотек для языка С++ чрезвычайнозатрудняет работу с ним. В силу того, что любое нетривиальное приложениетребует наличия некоторого набора базовых классов, разработчикам приходитсяпользоваться различными несовместимыми между собой библиотеками или писать свойсобственный вариант такого набора. Все это затрудняет как разработку, так идальнейшую поддержку приложений, затрудняет стыковку приложений, написанныхразными людьми. Полная система 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 classShreding {
final doubleK0 = 1.0;
final doubleC = 0.893;
doublei = Math.sqrt(-1);
doublehx = (XMax-XMin)/N;
doublehp = 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(){
doubleM[][]= new double[N+1][20+15*(NT+1)];
doubleL[][]= new double[N+1][NT+1];
for (intm = 0; 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 (intk = 1; k
for (intj = 0; 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 (intm = 0; 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 (intj = 0; 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 (intm = 0; 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;
}
}
classWave{
final doubleK0 = 1.0;
final doubleC = 0.893;
doublei = Math.sqrt(-1);
doublehx = (XMax-XMin)/N;
doublehp = 2*PMax/N;
/**
*
*Вычисление координат x
*/
double[] x(){
doubleX[] = new double[N+1];
for (intj = 0; j
X[j] = XMin+j*hx;
}return X;
}
double[]x = new double[N+1];{
x =x();}
**
*
*Вычисление импульсов p
*/
double[] p(){
doubleP[] = new double[N+1];
for (intj = 0; 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){
doubleW[]= new double[N+1];
for (intj = 0; j
doubleV = 0;
if(x[j]>a && x[j]
V = VMax;
}W[j] = V;
}return W;
}
double[]w = new double[N+1];{
w =w();}
/**
*
*Действительная часть функци Psy в начальный момент времени
*/
double[]rePsyX0(){
doubleRePsyX0[]= new double[N+1];
for (intj = 0; 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(){
doubleImPsyX0[]= new double[N+1];
for (intj = 0; 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 (intj = 0; j
PsyX02[j] = L[j]*L[j] + K[j]*K[j];
}return PsyX02;
}
double[]psyX02 = new double[N+1];{
psyX02= psyX02();}
/**
*
*Первое преобразование Фурье и вычисление действительной части функции Psy
*/
double[]rePsyP0(){
doubleRePsyP0[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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;
returnRePsyP0;
}
double[]rePsyP0 = new double[N+1];{
rePsyP0= rePsyP0();}
/**
*
*Первое преобразование Фурье и вычисление мнимой части функции Psy
*/
double[]imPsyP0(){
doubleImPsyP0[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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;
returnImPsyP0;
}
double[]imPsyP0 = new double[N+1];{
imPsyP0= imPsyP0();}
/**
*
*Произведение действительной части функции Psy и первой составляющей операторарасщепления
*/
double[]rePsyPt2(){
doubleRePsyPt2[]= new double[N+1];
for (intj=0; 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(){
doubleImPsyPt2[]= new double[N+1];
for (intj=0; 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(){
doubleRePsyX1t2[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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(){
doubleImPsyX1t2[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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(){
doubleRePsyX1t2V[]= new double[N+1];
for (intj=0; 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(){
doubleImPsyX1t2V[]= new double[N+1];
for (intj=0; 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(){
doubleRePsyP1t[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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(){
doubleImPsyP1t[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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(){
doubleRePsyP1te[]= new double[N+1];
for (intj=0; 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(){
doubleImPsyP1te[]= new double[N+1];
for (intj=0; 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(){
doubleRePsyX2t[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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(){
doubleImPsyX2t[]= new double[N+1];
for (intj=0; j
doubleS = 0;
for (ints=0; 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 (intj = 0; j
PsyX2t[j] = L[j]*L[j] + K[j]*K[j];
}returnPsyX2t;
}
}
Графики поведенияволновых функций
Прямоугольныйпотенциальный барьер
/>
/>
/>
/>
Барьер гауссова функция
/>
/>
/>
/>
Заключение
Численное решениенестационарного уравнения Шредингера имеет важное значение для компьютерногоисследования квантовых систем. В данной работе рассмотрены два методачисленного решения одномерного нестационарного уравнения Шредингера: методконечных разностей и метод аппроксимации оператора эволюции. По результатамвычислений построены графики поведения волновой функции в зависимости от временидля ступенчатого потенциала.
Полученные значенияполностью соответствуют теоретическим данным для квантовомеханической задачи соступенчатым потенциалом и наглядно отражают процессы отражения и прохождениячастицы через потенциальный барьер. Также рассмотренные численные методы могутиспользоваться для расчета других видов волновых функций и потенциалов.
Список использованныхисточников
1. А.С. Давыдов. Квантовая механика//М.,: «Наука»,1973г., 704 с
2. З. Флюгге. Задачи по квантовой механике//М.: «Мир»,Т.1, 1974г., 343 с
3. Е.А. Волкова, А.М. Попов, А.Т. Рахимов, «Квантоваямеханика на персональном компьютере»//Москва.: «УРСС», 1995.
4. Дж. Мэтьюз, Р. Уокер «Математические методы физики».
4. С.В. Поршнев Моделирование квантовых систем //www.exponenta.ru
6. П.Ноутон, Г.Шилдт Java 2 Наиболее полноеруководство//С-Петербург: «БХВ-Петербург» 2007.