Текст
                    II
Издательство «Мир»

С. КУНИН ВЫЧИСЛИТЕЛЬНАЯ ФИЗИКА
COMPUTATIONAL PHYSICS Steven E. Koonin Professor of Theoretical Physics California Institute of Technology Addison-Wesley Publishing Company, Inc. The Advanced Book Program Redwood City, California • Menlo Park, California • Reading, Massachusetts New York • Amsterdam • Don Mills, Ontario Sydney • Bonn • Madrid • Singapore • Tokyo * Bogota • Santiago San Juan • Wokingham, United Kingdom
С. Кунин Вычислительная физика Перевод с английского кандидатов физ.-мат. наук А.Д. Баркалова и А.Н. Явохина под редакцией д-ра физ.-мат. наук, проф. А.Н. Матвеева Москва «Мир» 1992 Scan AAW
ББК 32.97-22.31 К91 УДК53.087.9 Кунин С. К91 Вычислительная физика: Пер. с англ. — М: Мир, 1992.— 518 с., ил. ISBN 5-03-002124-8 Книга профессора Калифорнийского университета (США) посвя- щена компьютерному моделированию физических систем. Изложены основы математических методов моделирования, представлены 8 проектов и 8 примеров применения описанных методов к нетриви- альным задачам классической, квантовой и статистической механи- ки. Треть книги— полностью документированные программы на Бей- сике. Для студентов, преподавателей, а также специалистов-физиков, химиков и инженеров. 1604010000-086 К---------------- 28 -91 041(01)-92 ББК 52 Редакция литературы по физике и астрономии ISBN 5-03-00124-8 (русск.) ISBN 0-201-12279-0 (англ.) © 1986 by Addison-Wesley Publishing Company © перевод на русский язык, Баркалов А.Д., Явохин А. Н. 1992
Моим родителям ПРЕДИСЛОВИЕ Ни одна область современной науки не обходится без численных расче- тов. В физике особенно важно уметь использовать всю вычислительную мощь современных компьютеров. Правильное применение ЭВМ при модели- ровании физических систем означает нечто существенно большее, чем простое «перемалывание чисел». Опытный физик-вычислитель опирается на аналитическое решения и физическую интуицию, применяя численные расчеты в задачах, которые не поддаются решению другими методами. К сожалению, в рамках стандартного университетского курса физи- ки обучению «вычислять» уделяется мало места. Ведь такое умение требует интеграции трех дисциплин (физики, численного анализа и программирования ЭВМ), изучаемых обычно в несвязанных между собой курсах. Немногие студенты-физики к концу обучения представляют се- бе, как использовать компьютер в своей работе. Обычно они знают не- который ограниченный набор методов, который изучили в ходе выполне- ния нескольких независимых работ, таких, как исследовательский про- ект или дипломная работа. При отборе материала для этой книги ставилась цель— на примерах прямого использования ЭВМ для моделирования физических систем выра- ботать навыки вычислительного мастерства у студентов старших курсов и начинающих аспирантов. Сюда включен минимальный набор численных методов, необходимых, чтобы «создавать физику» на компьютере. Каж- дый из них вначале рассматривается в тексте, часто эвристически, а затем применяется к решению нетривиальной задачи из области класси- ческой, квантовой или статистической физики. Эти задачи подбирались с целью расширить или углубить материал стандартного университет- ского курса физики и потому представляют значительный собственный интерес вне связи с вычислительными методами, которые они иллюстри- руют.
6 Предисловие Материал книги не следует рассматривать как некоторый закончен- ный и устоявшийся учебный курс. Я ограничил выбор примерами вычис- лений, которые иллюстрировали бы какой-то широко используемый чис- ленный метод (эффективно работающий на персональном компьютере) и одновременно представляли некоторый интерес с точки зрения физика. Из-за этого некоторые важные численные методы здесь оказались опу- щены, в частности интерполяция сплайнами и быстрое преобразование Фурье. Лучше всего представить, что «Вычислительная физика» создает среду, обеспечивающую возможность для дальнейших разработок. Есть много вариантов расширения и развития изложенного материала. Ис- пользование собственного воображения для дальнейшего движения в указанных направлениях будет наиболее результативным методом работы над текстом. Эта книга является преимущественно книгой по физике. Макси- мальную пользу она принесет студентам, имеющим подготовку в рамках вузовских курсов классической, квантовой и статистической физики и освоившим также курс математических методов в физике или расширен- ный курс математического анализа. Книга не является учебником по методам численного анализа— в ней нет даже попыток давать строгое или полное обоснование излагаемым численным методам. Обсуждение же этих методов должно быть вполне доступно для студентов, обладающих указанной выше подготовкой. Возможно, иногда потребуется обращаться к одному из многих прекрасных учебников по численному анализу (например, [Ас70], [Ви81] или [Sh84]). Данная книга не является также и учебником по программированию для компьютеров. И хотя я во всех случаях пытался следовать принципам «хорошего программирова- ния» (см. приложение Б), задача учить читателя этому, начиная «с нуля», здесь не ставилась. Собственно, методы создания программ и написания соответствующих кодов лежат в стороне от главной цели этой книги. И поэтому читателю необходимо знакомство с программиро- ванием на одном из языков высокого уровня (Бейсик, Фортран, Пас- каль, СИ) хотя бы в пределах вводного курса. Выбор языка всегда вызывает сильные страсти среди ученых, рабо- тающих с компьютерами. Но любой язык программирования в конце кон- цов только средство для выражения содержания, составляющего суть программы. Для содержания данной книги также безразлично, на каком языке будут записаны соответствующие алгоритмы. Поскольку какой-то определенный язык все же выбрать необходимо, я использовал стан- дартный Бейсик в версии фирмы Microsoft для компьютеров IBM
Предисловие 7 РС/ХТ/АТ. Хорошо известны многие недостатки, присущие Бейсику. Главными из них являются отсутствие локальных переменных в подпро- граммах и громоздкость создания структурированных программ. Тем не менее я считаю, что эти недостатки вполне компенсируются простотой языка и его гибкостью. Бейсик доступен почти на всех типах персо- нальных компьютеров. Существуют как интерпретаторы языка, наиболее удобные при написании и отладке программных кодов, так и компилято- ры Бейсика, позволяющие получать в результате быстродействующие ис- полняемые коды. Бейсик обладает достаточно мощными графическими возможностями и средствами ввода и вывода данных. Я надеюсь, что читатели, знакомые с каким-либо другим из языков высокого уровня, смогут «на лету» освоить Бейсик и пользоваться • этой книгой. В помощь таким читателям в приложении А дается краткая сводка опера- торов Бейсика, а более подробные сведения можно найти во многих до- ступных руководствах по этому языку. Конечно, читатель может пред- почесть переписать предлагаемые программы на более подходящий ему язык. Эта книга появилась как результат чтения лекций зимой и весной 1984 г. студентам-физикам третьего и четвертого курсов Калифорний- ского института вычислительной физики. Содержание курса значительно выиграло от вдохновляющей поддержки, которую оказали автору М.-К. Чу, В. Пёниш, Р. Вильямс и Д. Мередит. Последний из них ока- зал также большую помощь в подготовке окончательного варианта руко- писи и программ. Мне также хотелось бы поблагодарить мою жену Лауру за ее чрезвычайное терпение, понимание и поддержку в течение моей двухлетней работы над книгой. Пасадена, май 1985 г. Стивен Э. Кунин
С компьютерами та проблема, что они только дают ответы. (Приписывается П. Пикассо) КАК ПОЛЬЗОВАТЬСЯ этой книгой Книга разбита на главы, каждая из которых содержит собственно текст, пример и некоторую задачу-проект. В разделах с текстом дает- ся общее обсуждение одного или нескольких близких численных мето- дов. При этом они часто иллюстрируются простыми математическими примерами. В текст включен ряд упражнений для расширения излагаемой темы и закрепления понимания путем аналитических выкладок или с по- мощью написания и просчета простых программ. Такие упражнения отме- чены специальным знаком | в начале строки. В каждой из глав пример и проект иллюстрируют применение опи- санных в ней методов к конкретным физическим проблемам. При этом вначале излагается физическая суть предлагаемой проблемы, а затем объясняется, как следует применять описанный выше численный метод. Пример и проект различаются между собой только ожидаемым способом, которым студент будет использовать (и, возможно, изменять) приводи- мые в них программы. Для примеров программы собраны в приложении Б и сопровождаются в тексте комментариями, шаг за шагом поясняющими структуру этих программ. Такие комментарии также отмечены в тексте знаками | . Приведены в книге также программы для проектов. Они со- браны в приложении В и могут служить образцами для собственных про- грамм читателей или же средством изучения физики, связанной с дан- ным проектом. Каждый пример и проект сопровождаются рядом дополни- тельных заданий. Они помогут читателю в использовании программ, по- нимании заложенных в них физических принципов и включенных в алго- ритм численных методов. В программах, как правило, используются простейшие операторы Бейсика. Поэтому они должны правильно восприниматься большинством реализаций этого языка. Все программы можно выполнять с помощью ин- терпретаторов Бейсика. Но поскольку они содержат достаточно много
Как, пользоваться этой книгой 9 вычислений, становится весьма важным вопрос о времени, необходимом для получения результатов счета. Поэтому для серьезных исследований рекомендуется создавать исполняемые коды программ с помощью компи- ляторов Бейсика фирм IBM или Microcdft. Такие коды работают в 5 — 10 раз быстрее. Программы писались таким образом, чтобы перевод их на другие языки высокого уровня (например, Фортран) был достаточно простым и прямым. Одним из эффективных способов изучения материала книги может быть такой их вариант. Студенты самостоятельно изучают текст книги. При этом они должны иметь возможность получать консультации у пре- подавателя. Он же следит за их работой, проводя краткие индивиду- альные опросы по каждой главе. Три главы за десять недель (60 учеб- ных часов) являются, по-видимому, вполне разумным темпом. Обычно за это время студенты пишут собственные программы для двух проектов (и используют приводимые в книге коды примеров) и еще одного из проек- тов для изучения физики соответствующих явлений. Восьми глав этой книги должно вполне хватить для семестрового курса. Альтернативный способ работы с книгой состоит в использовании ее как дополнитель- ного материала в курсах классической, квантовой и статистической механики. Большинство примеров и задач книги живо иллюстрируют ос- новные идеи, изучаемые этими дисциплинами, и потому вполне подходят для использования их на занятиях в аудитории и при самостоятельной работе.
1. ОСНОВНЫЕ МАТЕМАТИЧЕСКИЕ ОПЕРАЦИИ Ядром большинства компьютерных моделей физических систем являются операции численного дифференцирования, интегрирования и нахождения корней функций. Допустим, что мы умеем рассчитывать значения функ- ции f(x) для произвольного значения независимой переменной х. Тогда в результате дифференцирования будет найдена одна из производных функции f в заданной точке х. Интегрирование приближенно можно счи- тать операцией, обратной дифференцированию. При этом требуется вы- числить величину определенного интеграла функции f(x) в указанных пределах. Результатом операции нахождения корней являются одно или несколько значений х, которым соответствуют пренебрежимо малые зна- чения функции f. Если f(x) выражается аналитической зависимостью, то при доста- точной настойчивости почти всегда удается получить также аналити- ческие выражения для производных функции f. Нередко формула может быть получена и для значений определенного интеграла функции f(x). Однако все же более часты случаи, когда невозможно использовать аналитические методы, даже если сами значения f(x) могут быть вы- числены в любой точке. Это может быть следствием того, что значение f находится в результате очень сложной численной процедуры, и по- этому формула, к которой следовало бы применять правила дифференци- рования и интегрирования, просто отсутствует. Еще хуже, когда зна- чения f можно рассчитать лишь для ограниченного множества дискрет- ных значений независимой переменной х. В таких случаях мы вынуждены пользоваться приближенными формулами, выражая искомые величины про- изводных и интегралов через значения функции f(x) в тех точках, где их вычисление возможно. Что касается нахождения корней, то для лю- бых функций, исключая наипростейшие, их значения аналитическими ме- тодами найти не удается, и использование численных методов здесь является принципиальным моментом решения задачи.
Основные математические операции 11 Рис. 1.1. Значения функции f на равномерной сетке. Штриховой линией показана линейная интерполяция. В данной главе мы рассмотрим реализацию на компьютерах трех указанных математических операций. Основной метод при этом будет состоять в замене исходной функции f более простой (обычно это по- лином первой или второй степени), для которой требуемые операции выполняются достаточно легко. Здесь будут получены лишь простейшие и наиболее часто употребляемые формулы (схемы). Более полное обсуж- дение затронутых проблем можно найти в многочисленных учебниках по численным методам. 1.1. ЧИСЛЕННОЕ ДИФФЕРЕНЦИРОВАНИЕ Предположим, что требуется найти значение производной f'(0) в точке х - 0. (Для произвольного значения х полученные формулы достаточно просто могут быть обобщены путем сдвига вдоль числовой оси.) Будем считать также, что нам известны значения f в узлах одномерной сетки с постояннным шагом: 1п = «Хп); Хп = nh (п = °- 41’ ±2’ -)• Необходимо рассчитать приближенное значение f'(0), используя извес- тные значения fn (см. рис.1.1). Начнем с разложения функции f(x) в ряд Тейлора вблизи х = 0: 2 3 fW = fo + xr + .... (1.1) Z! О! где все производные вычислены в точке х - 0. Легко проверить, что /+ В Дх = ±Л) = f0 ± hf' + £f" ± А3Г"+ О(й4). (1.2а) “ 2 6
12 Глава 1 fi2 = f(x = ±2h) = f0 ± 2hf' + 2ft2/" + ^f"‘+ 0(h*), (1.26) 3 где 0(/z4) обозначает сумму членов ряда порядка /г4 и выше. Для оцен- ки вклада различных членов мы будем полагать, что функция f и все ее производные являются величинами одного порядка, что обычно верно для большинства зависимостей в физике и ее приложениях. Используя (1.2а) и вычитая f_} из fr после некоторой перегруп- пировки членов получаем f _ f 2 f' = J------ - - /'"+ O(ft4). (1.3а) 2h 6 Первый член здесь дает конечно-разностную аппроксимацию искомой производной 1 “ чг-1 "“> Основная ошибка полученного приближения определяется членом с f' ’ *, который становится пренебрежимо малым по мере уменьшения шага h. «3-точечная» формула (1.36) дает точное значение производной в слу- чае, когда f на интервале [-Л, К] является полиномом второй степе- ни, так как его производные, начиная с третьей и выше равны, нулю. По существу в схеме (1.36) заложено предположение, что функция f хорошо интерполируется квадратичным полиномом по ее значениям в трех точках х = ±/г, 0. Равенство (1.36) является совершенно естественным, если вспомнить формулы, используемые для определения производной в элементарных вычислениях. Ошибка полученного приближения (член порядка h ) в принципе может быть сделана сколь угодно малой путем выбора все меньших величин для шага h. Отметим также, что использованная здесь разность симметрична относительно точки х = 0. Из-за этого (1.36) дает более точное значение производной, чем формулы с «разностью вперед» и «разностью назад»: Г ~ f-L—- + 0(A). (1.4а) h f' * f° ~ Ll + 0(h). (1.46) h В основе этих «2-точечных» схем лежит предположение, что на интер- вале между х = 0 и х = ±h функция f хорошо аппроксимируется линей- ной функцией. В качестве примера рассмотрим расчет f'(x = 1) для f(x) = sin х. Точное значение производной, конечно, равно cos 1 = 0,540302. Сле-
Основные математические операции 13 дующая программа на Бейсике рассчитывает приближенные значения про- изводной по формуле (1.36) для различных значений /г, вводимых поль- зователем: 10 Х=1: EXACT=COS(X) 20 INPUT "Вводите величину h (<=0 для завершения работы)"; Н 30 IF Н<=0 THEN STOP 40 FPRIME = (SIN(X+H)-SIN(X-H))/(2*H) 50 DIFF = EXACT-FPRIME 60 PRINT USING "h = #.######, ошибка = +#.######"; H, DIFF 70 GOTO 20 (Для начинающих пользователей Бейсика поясним, что величина h зада- ется путем ввода числа с клавиатуры в ответ на соответствующий зап- рос. При вводе неположительного числа программа заканчивает работу. Для имен переменных в тексте программы выбраны английские слова, соответствующие обозначаемым величинам. В строке 40 переписана фор- мула (1.36) с использованием функции SIN( ), встроенной в интерпре- татор языка Бейсик. Строка 60 определяет вывод результатов счета на экран с семью значащими цифрами. Строкой 70 управление передается в начало программы для ввода нового значения h.) В табл. 1.1 даны результаты расчетов, полученные с помощью при- веденной выше программы, а также аналогичных ей программ, реализую- щих расчеты по схемам (1.4а) и (1.46). Обратите внимание, что по мере уменьшения h точность расчета улучшается. Однако после некото- рого значения h начинается падение точности. Этот эффект объясняет- ся тем, что вычисления в компьютере всегда выполняются с ограничен- ной точностью (5—6 десятичных разрядов для переменных с обычной точностью). При вычислении разностей в числителях аппроксимационных формул могут возникать относительно большие ошибки, связанные с ок- руглением, когда h слишком мало и и отличаются очень слабо. Например, для h = 10-6 при точности в шесть значащих цифр = sin (1,000001) = 0,841472; f_} = sin (0,999999) = 0,841470, a = 0,000002. Подстановкой в (1.36) находим f' ~ 1,000000, что является очень плохим результатом. Однако расчеты с десятью значащими цифрами, когда = 0,8414715251; = 0,8414704445, дают вполне приемлемое значение f' ~ 0,540300. Из сказанного следу- ет, что численное дифференцирование является внутренне неустойчивым
14 Глава 1 Таблица 1.1. Отклонение результатов расчета от точного значения d(sin x)/dx|x=1 = 0,540302 h Симметричная 3-точечная схема (1.36) 2-точечная схема (1.4а) с разностью вперед 2-точечная схема (1.46) с разностью назад Симметричная 5-точечная схема (1.5) 0,50000 0,022233 0,228254 -0,183789 0,001092 0,20000 0,003595 0,087461 -0,080272 0,000028 0,10000 0,000899 0,042938 -0,041139 0,000001 0,05000 0,000225 0,021258 -0,020808 0,000000 0,02000 0,000037 0,008453 -0,008380 0,000001 0,01000 0,000010 0,004224 -0,004204 0,000002 0,00500 0,000010 0,002108 -0,002088 0,000006 0,00200 -0,000014 0,000820 -0,000848 -0,000017 0,00100 -0,000014 0,000403 -0,000431 -0,000019 0,00050 0,000105 0,000403 -0,000193 0,000115 0,00020 -0,000163 -0,000014 -0,000312 -0,000188 0,00010 -0,000312 -0,000312 -0,000312 -0,000411 0,00005 0,000284 0,001476 -0,000908 0,000681 0,00002 0,000880 0,000880 0,000880 0,000873 0,00001 0,000880 0,003860 -0,002100 Ю,000880 процессом (в смысле отсутствия определенного предел^ при h —* 0), и потому пользоваться им следует с достаточной осторожностью. 3-точечная схема (1.36) может быть улучшена за счет использова- ния значений функции f в узлах сетки, удаленных от точки х = 0 на большее расстояние. Например, используя (1.2), можно показать, что в 5-точечной схеме Г « -±- U-2 - &f-i + 8^1 - У + °(л4) О'5) 12 А мы пренебрегаем всеми членами с производными, начиная с четвертой. Вычисление производной по этой схеме предполагает, что на 5-точеч- ном интервале [-2А, 2Л] функция f хорошо интерполируется полиномом четвертой степени. И хотя эта схема требует большего объема вычис- лений, результаты при этом получаются значительно лучше, что хорошо видно из табл. 1.1. Фактически при величине шага А, большей почти на порядок, точность (1.5) сравнима с точностью схемы (1.36). Это мо-
Основные математические операции 15 жет быть весьма важным в тех случаях, когда необходимо хранить в оперативной памяти компьютера значения f в большом числе точек х. Тогда за счет использования более точной формулы можно проводить более редкое табулирование функции и сократить объем необходимой оперативной памяти. Однако из-за того, что схема (1.5) требует большего числа математических операций, и из-за взаимных уничтоже- ний (присутствуют члены как с положительными, так и с отрицательны- ми коэффициентами) начало роста ошибок, связанных с округлением, в этой схеме будет происходить при больших значениях А. Из (1.2) можно также получить и расчетные схемы для производных более высоких порядков. Например, легко видеть, что f, - 2f0 + Ц = Л2/" + О(Л4). (1.6) Отсюда получаем приближенную формулу для второй производной с точ- ностью порядка А2: f" а Ь---2fo + f-i (1.7) А Аналогично можно вывести разностные формулы для других произ- водных функции f с более высоким порядком точности по А. В табл. 1.2 обобщены формулы 4- и 5-точечных схем. | Упражнение 1.1. Используя любые функции, для которых вы сможете получить аналитические выражения производных, исследуйте точность формул из табл. 1.2 для различных величин шага А. 1.2. ЧИСЛЕННОЕ ИНТЕГРИРОВАНИЕ Целью интегрирования является вычисление значения определенного ин- теграла от функции f на отрезке, ограниченном двумя пределами а < < 6. На этом отрезке всегда можно определить равномерную сетку с шагом А так, что N = (А - а)/А будет целым четным числом. Для наших целей будет достаточно вывести формулу вычисления интеграла в пре- делах от -А до +А, а исходная задача может быть решена многократным использованием полученной формулы: b a+2h a+4h b J f(*)dx = J f(x)dx + J f(x)dx + ... + J f(x)dx. (1.8) a a a+2h b-2h
16 Глава 1 Таблица 1.2. 4- и 5-точечные разностные формулы для производных 4-точечные 5-точечные hf' ±§(-2^Г^о+6^Г^2) h.2f" /-Г2^1 2^16^-30^16^) h3f" ±W?1+3f0-3f±l+f±2) h4f^ L2~4L^f0-4fff2 Все обсуждаемые ниже формулы интегрирования (они называются еще квадратурными формулами) относятся к классу формул Ньютона— Котеса замкнутого типа. Основная идея, лежащая в их основе, состоит в при- ближенной замене функции f между -h и +h некоторой другой функцией, которая может быть точно проинтегрирована на этом отрезке. Напри- мер, для простейшей аппроксимации можно разделить интервал интегри- рования на два отрезка [-Л, 0] и [0, h] и считать, что на каждом из них функция f изменяется линейно (см. рис.1.1). Ошибка, связанная с о такой интерполяцией, будет порядка h f", так что приближенное зна- чение интеграла равно h J f(x)dx = ± (f_} + 2f0 + f}) + O(ft3). (1.9) -h Мы получили хорошо известную формулу метода трапеций. Более точное приближение можно получить, использовав разложение функции f в ряд Тейлора (1.1) для улучшения ее интерполяции. Учтя разностные формулы (1.36) и (1.7) для первой и второй производных, получим внутри области |х| < h Ы ' '» * Чт4, ’ ~ 2>° Это выражение легко проинтегрировать: h J f(x)dx = J (f, + 4f0 + f_J + О(Л5), (1.11) О -h Получена формула Симпсона, точность которой на два порядка выше точности формулы трапеций (1.9). Обратите внимание, что в действи- тельности ошибка интегрирования по формуле Симпсона меньше той, ко- торую на первый взгляд следовало бы ожидать от разложения (1.10).
Основные математические операции 17 з Это связано с тем, что член с х не дает вклада в интеграл. Подста- новка полученной формулы в (1.8) дает Г f(x)dx = [ f(a) + 4f(a + Л) + 2f(a + 2Л) + 4f(a + ЗЛ) + ... J 3 b ... + 4f(b - h) + f(6)] (1.12) Как пример рассмотрим следующую программу, которая использует метод Симпсона для вычисления интеграла 1 jexdx = е - 1 = 1,718282. О Число интервалов N = 1/Л вводится пользователем с клавиатуры. 5 DEF FNF(X)=EXP(X) 'интегрируемая функция 10 ЕХАСТ=ЕХР(1)-1 15 INPUT "Вводи N (четное и >=2)", N% 20 IF N%<2 THEN STOP 25 i 30 H=1/N% 35 SUM=FNF(0) 'первый вклад в интеграл в точке х=0 40 FAC=2 'исходное значение множителя в формуле 45 t ' Симпсона 50 FOR l%=1 TO N%-1 'цикл по узлам сетки 55 IF FAC=2 THEN FAG =4 ELSE FAC=2 'текущее значение множителя 60 X=I%*H 'текущее значение координаты х 65 SUM=SUM+FNF(X)*FAC 'коррекция текущего значения интеграла 70 NEXT 1% 75 t 80 SUM=SUM+FNF(1) 'вклад в интеграл от точки х=1 85 INTEGRAL=H*SUM/3 90 DIFF=EXACT-INTEGRAL 95 PRINT USING 'N=#### ОШИБКА=*. ######"; N%, DIFF 100 GOTO 15 'переход к расчету с другим значением N В табл. 1.3 приведены результаты расчета для различных N. Там же да- ны результаты, полученные интегрированием методом трапеций. Преиму- щества формулы с более высоким порядком точности очевидны. Отметим, что численное интегрирование устойчиво в том смысле, что результат стремится к определенному пределу по мере роста W и уменьшения шага 2- 1650
18 Г лава 1 Таблица 1.3. Ошибка вычисления Г exdx = 1,718282 0 м h Метод трапеций (1.9) Метод Симпсона (112) Метод Боде (1.136) 4 0,2500000 -0,008940 -0,000037 -0,000001 8 0,1250000 -0,002237 0,000002 0,000000 16 0,0625000 -0,000559 0,000000 0,000000 32 0,0312500 -0,000140 0,000000 0,000000 64 0,0156250 -0,000035 0,000000 0,000000 128 0,0078125 -0,000008 0,000000 0,000000 сетки h. Ошибки округления в этом случае не оказывают существенного влияния из-за того, что в квадратурные формулы все значения f вхо- дят с одинаковым знаком (в отличие от случая численного дифференци- рования). При численном интегрировании весьма важно знать, насколько ма- чым следует выбирать шаг Л, чтобы обеспечить требуемую точность ре- зультата вычисления интеграла. И хотя для обсуждаемых формул можно оценить границы погрешности интегрирования, практически проще всего выполнить расчет с меньшим шагом h и оценить степень изменения ре- зультата. Квадратурные формулы более высокого порядка можно получать, ос- тавляя больше членов в разложении (1.10), которое используется для интерполяции f между узлами сетки. Естественно, при этом нужно брать и более точные конечно-разностные аппроксимации производных. Формулу Симпсона можно обобщить, интерполируя f кубической парабо- лой или полиномом четвертой степени: х3 J f(x)dx = (f0 + 3f, + 3f2 + f3) + O(h\ . (1.13а) х 8 0 Х4 J f(x)dx = (7f0 + 32/, + 12% + 32/3 + 7/4) + О(Л7). (1.136) х 45 0 Эти соотношения называются соответственно формулой Симпсона с 3/8 и формулой Боде. Результат расчетов с использованием последней форму-
Основные математические операции 19 лы приведен в табл. 1.3. Налицо улучшение точности, хотя за это при- ходится платить большим объемом вычислений. (Отметим, что примене- ние формулы Боде требует выбора Af, кратного 4.) Хотя может показа- ться, что квадратурные формулы, основанные на интерполяции f поли- номами очень высоких степеней, будут значительно точнее приведен- ных, однако это не так. Такие полиномы весьма сильно осциллируют, что ухудшает точность интерполяции. Более того, поскольку в такие формулы значения функции f в различных узлах сетки входят как с по- ложительными, так и с отрицательными весовыми коэффициентами, воз- никают проблемы, связанные с ошибками округления. Поэтому обычно отдают предпочтение квадратурным формулам низкого порядка, а точ- ность расчетов увеличивают за счет уменьшения шага интегрирования h. Точность квадратурных формул значительно повышается, когда вы- полняется требование об использовании равномерной сетки на интерва- ле интегрирования. Более подробно это будет обсуждено в гл.4. | Упражнение 1.2. Пользуясь любыми функциями, для которых вы умеете аналитически вычислять их определенные интегралы, исследуйте зави- симость точности рассмотренных выше квадратурных формул от величины шага h. Применение методов численного интегрирования, изложенных здесь, требует некоторой внимательности и здравого смысла. Например, в ин- тегралах, где верхний предел очень велик, полезно сначала сделать замену переменной. Рассмотрим интеграл ь J dx x'2g(x), 1 где с ростом х функция g(x) стремится к константе. В случае когда b велико по сравнению с шагом Л, непосредственное вычисление интег- рала по формуле Симпсона дало бы очень медленную сходимость процес- са к результирующей сумме и соответственно очень большое время сче- та. Но сделаем замену переменной t = х~\ 1 J g(t-')dt. \/ь Этот интеграл уже легко вычисляется с помощью любой из рассмотрен- ных квадратур. Прямое применение квадратурных формул к функциям, имеющим инте-
20 Глава 1 грируемые расходимости, может приводить к нелепым результатам. Трудностей такого рода можно избежать достаточно простым путем. На- пример, в интеграле J dx ^1 - x2]~1/2g(x) О имеется интегрируемая особенность в точке х = 1 (g —непрерывная функция). Он имеет некоторое конечное значение. Поскольку f(x = 1)= = со, непосредственная подстановка в приведенные выше квадратурные формулы дает в результате для интеграла бесконечное значение. Пра вильный результат можно получить после замены переменной t - = (1 - x)lz? Тогда 2j dt [2 - t2]~1/2g (1 - t2), 0 и дальнейшее вычисление интеграла не вызывает трудностей. В квадратурной формуле можно также учесть специальным образом наличие у функции интегрируемой особенности. Рассмотрим интеграл 1 h 1 J f(x)dx = J f(x)dx + J f(x)dx, 0 0 h —1/2 где f(x) спадает вблизи нуля как Сх (С —константа). Интегрируе- мая функция от А до 1 расходимостей не имеет, и интеграл здесь мо- жет быть легко вычислен. А вклад интерграла от 0 до А приближенно можно учесть членом 2СА1/2= 2Af(A). | Упражнение 1.3. Написать программу вычисления интеграла I Г2/3[1 - t]-v*dt = 2п / 31/2, О используя одну из полученных квадратурных формул, и исследовать ее погрешность в зависимости от величины шага А. (Подсказка: Чтобы из- бавиться от расходимости, разбейте весь отрезок интегрирования на две части и сделайте на них разные замены переменной.)
Основные математические операции 21 1.3. НАХОЖДЕНИЕ КОРНЕЙ Последней из рассматриваемых здесь элементарных операций будет вы- числение корней функции f(x) (т.е. нахождение корней уравнения f(x) = 0) в случаях, когда мы можем найти значение f в любой точке х. Одним из верных способов отыскания корня, когда его величина приблизительно известна (скажем, х = xQ), состоит в следующем (ал- горитм шагового поиска). Выбирается начальное значение х, гаранти- рованно меньшее корня. Затем начинаем увеличивать это пробное зна- чение, двигаясь с небольшим положительным шагом и проверяя значение f в каждой новой точке. Всякий раз, когда функция меняет знак, про- исходит возврат назад на один шаг, после чего величина шага умень- шается в два раза и процесс повторяется. Ряд значений х, получаемых такой процедурой, очевидно, сходится к xQ. Вычисление может быть прервано, когда длина шага станет меньше погрешности, с которой не- обходимо определить положение корня. Ниже приводится программа, ко- торая находит положительный корень функции f(x) = х2 - 5, xQ = = 51/2 = 2,236068 с погрешностью 10-6. В качестве исходного прибли- жения для корня выбрано значение х = 1. 5 10 15 20 25 30 35 40 45 50 55 56 60 70 DEF FNF(X)=X*X-5 TOLX=1.E-06 Х=1: FOLD=FNF(X): DX=.5 ITER%=0 'определение функции, корень которой ищется 'допустимая .погрешность ' исходные значения корня, функции и шага 'начальная установка счетчика итераций WHILE ABS(DX)>TOLX ITER%=ITER%+1 X=X+DX PRINT ITER%,X,SQR(5)-X 'вывод текущих значений корня и функции IF FOLD*FNF(X)>0 THEN GOTO 60 'если знак не изменился, сделать X=X-DX: DX=DX/2 ' следующий шаг по х, иначе возврат на длины шага пополам 'счет числа выполненных итераций 'очередной шаг по х 'один шаг и деление WEND STOP Отклонения вычисленного приближения корня от его истинного значения приведены в табл. 1.4. Очевидно, что результат сходится к правильно- му значению, хотя для этого потребовалось выполнить 33 итерации. При использовании этого метода следует проявлять осторожность, так как, если исходный шаг выбран слишком большим, можно пропустить ис-
22 Глава 1 комый корень— особенно в случаях, когда функция f имеет их несколь- ко. | Упражнение 1.4. Просчитать приведенную выше программу для различ- ных величин погрешности, начального шага и начального приближения для корня. Обратите внимание, что иногда процедура сходится к отри- цательному корню уравнения. Что случится, если вы начнете с исход- ного приближения х = -3 и шага, равного 6? Таблица 1.4. Ошибка вычисления положительного корня функции f(x) = х2- 5 Номер Шаговый Метод Ньютона итерации поиск (1.14) Метод секущих (115) 0 1,236076 1,236076 1 0,736068 -0,763932 2 0,236068 -0,097265 3 -0,263932 -0,002027 4 -0,013932 -0,000001 5 0,111068 0,000000 6 -0,013932 0,000000 1,236076 -1,430599 0,378925 0,098137 -0,009308 0,000008 0,000000 33 0,000001 0,000000 0,000000 Если в произвольной точке х можно вычислить не только значение f, но и ее производную f', то применим более эффективный метод вы- числения корня (метод Ньютона —Рафсона). При этом, исходя из пред- положения, что вблизи корня f ведет себя как линейная функция, рас- считывается последовательность х\ сходящаяся к xQ (рис. 1.2): f'(x‘) (1.14) Применение этого метода для вычисления корня xQ = 51/2 иллюстриру- ется средним столбцом табл. 1.4. Очевидна быстрая сходимбсть метода (всего 5 итераций). Этот алгоритм обычно используется в компьютерах для вычисления квадратных корней чисел. Линеаризация формулы (1.14) вблизи х0 показывает, что в результате число правильных разрядов примерно удваивается на каждой из итераций, что видно также и из табл. 1.4.
Основные математические операции 23 Рис. 1.2. Геометрические схемы, иллюстрирующие методы Ньютона—Раф сона (слева) и секущих (справа). Метод секущих является разумным компромиссом, позволяющим сохра- нить эффективность метода Ньютона —Рафсона и избежать неудобств, связанных с вычислением производной f'. Заменив ее разностной фор- мулой (1.46) f(x‘) - мы получим из (1.14) рекуррентную формулу, выражающую значение хг+1 через два предыдущих приближения корня х1 и х*-1 (см. рис. 1.2): В качестве начальных значений х° и х1 при запуске алгоритма можно использовать любые приближенные значения корня xQ. Вычисление за- вершается, когда изменение х между двумя итерациями станет меньше, чем погрешность, требуемая для искомого корня. В последнем столбце табл. 1.4 приведены результаты расчета с использованием метода секу- щих при начальных приближениях х° = 0,5 и х1 = 1,0. Если исходные точки х° и х1 выбраны достаточно близко к искомому корню, то ско- рость сходимости метода секущих приближается к скорости метода Нью- тона—Рафсона. | Упражнение 1.5. Напишите программы для вычисления отрицательного корня функции х2 - 5 методами Ньютона— Рафсона и секущих. Изучите поведение второго метода при изменении начальных приближений корня
24 Глава 1 Если вблизи корня %0 функция ведет себя «плохо» (например, имеет точку перегиба) или имеются несколько близких корней, в методах Ньютона —Рафсона и секущих сходимость может отсутствовать вообще или же можно получить неправильный ответ при неудачном выборе на- чальных приближений. Следовательно, надежная процедура вычисления корня состоит в том, что вначале используется алгоритм шагового на- хождения для приближенной локализации xQ, а затем переходят к одно- му из «автоматических» алгоритмов (т.е. методу Ньютона— Рафсона или секущих). | Упражнение 1.6. Функция f(x) = tanh х имеет корень при х = 0. На- пишите программу для демонстрации того факта, что выбор начального приближения х £ 1 в методе Ньютона— Рафсона не дает сходящуюся по- следовательность. Не могли бы вы, используя график функции tanh х, объяснить, почему такой выбор является неверным? Исходя из явной формы рекуррентного соотношения (1.14) для этого случая, определите критическое значение для исходного приближения, выше которого метод не обеспечивает сходимости. Попытайтесь решить эту же задачу, ис- пользуя метод секущих. Что происходит при изменении значения на- чального приближения, когда этим методом вычисляется корень х = 0 функции tanh х? 1.4. КВАЗИКЛАССИЧЕСКОЕ КВАНТОВАНИЕ КОЛЕБАНИЙ В МОЛЕКУЛЕ В качестве примера, сочетающего сразу несколько основных математи- ческих операций, обсуждавшихся выше, рассмотрим поведение двухатом- ной молекулы. Такая молекула (например, О2) состоит из двух ядер, связанных электронами, вращающимися вокруг них. Так как ядра во много раз тяжелее электронов, мы можем считать, что последние дви- жутся столь быстро, что в каждый момент времени происходит мгно- венная подстройка их распределения к изменяющемуся положению ядер (так называемое приближение Борна—Оппенгеймера). Поэтому исходная задача сводится к задаче о движении двух ядер в потенциальном поле V, зависящем лишь от расстояния г между ними. Физические принципы, определяющие конкретный вид V(r), будут подробно рассмотрены при об суждении проекта VIII. Однако из самых общих соображений можно ска- зать, что этот потенциал должен быть притягивающим на больших рас- стояниях (силы Ван-дер-Ваальса) и отталкивающим на близких рассто-
Основные математические операции 25 яниях (кулоновское взаимодействие ядер и расталкивание электронов, связанное с принципом Паули). Такое поведение поля обычно описыва- ется потенциалом Ленард-Джонса (также называемым потенциалом 6-12): V(r) = 4V0[(^]12 - (1.16) Форма его изображена в верхней части рис. 1.3. Минимум потенциала, равный Vo, соответствует расстоянию гт[п = 21/6а. Далее в большин- стве случаев мы будем считать, что V(r) имеет именно такую форму. Более полное объяснение физики двухатомных молекул можно найти в работе [Не50], а обсуждение приближения Борна—Оппенгеймера —в работе [Ме68]. Большая масса ядер позволяет провести дальнейшее упрощение зада- чи путем разделения медленного вращения ядер и более быстрого изме- нения их взаимного расстояния. Первый тип движения хорошо описыва- ется как квантовомеханическое вращение жесткой системы типа «ган- тель». А колебательное движение ядер относительно друг друга описы- вается решением 0п(г) одномерного уравнения Шрёдингера, соответст- вующим связанному состоянию с энергией Еп, [- ^ ^2 + = ЕпК- 017) В этом уравнении m обозначает приведенную массу двух ядер. Нашей задачей будет поиск значений Еп, соответствующих заданному виду потенциала V(r). Это можно сделать, непосредственно решая за- дачу на собственные значения для уравнения (1.17). Нужные для этого численные методы будут рассмотрены в гл.З. Однако, имея в виду очень большую массу ядер, можно считать, что движение их будет близко к классическому. При этом приближенные значения энергии ко- лебаний можно найти, решив классическую задачу о движении ядер в потенциальном поле V и использовав затем правила квантования для определения уровней Еп. Правила квантования, первоначально постули- рованные Н. Бором, Зоммерфельдом и Вильсоном, лежали в основе «ста- рой» квантовой теории, из которой потом была развита современная квантовая механика. Эти же правила могут быть получены применением ВКБ-приближения к волновому уравнению (1.17) (более подробно см. [Ме68]). Классическое ограниченное движение в потенциале V(r), описываю- щее изменение межъядерного расстояния, возможно в диапазоне энергий -Vo < Е < 0. Это изменение расстояния имеет характер периодических,
26 Г лава 1 но необязательно гармонических осцилляций между внутренней и внеш- ней точками поворота с координатами г и г (см. рис. 1.3). Во время этих колебаний энергия системы перераспределяется между кине- тической энергией относительного движения и потенциальной энергией. Однако общая энергия, равная 2 Е = 2— + V(r), (1.18) 2т остается постоянной (р — импульс относительного движения ядер). По- этому колебание при любой заданной энергии можно рассматривать как движение ее системы по некоторой замкнутой траектории в фазовом пространстве с координатами г и р. В каждой ее точке должно выпол- няться условие (1.18). Примером такой фазовой траектории является кривая в нижней части рис. 1.3. В явной форме уравнение траектории можно получить, решив (1.18) относительно р: р(г) = ±[2m(£ - V(r))],/2 (1.19) Рис. 1.3. Вверху: форма потенциала Ленард-Джонса и внутренняя и внешняя точки поворота при движений с энергией, меньшей нуля. Штри- ховой линией отмечена параболическая аппроксимация потенциала. Вни- зу: траектории движения системы в фазовом пространстве, соответст- вующие потенциалу Ленард-Джонса
Основные математические операции 27 Классическое движение, рассмотренное выше, возможно при любом уровне энергии между и 0. Чтобы проквантовать это движение и найти приближенные значения собственных чисел Еп уравнения (1.17), введем безразмерную величину, называемую действием. Оно зависит от энергии системы и определяется как S(£) = ф k(r)dr. (1.20) Здесь k(r) = h-1p(r)—локальное значение волнового числа для волны де Бройля, а интегрирование охватывает один полный цикл колебания. Величина действия равна площади, охваченной фазовой траекторией и измеряемой в единицах h. Правилами квантования установлено, что разрешены лишь такие значения энергии Е , которым соответствует действие, равное 2п (п+1/2), где и —целое число. Таким образом, ис- пользуя (1.19) и замечая, что каждая точка г во время цикла прохо- дится дважды (один раз с положительным значением р, а другой раз с отрицательным), получаем S(En) = 2 Ы,/2 h2. Г . out J [£„ - V(r)],/2dr = (п + 1)2п. Г1п (1.21) На концах интервала интегрирования, в точках г.п и г , подынте- гральное выражение в (1.21) становится равным нулю. Чтобы учесть в полученном условии квантования конкретный вид по- тенциала Ленард-Джонса (1.16), введем несколько безразмерных пере- менных: После этого соотношение де: (1.21) можно переписать в безразмерном ви- out Г J [еп - v(x)]'/2dx = (п + 1)11, х. z I п (1.22) где = 4 -lj - Ч есть безразмерный потенциал V(r). Безразмерная величина у служит мерой квантового характера дви- = =
28 Глава 1 жения для данной задачи. Когда h мало или т велико, т.е. в предель- ном случае классического движения, у становится большим. Определив из энергетического спектра вращательного движения величину момента инерции молекулы и зная энергию ее диссоциации (т.е. энергию, необ- ходимую для разделения молекулы на два составляющих ее атома), мож- но определить параметры потенциала а и VQ и, следовательно, значе- ние у. Например, для молекулы Н2 у = 21,7, а для HD у = 24,8 (в случае замены протона на дейтрон изменяется лишь приведенная масса /и, а параметр VQ остается прежним). В значительно более тяжелой мо- лекуле О2, состоящей из двух ядер 16О, у равно 150. Такой величины у более чем достаточно, чтобы быть уверенным в правильности квази- классического приближения, использованного нами для описания внут- римолекулярных колебаний. Текст программы для примера 1 находится в приложении Б. Для у, величину которого пользователь вводит с клавиатуры, программа нахо- дит значения е^, удовлетворяющие уравнению (1.22). После того как определен весь спектр значений е^, рассчитываются соответствующие им фазовые траектории. (Перед запуском программы на вашем компьюте- ре необходимо еще раз просмотреть материал из разд. <Как пользо- ваться этой книгой» и изучить начало приложения Б). Следующие ниже упражнения помогут вам улучшить понимание физики двухатомных молекул и численных методов, демонстрируемых. на этом примере. | Упражнение 1.7. Одной из самых существенных сторон использования компьютера как инструмента физического исследования является выра- ботка уверенности в том, что получены правильные результаты. Важ- нейшим тестом здесь может стать тщательное количественное сравнение данных расчета и аналитических зависимостей в тех случаях, конечно, когда они могут быть найдены. Измените в тексте программы форму по- тенциала на параболическую (в строке 160; обратите внимание на пре- дупреждения в строках 170—180). В случае параболического потенциа- ла квантование по правилу Бора —Зоммерфельда дает точный набор соб- ственных значений уравнения Шрёдингера. Им является последователь- ность равноотстоящих энергетических уровней. Разница между энергией самого нижнего уровня и минимумом потенциала составляет половину расстояния между уровнями в спектре. Сравните численные результаты, полученные для нескольких значений у, с результатами аналитического решения уравнения (1.22). Совпадает ли расчетная форма фазовых тра- екторий с той, которую вы ожидали получить?
Основные математические операции 29 | Упражнение 1.8. Другой важной проверкой для отлаживаемой програм- мы является сравнение результатов ее работы с теми, что ожидаются на основе физической интуиции. Восстановите в программном коде строку, соответствующую потенциалу Ленард-Джонса, и запустите рас- чет варианта с у = 50. Обратите внимание, что в этом случае, как и для параболического потенциала, разница в энергиях между первым возбужденным уровнем и дном потенциальной ямы примерно в 3 раза больше, чем расстояние от дна до основного уровня. Кроме того, рас- стояние между несколькими самыми низкими уровнями остается прибли- зительно постоянным. Это является следствием того, что вблизи мини- мума потенциал Ленард-Джонса ведет себя примерно как парабола (см. рис. 1.3). Вычислив значение второй производной V(r) в точке миниму- ма, найдите величину упругости спружины», которой приближенно экви- валентен потенциал рассматриваемого осциллятора. Покажите, что час- тота малых колебаний должна при этом быть равной hw _ 6-25/6 ~ 10,691 ,, v0 -г » Проверьте, насколько это совпадает с результатами численных расче- тов, и объясните согласие для различных значений %. Сравнив форму потенциала Ленард-Джонса и его параболической аппроксимации, можете ли вы понять, почему при более высоких энергиях уровни в спектре расположены чаще, чем при малых энергиях? | Упражнение 1.9. Если результаты остаются неизменными при смене численного алгоритма или его параметров, это может давать дополни- тельную уверенность в том, что расчеты проведены верно. Измените уровень допустимой погрешности при расчете точек поворота и уровней энергии (строка 120) или число интервалов, на которые разбивается область интегрирования (строка 130), и посмотрите, как это повлияет на результаты. Обратите внимание на то, что программа рассчитывает ожидаемое число связанных состояний так, что это число может изме- ниться при изменении величины допустимой погрешности в расчете энергии состояния (строки 1190—1200). | Упражнение 1.10. Замените в программе алгоритм Ньютона— Рафсона, используемый в блоке расчета точек поворота, на алгоритм метода се- кущих. (Для шага с N% * 0 в качестве очень хорошего начального при- ближения можно использовать точки поворота, найденные на шаге N%-1.) Замените метод Симпсона при численном интегрировании в под-
30 Глава 1 программе расчета s на квадратурную формулу более высокого порядка ((1.13а) или (1.136)) и посмотрите, как улучшится результат. | Упражнение 1.11. Для потенциала Ленард-Джонса начертите график зависимости от величины у, изменяющейся в интервале от 20 до 200, и объясните его вид. (Как это часто бывает для коротких расче- тов, проще построить график на бумаге, считывая результаты работы программы с экрана, чем пытаться заставить компьютер рисовать гра- фик на дисплее автоматически.) | Упражнение 1.12. Из наблюдений известно, что для молекулы Н2 глу- бина потенциальной ямы = 4,747 эВ и координата минимума гт[п = = 0,74166 А. Эти две величины, будучи подставлены в (1.23), дадут частоту колебаний hw = О,492Уо = 2,339 эВ. Полученное значение более чем в 4 раза превышает разницу энергий основного и первого возбужденного уровней, наблюдавшуюся на экспе- рименте и равную 0,515 эВ. Поэтому можно сделать вывод, что потен- циал типа Ленард-Джонса не является достаточно хорошим приближением к реальному взаимодействию в молекуле Н2. К тому же предсказывает- ся только 6 связанных состояний, в то время как известно, что их существует 15 (см. табл. 1.5, где перечислены энергии этих состоя- ний, взятые из работы [Wa67]). Необходимо более подходящее аналити- ческое выражение для формы потенциала с большим числом свободных параметров, чтобы одновременно правильно воспроизвести глубины по- тенциальной ямы, положение минимума, частоту малых колебаний вблизи него и число связанных состояний системы. Одним из таких выражений может считаться потенциал Морса (1.24) Отметим, что при этой форме потенциала задача может быть решена аналитически. Минимум потенциала Морса устанавливается в требуемом месте, а параметр /3 используется для того, чтобы, подгоняя кривизну потенциальной кривой вблизи минимума, получить правильную энергию первого возбужденного уровня. Найдите значение /3, соответствующее молекуле Н2, измените в нужном месте программы форму потенциала на
Основные математические операции 31 Таблица 1.5. Экспериментальные данные об энергиях колебаний в молекуле Н? п Е , эВ л’ п Е , эВ л’ 0 -4,477 8 -1,151 1 -3,962 9 -0,867 2 -3,475 10 -0,615 3 -3,017 И -0,400 4 -2,587 12 -0,225 5 -2,185 13 -0,094 6 -1,811 14 -0,017 7 -1,466 потенциал Морса и рассчитайте спектр колебательных состояний этой молекулы. Покажите, что при этом получается значительно большее число связанных состояний. Сравните их энергии с экспериментальными данными и результатами полученными ранее для потенциала Ленард- Джонса. Объясните полученные отличия ПРОЕКТ I: РАССЕЯНИЕ ЧАСТИЦ В ЦЕНТРАЛЬНОМ ПОЛЕ В этой работе будет исследоваться классическое рассеяние частиц с массой пг в центрально-симметричном потенциальном поле, каковым яв- ляется, в частности, и рассмотренный выше потенциал Ленард-Джонса. Собственно рассеяние состоит в том, что частица с начальной кинети- ческой энергией Е и параметром удара b (также называемым прицельным расстоянием) влетает в поле на очень большом расстоянии от его цен- тра. По мере прохождения через поле частица отклоняется и в конце концов выходит из него с той же энергией Е, но под углом 0 к исход- ному направлению движения. Так как потенциал зависит лишь от рас- стояния частицы от центра силы, угловой момент частицы будет сохра- няться и вся ее траектория будет лежать в одной плоскости. Движение такого рода обычно описывается в полярных координатах (г, 0), как это показано на рис. 1.1. (Более подробное изложение задачи класси- ческого рассеяния можно найти в любом учебнике по классической ме- ханике, таком, как [Go80].) Основной интерес для нас в этой задаче будет представлять функ- ция отклонения— зависимость угла рассеяния от параметра удара 8(6).
32 Глава 1 Рис.1.1. Геометрическая схема задачи о рассеянии в центральном поле и связанные с ней параметры. Отклонение зависит также и от начальной энергии частицы. Экспери- ментально наблюдаемой величиной является дифференциальное сечение рассеяния afo'ZdQ. Оно связано с функцией отклонения 0(6) соотношени ем ^ = _6_|^|. (Н) dQ sinS Iс1в| Поэтому если вычислить dB/db = (db/d&)~* то можно узнать и величи- ну сечения. Функцию отклонения в аналитической форме удается получить лишь для немногих типов потенциала, обычно же необходимы численные рас- четы. Одним из возможных путей решения этой задачи является непо- средственное интегрирование по времени уравнений движения частицы (т.е. уравнений, выражающих второй закон Ньютона). В результате бы- ла бы рассчитана траектория при различных значениях параметра b и затабулированы направления вылета частицы из поля (углы рассеяния). При таком способе нужно уметь находить решение системы из четырех связанных дифференциальных уравнений первого порядка (для двух ко- ординат частицы и двух компонент ее скорости). Соответствующие ме- тоды будут обсуждаться далее в разд.2.5. Здесь же отметим, что по- скольку угловой момент сохраняется, то изменение угла 0 прямо свя- зано с радиальным движением частицы; и поэтому задача может быть сведена к одномерной и решена далее численным интегрированием в квадратурах. Этот подход более прост и более точен, именно его мьГ и будем рассматривать. Чтобы найти искомое выражение для угла рассеяния 0, воспользуем- ся законом сохранения углового момента, который утверждает, что ве- личина
Основные математические операции 33 L = mvb = mr2 — dt (1.2) будет сохраняться во время движения. Здесь de/dt — угловая скорость частицы, а ц —ее скорость на бесконечности, связанная с начальной энергией соотношением Е = пги2/2. Радиальное движение происходит в эффективном потенциале, который складывается из V и потенциала цен- тробежных сил, так что в соответствии с законом сохранения энергии m 2 drl2 dt. L2 2mr2 (1.3) Если в (1.2) вместо времени в качестве независимой переменной поль- зоваться расстоянием г, то можно записать de dr de dr х _ bv dr 1 dt r2 [dt. (1.4) Находя dr/dt из (1.3), получаем de dr (1.5) Учитывая, что при влете в поле (г = со) 0 = п и что 0 всегда являет- ся падающей функцией, уравнение (1.5) легко проинтегрировать и най- ти выражение для угла рассеяния: 0 = п V Е, -1/2 (1.6) Здесь г . —минимальное расстояние сближения частицы с центром поля (точка поворота, положение которой определяется самым внешним нулем функции, стоящей в подынтегральном выражении). Множитель 2 перед интегралом возникает из-за того, что вклад в угол рассеяния частей траектории, где частица сближается с центром и где она расходится с иим, совершенно одинаков. Одно заключительное преобразование будет весьма полезно перед началом численных расчетов. Предположим, что есть некоторое рассто- яние rmax, за пределами которого мы всегда можем пренебречь влияни- ем поля на частицу. В этом случае подынтегральное выражение в (1.6) _о будет спадать с ростом г, как г , и процедура численного интегри- рования может быть очень неэффективной. Фактически, поскольку поле 3—1650
34 Глава / не действует на расстояниях г > гтах, счет будет пустой тратой вре- мени, описывая прямолинейное движение свободной частицы. Чтобы из- бежать такой ситуации, заметим, что в отсутствие поля (V = 0) угол рассеяния будет равен нулю, и можно записать " Az/ Г .21-1/2 Я = 2J ф 1 - (1-7) ь Будучи подставлено в (1.6), это дает конечное выражение для угла рассеяния: (1.8) Интегрирование здесь ведется лишь до г , так как на больших рас- стояниях оба подынтегральных выражения становятся одинаковыми. Нашей целью далее будет исследование рассеяния на потенциале Ле- нард-Джонса (1.16). Для него можно уверенно положить = За, ес- ли нас не будут интересовать энергии, меньшие V(r = За) * 5-lQ-3V0 . Данную работу лучше всего выполнять в следующем порядке. Шаг 1. Прежде чем начинать любые численные расчеты, следует иметь некоторое представление о характере ответа, который должен быть по- лучен. Поэтому постарайтесь кратко описать, как будет выглядеть функция отклонения 8(&) при относительно низких энергиях (Е VQ), если периферийные столкновения, когда b происходят преиму- щественно в притягивающем поле, а более «лобовые» столкновения при- водят к отскоку частиц от отталкивающего ядра. Что изменится в слу- чае значительно более высоких энергий (Е » VQ), когда притягивающей частью потенциала V уже можно пренебречь? Обратите: внимание, из уравнения (1.1) следует, что значениям Ь, в которых функция откло- нения достигает максимума или минимума, соответствует бесконечно большое сечение рассеяния. Эффект, связанный с этим, наблюдается, например, в радуге, когда свет рассеивается на капельках воды. Шаг 2. Чтобы иметь аналитическое решение задачи, с которым можно будет сравнить результаты численного расчета и тем самым проверить вашу программу, решите задачу рассеяния с потенциалом типа «сту-
Основные математические операции 35 пенька», т.е. V(r) = UQ при г < rmax и V = 0 при г > г Как бу- дет выглядеть функция отклонения, когда UQ отрицательно? Какой она будет при Uq положительном и Е < (/0? А если Е > (/Q? Шаг 3. Напишите программу, которая для определенной энергии Е будет рассчитывать функцию отклонения 9(5) для набора равнооотстоящих значений b из интервала между 0 и Воспользуйтесь численным интегрированием для вычисления обоих членов в (1.8). (Заметим, что наличие расходимостей в подынтегральных выражениях потребует неко- торой модификации алгоритма интегрирования.) Убедитесь, что про- грамма работает правильно и дает достаточно точный ответ, для чего проведите расчет с потенциалом-«ступенькой», предложенным в шаге 2. Сравните точность полученных результатов с альтернативным вариантом расчета, когда первый интеграл в (1.8) вычисляется аналитически, а не численно. Шаг 4. Используйте вашу программу для расчета функции 9(6), соот- ветствующей рассеянию на потенциале Ленард-Джонса частиц с энергия- ми, лежащими в диапазоне от O,1Vq до IOOVq. Сопоставьте полученные результаты расчетов с вашими ответами на вопросы шага 1. Рассчитай- те дифференциальное сечение рассеяния как функцию угла 9 для этих же энергий частиц. Шаг 5. Если ваша программа работает правильно, вы обнаружите, что для энергий Е VQ при некотором критическом значении b = 6 зависящем от Е, функция отклонения имеет расходимость, в которой 9 стремится к -оо. Эта особенность, пропадающая, когда Е становится больше Vo, связана с возможностью достаточно долгого вращения час- тицы по орбите вокруг центра поля. При этом сингулярность подынте- грального выражения в (1.6) в точке поворота имеет скорее линейный, а не корневой характер, в результате чего угол рассеяния становится логарифмически расходящимся. Иначе говоря, эффективный потенциал V + < вблизи максимума имеет вид параболы, и когда b - bcrit, максималь- ное значение этой параболы становится равным исходной энергии час- тицы. Тогда траектория частицы очень долгое время лежит при том значении радиуса, которому соответствует пик параболы, и частица совершает много оборотов вокруг центра. Проследите, как зависит з*
36 Глава 1 bcrit от энергии частицы, нарисуйте несколько раз соответствующие распределения эффективного потенциала и убедитесь, что дело проис- ходит именно таким образом. Определите максимальную энергию, при которой в потенциале Ленард-Джонса еще наблюдается «захват на орби- ту». Сделайте это, решая соответствующую систему уравнений, включа- ющую V и его производные, или же путем систематического численного исследования функции отклонения 8(6). Если вы выберете второй путь, может оказаться необходимым изменить способ, которым в алгоритме численного интегрирования исключаются расходимости.
2. ОБЫКНОВЕННЫЕ ДИФФЕРЕНЦИАЛЬНЫЕ УРАВНЕНИЯ Многие из законов физики наиболее удобно формулировать в виде диф- ференциальных уравнений. Поэтому неудивительно, что при моделирова- нии физических систем численное решение таких уравнений является одной из наиболее частых задач. Обыкновенное дифференциальное урав- нение самого общего вида можно свести к системе М уравнений первого порядка — = f(*. у). (2.1) dx где х является независимой переменной, а вектор у представляет на- бор ЛГзависимых переменных (f—также Af-компонеитный вектор). Вводом ряда дополнительных функций дифференциальное уравнение более высо- кого порядка всегда можно представить системой уравнений первого порядка. Например, одномерное движение частицы массы т в поле силы F(z) описывается уравнением второго порядка d22 т = 5(г)' <2 2> dt Определив величину импульса Р(О = т , dt уравнение (2.2) можно представить в форме, соответствующей (2.1), как два связанных уравнения первого порядка (уравнения Гамильтона) — = А = F(z). (2.3) dt т dt Поэтому вполне достаточно подробно рассмотреть методы решения лишь для уравнений первого порядка. При этом все результаты, полученные для задачи с одной зависимой переменной, можно без труда распрост- ранить на более общий случай, поскольку система связанных дифферен- циальных уравнений, естественно, записывается в матричной форме. Итак, мы сосредоточим внимание на решении уравнения
38 Глава 2 dy — = f(*> У) (2.4) dx * с одной зависимой переменной у(х). В этой главе обсуждается несколько методов для обыкновенных * дифференциальных уравнений, причем упор будет сделан на решение за- дачи Коши. Суть ее состоит в поиске у(х) при условии, что задано значение у в некоторой начальной точке, скажем, у(х = 0) - yQ. За- дача такого рода возникает, например, при необходимости рассчитать поступательное движение точки, описываемое уравнением (2.3), когда известны ее начальные положение и величина импульса. В гл.З будут рассмотрены столь же важные краевые задачи и задачи на собственные значения. 2.1. ПРОСТЫЕ МЕТОДЫ Еще раз отметим, что пока мы будем интересоваться лишь решением ди- фференциального уравнения (2.4) с начальным условием у(х = 0) = yQ. В конкретной задаче обычно требуется найти значение у в определен- ной точке (например, при х = 1). Общий способ здесь состоит в раз- биении интервала [0,1] на большое число (N) одинаковых подынтерва- лов длиной h - \/N и нахождении рекуррентной формулы для связи зна- чения уп с {«/ г Уп--2' •••}» где Уп обозначает приближенное значе- ние у в точке хп = nh. Такая рекуррентная связь позволит шаг за ша- гом определять решение дифференциального уравнения в точках от х = = 0 до х = 1. Одним из простейших алгоритмов поиска решения является метод Эйлера. В уравнении (2.4), рассматриваемом в точке х , производная заменяется ее конечно-разностным приближением «вперед» (1.4а): У*+'~ Уп + 0(h) = f(xn, уп). (2.5) Отсюда получается рекуррентная формула, выражающая уп^ через у^. Уп+\ = Уп + Уп) + °^2)- <2-6) А так как порядок ошибки аппроксимации в (1.4а) равен 0(h), формула 9 (2.6) на одном шаге от уп к уп^ дает локальную ошибку O(h ). В хо- де интегрирования от х = 0 до х = 1 выполняется N таких шагов для расчета у(\). «Глобальная» ошибка найденного значения у(\) равна МЭ(Л2) « 0(h). Она линейно спадает с уменьшением величины шага. Та- ким образом, использование в два раза меньшего значения h (т.е.
Обыкновенные дифференциальные уравнения________________________39 Таблица 2.1. Ошибка численного решения уравнения dy/dx = -ху,у(0) = 1 h Метод уравн. И1) Эйлера, Разложение в ряд Тейлора, Неявный метод, (2.6) {/(3) уравн. 4/(1) (2.Ю) !/(3) уравн. (2.18) 4/(1) 4/(3) 0,500 -0,143469 0,011109 0,032312 -0,006660 -0,015691 0,001785 0,200 -0,046330 0,006519 0,005126 -0,000712 -0,002525 0,000255 0,100 -0,021625 0,003318 0,001273 -0,000149 -0,000631 0,000063 0,050 -0,010453 0,001665 0,000317 -0,000034 -0,000157 0,000016 0,020 -0,004098 0,000666 0,000051 -0,000005 -0,000025 0,000003 0,010 -0,002035 0,000333 0,000013 -0,000001 -0,000006 0,000001 0,005 -0,001014 0,000167 0,000003 0,000000 -0,000001 0,000000 0,002 -0,000405 0,000067 0,000001 0,000000 0,000000 0,000000 0,001 -0,000203 0,000033 0,000000 0,000000 0,000000 0,000000 удвоение числа шагов) приводит лишь к двукратному увеличению точ- ности расчета. Затраты вычислительных ресурсов на каждом таком шаге в основном определяются вычислением значения f. В качестве примера рассмотрим уравнение с начальным условием dy — = //(0) = 1. (2.7) dx Оно имеет решение У = ехр[~2?]- Ниже приведена программа, которая, используя схему (2.6), решает указанную задачу Коши от точки х - 0 до х = 3. Программа запрашива- ет ввод величины шага. По завершении расчета на печать выводятся результат и его погрешность. 10 DEF FNF( X, Y)=-X*Y 'функция, задающая dy/dx 20 ИЧРиГ'Вводите h (при h<=0 конец работы)"; Н 30 IF Н<=0 THEN STOP 40 N%=3/H 'число шагов на интервале [0,3] 50 Y=1 'начальное значение у 60 FOR l%=0 ТО N%-1 'начало цикла 70 X=l%*H 'х, от которого делается шаг 80 Y=Y+H*FNF( X, Y) 'расчет у по формуле (2.6)
40 Глава 2 90 DIFF=EXP( -0.5*( Х+Н)л2)-У 100 PRINT 1%, Х+Н, Y, DIFF 110 NEXT 1% 120 GOTO 20 'сравнение с точным значением 'вывод на печать 'переход к расчету с новым h Отклонения результатов расчета от точных значений 1/(1) = ехр(-1/2) = 0,606531, i/(3) = ехр(-9/2) = 0,011109 для различных величин шага h приведены в первых двух столбцах табл. 2.1. Как и ожидалось исходя из (2.6), абсолютная погрешность линей- но снижается с уменьшением h. Однако относительная ошибка (т.е. аб- солютная погрешность, деленная на у) увеличивается с ростом х по мере продвижения к концу отрезка интегрирования и уменьшения значе- ния у. | Упражнение 2.1. Простой и часто достаточно строгий способ провер- ки на точность результата численного решения состоит в повторном интегрировании решаемого уравнения в обратном направлении от конеч- ного значения х к начальному. При этом полученное ранее значение у в конечной точке используется как новое начальное условие. Степень отличия конечного значения у, полученного при повторном решении уравнения, от исходного начального значения будет являться мерой погрешности численного решения. Примените этот способ проверки к приведенному выше примеру. Хотя кажется, что метод Эйлера работает достаточно хорошо, в общем случае он оказывается несостоятельным из-за низкого порядка его точности. Это должно предостеречь нас от желания сократить объем вычислений за счет использования большего шага h и соответст- венно меньшего числа шагов интегрирования. В рассмотренном примере неудовлетворительность метода становится очевидной, если мы попыта- емся искать решение уравнения до больших значений х. Можно пока- зать, что мы получим абсурдный результат у = 0 (точно!) для х > h~\ Одно из простых решений этой проблемы состоит в изменении шага по мере движения вдоль осн интегрирования (уменьшать h, с рос- том величины х), но и этот способ довольно быстро теряет эффектив- ность. Методу Эйлера интегрирования дифференциальных уравнений обычно предпочитают методы с более высокими порядками точности. Они дают гораздо более быстрый рост точности расчета с уменьшением длины ша- га и, следовательно, большую точность при фиксированном объеме вы-
Обыкноненные дифференциальные уравнения 41 числений. Один класс простых методов более высокого порядка можно получить из разложения в ряд Тейлора уп^ вблизи уп+\ = У<хп + А> = Уп + hy'n + l h2y"n + °(а3)- Из (2.4) имеем у' = f(x » У )» а поскольку df df df dy df df У = “~(x , у ) = — +-----------= — + —f, n dx n n dx dy dx dx dy (2.8) (2.9a) (2.96) то, сделав подстановку в (2.8), получим 1 2Р/ д1 1 ч Уп+1 = Уп+ hf + ~h + -f] + О(Л3)- (2.10) Здесь f и ее производные вычисляются в точке (хп, уп). Это рекур- рентное соотношение имеет локальную погрешность О(Л3) и, следова- тельно, общую ошибку порядка О(Л2), т.е. на один порядок выше, чем в методе Эйлера (2.6). Эта формула наиболее полезна, когда известен аналитический вид функции f и дифференцировать ее достаточно прос- то. Применив схему (2.10) к примеру (2.7), получим результаты, при- веденные в двух средних столбцах табл. 2.1. Улучшение по сравнению с методом Эйлера очевидно. Алгоритмы с большей точностью можно по- лучить, оставляя в разложении (2.8) еще большее число членов, но сложность алгебраических выкладок быстро становится препятствием во всех случаях, кроме простейших. 2.2. МНОГОШАГОВЫЕ И НЕЯВНЫЕ МЕТОДЫ Другой путь достижения большей точности состоит в использовании ре- куррентных соотношений, связывающих значение уп^ не только с у , но также и с другими точками, удаленными дальше «в прошлое», ска- жем, с у г у т •••. Чтобы вывести такие формулы, мы можем точно проинтегрировать на одном шаге дифференциальное уравнение (2.4): Уп+\ = Уп + I y)dx- (2.11)
42 Глава 2 Конечно, проблема в том, что мы не знаем значений f на этом интер- вале интегрирования. Тем не менее мы можем воспользоваться значе- ниями у в точках хп и хп_^ для линейной экстраполяции функции f на требуемый интервал: (% - хп .) (х - х) 0 f ” ----—— fn----------fn-y + О(А2). (2.12) h h где f = fpc., y^. Подставив это в (2.11) и выполнив интегрирова- ние по х, получим в результате схему двухшагового метода Адамса — Бэшфорта: Уп+1 = Уп + фп - + °<л3)- (213) Аналогичные методы более высокого порядка можно получить экстрапо- ляцией f полиномами больших степеней. Например, если функцию экст- раполировать кубическим полиномом, соответствующим значениям f г fn-y fn-2 и ^n-З’ т0 в РезУльтате получим 4-шаговый метод Адамса — Бэшфорта: Уп+1 = Уп + &fn - 59U + 37/п-2 - 9/п-з) + (2-14) Заметим, что, поскольку в рекуррентные формулы (2.13) и (2.14) вхо- дят значения функции на нескольких предыдущих шагах, одного началь- ного значения yQ недостаточно для запуска этих методов. Значения у в нескольких первых точках следует находить какой-либо другой про- цедурой, например такой, как разложение в ряд Тейлора (2.8), или же методами Рунге —Кутты, обсуждаемыми ниже. | Упражнение 2.2. Примените алгоритмы двух- и четырехшагового мето- дов Адамса —Бэшфорта к примеру (2.7), используя метод Эйлера для определения значений у, необходимых для первого шага рекурсии. Ис- следуйте погрешность решения у(х) при различных значениях шага А, сравнивая его с аналитическим „ответом, а также проведя проверку об- ратным расчетом, описанную в упр.2.1. Все обсуждавшиеся до сих пор методы относятся к явным методам в том смысле, что уп+^ выражается в виде явной зависимости от других известных значений уп. Неявные методы, в которых для определения уп+^ необходимо решить некоторое уравнение, дают еще один путь по- вышения точности решения. Давайте рассмотрим уравнение (2.4) в точ- ке *п+^/2) = (и + l/2)h, расположенной посредине между узлами сет-
Обыкновенные дифференциальные уравнения 43 ки: dy dx Xn+(1/2) ^Xn+(1/2)’ ^n+(1/2))' (2.15) Если мы воспользуемся симметричной разностной аппроксимацией произ- водной (аналогично (1.3), но с заменой h —> Л/2), а также заменим ^п+(1/2) еГ0 СРеДНИМи сетки (ошибка такой арифметическим по подстановки порядка значениям f в соседних узлах О(Л2)), то получим Уп+1 ~ Уп + О(Л2) = J (fn + fn+1) + О(Л2)- (2.16) п 2 Отсюда выводится рекуррентное соотношение Уп+1 = уп + ^ ЫХп’ yj + «ХП+Г 1^)] + (217) Все это хорошо, но появление в обеих частях этого уравнения означает, что в общем случае на каждом шаге интегрирования мы будем вынуждены решать некоторое нетривиальное уравнение (например, мето- дом Ньютона —Рафсона, обсуждавшимся в разд. 1.3). Это может потребо- вать больших затрат времени. Некоторое упрощение происходит в слу- чае, когда f линейно зависит от у, скажем, f(x, у) = g(x)y. Тогда (2.17) может быть решено и получится Уп+1 ' 1 + g(\)h/2 ' 1 ’ ^xn^h/2 Уп (2.18) Применяя эту схему к задаче (2.7), для которой g(x) = -х, получаем результаты, записанные в два последних столбца табл.2.1. Ясно видна квадратичная зависимость погрешности от величины h. | Упражнение 2.3. Примените метод разложения в ряд Тейлора (2.10) и неявный метод (2.18) к задаче (2.7) и получите результаты, пред- ставленные в табл. 2.1. Исследуйте точность решения для больших х. Методы Адамса —Мултона являются как многошаговыми, так и неяв- ными. Например, 2-шаговый метод Адамса —Мултона может быть получен из уравнения (2.11) при использовании квадратичного полинома, про- ходящего через fn Y fn и fn+Y , „ <х - Xn-j)<X - ХпК <Х - - XnJ, 1 ~ 2Л2 ' ft2 ,п
44 Глава 2 X - xnt1)(x - хп) 2h2 для интерполяции функции f на отрезке между хп и хп+1. В результате находится неявная рекуррентная связь Уп.г = Уп + ^ (5Ui + *fn ~ U + °(^ (2.19) Соответствующая 3-шаговая формула получается при интерполяции куби- ческим полиномом: Уп+Х = Уп + + Wn - 5fn-x + fn-2) + °(л5)- (2.20) Неявные методы, сопровождающиеся решением нетривиальных уравне- ний на каждом шаге интегрирования, используются редко. Чаще они служат основой предсказывающе-корректирующих алгоритмов (также на- зываемых методами типа предиктор —корректор). При этом «предсказа- ние» для у основанное на явном методе, затем «корректируется» на более точную величину с использованием «предсказанного» значения у уже в формулах какого-либо неявного метода. Преимуществом та- ких алгоритмов является возможность непрерывного слежения за точ- ностью получаемого решения, например, путем контроля за величиной коррекции. Часто применяемый алгоритм такого типа с локальной ошиб- кой О(А5) получен использованием явного 4-шагового метода Адамса — Бэшфорта (2.14) на этапе предсказания и расчетом поправки 3-шаговым методом Адамса —Мултона (2.20). При этом у^ полученное на первом шаге, используется для вычисления fn^ в правой части уравнения (2.20). 2.3. МЕТОДЫ РУНГЕ-КУТТЫ Как вы уже могли заметить в предыдущем разделе, существует доста- точная свобода в выборе алгоритмов интегрирования дифференциальных уравнений. Их имеется весьма много, и у каждого есть свои достоинс- тва и недостатки. К наиболее удобным и широко используемым алгорит- мам относятся методы Рунге —Кутты, различающиеся порядком точности. Мы выведем здесь формулу метода второго порядка точности, на кото- ром продемонстрируем общий дух этого подхода, а затем просто будут даны формулы для методов третьего и обычно используемого четвертого порядка точности.
Обыкновенные дифференциальные уравнения 45 Чтобы разработать алгоритм метода Рунге— Кутты второго порядка (существует целый класс методов этого типа, характеризующийся не- прерывным параметром), аппроксимируем функцию f в интеграле (2.11) первыми членами ее разложения в ряд Тейлора в средней точке отрезка интегрирования. Тогда *61+1 = Уп + ft^Xn+(l/2)’ *6i+(1/2p + (2-21) и ошибка здесь начинает возникать лишь с квадратичного члена разло- жения, так как интеграл от линейного члена равен нулю. При взгляде на эту формулу может показаться, что для любого дальнейшего ее ис- пользования нам нужно знать Уп+^/2у появляющуюся справа в f. Од- нако это неверно. Так как порядок погрешности равен O(ft3), аппрок- симацию t/n+1 с ошибкой O(ft2) можно считать достаточно хорошей. Это как раз то, что обеспечивается простым методом Эйлера по схеме (2.6). И тогда, определив величину k как некоторое промежуточное приближение, в два раза большее разности между Упщ/2^ и уп, мож- но записать двухшаговую процедуру, выражающую через у^. Ь = hf Уп)\ (2.22а) Уп+' =Уп + V (хп + %- Уп +%>+ (2-22б) Это и есть метод Рунге —Кутты второго порядка. В нем воплощена об- щая идея о возможности подстановки некоторых приближенных значений у в неявные выражения, содержащие f в своей правой части. Точность его такая же, что и у метода тейлоровского разложения (2.10) или неявного метода (2.17). Однако здесь отсутствуют специальные огра- ничения на вид f, такие, как легкая дифференцируемость или линей- ность по у. К тому же в отличие от многошаговых методов, рассмот- ренных выше, здесь используется значение у лишь в одной предыдущей точке. Однако метод (2.22) требует двукратного вычисления f на каж- дом шаге по сетке. Схемы Рунге —Кутты более высоких порядков можно получать до- вольно единообразным способом. Интеграл в формуле (2.11) аппрокси- мируется конечной суммой нескольких значений f. Для этого можно ис- пользовать любую из квадратурных формул, обсуждавшихся в гл.1. На- пример, метод Симпсона дает *61+1 = уп+ g[^Xn’ У г) + 4^*n+(1/2)’ *6i+(1/2p + KXn+V **п+?] + + О(Л5). (2.23) Процедуру дополняют формулы аппроксимации соответствующей точности
46 Глава 2 для значений у, входящих в правую часть полученного соотношения. Следующие формулы реализуют схему третьего порядка с локальной точ- ностью О(Л4): *1 = hf <Хп’ Уп>’ k2 = У [Хп + 2’ Уп + ГР k3 = hf (хп + А> Уп ~ *i + 2М; Уп+у = Уп + ^[*1 + Ч + *з] + °^- <2-24) В ее основе лежит формула (2.23). На каждом шаге интегрирования уравнения требуется три раза вычислять значение f. Опытным путем найдено, что наилучшее соотношение точности расчета и объема необ- ходимых вычислений достигается в схеме Рунге —Кутты четвертого по- рядка, которая имеет локальную точность О(Л5) и требует четырех вы- числений f на шаге интегрирования. Обозначив промежуточные перемен- ные через k., эту схему можно записать следующим образом: *1 = К <Хп’ Уп>' k„ = (Хп + Уп + 2 I п п 2 J k„ = hf lx + —, у + —1; 3 ' I " 2 п 2 J *4 = hf (хп + h, yn + fe3); Уп+\ = Уп + + 2*2 + 2*3 + + °^- <225) O'" J I Упражнение 2.4. Опробуйте методы Рунге —Кутты второго, третьего и четвертого порядков, рассмотренные выше, на примере задачи (2.7). При заданной точности сравните объем вычислений, требуемый методами Рунге —Кутты и другими методами. | Упражнение 2.5. Система двух связанных уравнений первого порядка dy dp — = р\ — = -4тгу (2.26) dt dt описывает простое колебательное движение с периодом, равным 1. Обобщите формулы, выведенные выше для случая одной переменной, на задачу с двумя переменными. Найдите решение задачи (2.26) для неко-
Обыкновенные дифференциальные уравнения 47 торых начальных условий, выбранных вами. Исследуйте точность, с ко- торой система возвращается в исходное состояние, по мере роста чис- ла периодов колебаний. 2.4. УСТОЙЧИВОСТЬ Основным вопросом в задаче интегрирования дифференциальных уравне- ний является устойчивость выбранного метода решения, т.е. вопрос о степени нарастания в ходе расчета ошибок округления и других оши- бок, связанных с проводимыми вычислениями. Во многих случаях нарас- тание такого рода «шумов» может приводить к полному искажению ре- зультата. Для иллюстрации возникающей здесь проблемы давайте попро- буем улучшить точность метода Эйлера и для этого прямо заменим про- изводную в (2.4) ее симметричной разностной аппроксимацией (1.36). В результате получается трехчленная рекуррентная формула Уп+\ = Уп-х + 2hf Уп> + °<л3)> (2-27) которая на первый взгляд ничем не хуже расчетных схем (2.10) или (2.18) с третьим порядком точности. Давайте посмотрим, что произой- дет, если этим методом искать решение задачи dy — = -у, у(х = 0) = 1, (2.28) dx точное решение которой равно у - е~* Для первого шага рекурсии по (2.27) кроме значения t/Q = 1 требуется еще одно значение у^. Ис- пользовав (2.10), можно получить У] = 1 - h + 1ft2 + О(Л3). (Это просто первые члены разложения e~h в ряд Тейлора.) Следующая программа запрашивает ввод с клавиатуры величины шага h и, исполь- зуя схему (2.27), рассчитывает у(х) вплоть до х = 6. 10 INPUT "Вводите величину h (<=0 для останова)”; H 20 YAA=1: YZ=1-H+0.5*ЬГ2 1 начальные значения у(0) и y(h) 30 FOR J%=2 TO 6/H 'начало цикла интегрирования 35 X=H*J% 'текущее значение х 40 YP=YM-2*H*YZ 'расчет нового у с учетом (2.15) 45 YM=YZ: YZ=YP 'сохранение у для использования ' на следующем шаге
48 Г лава 2 47 ЕХАСТ=ЕХР(-Х) 'аналитическое решение в этой точке 50 PRINT X,EXACT,EXACT-YZ 'вывод точного значения у и ошибки 60 NEXT )% 70 GOTO 10 'переход к вводу очередного значения для h Обратите внимание, каким образом выполняется рекурсия по формуле (2.27) с использованием всего лишь трех переменных YP(1 us) —значе- ние у на следующем шаге, YZ(ero)—значение в текущей точке и YM(inus) —значение на предыдущем шаге. В табл.2.2 дана некоторая часть результатов расчетов, проводив- шихся с шагом h = 0,1. При малых х численное решение лишь слегка превышает точное и погрешность согласуется с оценкой О(Л3). Затем вблизи х = 3,5 в численном решении развиваются осцилляции, и оно при переходе с каждого узла сетки на следующий попеременно стано- вится то больше точного решения, то меньше его. В ходе дальнейшего интегрирования размах осцилляций нарастает (см. в табл, значения вблизи х = 6), в конечном счете полностью подавляя ожидаемый экспо- ненциальный спад для у(х). Таблица 2.2. Интегрирование dy/dx = -1 при у(0) = 1 по схеме (2.27) X Точное Ошибка У(х) X Точное Ошибка «/(*) X Точное У(х) Ошибка 0,2 0,81873 -0,000269 3,3 0,03688 -0,000369 5,5 0,00409 -0,001533 0,3 0,74082 -0,000382 3,4 0,03337 -0,000005 5,6 0,00370 0,001618 0,4 0,67032 -0,000440 3,5 0,03020 -0,000380 5,7 0,00335 -0,001858 0,5 0,60653 -0,000517 3,6 0,02732 0,000061 5,8 0,00303 0,001989 0,6 0,54881 -0,000538 3,7 0,02472 -0,000400 5,9 0,00274 -0,002257 3,8 0,02237 0,000133 6,0 0,00248 0,002439 Наблюдавшееся поведение является признаком неустойчивости алго- ритма (2.27). Это можно понять следующим образом. Рекуррентное со- отношение (2.27) для задачи (2.28) имеет вид yn+t = Уп.х - Муп- (2.29) Можно найти решение этого уравнения, предположив, что оно имеет вид уп = Лгл, где А и г —некоторые постоянные. Подстановка в (2.29) да- ет уравнение для г: г2 + 2hr - 1 = 0,
Обыкновенные дифференциальные уравнения 49 а значение константы А неважно, так как рекуррентное соотношение линейно. Двумя корнями полученного уравнения являются значения Г+ = (1 + й2),/2- Л « 1 - Л; r_ = -(1 + й2)1/2- й ~ -(1 + Л), где приближенные значения будут верны при условии h « 1. Положи- тельный корень, немного меньший единицы, соответствует экспоненци- ально спадающему решению, полученному ранее. Однако имеется еще один корень, значение которого несколько меньше -1 и которому соот- ветствует побочное нарастающее решение уравнения Уп ~ + Л)п. изменяющее знак при каждом переходе к следующему узлу сетки. Общее решение линейного дифференциального уравнения (2.27) яв- ляется линейной комбинацией Этих двух экспоненциальных решений. Тщательным выбором начальных значений t/Q и мы можем обеспечить для малых х наличие лишь спадающего решения. Однако из-за ошибок округления при вычислении рекуррентного соотношения (2.29) постоян- но будет вноситься некоторая доля «плохого» решения (обратите вни- мание, что в этой формуле вычисляется малая разность двух положи- тельных величин). В конце концов в результате станет доминировать побочное нарастающее решение. Эта неустойчивость явно связана с тем, что в рекуррентное соотношение (2.29) входят три члена. Хоро- шим правилом должно стать исследование проблемы устойчивости и оши- бок округления в задачах, где ожидаются строго спадающие решения. Ситуаций, подобных изложенной выше, следует по возможности избе- гать. Мы еще встретимся с такого рода неустойчивостями при изучении дифференциальных уравнений второго порядка в гл.З. | Упражнение 2.6. На примере задачи (2.28) исследуйте устойчивость нескольких других методов из числа изложенных в этой главе. Не мог- ли бы вы некоторыми аналитическими выкладками пояснить результаты, полученные численным расчетом? 2.5. ПОРЯДОК И ХАОС В ДВУМЕРНОМ ДВИЖЕНИИ При использовании компьютеров в физике появляется возможность изу- чать поведение систем, к которым нельзя применить аналитические ме- тоды. Обычно при моделировании представляют интерес точные коли- I 1650
50 Глава 2 явственные характеристики явления, качественная картина которого уже интуитивно понята в результате аналитических исследований. Од- нако в некоторых ситуациях результаты расчетов опровергают сложив- шиеся представления такого рода (и тем самым меняют их). В этих случаях численное моделирование необходимо для понимания сути явле- ния. Совершенно неожиданно оказалось, что к таким случаям относится динамика некоторых простых классических систем, поведение которых качественно отличается от моделей, рассматриваемых в традиционных курсах классической механики. В примере, рассматриваемом в этом разделе, мы изучим один из случаев такого неожиданного поведения, численно исследуя траектории частицы, движущейся в двух измерениях. Общее рассмотрение подобных систем можно найти в работах [Не80], [Ri80] и [АЬ78]. Рассмотрим частицу единичной массы, движущуюся в двух измерени- ях в потенциальном поле V. Допустим, что при достаточно малой энер- гии ее движение будет всегда ограниченным. Если компоненты импуль- са, сопряженные координатам (х, у), обозначить как (р*, р^), то га- мильтониан системы будет иметь вид н = kp2x + Р2) + V(x, у). (2.30) 2 у Если задать определенные начальные значения этих координат и им- пульсов, то траекторию частицы можно узнать, рассчитав ее движение, описываемое связанной системой четырех дифференциальных уравнений первого порядка (уравнения Гамильтона): dx di дН ^- = p' r X dy _ dt dH — = Py’ aPy y dpx _ дН dV dpu _ dH dV — — = — — — — = — — . (2.31) dt д x дх dt dy аУ Для любого вида V эти уравнения сохраняют постоянной энергию Е. Ус- ловие Н(х, у, р р ) = Е Л У означает, что траектории частицы принадлежат некоторому трехмерному многообразию, погруженному в четырехмерное фазовое пространство. Кроме этого ограничения имеется совсем немного утверждений общего характера, которые характеризуют поведение рассматриваемой системы. Важным классом систем с двумерным гамильтонианом, для которых можно сделать такие дополнительные утверждения, являются так назы-
Обыкновенные дифференциальные уравнения 51 ваемые интегрируемые системы. Помимо энергии для такого рода потен- циалов имеется вторая функция координат и импульса частицы, значе- ние которой будет оставаться постоянным во время движения. (Такие функции называются интегралами движения.) В этом случае траектория частицы будет принадлежать уже двумерному множеству в фазовом про- странстве. Двумя известными типами системы циалом. с разделяющимся потенциалом В первом случае интегрируемых систем являются и системы с центральным потен- (2 32) функциями, так что полный га- мильтониан делится на две части, каждая из одной координаты и сопряженного ей импульса где V являются двумя независимыми которых зависит лишь от V(x, у) = Vx(x) + Н = Н + Н ; Н = V у Х.у 2 Х,у + V Тем самым движения по х течением времени каждый постоянным. величиной в дополнение к Е = и у оказываются полностью развязанными, и с из отдельных гамильтонианов Н ~ остается (Соответственно , Н ричного потенциала гамильтонианов Н - Ну является второй сохраняющейся Н* + Н^) В случае центрально-симмет- V(x, у) = V(r); .2 ..2J/2 (2.33) вторым интегралом движения а гамильтониан имеет вид является угловой момент р& = хру - ур*, „2 2 г 2г2 Н = где рг~-импульс, сопряженный г. Дополнительная связь, наложенная на траекторию в интегрируемых системах, позволяет изучать характер движения не путем решения системы уравнений движения, а сводя зада- чу к вычислению интегралов определенного типа, как это мы сделали в гл.1. Все подобного рода задачи классической механики, решаемые аналитически, относятся именно к интегрируемым системам И хотя динамика интегрируемых систем достаточно проста, часто бывает не так-то легко выявить эту простоту. Не имеется общего ана литического подхода, чтобы узнать, существует ли второй интеграл движения у некоторой системы с произвольным потенциалом взаимодей- ствия, или чтобы найти его величину в том случае, когда известно, что он есть. Численные расчеты также не могут помочь —они дают на- бор траекторий частицы (при различных начальных условиях), которые 4*
52 Глава 2 могут быть весьма запутанными даже в довольно тривиальных случаях Это можно видеть на примере траекторий в виде фигур Лиссажу, соот- ветствующих обычным гармоническим колебаниям частицы по обеим коор- динатам: V = Vx2. V = V(/2. (2.34) х 2 х у 2 у Анализ поведения системы в фазовом пространстве дает один из способов установить для нее наличие интегрируемости, исходя лишь из вида траектории в этом пространстве. Рассмотрим для примера случай разделяемого потенциала. Из-за того что движения по каждой из двух координат независимы, проекции траекторий на плоскости (х, р ) и (у, р ) могут выглядеть так, как изображено на рис.2.1. Здесь было предположено, что каждый из потенциалов V имеет единственное ми- нимальное значение, равное нулю, при некотором конкретном значении х или у соответственно. Частица движется по замкнутому контуру на каждой из двумерных проекций четырехмерного фазового пространства. Они похожи на аналогичные контуры, полученные для обыкновенного од- номерного движения и изображенные выше на рис. 1.3. Площади контуров зависят от того, какова величина энергии, связанной с каждой из ко- ординат (т.е. Ех и Е^. Если мы рассматриваем вид траекторий при одной энергии, то при изменении начальных условий площадь контура в одной проекции будет сокращаться, если она растет в другой. В каж- дой из плоскостей" (х, р^ и (у, р ) есть некоторый предельный кон- Рис.2.1. Траектории частицы в двумерном разделяемом потенциале в проекциях на плоскости (х, р*) и (у, р^. Показано несколько траек- торий, соответствующих одной энергии, но разным начальным условиям. Траектории А и Е являются предельными случаями, соответствующими нулевым значениям Е и Е . х у
Обыкновенные дифференциальные уравнения 5J тур, относящийся к случаю, когда вся энергия частицы оказывается связаной с движением по данной координате. Все эти контуры образу- ются пересечением двумерных множеств фазового пространства, содер- жащих все траектории частицы. Поэтому такое изображение в координа- тах (х, рх) и (г/, ру) называется также «поверхностью сечения>. Су- ществование на них замкнутых контуров указывает на интегрируемость системы. Хотя общий вид фазовых траекторий, изображенных на рис.2.1, был получен, исходя из интегрируемости системы, аналогичную картину можно получить, зная лишь траектории частицы. Предположим, что в каждый момент времени, когда какая-либо из ее координат, скажем х, меняет знак, мы отмечаем ее текущее положение на- плоскости (у, р ). Другими словами, пересечение частицей плоскости х = 0 включает «стробоскоп», через который мы рассматриваем движение проекции час- тицы на (у, ру). Если периоды движения по х и у являются несоизме- римыми (т. е. их отношение является иррациональным числом), то по мере движения частицы вдоль траектории точки—результаты наблюде- ний—постепенно будут заполнять весь контур на (i/, р ). Если же пе- риоды соизмеримы (отношение —рациональное число), то результатом будет некоторая дискретная последовательность точек на таком конту- ре. Этим же методом, зная лишь траектории частицы, можно изучать топологию фазового пространства, связанного с гамильтонианом произ- вольного вида. Общий вид топологии фазового пространства для интегрируемого гамильтониана можно проиллюстрировать на примере движения в цен- тральном потенциале. Для фиксированных значений энергии и углового момента радиальное движение ограничено двумя точками возврата г. и rQut, координаты которых являются решениями уравнения Е ~ V(r) - А = 0. 2г2 Эти два радиуса определяют на плоскости (х, у) кольцо, которым ог- раничена траектория частицы, как это показано в левой части рис. 2.2. Далее, из закона сохранения энергии следует, что фиксиро- ванному значению г могут соответствовать лишь два значения радиаль- ной компоненты импульса г ‘2.1/2 pr= ± 2Е - 2V(r) - Эти значения определяют в пространстве (х, у, р ) определенное дву- мерное многообразие, содержащее . данную траекторию. Ясно, что оно
54 Глава 2 Рис. 2.2. Слева- тороидальное многообразие, содержащее траекторию частицы в центральном потенциале. Справа: сечение этой поверхности при х = 0. имеет топологию тора, как и показано слева на рис.2 2. Если бы мы построили поверхность сечения для (у, р^), рассматривая пересечение частицей плоскости х = 0, то получилось бы два замкнутых контура, как изображено справа па этом же рисунке. (Заметим, что у = г при х = 0.) Если величину энергии фиксировать, но изменять угловой мо- мент частицы, выбирая различные начальные условия, то размеры тора будут меняться, равно как и площадь контура на поверхности сечения. Можно показать, что тороидальная топология фазового пространст- ва систем с центральным потенциалом является общей для всех интег- рируемых систем. Многообразие, которому принадлежит траектория дви- жения при заданных значениях интегралов движения, называется «инва риантным тором>, и каждому значению энергии соответствует множество таких торов. Как пример на рис.2.3 приведен вид поверхности сечения инвариантных торов в достаточно общем случае. Видно, что есть опре- деленные неподвижные точки, связанные с траекториями, которые по вторяют сами себя с некоторым периодом. Неподвижные точки эллипти- ческого типа соответствуют траекториям, которые остаются устойчивы ми при любых малых возмущениях Каждая такая точка окружена своим семейством торов. Области, занятые семействами, разделяются сепа- ратрисой. Неподвижные точки гиперболического тина возникают на пе- ресечениях сепаратрис. Соответствующие траектории устойчивы к воз мущениям вдоль одной из осей гиперболы, но неустойчивы по другой ее оси. Интересно, что случается с торами интегрируемой системы при на- ложении возмущения, нарушающего интегрируемость гамильтониана? В областях вблизи неподвижных точек эллиптического типа при малых возмущениях большая часть торов искажается, однако сохраняет свою
Обыкновенные дифференциальные уравнения 55 Ру Рис.2.3. Возможная картина поверхности сечения для интегрируемой системы общего вида. Эллиптические и гиперболические точки помечены соответственно Е и Н. Кривая S является сепаратрисой Рис,2.4. Вложенные торы слабовозмущенной интегрируемой системы. От- метим иерархию эллиптических орбит, перемежаемую областями хаоса. Разглядывание такой структуры в «микроскоп» показало бы ту же самую картину на меньших размерах и так далее до бесконечности. (Воспро- изведено из работы [АЬ78].)
56 Глава 2 топологию (КАМ-теорема Колмогорова —Арнольда —Мозера [Аг68]). Одна- ко примыкающие области становятся «хаотическими», давая на графиках поверхности сечения разброс точек, кажущийся вначале совершенно случайным. Тем не менее в такие области хаоса оказываются вложены новые эллиптические неподвижные точки и новые хаотические области и т. д., создавая некую фантастическую иерархию (см. рис.2.4). Сильные отклонения от интегрируемости должны исследоваться чис- ленно. Удобным примером для этого может быть потенциал вида V(x, у) = V + у2) + Л - V. (2.35) Z о первоначально введенный Эноном и Хейлесом при изучении движения звезд в галактиках [Не64]. Его можно рассматривать как возмущенный потенциал гармонического осциллятора (кубический член с малым коэф- фициентом можно убрать перенормировкой координат и энергии, так что величина последней станет мерой отклонения от интегрируемости). По- ле имеет симметрию третьего порядка, как это видно из рис.2.5. По- тенциал равен нулю в начале координат и неограниченно растет по ме- ре удаления от центра. Однако для значений энергии, меньших 1/6, траектории не выходят за пределы равностороннего треугольника, по- казанного на рисунке. Рис.2.5. Линии уровня для потенциала Энона— Хейлеса (2.35).
Обыкновенные дифференциальные уравнения 57 Программа примера 2, текст которой дается в приложении Б, пред- назначена для построения поверхности сечения потенциала Энона — Хейлеса Для интегрирования уравнений движения (2.31) использован метод Рунге —Кутты четвертого порядка (2.25). Считается, что в на- чальный момент времени х = 0, а значения у, р^ и энергия частицы задаются пользователем. Начальное значение р* находится из условия сохранения энергии. Ввод начальных у и р^ можно сделать, двигая курсор по графику на экране дисплея (конечно, если доступен графи- ческий режим) или же просто вводя числа с клавиатуры. По ходу инте- грирования уравнений движения выдаются информация о траектории час- тицы в плоскости (х, у) и данные для поверхности сечения (у, р ). Каждая точка сечения рассчитывается только на том, шаге по времени, когда координата х частицы меняет знак. Когда это происходит, про- грамма специальной процедурой находит точное положение точки на по- верхности сечения. Для этого х временно переопределяется в качестве независимой переменной и уравнения движения записываются как dx dy । — = 1» — = — р ; dx dx ?х у dpx ! dV dpy t dV dx ?x dx dt Px dy После этого производится интегрирование этой системы назад по оси х от начальных значений, полученных на последнем шаге по времени, до точки х = 0 [Не82]. Если рассчитать ряд вариантов траектории и при этом, выбирая начальные условия, не менять значения энергии, то, наложив графики нескольких поверхностей сечения, можно получить картину, подобную изображениям на рис.2.3 и рис.2.4. Следующие упражнения помогут вам закрепить понимание физических явлений и численных методов, демонстрируемых этим примером. | Упражнение 2.7. Одной из необходимых (но недостаточных) проверок точности интегрирования гамильтоновых систем является сохранение энергии. Измените шаг по времени (строка 70) и посмотрите, как это повлияет на точность расчета. Замените используемый метод интегри- рования на какой-либо другой (из рассмотренных в этой главе) и по- смотрите, как изменится точность и эффективность работы программы. Заметим, что из-за необходимости рассматривать движение в течение очень больших периодов времени используемый алгоритм интегрирова- ния должен быть одновременно достаточно точным и быстрым.
58 Глава 2 | Упражнение 2.8. Измените вид потенциала на центральный (строки 230—250) и посмотрите на характер (х, ^-траектории и поверхностей сечения при различных начальных условиях. Сравните полученные ре- зультаты с рис.2.2 и проверьте, что картина качественно не изменяе- тся при выборе различных зависимостей для V(r). Обратите внимание на необходимость подбора значения энергии и нормирования потенциала таким образом, чтобы (%, ^-траектория не выходила за пределы рав- ностороннего треугольника, связанного с потенциалом Энона —Хейлеса (рис.2.5). В противном случае графический вывод на экран будет не- правильным. | Упражнение 2.9. Если в потенциале Энона —Хейлеса (2.35) поменять з знак перед членом с у , то гамильтониан станет интегрируемым. Про- верьте это практически. Для этого выполните каноническое преобразо’ вание к переменным х ± у и покажите, что в этих переменных потенци- ал является разделяемым. Сделайте соответствующую замену знака в тексте программы и наблюдайте за видом поверхностей сечения при различных начальных условиях, но постоянной энергии. (Энергия час- тицы не должна превышать 1/12, чтобы траектория оставалась ограни- ченной.) Проверьте, что нет качественного отличия при использовании других разделяемых потенциалов, скажем гармонического осциллятора (2.34). | Упражнение 2.10. Используйте программу для построения поверхнос- тей сечений потенциала Энона —Хейлеса (2.35) в диапазоне энергий от 0,025 до 0,15 с шагом 0,025. Для каждого значения энергии брать не- сколько различных начальных условий. Интегрирование уравнений вести в течение достаточно большого времени (иногда может потребоваться t » 1000), чтобы прорисовать контуры на поверхности сечения с при- емлемой полнотой. Для каждой энергии посмотрите, сможете ли вы най- ти неподвижные эллиптические точки, торы вокруг них (а также торы, состоящие из торов) и области фазового пространства, заполненные хаосом. Посмотрите также, как с ростом энергии изменяется относи- тельная доля хаотических областей. При некотором опыте и терпении вы будете вполне способны получить для каждой эллиптической траек- тории график, похожий на схему рис.2.4.
Обыкновенные дифференциальные уравнения 59 ПРОЕКТ II: СТРУКТУРА БЕЛЫХ КАРЛИКОВ Белые карлики—это холодные объекты, состоящие в основном из тяже- лых ядер и электронов. Звезды такого типа являются одним из возмож- ных конечных результатов течения обычных ядерных процессов, в ходе которых синтезируются элементы путем связывания нуклонов в ядра. Карлики часто состоят из наиболее стабильных ядер 56Fe с 26 прото- нами и 30 нейтронами. Однако если процесс нуклеосинтеза прерывается преждевременно, то могут преобладать ядра 12С. Структура такой звезды определяется балансом силы тяжести, которая ее сжимает, и давлением вырожденных электронов, которое противодействует сжатию. В этом проекте мы будем исследовать структуру белого карлика, решая уравнения, которыми определяется его равновесие. В частности, мы получим соотношение между массой звезды и ее радиусом—величину, которую можно определить из астрономических наблюдений. Обсуждение физики белых карликов можно найти в работах [Ch57], [Ch84] и [Sh83]. II.1. Уравнения равновесия Предположим, что звезда сферически-симметрична (т.е. состояние в ее любой заданной точке зависит только от расстояния между этой точкой и центром звезды). Допустим далее, что вращение отсутствует и можно пренебречь влиянием магнитного поля. Если звезда находится в меха- ническом (гидростатическом) равновесии, то гравитационная сила, приложенная к некоторому объему вещества, уравновешивается градиен- том давления Р. Сила тяжести, действующая на единичный объем вещес- тва на расстоянии г от центра, равна Fgrav = (ПЛ) гдр G — гравитационная постоянная, р( г) — массовая плотность, а т(г) — масса звезды, заключенная внутри сферы радиуса г. г т(г) = 4п J p(r')r'2dr'. (II.2) 0 Сила, связанная с градиентом давления и действующая на единицу объема, равна -dP/dr. Когда звезда находится в равновесии, резуль- тирующая этих сил (гравитации и давления), приложенная к любому пробному объему вещества, должна быть равна нулю. Так что, исполь-
60 Глава 2 зуя (II. 1), получаем = _ Gm£d р(г) dr г (П.З) Дифференциальное соотношение между массой и плотностью можно полу- чить, продифференцировав (II.2): — = 4пг2р(г). (II.4) d г Чтобы описание системы было полным, необходимо знать «уравнение со- стояния» вещества, связывающее его плотность с величиной давления, необходимого для поддержания этой плотности. Используя тождество dP = fd^l \d£ dr [dr J [dp. уравнение (П.З) можно переписать в виде dp \dP dr [dp. ^p. (11.5) Уравнения (II.4) и (II.5) являются системой двух связанных диф- ференциальных уравнений первого порядка, которые определяют струк- туру звезды совместно с заданным уравнением состояния ее вещества. Начальным значением переменных при г = 0 являются т = 0 и плотность в центре р = рс. Интегрирование полученной системы по г в направле- нии от центра дает профиль плотности вещества внутри звезды, а так- же ее радиус R, который определяется как расстояние, на котором плотность р спадает до нуля. (Из самых общих соображений следует ожидать, что плотность должна падать с ростом расстояния от цент- ра.) Общая масса звезды тогда определяется как М = m(R). Так как обе величины R и М зависят от р , изменяя этот параметр, можно изу- чать структуру звезд разной массы. II.2. Уравнение состояния Теперь мы должны определить уравнение состояния для вещества белого карлика. Как отмечалось выше, мы будем полагать, что оно состоит из больших ядер и электронов. Ядра дают определяющий вклад в массу, но чрезвычайно слабо влияют на давление, так как почти все они движут- ся очень медленно. Вклад электронов в массу, напротив, близок к ну- лю, но почти полностью определяет давление. Нас интересуют уровни,
Обыкновенные дифференциальные уравнения 61 значительно большие, чем те, которые имеет обычное вещество. При высоких плотностях электроны уже не связаны с отдельными ядрами, а большей частью свободно движутся по всему объему вещества. Хорошей моделью в этом случае будет свободный электронный ферми-газ при ну- левой температуре, рассматриваемый в рамках релятивистской кинема- тики. При заданной массовой плотности вещества р плотность числа час- тиц в нем равна Р п = Г — , (II.6) е М v 7 Р где М —масса протона (мы пренебрегаем небольшой разницей между массами протона и нейтрона), a Y —среднее число электронов, прихо- £ чв дящихся на одно ядро. Если в звезде присутствуют только ядра Fe, то Y = 26/56 = 0,464, е ’ в то время как для 12С эта величина равна 1/2. Общая электрическая нейтральность вещества требует наличия одного электрона для каждого протона. Изучая свободный ферми-газ, обычно рассматривают большой объем V, содержащий М электронов. Эти электроны занимают самые нижние по энергии состояния, имеющие характер плоских волн с импульсом р < Pf. Вспомнив, что для каждой плоской волны имеется двукратное вырождение по спину, получим Pf И3п Г а Р N = 2V Г ------« , (II.7) J (2п)3 о что приводит к pf = (Зя2/!)173, (II.8) где п = N/V. (Мы полагаем h = с = 1, если явно не указано об отмене этого условия.) Плотность полной энергии электронов равна что после интегрирования дает = м0/иех3е(х); (II. 10а)
62 Глава 2 е(х) = [х(1 + 2?)(1 + х2),/2 - 1ойх + (1 + х2)1/2]]. где п пЪ 1/3 3 т „ _ е ° ’ Зп2 ' (П.Юб) (П.Юв) Переменная х определена как плотность электронов в единицах п0 = 5,89-1029 см’3. Это то значение плотности, при котором величина импульса Ферми становится равной массе электрона те. pf Обычно в термодинамике давление определяется как производная энергии по объему при постоянном ЛГ: = _ ЗЕ дх dV дх dV * (П.11) Используя (П.Юв), находим х dV 3V и, продифференцировав (II. 10а), (П.Юб), получаем в результате Р = -ппт х4е', 3 0 е (П.12) где е'= de/dx. Отсюда прямо вычисляется dP/dp. Так как выражать через х, необходимо определить связь го сделать, использовав (П.Юв) и (II.6): el1/3 ₽о] ’ Р наиболее естественно хер. Это легче все- п],/3 1"о. К 1 О pn = = ojo-io5^ г-см-3 ^0 у е е (II.13а) (11.136) х Таким образом, pQ определяется как значение массовой плотности ве щества, при котором плотность электронов в нем равна nQ. Дифферен- цируя давление и используя (II. 12) и (II. 13а), после некоторых пре- образований получаем
Обыкновенные дифференциальные уравнения 63 dP = dP dx = Y dp dx dp * т 17 м р е = ~2 ~<ж4е') = 9х2 dx х2 3(1 + х2)1/2 (11.14) П.З. Обезразмеривание уравнений Часто бывает полезно привести уравнения, описывающие физическую си- стему, к безразмерному виду. Причем это полезно как для выявления физической сути явления, так и для удобства численных расчетов (тем самым из вычислений исключаются очень большие и очень малые числа). Чтобы сделать это для уравнений, описывающих структуру белых карли- ков, введем безразмерные переменные для радиуса, плотности и массы: г = RQr, р = рор, т = MQm, (11.15) где для удобства в качестве масштабов длины и массы взяты /?0 и Сделав подстановки в (II.4) и (II.5) и использовав (11.14), после некоторой перегруппировки d~in членов получим 47rRopo = I Л40 J г2 р; (II.16а) Если жители в dp d7 теперь выбрать GMQ /?ЛУ ( т /М ) 0 е' е p'J /?0 и A4Q так, т р К г2 (11.166) чтобы в обоих уравнениях мно- скобках стали равными единице, то получим Y (т /М )“|1/2 ev е р' . 4irGp0 = 7,72-Ю8 У см, е (II.17а) Мо = 4тг/?Зр0 = 5,67-Ю33 У2 г, (11.176) d г а безразмерные уравнения запишутся в виде Р _ тр г цг (II.18а)
64 Глава 2 dm d~ г2 р. (11.186) Эти уравнения дополняются соотношением (11.14) для у, вычисляемым при х = р 1/3. Сопоставляя характерные величины (11.136) и (11.17), можно оп- ределить, как соотносятся между собой внутренние структуры звезд с разными значениями У , и тем самым сократить объем необходимых вы- числений. Например, если найдено решение для Ye = 1 при некотором значении рс = Р/Ро> то из него получаются решения для любого дру- гого значения У простым изменением масштаба уже найденного решения ® i 2 для плотности в Y~e раз, радиуса в У^ и массы в Y е раз. Чтобы более конкретно почувствовать масштабы (11.17), напомним, что радиус и масса Солнца равны Rq = 6,95-10ю см, MQ = 1,98-1033 г, а плотность в его центре равна примерно 150 г/см3. Поэтому следует ожидать, что массы белых карликов должны быть сравнимы с солнечной, но размеры их будут значительно меньше, а плотности намного больше солнечных. 11.4. Решение уравнений Только теперь мы довели поставленную задачу до состояния, когда можно решать уравнения и определять характеристики белых карликов. Это можно делать, выполняя работу, например, в следующем порядке. Шаг 1. Проверьте шаг за шагом все выкладки, сделанные выше. Опреде- лите поведение е и у в двух предельных случаях (нерелятивистском, х « 1, и релятивистском, х » 1). Проверьте, совпадают ли результаты с тем, что можно было ожидать из простых соображений. Анализируя уравнения (П.18а), (11.186) для случая ограниченных т и г и малого р, покажите, что р достигает нуля при конечном радиусе. Это означа- ет, что звезда имеет четко определенную поверхность. Найдите вид функциональной зависимости для плотности р вблизи поверхности. Шаг 2. Напишите программу для интегрирования системы (11.18) по 7 в направлении от центра для случая У = 1. Рассчитайте профили плот- ности, полные массу и радиус звезды для ряда значений безразмерной плотности в центре рс из диапазона от 10-1 до 10б. Меняя величину
Обыкновенные дифференциальные уравнения 65 шага по радиусу и алгоритм интегрирования уравнений, убедитесь в том, что полученные решения достаточно точны. Покажите, что полная энергия электронов (сумма кинетической энергии и массы покоя) равна R и = i [у]4лг2^ о где E/V — плотность энергии, задаваемая (П.10). Показать также, что полная гравитационная энергия звезды может быть записана как Г Gm(r) , W = - J ------- p(r)4itr2dr. О Используя масштабы величин, приведенные выше, запишите эти интегра- лы в безразмерном виде и вычислите значения этих энергий для посчи- танных ранее решений системы (11.18). Попробуйте объяснить характер полученных зависимостей на основе простых физических соображений. Шаг 3. Обычно при описании структуры звезд используют уравнения со- стояния политропного типа: где ?0, р0 и Г являются константами (последняя называется показате- лем политропы). Нормируя подходящим образом уравнения (П.4), (II. 5), покажите, что звезда с политропным уравнением состояния _р_1 зГ_3 описывается уравнениями (II.18) с # = р = х Вырожденному электронному газу в релятивистском пределе (высокая плотность) со- ответствует Г = 4/3, а ’в крайнем нерелятивистском пределе (низкая плотность)—Г = 5/3. Выбор политропного уравнения состояния дает простой способ изу- чения влияния вида уравнения состояния на результаты (изменяя вели- чину Г). Кроме того, в этом случае есть возможность для двух специ- альных значений Г получить аналитические решения и сравнить с ними численные результаты. Для этой цели наиболее удобно переписать си- стему (II. 18) как одно дифференциальное уравнение - второго порядка для р, решив (II. 18а) относительно т, продифференцировав его по г и использовав далее (II. 186). Покажите, что полученное в результате уравнение имеет вид ~ [V-’ 5 . -р г dr 1 drJ b— 1650
66 Г лава 2 (уравнение Лане —Эмдена [Ch57]), а также что при Г = 2 оно имеет решение р = рс( sinr/r ) , а при Г = 6/5 решением является —2 р = р[1 ' Г5/2; а = 5,/2р ”2/5. За2-1 Используйте эти аналитические решения для проверки программ, напи- санных вами на шаге 2. После этого исследуйте структуры звезд с разными значениями показателя политропы Г и поясните полученные ре- зультаты. Шаг 4. Если все работает правильно, то вы обнаружите, что по мере роста плотности в центре белого карлика его масса стремится к неко- торому предельному значению (называемому массой Чандрасекара, MCh), а размер звезды становится очень малым. Чтобы это понять и получить оценку для MCh, мы можем повторить ход рассуждений, впервые исполь- зованный Ландау в 1932 г. Полная энергия звезды складывается из гравитационной энергии (W < 0) и внутренней энергии ее вещества (U > 0). Предположим, что звезда с заданной полной массой имеет одинаковую плотность по всему объему. (Это не совсем хорошее пред- положение, если целью является поиск количественных закономернос- тей. Но для общего понимания ситуации оно вполне подходит.) При по- стоянной плотности радиус звезды связан с величиной плотности прос- тым соотношением. Рассчитайте U и W для такого профиля плотности, полагая, что ее значение достаточно велико, чтобы электроны можно было считать релятивистскими. Покажите, что обе энергии масштабиру- ются зависимостью 1/7? и что W становится больше U после превышения общей массы звезды некоторой критической величины. После этого зве- зде становится энергетически выгодным коллапсировать (т.е. ее ради- ус будет уменьшаться до нуля). Оцените этим способом массу Чандра- секара и сравните ее с результатом ваших численных расчетов. Про- верьте корректность этого аргумента, показав также, что U и W, най- денные вами на шаге 2, по мере приближения к предельной массе сбли- жаются, оставаясь противоположными по знаку. Шаг 5. Запишите найденную вами на этапе 1 связь между массой и ра- диусом для звезд, состоящих из ядер 56Fe и 12С. Для трех белых кар- ликов (Сириус Б, 40 Эйри Б и Штейн 2051) из наблюдений известны массы и радиусы (в единицах солнечных массы и радиуса). Они соот-
Обыкновенные дифференциальные уравнения 67 ветственно равны (1,053 + 0,028, 0,0074 + 0,0006), (0,48 + 0,02, 0,0124 + 0,0005) и (0,50 + 0,05 или 0,72 + 0,08, 0,0115 + 0,0012) [Sh83]. Убедитесь, что эти значения согласуются с полученной нами моделью. Что можно сказать о составе вещества этих звезд? 5
3. КРАЕВЫЕ ЗАДАЧИ И ЗАДАЧИ НА СОБСТВЕННЫЕ ЗНАЧЕНИЯ Множество важных дифференциальных уравнений, получаемых в - физике, сводится к линейному уравнению второго порядка: d^ у + k\x)y = S(x), (3.1) dx где S —член, определяющий неоднородность системы (ее «подталкива- ние»), а Л2— некоторая действительная функция. В случаях, когда Л2 положительно, решения однородного уравнения (S = 0) имеют колеба- тельный характер. Осцилляции описываются локальным волновым числом k. Если же Л2 отрицательно, то решения уравнения экспоненциально растут или затухают с ростом х с локальной скоростью (-k ) . Для примера рассмотрим задачу об определении электростатического потен- циала Ф(х), создаваемого некоторым локализованным распределением заряда р(г). Задаче соответствует уравнение Пуассона ?2Ф = -4пр, (3.2) которое в частном случае сферически-симметричных р и Ф сводится к более простому уравнению 1 d г 2 d<K -2 — к тч = "47гр- <3-3) г drk drJ Стандартная подстановка Ф(г) = г’’(Р(г) дает в результате б/2ф — = -4пгр, (3.4) dr что по форме совпадает с (3.1) при Л2 = 0 и S = -4пгр. Еще один пример относится к волновой функции частицы с массой т и энергией £, движущейся в центральном потенциале V(r). Ее можно записать в
Краевые задачи и задачи на собственные значения 69 виде Ф(г) = r-xR(r)YLf/r), где LM являются угловыми сферическими гармониками, а радиальная волновая функция R удовлетворяет уравнению 2 + ^)R = 0; *2(г) = Jy [£ - +21)h2 - V(r)l. (3.5) dr* h L 2mr -« Его форма также совпадает с (3.1) при S = 0. Уравнения, приведенные выше, ничем особым не примечательны и легко решаются методами, обсуждавшимися в гл.2. Исключения могут быть связаны с двумя особенностями. Во-первых, часто граничные ус- ловия, определяемые физикой задачи, налагаются' в виде ограничений для зависимой переменной не при одном значении независимой перемен- ной, а в двух различных точках. Возможность решения такой задачи как задачи Коши вовсе не очевидна. Во-вторых, уравнение Шрёдингера (3.5) дает пример уравнения, включающего в себя собственное значе- ние. В этом случае дополнительно требуется найти такие значения энергии Е, которым будут соответствовать физически приемлемые реше- ния, удовлетворяющие поставленным граничным условиям. Эта глава бу- дет посвящена методам решения задач такого рода. Вначале мы получим алгоритм, специально приспособленный для решения уравнений вида (3.1), а потом последовательно рассмотрим краевые задачи и задачи на собственные значения. 3.1. АЛГОРИТМ НУМЕРОВА Для интегрирования дифференциальных уравнений второго порядка, име- ющих вид (3.1), есть особенно простой и эффективный метод. Чтобы получить схему этого метода, обычно называемого методом Нумерова или методом Коулинга, сначала аппроксимируем вторую производную в (3.1) 3-точечной разностной формулой (1.7): Уп+1 - 2Jn + Уп-1 = у„ + а! у»п» + O(h\ (3.6) h 12 Здесь мы записали в явной форме член, соответствующий погрешности аппроксимации. Эту форму легко получить, исходя из разложений в ряд Тейлора (1.1), (1.2а). Из исходного уравнения имеем
70 Глава 3 d 2 , * » - 2 * » л + (k У п-1 у"" = —j ( -k2у + S) =----------------------5---2--------— + dx2 х=хп Л2 S 1 — 2 S + S 1 п + ------— + 0(Л2). (3.7) h Подставив это выражение в (3.6), после некоторой перегруппировки членов получим [1 + — - 2(1 - — *211/ + [1 + k2 .li/ = t |2 n+ljyn+l [ |2 nj^n [ |2 n-ljyn-l = £ <5n+1 + 105n + Sn-1) + (3-8) Разрешив это уравнение относительно уп^ или Уп_у получим рекур- рентные формулы для интегрирования соответственно вперед или назад по х с локальной погрешностью порядка О(Л6). Отметим, что это на порядок выше, чем точность метода Рунге —Кутты четвертого порядка, которым можно воспользоваться для интегрирования эквивалентной сис- темы двух уравнений первого порядка. Этот алгоритм более эффективен 9 также из-за того, что k и S нужно вычислять лишь в узлах сетки. | Упражнение 3.1. Используйте алгоритм Нумерова для решения задачи d2y —5-^-47Г, у(0) = 1, /(0) = 0. dx Проинтегрируйте уравнение от х - и до х = 1 несколько раз с различ- ной длиной шага и сравните точность и эффективность предложенного метода с некоторыми другими методами, обсуждавшимися в гл.2. Обра- тите внимание, что вам придется воспользоваться некоторой специаль- ной процедурой (например, разложением в ряд Тейлора), чтобы опреде- лить значение = y(h), необходимое для запуска трехчленной рекур- рентной формулы на первом шаге. 3.2. ПРЯМОЕ ИНТЕГРИРОВАНИЕ КРАЕВЫХ ЗАДАЧ Как конкретный пример краевой задачи рассмотрим решение уравнения Пуассона (3.4) со следующим распределением заряда: р(г) = -1 ё~г. (3.9) 8п Ему соответствует общий заряд системы
Краевые задачи и задачи на собственные значения 71 00 Q = J p(r)d3r = J p(r)4nr2dr = 1. 0 Точным решением поставленой задачи является ф(г) = 1 - 1/2(г + 2)е"г, (3.10) откуда сразу находится Ф(г) = г“\р. Как и следовало ожидать, при больших г в этом решении р —» 1, что соответствует Ф —» г-1, т.е. кулоновскому потенциалу единичного заряда. Попробуем вначале решить этот пример как задачу Коши. Так как р не имеет особенностей в начале координат (т.е. это не точечный за- ряд), то Ф имеет в этой точке регулярное поведение. А значит, <р = = гФ стремится к нулю при г —> 0. Именно этому случаю соответствует явное решение (3.10). Мы будем интегрировать (3.4) вдоль г от нача- ла координат. Сделав нужную подстановку в (3.8) и учтя, что здесь 9 k = 0, получим р . = 2р - р . + — (S , + 10S - S J, (3.11) rn+l П Kn-1 |2 ' м+1 п n-v v ' S = -4nrp = - (l/2)re~r. Чтобы запустить эту схему, кроме значения pQ = 0 нам необходимо знать р1 (или, что эквивалентно, d<p/dr = Ф при г = 0). Это не сов- сем благоприятная ситуация, так как <р^ является одним из искомых значений функции, и поэтому оно не может быть известно заранее. Как такая проблема решается в общем случае, мы рассмотрим далее. В дан- ной же задаче, имея ее аналитическое решение, мы можем просто уз- нать значение р1 = <р(г = h) из (3.10). Следующая ниже программа ин- тегрирует уравнение по г до значения г = 20, заносит решение в мас- сив и выводит на печать точные значения (по (3.10)) и отклонения от них численного решения. 5 DIM РНЦ200) 'массив для запоминания решения 10 DEF FNS( R)=-„ 5*R*EXP(-R) 'функциональная зависимость для S 15 H=.1 'величина шага по радиусу 20 N%=20/H 'число узлов сетки до г=20 25 CON=FT2/12 'параметр в методе Нумерова 30 SM=0: SZ=FNS(H) 'S в первых двух узлах 35 PHI(O)=O 'граничное условие при г=0 40 PHI(1)=1-.5*(H+2)*EXP(-H) 'точное значение в 1-м узле 45' 50 FOR J%=1 TO N%-1 'цикл интегрирования по г
72 Глава 3 55 R=(J%+1)*H: SP=FNS(R) 'значения радиуса и S в следующем узле 60 'схема Нумерова (3.11) 65 PHI( J%+1)=2*PHI( J%)-PHI( J%-1)+CON*( SP+10*SZ+SM) 70 SM=SZ: SZ=SP 'переопределение S для следующего шага 75 EXACT=1-. 5*(R+2)*EXP(-R) 'расчет по формуле (3.10) 80 DIFF EXACT-PHI(J%+1) 'погрешность в данном узле 85 PRINT R,EXACT,DIFF 'вывод текущих значений 90 NEXT J% Обратите внимание, как здесь сокращается необходимое число вычисле- ний S путем переопределения его значений в текущем и соседних узлах (SZ, SM и SP). Объем вычислений снижается также за счет вычисления константы /г2/12, входящей в схему Нумерова (3.11), за пределами цикла интегрирования. Результаты расчетов, полученные с помощью этой программы, при- ведены в первых трех столбцах табл.3.1. Видно, что точность числен- ного решения выше при малых г. Однако отнюдь не все так хорошо. Величина ошибки, отнесенная к одному шагу интегрирования, растет с увеличением г (за 20 шагов от г = 0 до г = 2 приращение ошибки рав- но 3 • 10-6, а за 20 шагов от г = 18 до г = 20 оно же равно 1,2* 10-5, т.е. в 4 раза больше). Решение будет становиться все менее точным по мере интегрирования до больших значений радиуса. Такое поведение является совершеннно неожиданнным, так как ошибка в схеме Нумерова должна была бы уменьшаться при больших г из-за того, что ф стремит- ся к константе. С решением такого рода задач связаны также другие тревожные симптомы. Их можно обнаружить при решении задачи в более общем слу- чае, когда ответа в аналитическом виде нет. Такой ответ давал нам Ф вблизи начала отрезка интегрирования, значение которого нужно для начального запуска расчета по трехчленной рекуррентной формуле. Один из способов действия в этой ситуации состоит в поиске Ф(0) прямым численным интегрированием кулоновского потенциала оо Ф(0) = J p(r)<1d3r = 4njprdr, 0 например, методом Симпсона. Однако с полученным значением всегда будет связана некоторая погрешность расчета. Мы можем программно моделировать наличие такой ошибки, полагая, что она равна 5%, и до- бавляя в программу соответствующую строку:
Краевые задачи и задачи на собственные значения 43 РН1(1)=0,95*РН1(1) . Отклонение численного решения от точного в этом случае приведено в четвертом столбце табл. 3.1. Очевидно, произошла катастрофа. 5%-ное изменение начальных условий породило 50%-ную погрешность решения при больших г. Таблица 3.1. Погрешность численного решения задачи Пуассона, определенной в (3.4), (3.9) г Точное значение «’(') Аналитическое задание (Р(Л) Задание (КЛ) с 5%-ной опп Линейная коррекция 1бкой 2 0,729330 -0,000003 0,049919 -0,000016 4 0,945053 -0,000006 0,099838 -0,000011 6 0,990085 -0,000005 0,149762 -0,000007 8 0,998323 0,000001 0,199690 -0,000003 10 0,999728 0,000010 0,249622 -0,000001 12 0,999957 0,000022 0,299556 0,000002 14 0,999993 0,000036 0,349493 0,000003 16 0,999999 0,000052 0,399431 0,000000 18 1,000000 0,000065 0,449366 0,000000 20 1,000000 0,000077 0,499301 0,000000 Довольно просто понять, что же произошло. К любому частному ре- шению уравнения (3.4) можно добавить решение однородного уравне- ния —у = О dr2 и получить еще одно решение (3.4). линейно независимых решения У однородного уравнения есть два <р ~ г, Ф ~ const, <р ~ const; г 1 Ф ~ Общее решение (3.4) в области асимптотики (где р стремится к нулю, а уравнение становится однородным) можно записать как линейную ком- бинацию этих двух функций. Но только последняя из них имеет физи-
74 Г лава 3 ческий смысл, так как мы знаем, что на больших расстояниях г потен- циал спадает как Ф —> 1/г. Неточность в определении Ф в начале ко- ординат или любые ошибки округления в ходе интегрирования могут «подмешивать» в численное решение некоторую малую долю решения в виде (р ~ г, которая при больших г неизбежно становится доминирую- щей. Есть простое средство преодоления описанной трудности: вычесть из найденного численного решения вклад «плохого» нефизического ре- шения однородного уравнения. Это гарантирует физически правильное поведение потенциала в асимптотической области. Легко видеть, что «плохой» результат, приведенный в четвертой колонке табл.3.1, изме- няется линейно с ростом г в области больших значений г. Следующие строки программного кода соответствуют приведению найденного реше- ния на десяти последних узлах сетки к виду (р = mr + b и последующему вычитанию члена тг из первоначального решения с целью гарантировать надлежащее его поведение в области больших г. 95 М=( PHI( N%)-PHI( N%-10))/( 10*Н) 100 B=PHI( N%)-M*N%*H 105 FOR J%=1 ТО N% 110 R=J%*H 115 PHI( J%)=PHI( J%)-M*R 120 NEXT J% Погрешность решения, исправленного таким образом, приведена в по- следнем столбце табл.3.1. При больших г она стала даже меньшей по сравнению с некорректированным решением, использующим точное значе- ние РН1(1) на первом шаге интегрирования. В этом простом примере неустойчивость не имела слишком серьез- ного характера. Использование точного значения РН1(1) (или его при- ближения с некоторой умеренной погрешностью) дало удовлетворитель- ный результат для не очень больших значений г при интегрировании от центра. Возможен также другой вариант —интегрировать по направлению к центру, начиная с больших г и полагая там <р = Q независимо от г. В таком случае результатом будет решение, которое часто достаточно точно удовлетворяет граничному условию в центре. К тому же при этом нет необходимости численного интегрирования на первом шаге для оп- ределения приближенного значения РН1(1).
Краевые задачи и задачи на собственные значения 75 | Упражнение 3.2. Решите задачу, определенную соотношениями (3.4), (3.9), интегрируя методом Нумерова в направлении от больших г к центру и используя известный характер асимтотического поведения <р для расчета необходимых начальных значений. Насколько хорошо удов- летворяет полученное таким способом решение граничному условию <р(г - 0) = 0? 3.3. РЕШЕНИЕ КРАЕВЫХ ЗАДАЧ МЕТОДОМ ФУНКЦИЙ ГРИНА В случаях, когда два решения однородного уравнения сильно различа- ются, необходимо предпринимать некоторые дополнительные меры предо- сторожности. Например, для описания потенциала от распределения за- рядов с мультипольностью порядка / > 0 полученное ранее уравнение (3.4) следует изменить следующим образом: - <2 л — - /(Z2+ <Р = -4пгр. dr2 Г (3.12) Оно имеет два однородных решения: <р ~ гМ\ <р ~ г~1. При больших г первое из этих решений во много раз больше второго. Поэтому процедура восстановления правильного асимптотического пове- дения решения путем вычитания доминирующего однородного решения из частного решения, найденного интегрированием от центра, внесет в полученный результат большие ошибки округления. Смена направления интегрирования к центру не решает проблемы, так как в этом случае при малых г аналогично начинает доминировать решение г~\ физически бессмысленное. Одним из возможных путей вычисления достаточно точного решения является комбинирование этих двух методов. Интегрирование к центру можно использовать, чтобы получить потенциал в области, где г боль- ше некоторого промежуточного значения г . А интегрированием от цен- тра ищется потенциал при г < г^. Поскольку значение выбиралось из условия близости однородных решений в этой точке, то потенциалы, полученные интегрированием вовне и внутрь при г = rm будут «сшива- ться» и в совокупности описывать решение во всей области. Конечно, если внутренняя и внешняя ветви потенциала будут сильно несогласо- ванными, во внутренней области потенциал всегда можно дополнить
76 Глава 3 членом, кратным однородному решению, чтобы скорректировать любую разницу с известным значением <р'(г = 0). Иногда два однородных решения имеют столь различное поведение, что просто невозможно подобрать промежуточное значение г , которое позволило бы удовлетворительно проинтегрировать уравнение во внут- ренней и внешней областях. В таких случаях решение можно найти, ис- пользуя функции Грина однородного уравнения. Чтобы проиллюстриро- вать этот метод, давайте рассмотрим уравнение (3.1) с граничными условиями р(х = 0) = р(х = со) = 0. Так как задача линейна, мы можем записать решение как 00 ф(х) = J G(xtx' )S(x' )dx', (3.13) 0 где G —функция Грина, удовлетворяющая уравнению d2 dx2 + k?(x) G(x,x') = 5(x,xz). (3.14) Ясно, что функция Грина удовлетворяет однородному уравнению при х * х7. Однако производная dG/dx имеет разрыв при х = х7, в чем можно убедиться, проинтегрировав (3.14) от х = х* - € до х = = х' + е, где е—бесконечно малая величина: dG dx / х=х +е dG dx (3.15) Проблема, конечно, заключается в том, чтобы найти G. Это можно сделать, рассматривая два решения однородного уравнения, <р и <р, соответственно удовлетворяющих граничным условиям при х = 0 и х = со и отнормированных так, что их вронскиан dtp dtp W = — <р--------> (3.16) dx < dx * равен единице. (Используя однородное уравнение, легко показать, что величина W не зависит от х.) Тогда функция Грина будет определена как G(x,x7) = ^(xj^xj, (3.17) где х и х обозначают меньшую и большую из двух величин х и х7. Очевидно, что это выражение для G удовлетворяет однородному уравне- нию и условию на разрыве (3.15). Из этого условия мы получим реше-
Краевые задачи и задачи на собственные значения 77 ние в явной форме: х со ф(х) = tp>(x)^tp<(x')S(x')d.x' + <р(х) jp^x' )S(x' )dx'. (3.18) 0 x Эта функциональная зависимость может быть вычислена численным инте- грированием и результат не будет подвержен ни одной из неустойчи- востей, связанных с прямым интегрированием неоднородного уравнения. Для произвольных значений k однородные решения ф и ф можно найти, решая численно задачу Коши соответственно в направлении от центра и к центру и нормируя полученные зависимости так, чтобы они удовлетворяли (3.16). Однако для некоторых простых функций k2(x) аналитический вид этих решений известен. К примеру, для задачи, оп- ределенной (3.12), легко показать, что ф (г) = r'+1; <₽ (г) = - 1 Г1 ‘ > 21 + 1 представляют одну из возможных пар однородных решений, удовлетворя- ющих как граничным условиям, так и (3.16). | Упражнение 3.3. Решить задачу, определенную в (3.9), (3.12) для случая / = 0, используя метод функций Грина. Сравните ваш результат с решением, полученным ранее прямым интегрированием, и с аналити- ческим решением. | Упражнение 3.4. Поиск сферически-симметричного решения уравнения (V2 - а2)Ф = -4тгр приводит к обыкновенному дифференциальному уравнению d2 jir2 9 а <р = -4пгр с граничными условиями <р(г = 0) = ф(г —» со) = 0. Здесь а —кон- станта. Напишите программу для решения такой задачи методом функций Грина в случае, когда р задается соотношением (3.9). Численные ре- зультаты, найденные для различных значений а, сравните с аналити- ческим решением ф = 1_ _ e~r [1 + 1 (1 _ a2)r]J
78 Глава 3 Что произойдет, если вы попытаетесь решать эту задачу путем инте- грирования только в направлении к центру или от центра? Что случит- ся при попытке интегрировать к центру до некоторого промежуточного радиуса сшивки и от центра, начиная с этого же радиуса? Как изменя- ются результаты расчета, если вы меняете величину радиуса, на кото- ром решения сшиваются? 3.4. СОБСТВЕННЫЕ ЗНАЧЕНИЯ ВОЛНОВОГО УРАВНЕНИЯ Задачи на собственные значения дифференциальных уравнений часто возникают при поиске решений волновых уравнений, соответствующих нормальным колебательным модам (т.е. поперечным колебаниям). В ка- честве простого примера, иллюстрирующего метод решения задач такого рода, рассмотрим поперечные колебания натянутой струны с однородной плотностью. После соответствующего масштабирования физических вели- чин уравнение и граничные условия, описывающие такие колебательные моды, имеют вид d2<p 2 = k2<p, <р(х = 0) = <р(х = 1) = 0. (3.19) dx Здесь 0 < х < 1—безразмерная координата вдоль струны, ^ — попереч- ное смещение струны, a k — волновое число, линейно зависящее от частоты колебаний. Это уравнение является уравнением с собственным значением в том смысле, что решения, удовлетворяющие граничным ус- ловиям k, существуют лишь для некоторых отдельных значений {k }, которые следует найти. Поскольку уравнение линейно и однородно, нормировка собственной функции соответствующей любому kn, не является однозначно определенной, но может выбираться из соображе- ний удобства. Собственные значения и собственные функции (ненормированные) для сформулированной выше задачи имеют хорошо известный аналитичес- кий вид kn - пи\ <рп ~ sin иях, (3.20) где и— положительные целые числа. Эти решения послужат полезной проверкой для численных методов решения поставленной задачи. Одной из допустимых общих стратегий численного решения задач на собственные значения является метод последовательных итераций. При этом выбирается некоторый пробный вариант собственного значения и
Краевые задачи и задачи на собственные значения 79 рассчитывается решение дифференциального уравнения путем интегриро- вания его как задачи Коши. Если полученное решение не удовлетворяет граничным условиям, мы изменяем собственное значение и интегрируем вновь, повторяя процесс до тех пор, пока не будет найдена такая ве- личина собственного значения, при которой граничные условия будут удовлетворены в пределах заранее установленной погрешности. На примере рассматриваемой задачи эта стратегия (образно назы- ваемая методом «пристрелки») может быть реализована следующим обра- зом. Для каждого пробного значения k мы будем интегрировать уравне- ние вперед от х = 0 при начальных условиях <р(х = 0) = 0, <р'(х = 0)= = 5. Число 5 здесь является произвольным и может выбираться из со- ображений удобства, поскольку решаемое уравнение однородно, а ха- рактер нормировки решения не оговаривается. Выполнив интегрирование до х = 1, мы найдем в общем случае значение ф, не равное нулю, так как пробное собственное значение отлично от истинного его значения. Затем мы должны откорректировать k и интегрировать уравнение вновь, повторяя этот процесс, пока не будет найдено, что ф(х = 1) = 0 в пределах установленной точности. В результате мы получим искомое собственное значение и соответствующую ему собственную функцию по- ставленной задачи. Задача поиска значения /г, при котором ф(1) = 0, является типич- ной задачей определения корня функции, обсуждавшейся в гл.1. Отме- тим, что метод Ньютона —Рафсона здесь неприменим, потому что мы не можем явно дифференцировать рассчитываемую численно зависимость д?(1) от k. Использование метода секущих также таит в себе опас- ность, так как у задачи много собственных значений и бывает трудно проверить, что итерации в конце концов сошлись к правильному значе- нию. Поэтому надежнее всего использовать простой шаговый поиск для локализации приближенного значения k, а потом, если нужно, перейти к более эффективному методу секущих. Следующая программа с помощью изложенного выше метода пристрел- ки находит наименьшее собственное значение для задачи о натянутой струне (3.19), выдавая по ходу расчета ряд последовательных его приближений. Поиск (строки 140—190) обрывается после того, как собственное значение будет определено с точностью не менее 10-5. Начальные величины шага поиска и самого собственного значения зада- ются в строке 120. 100 N%=100:H=1/N% 'определение параметров сетки 110 TOLK=9.999999Е-06 'допустимая погрешность для к
80 Глава 3 120 К=1: DK=1 'начальные значения для запуска поиска 130 GOSUB 1000: PHIOLD=PHIP 'расчет PHIP для первого пробного 131 ' значения к 140 WHILE ABS(DK)>TOLK 'цикл шагового поиска нуля PHIP 150 K=K+DK 'делается очередной шаг по к 160 GOSUB 1000 'расчет PHIP для нового к 170 IF PHIP*PHIOLD>0 GOTO 190 'если PHIP изменило знак, то 171 'вернуться на шаг назад и 180 K=K-DK: DK=DK/2 ' уменьшить величину шага в 2 раза 190 WEND 200 PRINT USING "Собст. знач. =###.#####"; К 'печать итога расчета к 210 END 1000 'подпрограмма расчета phi( х=1)=РН1Р для заданного значения к 1010 PRINT К 'печать текущего значения к 1020 РН1М=0: PHIZ=.01 'начальные условия 1030 CON=(К*Н)~2/12 'константа в методе Нумерова 1040 FOR l%=1 ТО N%-1 ' цикл интегрирования вперед до х=1 1050 PHIP=2*( 1-5*CON)*PHIZ-( 1+CON)*PHIM 'схема Нумерова, см.(3.8) 1060 PHIP=PHIP/{ 1+CON) 1070 PHIM=PHIZ: PHIZ=PHIP 'переопределение величин phi для 1071 ' следующего шага цикла 1080 NEXT 1% 1090 RETURN Когда эта программа работает, выдается ряд приближений собственного значения, которые сходятся к точному значению, равному п. Ошибка связана с конечным шагом интегрирования, и предельное ее значение задается величиной TOLK. | Упражнение 3.5. Используйте приведенную выше программу для расче- та других более высоких собственных значений данной задачи. Обрати- те внимание, что с ростом собственных значений числовые ошибки ста- новятся больше и расчет все более быстро осциллирующих собственных функций становится все менее точным. Замените шаговый алгоритм по- иска корня на более эффективный метод секущих. Насколько близким должно быть начальное приближение собственного значения, чтобы про- цесс сходился именно к этому значению? Внесите изменения в текст программы, соответствующие другим граничным условиям: = 0) = 0, ф(х = 1) = 0,
Краевые задачи и задачи на собственные значения 8J и убедитесь, что рассчитанные собственные значения согласуются с их аналитическими значениями. | Упражнение 3.6. Решение волновых уравнений в областях с цилиндри- ческой геометрией часто сводится к следующей задаче на собственные значения: IdL dr2 1 ф(г) = _Л2ф. г dr} .2, Ф(г = 0) = 1, Ф(г = 1) = 0. Эта задача решается аналитически. Собственными функциями здесь яв- ляются цилиндрические функции Бесселя нулевого порядка, а собствен- ными значениями задачи будут нули этих функций: = 2,404826, = 5,520078, k3 = 8,653728, k4 = 11,791534, • Покажите, что подстановка Ф = r~V2<p приводит это уравнение к виду, с которым можно использовать метод Нумерова. Внесите изменения в текст приведенной выше программы и решите данную задачу. Сравните результаты численного расчета с точными собственными значениями. 3.5. СТАЦИОНАРНЫЕ РЕШЕНИЯ ОДНОМЕРНОГО УРАВНЕНИЯ ШРЁДИНГЕРА Поиск стационарных квантовых состояний частицы массой т, движущейся в одномерном потенциальном поле V(x)t дает отличный пример примене- ния метода пристрелки в задачах на собственные значения. Будем по- лагать, что форма потенциала V(x) в целом характеризуется рис.3.1: в точках х . их потенциал становится бесконечно большим (т.е. в этих местах расположены «стенки»), а между ними находится яма ко- нечной глубины. Стационарные состояния частицы определяются не за- висящим от времени уравнением Шрёдингера и следующими граничными условиями [Ме68]: d2$ 2 + й2(х)0(х) = 0; М>(Хт.п) = 0(xmJ = 0. (3.21) Это уравнение по форме совпадает с (3.1), а k2(x) = ^[Е - У(х)]. h 6—1650
82 Глава 3 Мы должны найти спектр значений энергии Е (собственные значения задачи), для которых имеются решения, отличные от нуля. Следует ожидать, что собственному значению этой задачи будет соответство- вать собственная функция, осциллирующая в классически разрешенной для движения области, где Е > V(x), и экспоненциально затухающая в запрещенных областях, где Е < V(x). Таким образом, в задаче при Е < < 0 будут дискретные решения («связанные» состояния), локализован- ные в потенциальной яме и экспоненциально затухающие к стенкам, и «континуум» решений в области Е > 0, имеющих примерно постоянное значение во всем промежутке между стенками. Задача на собственные значения (3.21) может быть решена методом пристрелки. Допустим, что мы ищем одно из связанных состояний, и поэтому в качестве пробного берем отрицательное собственное значе- ние. По ходу интегрирования от xmin в сторону больших значений х мы вначале вычислим решение 0 , экспоненциально нарастающее в пределах запрещенной классикой области. После перевала через точку поворота, ограничивающую слева разрешенную классически область движения, ре- шение становится осциллирующим (см. нижнюю часть рис.3.1). Если бы мы продолжили интегрирование далее за правую точку поворота, то процесс стал бы численно неустойчивым. Это объясняется тем, что да- же при точном выборе—Собственного значения, которому соответствует 0< ^Хтах) ~ 0’ Решение в этой области всегда может содержать неко- Рис.3.1. Вверху: схематический вид потенциала V(x), используемого при обсуждении одномерного уравнения Шрёдингера. Внизу: решения 0 и 0 уравнения Шрёдингера для некоторого произвольного значения энергии Е < 0. Левая точка поворота бралась в качестве точки сшивки этих двух решений. Если Е является собственным значением задачи, то производная в точке сшивки будет неразрывной.
Краевые задачи и задачи на собственные значения 83 торую примесь нефизического экспоненциально растущего решения. Мож- но сформулировать даже некоторое общее правило, что интегрирование по направлению вовнутрь области, запрещенной классикой, будет не- точным. И поэтому будет более разумно для каждого значения энергии рассчитывать еще одно решение 0 , интегрируя уравнение от *та в сторону уменьшения х. Чтобы понять, является ли выбранное значение энергии собственным значением задачи, нужно сравнить 0 и ф в ка- кой-либо промежуточной точке (х^) «сшивки» этих решений, выбранной так, чтобы обе процедуры интегрирования для ф и ф были в ней ус- тойчивы. (В качестве х обычно выбирают левую точку поворота.) Так как ф и ф удовлетворяют однородному уравнению, их всегда можно отнормировать таким образом, что они будут равны.при х = х . В этом случае на правильный выбор величины собственного значения будет указывать равенство производных в точке х , т.е. гладкая сшивка ре- шений ф и ф (как это было бы при аналитическом решении задачи). Таким образом, в точке сшивки дф^ dx дф> dx = 0. (3.22) Если мы аппроксимируем производные простейшими конечно-разностными выражениями (1.14), используя значения функций в точках хт и хт - h, то получим эквивалентное условие f = (*m - V - (*т - Л)] = 0. (3.23) Здесь учтено, что функции нормированы на выполнение условия ф (х ) = ф> (хт)- Величина ф в (3.23) является некоторым масштаби- рующим множителем, который можно выбирать так, чтобы f было порядка единицы. В заключение заметим, что если точек поворота нет (т.е. Е > 0 для случая, аналогичного изображенному на рис.3.1), то в ка- честве х можно брать любую точку между стенками. Для потенциалов, имеющих более двух точек поворота и соответственно три или более однородных решения, каждое из которых точно в своей области, общее решение должно сшиваться из нужного числа отдельных кусков. Программа для примера 3, текст которой приведен в приложении Б, использует описанный алгоритм для расчета на сетке из 160 узлов стационарных состояний частицы в одномерном потенциале. Предполага- ется, что он имеет вид V(x) = VQu(x), где безразмерная функция v(x) имеет минимальное значение, равное -1, и максимальное, равное +1. 6*
84 Г лава 3 (Это всегда можно сделать линейно, изменяя масштаб для энергии час- тицы.) Если в качестве единицы длины взята величина а, то уравнение Шрёдингера (3.21) можно переписать в виде Г- Ч + “ e]WX> = °- L у dx у J где безразмерный параметр Г2та2Уп],/2 у = г-кН является мерой классического поведения системы, а е = £7V0 — обезра- змеренная энергия этой системы. Все собственные значения задачи удовлетворяют условию е > -1. В программе можно выбрать один из трех конкретных видов аналитической зависимости для v(x): прямо- угольная яма, параболическая яма или потенциал Ленард-Джонса. Каж- дую из них потом можно модифицировать, двигая клавишами курсор по графику функциональной зависимости v(x). После того как введены у, начальное приближенное значение энергии е и начальная величина шага DE по шкале энергии, программа проводит расчет ряда стационарных состояний системы. Для каждого из них простым поиском делается по- пытка найти значение энергии, которому соответствует нуль функции f, определенной формулой (3.23). После того как собственное значе- ние приблизительно определено, используется метод секущих до тех пор, пока не будет найдено значение е, для которого |/| < 5’10-5. Для каждого собственного значения уравнение Шрёдингера интегрирует- ся вперед и назад по х. Два полученных решения сшиваются в крайней левой точке поворота, где осциллирующий характер волновой функции сменяется ее экспоненциальным затуханием. (Если такой точки поворо- та нет, сшивка производится вблизи точки Хтах) По ходу поиска ре- шения на экран выводятся графики очередного приближения волновой функции (только для графических дисплеев), а также приближение для собственного значения, текущий шаг вдоль шкалы энергий, текущее значение f и число узлов (нулей) на волновой функции. Когда собст- венное значение найдено, это отмечается на графике потенциала ли- нией, соответствующей этому уровню энергии и соединяющей крайние левую и правую точки поворота. В случаях, когда имеются три и более точек поворота и точность расчета не гарантируется, пользователю на экран выдается предупреждающее об этом сообщение. Следующие упражнения помогут вам закрепить понимание физических
Краевые задачи и задачи на собственные значения 85 принципов и численных методов, использованных в этом примере. | Упражнение 3.7. Проверьте, что программа дает ожидаемые ответы для собственных значений в прямоугольной и параболической потенци- альных ямах. (Для этого удобно использовать у = 50.) Наблюдайте, как сглаживается разрыв производной в точке сшивки по мере того, как энергия приближается к собственному значению задачи. Также об- ратите внимание на увеличение числа узлов волновой функции по мере роста собственного значения, а для параболической ямы —на поведение решения вблизи точек поворота. В состояниях с большими квантовыми числами амплитуда осцилляций около точек поворота возрастает, что согласуется с ВКБ-приближением, где она обратно пропорциональна квадратному корню из классической скорости частицы (Е - У)“1/4. Для этих двух видов потенциала найдите несколько решений для малых у (скажем, у = 10) и больших (у = 200), что соответствует крайним случаям квантового и классического движения частицы. | Упражнение 3.8. Для случаев прямоугольной и параболической потен- циальных ям, когда задача может быть решена аналитически, исследуй- те влияние на результат замены интегрирования методом Нумерова ин- тегрированием простым «без фокусов» методом, получаемым заменой второй производной 3-точечной формулой (1.7), т.е. когда мы пренеб- режем членом О(А2) в формуле (3.6). | Упражнение 3.9. Измените программу таким образом, чтобы волновая функция определялась интегрированием лишь вперед при выполнении требования обращения ее в нуль в точке х . Посмотрите, какие про- блемы возникнут при попытке получить экспоненциально спадающее ре- шение в запрещенной классикой области. (Здесь разумно будет брать сравнительно малые у, чтобы неустойчивость не была слишком боль- шой. ) | Упражнение 3.10. В случаях, когда потенциал имеет зеркальную сим- метрию относительно х = 0, собственные функции системы будут четны- ми или нечетными относительно той же точки, причем четность и не- четность будут чередоваться с ростом квантового числа (энергии). Проверьте это на численных решениях, выдаваемых программой. Не мог- ли бы вы придумать способ сокращения в два раза вычислений при рас- чете собственных значений для потенциалов, обладающих зеркальной симметрией? Если можете, то измените текст программы и испытайте этот способ.
86 Глава 3 | Упражнение 3.11. Если мы рассмотрим случай, когда и(х) = 0 для х < xmin и х > Хтах (т.е. мы просто уберем <стенки>), то нулевые граничные условия на концах интервала интегрирования уже не будут пригодны для слабосвязанных состояний (е 0), потому что волновая функция будет затухать очень медленно с ростом |х|. Тогда более подходящими условиями в xmin и Хтах будут 1 (Щ. = ±у(_е)1/2 0 dx Измените программу так, чтобы она соответствовала этим условиям, и посмотрите, как это повлияет на вид волновых функций и энергии сос- тояний, лежащих вблизи нулевой энергии. Заметим, что если бы мы нормировали волновую функцию обычным образом, то вклад от этих экс- поненциальных хвостов также был бы учтен. Не сможете ли вы получить в духе алгоритма Нумерова аппроксимацию приведенных граничных усло- вий с достаточно высоким порядком точности по h (т.е. DX ) ? | Упражнение 3.12. Проверьте, что для некоторого заданного потенци- ала две волновые функции 0^. и 0^.,, соответствующие разным собствен- ным значениям Е и Е', являются ортогональными: Jt/l£(x)0£,(x)rfx = 0, как и требуют этого общие принципы квантовой механики. | Упражнение 3.13. Сравните точные собственные значения для потен- циала Ленард-Джонса при малых, средних и больших значениях у с уровнями, рассчитанными в квазиклассическом приближении программой, приведенной в примере 1. | Упражнение 3.14. Исследуйте собственные функции и собственные значения для потенциалов, с которыми вы встречались в курсе элемен- тарной квантовой механики: потенциал в виде 5-функции, прямоуголь- ная яма конечной глубины, две ямы, периодический потенциал и т.д. Объясните вид найденных волновых функций и спектров собственных значений. Используя графический ввод формы потенциала при некотором воображении, можно получить множество интересных ситуаций. (Заме- тим, что в ходе расчета иногда могут возникать неприятности при вы- числении собственных значений, близких к вырожденным.)
Краевые задачи и задачи на собственные значения 87 ПРОЕКТ Ш: СТРУКТУРА АТОМА В ПРИБЛИЖЕНИИ ХАРТРИ-ФОКА Известно, что приближение самосогласованного поля (приближение Хар- три—Фока) дает достаточно точное описание многих свойств много- электронных атомов и ионов. В его рамках каждый электрон описывает- ся отдельной одночастичной волновой функцией (отличной от много- электронной волновой функции), являющейся решением уравнения, по- добного уравнению Шрёдингера. Потенциал, входящий в это уравнение, определяется усредненным движением всех других электронов системы и поэтому зависит от вида одночастичных волновых функций. В результа- те появляется система нелинейных уравнений с собственными значения- ми, которую можно решить методами, исследованными в этой главе. В данном проекте мы будем решать уравнения самосогласованного поля, чтобы исследовать структуры основного состояния атомных систем с малым числом электронов (т.е. атомов и ионов элементов, расположен- ных в периодической таблице от водорода до неона). Полные энергии, рассчитанные таким образом, можно будет затем прямо сравнить с экс- периментальными данными. Общий обзор темы, даваемый ниже, можно до- полнить материалом из работ [Ве68], [Ме68] и [We80]. Ш.1. Общее понятие о приближении Хартри—Фока Гамильтониан системы N электронов, движущихся вокруг тяжелого ядра с зарядом Z, расположенного начале в координат, можно записать как N „2 А/ о N н = 1 -- X +1 I ,_<2т К ri 2 Jr (П1.1) Здесь {i\}—радиус-векторы электронов, m и -е — масса и заряд элек- трона, а г = г. - г, — расстояние между t-м и /-м электронами. Три суммы, входящие в (III. 1), соответствуют кинетической энергии элек- тронов, взаимодействию их с ядром и взаимному отталкиванию электро- нов. Уровень точности приближения самосогласованного поля позволяет пренебречь вкладом в гамильтониан существенно более слабых эффек- тов, таких, как спин-орбитальное взаимодействие, сверхтонкое взаи- модействие, отдача ядер, а также релятивистских эффектов. Квантовомеханическое описание системы требует, чтобы мы кроме положения каждого электрона дополнительно определили состояние его спина. Это можно сделать, задавая его проекцию на какую-либо фикси- рованную ось квантования, <г. = ±1/2. В дальнейшем для удобства мы
88 Глава 3 будем использовать обозначение х^ = (г^ о*р для ссылки на все ко- ординаты Z-го электрона (как пространственные, так и спиновую). Методы самосогласованного поля основаны на вариационном принци- пе Рэлея —Ритца, который утверждает, что основным состоянием га- мильтониана является такое, волновая функция Ф(х^ х2, • • •, х^) ко- торого минимизирует величину ожидания: Е = < Ф \Н\ Ф >. (1П.2) При этом Ф должна удовлетворять принципу Паули (т.е. быть антисим- метричной относительно перестановки любых двух х-аргументов) и быть нормированной на единицу: ||Ф|2Л = 1. (ш.з) (Запись dNх означает интегрирование по всем пространственным и сум- мирование по всем спиновым координатам N электронов.) Минимальное значение Е и является энергией основного состояния системы. Вычис- ление ожидания (Ш-2) для любых нормализованных и антисимметричных пробных волновых функций Ф обеспечивает предельную оценку сверху для энергии основного состояния. Приближение Хартри—Фока ограничивает вид пробных функций де- терминантами Слэтера: Ф(хг хт •••, xN) = (M)-1/2det 0а(х.). (HI.4) Здесь ^а(х) —набор N ортонормированных одночастичных волновых функ- ций. Каждая из них зависит от координат лишь одного из N электронов системы. Указанный детерминант является детерминантом матрицы раз- мером N х М, где индексы а и х. пробегают по всему набору из N воз- можных значений, а множитель (М!)“1/2 обеспечивает нормировку функ- ции Ф в соответствии с условием (Ш.З). Физический смысл волновой функции такого вида состоит в том, что каждый электрон системы дви- жется независимо по орбитали фа, подвергаясь лишь усредненному вли- янию всех других электронов. Это оказывается достаточно хорошим приближением к истинной волновой функции вследствие того, что плав- ное кулоновское взаимодействие между электронами усредняет многие детали их индивидуального движения. Воспользовавшись свойствами детерминантов, легко увидеть, что функция Ф обладает нужной антисимметричностью при перестановке лю- бых двух электронов (детерминант меняет знак при перестановке любых двух его столбцов). Можно также видеть, что если одночастичные вол-
Краевые задачи и задачи на собственные значения 89 новые функции фа являются ортонормированными: f = Saa'’ (Ш-5) то общая функция Ф нормирована в соответствии с условием (III.3). Поскольку в гамильтониан (III. 1) не входят спиновые переменные, пространственные степени свободы и спины оказываются развязанными между собой. Полезно будет записать одночастичную волновую функцию как произведение спиновой функции и некоторой функции, зависящей лишь от пространственных координат: 0aW = za(r)lv (Ш-в) где о*а= ±1/2— проекция спина электрона а. Из условия ортонормиро- ванности (III.5) тогда получается 5<га°а'^ г = ^аа7’ (Ш.7) так что орбитали могут быть ортогональны либо по спиновым, либо по пространственным частям своих волновых функций. Расчет энергии (III.2) для функций, определенных соотношениями (Ш.4)—(Ш.6), будет громоздким, однако не представляет особого труда. После ряда алгебраических преобразований мы получим 1 а2 -Z I a ,<aa'l 77. Io»'»- (HI.8) 2 a,a'=l a a 4 В этом выражении матричные элементы кинетической энергии отдельных электронов равны <а|^-|«> = - Г z;(r)V2Za(r)A; (Ш.9) 2m 2 m плотность электронов является суммой одночастичных плотностей р(г) = Г I*«(«•)I2; (III. 10) а=1 электростатический потенциал, создаваемый электронами системы, ра- вен Ф(г) = е2 Г-J----- р(г')<Рг', (III. 11а) J|r - г'I так что
90 Глава 3 ?2Ф = -4тге2р(г); (Ш.Иб) и, наконец, объемные матричные элементы, связанные с межэлектронным отталкиванием, равны 2 <аа'| у- |а'а> = Ч = e2JZ;(r)z;,(r') * Ха,(г)ха(г')АЛ'. (III.12) Физический смысл различных членов, входящих в (III.8), доста- точно очевиден. Кинетическая энергия системы есть просто сумма ки- нетических энергий отдельных электронов. Далее, энергии притяжения электронов к ядру и их взаимного расталкивания как раз таковы, ка- кие следовало ожидать для полного заряда, равного -Ne и «размазан- ного» по пространству с плотностью р(г). Последний член в (III.8) представляет обменную энергию, возникающую из-за антисимметрии вол- новой функции (III.4). Она равна сумме по всем парам орбиталей с одинаковыми проекциями спинов; пары с раными спиновыми проекциями являются «различимыми» и потому не дают вклада в обменный член. Считаем, что теперь общие черты метода самосогласованного поля должны быть вам ясны. Варьируемая волновая функция (III.4) зависит от набора «параметров»—значений одночастичных волновых функций в каждой точке пространства. Вариация по этим параметрам с целью ми- нимизации энергии системы (III.8) и с учетом ограничений (III.7) дает в результате систему эйлеро-лагранжевых уравнений, называемых также уравнениями Хартри—Фока. Этой системой определяется «наилуч- шая» волновая функция, имеющая вид детерминанта, а также оптималь- ная предельная оценка для полной энергии системы. Поскольку упомя- нутые уравнения несколько сложны в деталях, мы сначала рассмотрим задачу о двухэлектронной системе, а потом вернемся к случаю с тремя и более электронами. III.2. Двухэлектронная система Для двух электронов, движущихся вокруг ядра, но не взаимодействую- 9 щих между собой, основным состоянием будет конфигурация 1s —оба электрона находятся в одинаковом сферически-симметричном простран- ственном состоянии, но имеют противоположно направленные проекции спинов. Для системы с взаимодействующими электронами естественно будет взять волновую функцию этой конфигурации в качестве пробной.
Краевые задачи и задачи на собственные значения 91 Соответственно каждая из двух одночастичных волновых функций будет иметь вид ФИ = /1/2 (Ш.13) (4я) г а общая волновая функция (III.4) — Ф = 2'1/2 —I----- Щг.Щг.) Г|+1/2) |-1/2) - |-1/2) 1+1/2)]. (III.14) 4nr)r2 l j Эта пробная функция антисимметрична относительно перестановки спи- нов, но симметрична для перестановки пространственных координат электронов. Она удовлетворяет принципу Паули, тйк как является ан- тисимметричной для перестановок по полному набору переменных, опи- сывающих эти два электрона. Условие нормировки (III.5) здесь сво- дится к со J R2(r)dr = 1, (III.15) О а энергия (III.8) записывается как При этом (III.10) имеет вид р(г) = 2—^ R2(r)-, Г p(r)4nr2dr = 2, (III.17) 4яг J о a (III.116) - 1 d_f2 df) = _4яе2р (III.18) г dr^ drJ Обратите внимание, что обменная энергия здесь связана с притягиваю- щим взаимодействием и по величине равна половине энергии взаимного расталкивания электронов (давая в результате множитель 1/4 в по- следнем члене (III. 16)). Заметим также, что двойки, входящие здесь во многие места в виде множителей, появились в результате суммиро- вания по проекциям спинов. Обычно при вариационном исследовании двухэлектронных систем в качестве R берется водородная волновая функция для состояния 1s,
92 Глава 3 параметризованная значением эффективного заряда Z*: ад (III.19) где а — боровский радиус. После этого энергия (III.16) минимизирует- ся как функция Z*, чтобы найти приближенный вид волновой функции и энергию. Эта процедура, детально описанная во многих книгах (см., например, [Ме68]), дает следующий результат: Z* = Z - —; Е = - |z2- -Z + —1. (111.20) 16 a L 8 256-1 В ходе этой минимизации поучительно будет заметить, что кинетичес- кая энергия имеет скейлинг Z*2, а все виды потенциальной энергии—Z*, так что при оптимальном Z* кинетическая энергия равна -1/2 от потенциальной. Это частный случай проявления более общей теоремы вириала, относящейся к приближению Хартри—Фока (см. ниже шаг 1). Полномасштабное применение приближения Хартри—Фока к двухэлек- тронной системе очень близко по духу к выполненному примеру— только берется наиболее общий класс нормированных одночастичных волновых функций. В этом случае будем рассматривать в (III. 16) Е как функци- онал по отношению к R и потребуем его стационарности при вариациях по всем волновым функциям, сохраняющим нормировку неизменной. Ис- пользуя метод лагранжевых множителей, из условия (III. 15) получаем для произвольной вариации д/?(г) - 2е J R2dr] = 0, о (III.21) где е—лагранжев множитель, который определяется так, чтобы найден- ное решение имело правильную нормировку. После этого, применяя стандартные процедуры вариационного исчисления, находим 2 2 2 Г 3/?(г) -4^— - 4^- + 2Ф(г) - 4е R(r)dr = 0. J [ 2т dr r о (III.22) Это равенство удовлетворяется в случае, когда R является решением уравнения типа Шрёдингера h2 rf2 2 т dr2 - + 1ф(г) - е г 2 /?(г) = 0. (111.23)
Краевые задачи и задачи на собственные значения 93 Выбор в качестве е собственного значения одночастичного гамильтони- ана, фигурирующего в (III.23), обеспечивает возможность правильной нормировки для R. (е играет роль некоторой «одночастичной» энер- гии.) Уравнения (III.18), (III.23) являются системой двух связанных нелинейных одномерных дифференциальных уравнений, которые и образу- ют приближение Хартри—Фока для исходного шестимерного уравнения Шрёдингера. Обратите внимание, что в (III.23) входит лишь половина ф, так как каждый электрон взаимодействует с другим электроном, но не «сам с собой». Правильное выражение, удовлетворяющее этому обще- му соображению, можно получить, только включив обменный член в энергию (III.16). III.3. Многоэлектронные системы Предположение о сферической симметрии привело к огромному облегче- нию в случае двухэлектронной системы. В задаче на собственные зна- чения для одночастичной волновой функции, дополненной уравнением Пуассона для потенциала, оно позволило нам перейти от системы трех- мерных уравнений в частных производных к обыкновенным дифференци- альным уравнениям. Для двухэлектронной задачи это возможно (и пра- вильно), потому что сферически-симметричное решение имеет наимень- шую энергию. Однако для большинства многоэлектронных систем сфери- ческая симметрия распределений плотности и потенциала никоим обра- зом не гарантируется. В принципе рассматривать нужно именно несфе- рические решения, и в действительности такие «деформированные» вол- новые функции являются оптимальными при описании структуры опреде- ленных систем. Чтобы понять, в чем суть проблемы, давайте предположим, что по- тенциал Ф сферически-симметричен. Решения одночастичного уравнения Шрёдингера в таком потенциале имеют структуру «оболочек», каждая из которых характеризуется квантовыми числами п (радиальное число) и / (орбитальный угловой момент). Каждая оболочка включает 2(2/ + 1) орбиталей, связанных с различными значениями о*а, и проекции ш орби- тального углового момента. Все они являются вырожденными и описыва- ются формулами со *а<г) = J L (IIL24) О Мы должны понять, какие из этих орбиталей следует использовать при
94 Глава 3 составлении слэтеровского детерминанта приближения Хартри—Фока. Распределение плотности, определяемое (ШЛО), в общем случае не будет сферически-симметричным, если только число электронов не ока- жется таким, что все 2(2/ + 1) состояний данной оболочки будут за- полнены. Это распределение плотности в свою очередь приведет к не- симметричному потенциалу и тем самым к значительно более сложному одночастичному уравнению для собственных значений. В общем случае по сути данная задача является трехмерной. Требуется некоторая модификация исходного метода Хартри—Фока для получения сферически-симметричного приближения в системах с не- заполненной оболочкой (так называемое <наполнение> или приближение центрального поля). Основная идея способа состоит в как бы равно- мерном <размазывании> валентных электронов по всей занимаемой ими оболочке. Например, в нейтральном атоме углерода будут два электро- на в 1 s-оболочке, два в 2$-оболочке и два электрона будут занимать 6 орбиталей оболочки 2р. (Заметим, что мы не стали размещать 4 электрона в оболочку 2р и ни одного в оболочку 2s, потому что ожи- даем более низкой одночастичной энергии системы при заполненных 25-орбиталях.) Введем величину А^ —число электронов в каждой из оболочек. Оно может принимать целые значения в диапазоне от 0 до 2(2/ + 1). Используя волновую функцию (III.24), запишем плотность (Ш.10) как 00 Р(Г) = 4^7 I p(r)4itr2dr = X Nnl = AC (III.25) п I Q П l При записи этого выражения мы учли тождество Z |^)|2 = ^-- т=- I В таком же духе можно обобщить запись функционала энергии (III.8) для системы с незаполненной оболочкой: 00 0 00 2 + ][- + i$(r)]p(r)4itr2dr + Еех , (III.26а) о
Краевые задачи и задачи на собственные значения 95 где обменный член равен 1 + 1' 2 = - 4 I NniNn4> I (о о'о) (III.266) nln'l' X=\l-l'\ В этом выражении / обозначает интеграл со со 'it.-,- «2W*'И'') /, «.-fW (Hl.27) » » т)” где гиг обозначают меньшую и большую величины из г и г'. В (III. 266) 3/-индекс становится равным нулю при нечетном значении / + /'+ X, а в остальных случаях равен [7 Z'A-|2 _ (-/ + I' + X)! (/-/'+ X)! (I + I' - Л)! у 1° 0 °J (/ + I' + X + 1)! _(р - /)! (р - /')! (р - X)lJ ’ где р = (I + I'+ Х)/2. При выводе этих выражений мы воспользовались разложением кулоновского взаимодействия по мультиполям и провели некоторые стандартные выкладки алгебры угловых моментов [Вг68]. Вычисляя далее вариации аналогично двухэлектронной задаче, мы получаем уравнения Хартри—Фока для оптимальных радиальных волновых функций. Чтобы сохранить правильную нормировку каждой из них, вво- дим лагранжевы множители £п/ и после некоторого ряда алгебраических преобразований получим [- Ё & ’ *ФМ -F^ ",, г8‘) где W = - f I t (o oo]2j*nl.n'l n'l' X=|/-/,| 0 + rxr^^')V')rfr< J ,'A+1 (III.286) (III.28b)
96 Глава 3 Видно, что уравнение на собственные значения (Ш.28а) аналогично уравнению (III. 23) двухэлектронной задачи. Отличие заключается в том, что обменная энергия приобрела нелокальность, выраженную чле- ном F (так называемый потенциал Фока), и уравнения для различных волновых функций начали^ «зацепляться» друг за друга, образуя свя- занную систему. Легко показать, что для синглетного состояния с / = 0 оба уравнения системы становятся эквивалентными. Полезно об- ратить внимание на то, что, учтя (III.266), (III.286), обменную энергию можно записать как 00 = 2 I Nni J WW*' (III-29) nl О а также, что, помножив (III.28а) на R и проинтегрировав, одночас- тичное собственное значение задали можно выразить как 00 0 + J[- Ц- + *(H]^z(r)dr + k/r)Fn,(r)dr (П1.30) о о III.4. Решение уравнений Для численного решения уравнений Хартри—Фока мы сначала должны по- добрать подходящую систему единиц. При сравнении с эксперименталь- ными данными удобно измерять все расстояния в ангстремах, а энер- гии—в электрон-вольтах. Если мы воспользуемся следующими значения- ми констант = 7,6359 эВ-А2; е2 = 14,409 эВ-А, (1П.31) то боровский радиус и константа Ридберга будут иметь их правильные значения а = -А? = 0.5299А, Ry = — = 13,595 эВ. (Ш.32) те2 2а Для больших атомов со многими электронами достаточно точное ре- шение уравнений Хартри—Фока является весьма трудоемкой задачей.
Краевые задачи и задачи на собственные значения 97 Однако если ограничиться рассмотрением основных состояний систем с числом электронов не более десяти (это соответствует трем оболоч- кам—1s, 2s и 2р), то с этой задачей может справиться и персональ- ный компьютер. В этих случаях будет достаточно сетки из нескольких сот узлов в интервале от нуля до ~ ЗА и длины шага 0,01 А. Наилучшим путем разработки программы для решения уравнений Хар- три—Фока, по-видимому, будет следующий. Сначала рассмотрим двух- электронную задачу, где уравнение с собственным значением для ради- альной волновой функции имеет единственное решение. После этого можно рассматривать более сложный случай с несколькими электронами. Работу можно разбить на несколько этапов. Шаг 1. Проверьте алгебраические выкладки, в результате которых по- лучены конечные уравнения для двухэлектронной системы (III. 16), (III.18), (III.23) и для многоэлектронных систем (III.18), (III.26), (III.28), и убедитесь, что вы понимаете физические прин- ципы, лежащие в основе всей этой цепочки выкладок. Докажите теорему вириала, утверждающую, что кинетическая энергия системы равна по- тенциальной, помноженной на -1/2. Это можно сделать, представив, что одночастичная волновая функция, являющаяся решением уравнения Хартри—Фока, подвергается преобразованию скейлинга, сохраняющему ее нормировку: %а(г) т3/2х(тг), где т —безразмерный масштабирующий параметр. Покажите, что при этом полная кинетическая энергия (III. 8) масштабируется как т2, а все виды потенциальной энергии—как т. При доказательстве теоремы вири- ала используйте соотношение ^1 = О, ат1т=1 поскольку энергия, определяемая решением уравнений Хартри—Фока, остается стационарной при любых вариациях волновой функции. Шаг 2. Напишите программу расчета энергии по формуле (III. 16) при условии, что R известна на всех узлах сетки. Для этого также потре- буется написать подпрограмму решения уравнения (III. 18) для расчета ф (вы можете использовать одну из программ, приведенных ранее в этой главе). Далее с помощью подходящих квадратурных формул следует вычислить интегралы, входящие в (III. 16). Проверьте правильность работы вашей программы, рассчитав энергию водородоподобного состоя- 7—1650
98 Глава 3 ния 15 (III. 19), и сравните ее с аналитическим результатом (ие за- будьте отнормировать волновую функцию соответствующей дискретиза- цией соотношения (III.15)). Шаг 3. Напишите подпрограмму, в которой используется метод при- стрелки для расчета самого малого собственного значения е и соот- ветствующей ему нормированной радиальной волновой функции, являю- щейся решением уравнения (III.23). Считайте при этом, что во всех узлах сетки потенциал Ф известен. Нулевое граничное условие в нача- ле координат в расчетную схему вносится легко. Хуже с граничным ус- ловием на больших расстояниях. Его можно взять в виде R(r = L) = О, где L — конечный узел сетки. (Большей точности, особенно для слабо связанных состояний, можно достичь заменой этого условия на экспо- ненциальное граничное уловие на внешнем радиусе сетки.) Обратите внимание, что масштаб длины (т.е. R и величина шага по радиусу) должен изменяться в зависимости от величины центрального заряда. Проверьте, как работает подпрограмма, приравняв Ф нулю и рассчитав волновую функцию, собственное значение и энергию состояния 1s для случаев Z = 2 и Z = 4. Сравните ваши результаты с аналитическими, полученными при использовании водородных функций. Шаг 4. Комбинируя подпрограммы, созданные на шагах 2 и 3, напишите программу, которая методом последовательных итераций решает двух- электронные уравнения Хартри—Фока для заданного значения Z. Итера- ционная схема и ее организация в виде подпрограмм очевидны: а) Некоторая «догадка» об исходном виде волновой функции; ска- жем, это может быть водородная функция (III. 19) с подходя- щим значением Z*. б) Решаем уравнение (II 1.18) для распределения потенциала, со- здаваемого исходной волновой функцией, и рассчитываем пол- ную энергию системы по (III.16). в) Ищем новую зависимость для волновой функции и ее собствен- ное значение, находя решение (III.23) и нормируя его по (III.15). г) Вычисляем новые значения потенциальной и полной энергии. После этого возвращаемся в пункт в) и повторяем пункты в) и г) до тех пор, пока последовательность значений полной энергии не сойдется в пределах установленной погрешности. На каждой итерации следует выводить на экран собственное значение,
Краевые задачи и задачи на собственные значения 99 полную энергию и каждый из трех отдельных вкладов, ее составляющих (см. (III. 16)). Также полезно было бы рисовать график волновой фун- кции, чтобы следить за ходом расчета. Заметим, что полная энергия, которая должна спадать по мере выполнения итераций, будет относи- тельно быстро сходиться к некоторому минимуму. В то же время сходи- мость отдельных вкладов в полной энергии существенно более медлен- на. Это вполне согласуется с тем фактом, что лишь полная энергия сохраняет стационарность в вариационном минимуме, но не составляю- щие ее части. В процессе сходимости должно начать выполняться тре- бование теоремы вириала, обсуждавшейся на шаге 1. Попробуйте начи- нать итерационный процесс с волновых функций различного вида и убе- дитесь, что конечное решение тем не менее будет тем же. Изменяя па- раметры сетки и величину конечного радиуса L, докажите, что ваши результаты устойчивы к такого рода заменам. Шаг 5. Используйте созданную вами программу для решения уравнений Хартри—Фока в случаях заряда ядра Z от 1 до 9. Сравните найденные значения полной энергии с экспериментальными данными, приведенными для N = 2 в табл. III. 1. (Энергии связи, совпадающие по абсолютной величине с полными энергиями (полная энергия отрицательна), получе- ны из измерений потенциалов ионизации атомов и ионов, взятых из ра- боты [We71].) Сравните также ваши результаты с волновыми функциями и соответствующими им энергиями, получаемыми по формулам (III. 19), (III.20). Обратите внимание, что оба приближенных значения должны давать верхние предельные оценки точной величины энергии. Приведите качественное физическое объяснение поведению отличия между прибли- женным и точным значениями с ростом Z. Не смогли бы вы показать, используя теорию возмущений второго порядка, что это расхождение должно становиться константой при больших Z. Покажите, что для Z = = 1 приближение Хартри—Фока предсказывает отсутствие связанного состояния для иона Н . Это следствие того, что полная энергия иона будет больше, чем у нейтрального атома Н. Поэтому системе энергети- чески выгодно сбросить лишний электрон. Однако из табл. III. 1 видно, что в действительности это совсем не так. В ходе поиска решения для Z = 1 вы могли бы обнаружить, что сходимость вычислительной проце- дуры—дело весьма тонкое. Легко выйти на такой режим счета, когда между соседними итерациями плотность меняется столь сильно, что наименьшее собственное значение одночастичного гамильтониана стано- вится положительным. Один из способов избежать этой неприятности состоит в предупреждении возможности слишком больших скачков пЛОТ- 7*
100 Глава 3 ности при переходе от одной итерации к другой. Это можно сделать, например, усредняя прежнее значение плотности и ее новое значение на шаге в) описанной выше итерационной схемы . Шаг 6. Модифицируйте вашу двухэлектронную программу для работы с атомными системами, включающими большее число электронов. Простей- ший путь к этому состоит в том, чтобы сначала изменить расчет пол- ной энергии по заданному набору волновых функций, от которого зави- сит Еех. Удобнее всего это сделать, если воспользоваться (III.29), вычисляя по формуле (III.286) и запоминая значения F^. Из-за нали- чия фоковского потенциала уравнение (III.28а) нельзя решать методом пристрелки, рассмотренным выше. Однако этот метод применим, если рассчитывать значение F t с использованием волновых функций, най- денных на предыдущей итерации. При этом F t будет играть роль неод- нородного члена при расчете нового набора волновых функций. Для пробных значений рассчитанных по (III.30) с подстановкой пре- дыдущего набора волновых функций, систему (III.28а) уже можно ре- шать как сумму несвязанных между собой неоднородных краевых задач, используя для этого метод функций Грина (III. 18). Найденные решения после нормировки их в соответствии с (III.24) могут служить новым набором волновых функций. На двухэлектронных системах вы можете проверить точность модифицированной программы. При этом вы должны получить, что обменная энергия равна энергии прямого межэлектронно- го взаимодействия, помноженной на (-1/2), а также что решения схо- дятся к тому же результату, что был получен ранее на шаге 4. Ис- пользуйте написанную вами программу для расчета волновых функций и энергий некоторых атомных систем, приведенных в табл. III. 1. Сравни- те данные расчета с экспериментальными значениями. Поясните резуль- таты сравнения. В качестве начальных волновых функций на первой итерации обычно берут волновые функции водородных орбиталей. Для состояния 1s она выражается формулой (III. 19), а для состояний 2s и 2р- p(f) е-А/2а 2s 1*2(Р I 2aJ 2a № ^Z*j1/2^‘rj2 e~Z'r/2a
Краевые задачи и задачи на собственные значения_____________________101 Оптимальное значение Z*, общее для этих выражений, определяется для каждой системы путем минимизации полной энергии. Таблица 3.1. Энергии связи для малых атомных систем (эВ) Число электронов, N Z 2 3 4 5 6 7 8 1 14,34 2 78,88 3 198,04 203,43 4 371,51 389,71 399,03 5 599,43 637,35 662,49 670,79 6 881,83 946,30 994,17 1018,55 1029,81 7 1218,76 1316,62 1394,07 1441,19 1471,09 1485,62 8 1610,23 1743,31 1862,19 1939,58 1994,47 2029,58 2043,19 9 2054,80 2239,93 2397,05 2511,27 2598,41 2661,05 2696,03
4. СПЕЦИАЛЬНЫЕ ФУНКЦИИ И КВАДРАТУРНАЯ ФОРМУЛА ГАУССА В этой главе мы обсудим две соприкасающиеся темы: алгоритмы вычис- лений специальных функций математической физики (функции Бесселя, ортогональные полиномы и т.п.) и эффективные методы численного ин- тегрирования, основанные на ортогональных функциях. В большинстве программных продуктов, ориентированных на научные приложения, име- ются обширные библиотеки, включающие стандартные процедуры для этих целей. Это освобождает пользователя от утомительной работы по соз- данию собственных кодов такого рода. Обычно пользователю нет нужды знать в деталях, как такие стандартные процедуры работают. Однако с общей идеей, лежащей в основе этих методов, познакомиться будет по- лезно. Это как раз то, что мы хотим изложить в данной главе. 4.1. СПЕЦИАЛЬНЫЕ ФУНКЦИИ Проблематика специальных функций математической физики активно раз- вивалась во времена, когда проведение значительных численных расче- тов было малодоступно и когда правилом были аналитические методы исследования. Тем не менее и теперь эта тема остается актуальной. Для этого есть две причины. Одна из них —внутренняя привлекатель- ность аналитических результатов. Они направляют нашу интуицию и да- ют некоторые общие рамки для качественной интерпретации более слож- ных задач. Другая причина, особенно важная для численных расчетов, состоит в том, что использование специальных функций часто позволя- ет некоторую часть задачи решить аналитически и тем самым значи- тельно сократить объем вычислений, необходимых для решения всей за- дачи.
Специальные функции и квадратурная формила Гаусса 103 В качестве иллюстрации рассмотрим одномерный гармонический ос- циллятор, подвергающийся воздействию некоторого внешнего возмуще- ния. Частота его колебаний w будет изменяться во времени. Предполо- жим, что частота имеет невозмущенное значение до момента t = О, а также после t > Т. И пусть для нас представляет интерес движение осциллятора на временах, существенно больших, чем длительность дей- ствия возмущения. Задав начальные скорость и положение маятника, можно далее прямо интегрировать уравнения движения = v(t); — = -u2(t)x(t) dt dt как задачу Коши, используя для этого один из методов, обсуждавшихся в гл.2. Однако это было бы весьма неэффективно, так как характер движения маятника после снятия возмущения (t > Т) отлично известен и легко выражается в терминах таких «специальных» функций, как си- нус и косинус: X(t > Т) = х(Т) cos ш0(/ - Т) + 0~'v(T) sin ш0(/ - Т). Поскольку имеются отличные методы расчета значений тригонометричес- ких функций, разумнее всего численное интегрирование проводить лишь для нетривиального периода движения (0 < t < Т). После этого ис- пользовать координату и скорость маятника в момент t = Т для непо- средственного вычисления тригонометрических функций в приведенном выше выражении. Хотя этот пример может показаться примитивным, он вполне демонстрирует общую идею использования специальных функций для сокращения вычислительной части работы. Полезным источником сведений при работе со специальными функци- ями является «Handbook of Mathematical Functions» [Ab64] («Справоч- ник по математическим функциям»). Эта книга содержит определения и свойства большинства часто употребляемых функций. Даны также методы их расчета и таблицы для отдельных значений аргумента. Последние весьма полезны для проверки точности подпрограмм, которые вы будете использовать в своей работе. Особенно простым способом расчета для некоторых специальных функций является рекурсия. Многие из функций имеют свойство, назы- ваемое порядком (что обычно отмечается индексом), и удовлетворяют рекуррентным соотношениям в отношении этих индексов. Если функция может быть вычислена явно для нескольких самых нижних порядков, то значения ее в более высоких порядках можно находить по таким рекур- рентным формулам. Как пример давайте рассмотрим вычисление полино- мов Лежандра Р^х) для |х| 1 и I = 0, 1, 2,---. Эти функции появ-
104 Глава 4 ляются в решениях волнового уравнения в задачах, обладающих сфери- ческой симметрией. Рекуррентная связь полиномов различных степеней здесь такова: (/ + 1)Р/+1(х) + IP^x) - (21 + 1)хР,(х) = 0. (4.1) Используя известные значения PQ(x) = 1 и Р^(х) = х и выполняя ре- курсию вперед по /, можно вычислить любого требуемого порядка. Следующая программа делает это для любых вводимых значений хи/. 10 INPUT "Вводите х и I"; X,L% 20 IF L%=0 THEN PL=1: GOTO 120 30 IF L%=1 THEN PL=X: GOTO 120 40 ' 50 PM=1: PZ=X 60 FOR LL%=1 ТО L%-1 70 РР=( (2*LL%+1)*X*PZ-LL%*PM)/( LL%+1) 'явная зависимость для 1=0 'явная зависимость для 1=1 'значения для начала рекурсии 'цикл для рекурсии вперед 'уравнение (4.1) 'сохранение текущих значений для 'использования на следующем шаге 80 PM=PZ: PZ=PP 81 90 NEXT LL% 100 PL=PZ 110 ' 120 PRINT X,L%,PL 130 GOTO 10 'вывод результатов 'переход к запросу для новых х и I Эта программа работает без каких-либо проблем, и результаты согла- суются с табличными данными в пределах арифметической точности ком- пьютера. Пользуясь этой же программой, можно вычислить и производ- ную полиномов Лежандра, заменив лишь рекуррентное соотношение на (1 - х2)Р' = -lxPt + /Р(_, . (4.2) Аналогично рассматриваются ряды других полиномов, таких, как поли- номы Эрмита и Лагерра. В качестве второго примера рассмотрим цилиндрические функции Бесселя первого и второго рода, J (х) и Y (х), возникающие как ре- гулярные и нерегулярные (имеющие особенность в нуле) решения волно- вых уравнений в цилиндрической геометрии. Эти функции подчиняются рекуррентным соотношениям Сп-^ + = 27 Сп^> (4-3> где Сп обозначает 1п(х) или Уп(х). Чтобы использовать эту формулу в прямом направлении, необходимо знать CQ и Сг Их проще всего полу- чить из полиномиальных аппроксимаций, приводимых в работе [АЬ64]
Специальные функции и квадратурная формула Гаусса 105 Таблица 4.1. Прямая рекурсия для функции Бесселя Yn(2) п Уп(2) п У2) 0 +0,51037 5 -9,9360 1 -0,10703 6 -46,914 2 -0,61741 7 -271,55 3 -1,1278 8 -1853,9 4 -2,7659 9 -14560 (формулы (9.4.1)—(9.4.3). Для |х| < 3 имеем /О(Х) = 1 - 2,2499997р2 + 1.2656208*/4 - - 0,3163866/ + 0,0444479/ - O.O39444//10 + + 0.0002100/2 + £; |£| — 5-10'8, (4.4а) где у = х/3 и У0(х) = | log(x/2)/Q(x) + 0,36746691 + 0,605593666/ - -0,74350384/ + 0,25300117/ - 0,04261214/ + + 0,00427916/° - 0,0002484б/2 + е; |е| £ 1.4-10"8. (4.46) Для х > 3 /(](*) = -t"’/2f0cose; У0(х) = x~1/2f0sine, (4.4в) где f0 = 0,79788456 - 0,00000077/’ - 0,00552740;/ - - 0,00009512у’3 + 0,00137237/* - 0.00072805/5 + + 0.00014476/5 + e; |e| < 1,6-10~8. (4.4г) 0 = x - 0,78539816 - 0,04166397/’ - 0.00003954/2 + + 0,00262573;/ - 0,00054125/* - 0,00029333y’5 + + 0.00013558/6 + e; |e| < 7-10~8. (4.4д) Аналогичные формулы для J и даны в разд.9.4.5 —9.4.6 в [АЬ64]. Обратите внимание, что приведенные выражения не являются разложени- ями в ряд Тейлора. Скорее это полиномы, в которых коэффициенты спе- циально подобраны для наилушего представления функций Бесселя на указанных интервалах. Теперь давайте попытаемся вычислить Yn рекурсией вперед, ис-
106 Глава 4 пользуя (4.3) совместно с полиномиальными аппроксимациями значений Уо и Уг В результате такой процедуры в пределах арифметической точности компьютера будут воспроизведены данные из таблиц гл.9 в [АЬ64]. Для примера мы провели расчет для х = 2, результаты которо- го приведены в табл.4.1. Естественно попробовать с помощью такой же процедуры прямой ре- курсии вычислить значения 1п. Используя (4.4а) и его аналог для находим отклонения расчетных значений от точных, приведенные в тре- тьем столбце табл.4.2. Видно, что рекурсия такого типа дает хорошие результаты для п < 5, а для более высоких порядков п ошибка быстро нарастает. Довольно просто понять, что же порождает эту неточность. Рекур- рентную формулу (4.3) для бесселевых функций можно рассматривать как конечно-разностное представление некоторого дифференциального уравнения второго порядка по п. Действительно, если вычесть 2Сд из обеих частей равенства, то получим Cn-1 - 2С„ + Сп+1 = 2(т - (4-5) что в пределе непрерывного п можно записать как 2 = -k\n)C- k\n) = 2 Г1 - |1. (4.6) dn 1 J При выводе этого уравнения мы использовали 3-точечную конечно-раз- ностную формулу (1.7) для второй производной с h = 1 и идентифици- ровали вид локального волнового числа Уравнение (4.6) будет иметь два линейно независимых решения. Если Л2 положительно или п < х, оба они будут иметь осциллирующий характер. Если же Л2 отри- цательно или п > х, то одно из них будет экспоненциально спадать, а другое экспоненциально расти. Как ясно из табл. 4.1, Yn является тем решением, которое экспоненциально нарастает с увеличением и, так что в процессе прямой рекурсии потери точности не происходит. В отличие от этого из табл. 4.2 видно, что точное значение J быстро убывает с ростом л, что и приводит к неизбежной потере точности, как только в ходе рекурсии п превышает значение п = х. Это несчас- тье такого же рода, что рассматривалось в гл.З при интегрировании дифференциальных уравнений второго порядка, имеющих экспоненциаль- ные решения. Поэтому и лекарство от этой болезни остается тем же, а именно исключить применение рекурсии в направлении спада рассчиты- ваемой функции.
Специальные функции и квадратурная формула Гаусса 107 Таблица 4.2. Расчеты значений функции Бесселя первого рода J^(2) п Точное значение Ошибка при прямой рекурсии Обратная рекурсия без нормировки Ошибка обратной рекурсии с нормировкой 0 0,223891Е+00 0,000000Е+00 0Д50602Е-10 0,000000Е+00 1 0.576725Е+00 0,000000Е+00 0,387940Е-10 0,000000Е+00 2 0.352834Е+00 0,000000Е+00 0.237337Е-10 0,000000Е+00 3 0.128943Е+00 0,000000Е+00 0,867350Е-11 0,000000Е+00 4 0.339957Е-01 -0,000002Е-01 0,228676Е-11 0,000000Е-01 5 0.703963Е-02 -0,00007бЕ-02 0.473528Е-12 0,000000Е-02 6 0.120243Е-02 -0,000355Е-02 0,808826Е-13 0,000000Е-02 7 0.174944Е-03 -0,020559Е-03 0,117678Е-13 0,000000Е-03 8 0.221795Е-04 -0Д40363Е-03 0,149193Е—14 0,000000Е-04 9 0.249234Е-05 —0,110234Е—02 0,167650Е-15 0,000000Е-05 10 0.251539Е-06 -0.978959Е-02 0Д69200Е-16 0,000000Е-06 И 0.230428Е-07 0,155000Е-17 0,000000Е-07 12 0.193270Е-08 0,130000Е-18 0.000007Е-08 13 0.149494Е-09 0,100000Е-19 0,000830Е-09 14 0.107295Е-10 0,000000Е-19 0,107295Е-10 | Упражнение 4.1. Используя (4.1), покажите, что рекурсия при рас- чете полиномов Лежандра устойчива в обоих направлениях. Чтобы рассчитать функцию Бесселя I с достаточной точностью, учтем линейность рекуррентного соотношения и воспользуемся формулой (4.3) в направлении уменьшения п. Предположим, что нас интересуют значения /^(2) для п 10. Тогда, положив L. = 0, а для /13 взяв произвольное малое число, например, /13 = 10 , мы можем начать ре- курсию к п = 0. Результирующий ряд чисел будет воспроизводить зна- чения J . Правда, рассчитанная функция будет иметь некоторую произ- вольную нормировку, поскольку начальные значения для рекурсии мы выбирали тоже весьма вольно. Тем не менее найдено нужное решение разностного уравнения (4.3), которое растет экспоненциально с уменьшением п, и оно будет доминировать при малых п. Рассчитанную последовательность можно потом нормировать, использовав тождество /О(Х) + 2/2(х) + 2/4(х) +’••=!. (4.7) Следующая программа вычисляет функцию Бесселя первого рода с помощью обратной рекурсии.
108 Глава 4 5 DIM J(50) 10 INPUT "Введите максимальное значение для п (<=50)"; 15 INPUT "Введите значение для х 20' 25 J(NMAX%)=0: J(NMAX%-1)=1E-20 30 FOR N%=NMAX%-1 TO 1 STEP -1 35 J( N%-1)=( 2*N%/X)*J( N%)-J( N%+1) 40 NEXT N% 45' 50 SUM=J(0) 55 FOR N%=2 TO NMAX% STEP -2 60 SUM=SUM+2*J(N%) 65 NEXT N% 70 FOR N%=0 TO NMAX% 75 J( N%)=J( N%)/SUM 80 PRINT N%,J(N%) 85 NEXT N% 90 GOTO 10 NMAX% 'начальные условия 'цикл для обратной рекурсии 'формула (4.3) 'расчет суммы для (4.7) 'нормировка и вывод результатов X При расчете с NMAX% = 14 и X = 2 программа сначала находит ненорми- рованные значения функции (в блоке, оканчивающемся строкой 40). Они приведены в четвертом столбце табл. 4.2. После этого последователь- ность нормируется. Ошибки конечного результата даны в пятом столбце той же таблицы. Расчет оказывается неожиданно точным даже для зна- чений и, близких к 14. Константу для нормировки чисел в полученной последовательности можно выбрать и другим способом, рассчитав зна- чение /0(2) полиномиальной аппроксимацией (4.4а). | Упражнение 4.2. Просчитайте вышеприведенную программу для различ- ных значений NMAX% и фиксированном X. Сравнивая полученные резуль- таты с табличными значениями, убедитесь, что расчет точен, пока значение NMAX% достаточно велико (оно должно быть тем больше, чем больше X и максимальный искомый порядок функции). Измените алгоритм нормировки и используйте для аппроксимационные формулы (4.4а), (4.4в). | Упражнение 4.3. Сферические функции Бесселя первого и второго ро- да /. и п. удовлетворяют рекуррентной формуле S + S = 21 + 1 S (+1 (-1 X I ’
Специальные функции и квадратурная формула Гаусса 109 где sl обозначает или nf Для нескольких самых низких значений порядка приведем явные выражения этих функций: ш у . ( 3, - 1 ],|„ х - cos х. и X X X 1 X X J X cos х. „ _ cos х sin x, „ _ f 3 , 1ЪЛС v 3 . v "o = - nl= - ------—’ n2- 1“ “3 + -JC0S X - ~2 s,n x- Л л Л Л, Д, X При x = 0,5 точные значения функций второго порядка равны п2 = -25,059923; /2 = 1,6371107 -10’2. Покажите, что л2 можно рассчитать как непосредственной подстанов- кой, так и прямой рекурсией, и убедитесь, что последний способ при- меним при любых /их. Исследуйте расчет /2(0,5) методами прямой рекурсии, подстановки и обратной рекурсии и покажите, что первые два могут приводить к совершенно искаженным результатам. Можете ли вы сказать почему? Итак, даже в случаях, когда для функции доступно явное выражение, можно предпочесть обратную рекурсию из-за устойчи- вости этого метода. Все рассказанное выше иллюстрировало определенные ловушки, воз- никающие при вычислении некоторых часто используемых специальных функций. Специфические методы, подходящие для других функций, можно найти в соответствующих разделах [АЬ64]. 4.2. КВАДРАТУРНАЯ ФОРМУЛА ГАУССА В первой главе мы обсуждали несколько методов вычисления определен- ных интегралов, наиболее подходящих для случаев, когда интегрируе- мая функция известна в узлах равномерной сетки. Эти методы широко используются, особенно когда подынтегральнное выражение зависит от решения некоторого дифференциального уравнения, находимого числен- ными методами. Однако существуют более эффективные схемы численного интегрирования, доступные в тех случаях, когда мы можем вычислять интегрируемую функцию для произвольных абсцисс. Одной из наиболее полезных схем такого рода является квадратурная формула Гаусса. Рассмотрим задачу вычисления интеграла 1 / = ff(x)dx. -1 Квадратурные формулы, рассмотренные в гл.1, имели вид
по Глава 4 N IaLw^xn>’ <4-8) П = 1 где — узлы равномерной сетки. Здесь мы ссылаемся на «элементарные» фор- мулы (такие, как (1.9), (1.11) или (1.13а), (1.136)) в отличие от составных формул типа (1.12). Например, для правила Симпсона (1.11) N = 3 и хл = -1, хо = 0, х« = 1, w = = 1/3, = 4/3. 1 Zu i u Z Из вывода формулы Симпсона ясно, что она точна для f в виде полино- мов степени 3 или ниже, что соответствует оценке погрешности (1.11). Обобщая, можно сказать: если квадратурная формула, основан- ная на тейлоровском разложении, использует значения в W узлах, то она будет точна для полиномов степени N - 1 (степени (V для нечетных N). Исходя отсюда, 7V неизвестных весов wn можно выбрать так, чтобы удовлетворялись (V линейных уравнений 1 N §xpdx = Xwnxn ’ р = 0, 1, • • •, Af - 1. (4.9) -1 n=1 (Когда N нечетно, квадратурная формула также точна для нечетного одночлена xN.) Большей точности интегрирования при том же объеме вычислений можно достичь, если отказаться от требования равного расстояния между узлами сетки. В этом случае мы будем выбирать координаты х^ некоторым оптимальным образом, ограничиваясь лишь условием принад- лежности их интервалу [-1, 1]. Теперь в нашем распоряжении 2N пара- метров для конструирования нужной квадратурной формулы (W координат xN и столько же весов и мы должны уметь выбирать их значения так, чтобы выполнялись равенства (4.9) для всех р из набора 0, 1,..., 2ЛМ. Вот такую квадратурную формулу, использующую N специ- ально выбранных координат для узлов, можно сделать точной для поли- номов степени 2N - 1 и ниже. Ясно, что это более эффективно, чем работа с равномерной сеткой. Чтобы увидеть, как делается наилучший выбор х^, рассмотрим по- линомы Лежандра, ортогональные на интервале [-1, 1]: 1 Г PLx)P.(x)dx = —2— 8 . (4.10) J 1 1 2i + 1 4 -1
Специальные функции и квадратурная формула Гаусса 111 Легко показать, что Л—это полином г-й степени, все i корня кото- рого расположены на интервале [-1, 1]. Любой полином степени 2W - 1 или меньшей можно записать в виде f(x) = Q(x)P^x) + Я(х), где Q и /? —полиномы степени N - 1 или ниже. В этом случае точное значение искомого интеграла (4.8) будет равно 1 /. 1 I = J (QPn + R)dx = J Rdx, (4.11) -1 -1 где второе равенство является следствием ортогональности PN ко всем полиномам степени ДО - 1 и ниже. Если мы теперь выберем в качестве хп координаты N нулей полиномов Р^, то подстановка их в (4.8) даст точное равенство ' = EWW + 4»= (412> П=1 П=1 Теперь лишь остается выбрать шп так, чтобы Р (полином степени N - 1 или ниже) тоже интегрировался точно. Это произойдет, если шп будут удовлетворять системе линейных уравнений (4.9) при являю- щихся корнями Р^. Можно показать, что и>п связаны с производными Рд в точках соответствующих нулей: И» = ------2^--------2 • п (1 - х2)[р;(хп)]2 Теперь полностью определено правило численного интегрирования, из- вестное как квадратурная формула Гаусса—Лежандра. Заметим, что после простой линейной замены переменной эту формулу можно приме- нять для вычисления любого определенного интеграла в конечных пре- делах. Например, интеграл между х = а и х = b заменой переменной t = -1 + 2 Ь - а приводится к требуемому виду. Используя нелинейные замены перемен- ных, делающие интегрируемую функцию максимально плавной, можно к тому же улучшить точность интегрирования. Другие типы ортогональных полиномов позволяют получить ряд га- уссовских квадратурных формул, применяемых для интегрирования функ- ций специального вида. Например, полиномы Лагерра Л, ортогональные на интервале [0, ®] с весовой функцией е-х, дают квадратурную фор- мулу Гаусса—Лагерра:
112 Глава 4 J е Xf(x)dx « Y.wn (413) О n = 1 где х^ —корни LNt a wn определяются значениями в этих точках. Аналогично полиномы Эрмита порождают формулу Гаусса— Эрмита для ин- тегралов вида оо г -х2 J е х f(x)dx. -00 Все эти гауссовские квадратурные формулы приведены в разд. 25.4 [АЬ64], который к тому же содержит соответствующие таблицы коорди- нат узлов и весов. При практическом использовании гауссовских квадратур нет нужды в создании программ для расчета соответствующих абсцисс и весов. Обычно используются библиотечные подпрограммы с готовыми массивами, содержащими эти числа. Скажем, в примере 4 подпрограмма, начинающа- яся строкой 12 000 (см. приложение Б), определяет абсциссы и веса формулы Гаусса—Лежандра для многих значений М Общее правило состоит в следующем. Гауссовские квадратуры выби- раются в том случае, когда интегрируемая функция достаточно гладкая или может быть сглажена путем выделения из нее функции, являющейся весовой для некоторого набора ортогональных полиномов. Конечно, кроме этого мы должны иметь возможность вычислять подынтегральное выражение в нужных точках. Если интегрируется быстро меняющаяся функция, мы можем воспользоваться составной квадратурной формулой, применяя базовую гауссовскую формулу к некоторому числу подынтерва- лов, на которые разбивается весь отрезок интегрирования. Естествен- но, если подынтегральное выражение можно вычислить лишь в точках, расположенных на равных расстояниях (например, в ходе численного решения дифференциального уравнения), то следует применять формулы, рассмотренные ранее в гл.1. В качестве иллюстрации использования гауссовских схем рассмот- рим работу 3-точечной формулы Гаусса—Лежандра при вычислении инте- грала 3 / = ](! + t)'/2dt = 4,66667. (4.14) 0 Сделав замену переменной х = -1 + - /, 3
Специальные функции и квадратурная формула Гаусса 113 получим 5 2 ' 1/2 - dx. (4.15) Для А = 3 значения абсцисс и весов в формуле Гаусса—Лежандра равны хЛ = -х~ = 0,774597, х0 = 0, w = = 0,555556, = 0,888889. 1 О х 1 u х Прямая подстановка в квадратурную формулу (4.8) дает результат / = = 4,66683, а расчет по формуле Симпсона (4.14) при h = 1,5 приводит к значению / = 4,66228.1 Видно, что гауссовская квадратура более точна при том же числе вычислений интегрируемой функции (в данном случае 3). | Упражнение 4.4. Рассмотрим интеграл J [1 ~ x2y/2dx = тг/2. -1 Вычислите значение этого интеграла, используя некоторые из квадра- турных формул, выведенных в первой главе, а также с помощью квадра- туры Гаусса—Лежандра. Обратите внимание, что поведение интегрируе- мой функции вблизи х = ±1 потребует от вас некоторой осторожности. Сравните точность и эффективность использованных методов интегриро- вания при разном числе узлов сетки. Заметим, что этот интеграл мож- но вычислить точно с помощью «одноточечной» квадратурной формулы Гаусса —Чебышева следующего вида: 1 J [1 “ x2j]/2f(x)dx = -1 при х = cos —-—тг; w = — охп — п + 1 п N + 1 N + 1 (См. разд.25.4.40 в работе [АЬ64].) lWn «Хп> П = 1 И П 8—1650
114 Глава 4 4.3. ПРИБЛИЖЕНИЕ БОРНА И ПРИБЛИЖЕНИЕ ЭЙКОНАЛА В КВАНТОВОЙ ТЕОРИИ РАССЕЯНИЯ В этом примере мы исследуем два приближенных метода, пригодных для описания процесса квантовомеханического рассеяния при высоких энер- гиях, в частности для расчета рассеяния на нейтральных атомах быс- трых электронов (с энергиями, большими нескольких десятков эВ). А в проекте, рассматриваемом далее в этой главе, мы будем иметь дело с точным решением этой же задачи в виде парциальных волн. Обширное изложение вопросов квантовой теории рассеяния дается во многих публикациях (см., например, в работах [Ме68], [Ne66] или [Wu62]). Здесь же мы даем лишь краткий обзор основных ее положений. Для частицы с массой т и энергией Е = — fc2 > О 2m рассеяние на центральном потенциале У(г) описывается волновой функ- цией Ф(г), удовлетворяющей уравнению Шрёдингера _ Lt ?2Ф + УФ = ЕФ (4.16) 2т со следующим граничным условием на больших расстояниях: Ф —> eikz + /(0) . (4.17) Здесь полагается, что исходное направление потока частиц совпадает с осью z, а 0—угол рассеяния (угол между г и z). Комплексная ам- плитуда рассеяния f характеризует наблюдаемые свойства рассеяния и является той основной функцией, которую мы будем стремиться найти. Дифференциальное сечение рассеяния при этом определяется как 7? = lf(0)|2. (4.18) аО. а полное сечение равно п <г = Г сК1 — = 2тг Г de sin 0 |f(0) I2. (4.19) J dQ J 0 В общем случае f зависит как от Е, так и от 0. Во многих элементарных трактовках процесса рассеяния в этом месте вводится разложение волновой функции Ф на парциальные волны, a f выражается в терминах фазовых сдвигов этих волн. После этого
Специальные функции и квадратурная формула Гаусса 115 для каждой волны выводится радиальное уравнение Шрёдингера, решая которое, можно найти фазовый сдвиг и потом вычислить точную величи- ну сечения. Этот путь более всего подходит, когда энергии малы и важен вклад лишь небольшого числа парциальных волн. Мы воспользуем- ся им ниже в проекте IV. В данном же примере будут рассмотрены две приближенные процедуры (борновское приближение и приближение эйко- нала), которые больше приспособлены для поиска решения в случаях больших энергий, когда играют роль вклады многих парциальных волн. Оба приближения основаны на точном интегральном выражении для амплитуды рассеяния (для его вывода необходимо более глубокое изу- чение проблемы): f(0) =----Г e~‘kf ГИ(г)Ф(г)Л. ' (4.20) 2nhz J Здесь |kfl : kf k, является волновым числом рассеянной частицы, так что a k^*z = cos 0. Удобно ввести также волновое, число и для падающей частицы k. = kz. Основная идея борцовского приближения (более точно, первого борновского приближения) заключена в предположении, что рассеяние является слабым, так что волновая функция полного рассеяния Ф мало отличается от плоской волны ~ exp(/kfT), соответствующей падающей частице. Сделав эту подстановку в (4.20), получим борновскую ампли- туду рассеяния Ы0) =--------^2 I e-‘4’rV(r)d3r = - -^2 J sin qr V(r) rdr. b 2nhz J qhz J 0 Здесь была введена величина переданного импульса q = k^ что q = | ke — k.| = 2£sin-!-0, f 1 2 и использовано тождество J e'^'dr = 4n/0(?r) = 4я . (4.21) k., так i (4.22) Обратите внимание, что амплитуда рассеяния в борновском приближении зависит только от q и не зависит отдельно от Е или 0. Подставляя в (4.20) более точное приближение Ф, естественно, получаем в результате и лучшую аппроксимацию амплитуды f. Одним из таких путей улучшения является так называемое приближение эйконала, верное для высоких энергий частиц и малых углов рассеяния. (См. ра- боты [Wa73] и [Ne66].) По своей природе это — квазиклассическое 8*
116 Глава 4 Рис.4.1. Геометрическая схема, поясняющая приближение эйконала. приближение. Суть его в предположении, что каждый из лучей падающей плоской волны, проходя по прямолинейной траектории область возмуща- ющего потенциала, набирает некоторый фазовый сдвиг (рис. 4.1). Так как этот сдвиг фазы зависит от прицельного расстояния луча (6), то после прохождения области поля волновой фронт результирующей волно- вой функции будет искажен. Именно в этом искажении и содержится ин- формация о рассеянии. Чтобы вывести формулу эйконального приближения, можно без поте- ри общности положить /к.* г Ф(г) = е 1 ф(г), (4.23) где ф — слабоменяющаяся функция, описывающая искажение падающей вол- ны. Подставляяя это выражение для волновой функции в исходное урав- нение Шрёдингера (4.16), получаем уравнение для ф: - — foik.-V + V2]0 + V<l> = 0. (4.24) 2т 1 1 J Если мы теперь предположим, что ф меняется столь медленно, что чле- ном V20 можно пренебречь (т.е. k очень велико), то получим h2 30(b,z) ik %- —------ = V(b, г)ф(Ъ, z). (4.25) т dz Здесь введена координата b в плоскости, перпендикулярной падающему лучу, так что V(b, z) = V(r)\ г = (b2 + z2}V2. Из соображений симметрии следует ожидать, что ф будет азимутально симметричной и поэтому не будет зависеть от Ь. Теперь уравнение (4.25) можно сразу интегрировать. Учтя граничное условие ф —» 1 при
Специальные функции и квадратурная формула Гаусса Л/7 z —> -со (нет искажения, если частица не проходила через область по- ля), получим ф(Ь, г) = е2да’г); х(Ь, г) =------J V(b, z')dz'. (4.26) -00 Установя вид волновой функции рассеянной частицы в приближении эйконала, можно записать выражение для амплитуды рассеяния f . Под- ставив (4.23) в (4.20), имеем f =------Г d2b Г dz e-^'rV(b, г)ф(Ь, z). (4.27) е 2nh J i -00 Используя (4.25), можно прямо связать Уф с дф/dz, Более того, если мы ограничим наше исследование относительно малыми углами рассея- ния, такими, что qz я 0, то интеграл по z в (4.27) можно легко вы- числить. Подставив ф из (4.26), получим = _ ХА е-'Ч-ЬрДО) _ (4.28) с некоторой «профильной» функцией x(b) = x(b, z = со) =----ф- J V(b, z)dz . (4.29) 2h k -i Поскольку % азимутально-симметрична, мы можем провести в (4.28) ин- тегрирование по углу и получим окончательное выражение для амплиту- ды рассеяния в приближении эйконала: fe = - ik J bdbJQ(qb) [е2да) - 1]. (4.30) 0 При выводе этого выражения использовалось тождество 2п Uqb) = -1 Г e~iqb ™*d<p и 2тг J о (ср. уравнение (4.22)). Заметим, что в протйвоположность борцовско- му приближению f здесь зависит как от Е (через k), так и от q. Важное свойство точной амплитуды рассеяния выражается оптичес- кой теоремой, связывающей полное сечение с мнимой частью амплитуды рассеяния вперед. Проведя некоторые алгебраические выкладки, можно показать, что f удовлетворяет этой теореме в предельном случае, когда импульс налетающей частицы является большим по сравнению с
118 Г лава 4 характерным масштабом, на котором изменяется потенциал: со <r = Imf(<7 = 0) = 8л Г bdb sin2%(6). (4.31) k 0 В борновском приближении нельзя получить амплитуду рассеяния, удов- летворяющую этому соотношению, поскольку из равенства (4.21) следу- ет, что fB является чисто действительной величиной. Также легко по- казать, что в пределе чрезвычайно высоких энергий, когда k —> со, а % становится малым, борновское и эйкональное приближения начинают совпадать (см. упражнение 4.5). Формулу (4.30) можно связать с обычным выражением для f через парциальные волны (см. упражнение 4.6). Одним из практических применений рассмотренных выше приближений является расчет рассеяния высокоэнергичных электронов на нейтраль- ных атомах. В общем случае это сложная задача о многоканальном рас- сеянии, так как процесс может включать реакции, в результате кото- рых в конечном состоянии оказываются возбужденные атомы. Но по- скольку вероятность реакций мала по сравнению с упругим рассеянием, для многих целей эта задача может моделироваться как рассеяние электронов на некотором центральном потенциале. Этот потенциал представляет комбинированное воздействие притяжения зарядом ядра (Z) и экранировки этого притяжения Z электронами, окружающими ядро. Для нейтрального атома указанный потенциал спадает на больших рас- стояниях быстрее 1/г. Очень точную аппроксимацию вида такого потен- циала можно получить, рассчитав его как самосогласованный хартри- фоковский потенциал нейтральной системы (это делалось ранее в про- екте III). Однако более простую оценку можно получить, используя приближение в рамках метода Томаса— Ферми, предложенное Ленцем и Йенсеном [Go49]: V = - е“*(1 + х + б/ + 63х3 + 64х4) (4.32а) С е2 = 14,409; Ь2 = 0,3344; Ь3 = 0,0485; i>4 = 2,647 -10’3; (4.326) х = 4,5397Z1/6r’/2. (4.32в) Здесь потенциал измеряется в электрон-вольтах, а радиус —в ангстре- мах. Отметим, что при работе с потенциалом этого вида возможны не- которые проблемы, связанные с его сингулярностью типа 1/г в начале координат, порождающей расходящееся выражение для % при 6 = 0. Од-
Специальные функции, и квадратурная формула Гаусса 119 нако если потенциал регуляризовать, положив его равным константе внутри некоторой сферы с малым радиусом rmin (скажем, внутри обо- лочки 1s), то это не повлияет на численные результаты по сечению, исключая случаи больших передач импульса, когда qr . » 1. Нашей целью будет расчет дифференциального и полного сечений в борновском и эйкональном приближениях для определенной энергии па- дающих частиц и заданного вида центрального потенциала, в частнос- ти потенциала (4.32). Чтобы сделать это, мы должны, вычислив инте- гралы (4.21), (4.29), (4.30), найти соответствующие амплитуды рас- сеяния, а затем рассчитать полное сечение, вычисляя интеграл (4.19). Программа примера 4, текст которой помещен в приложении Б, выполняет нужные расчеты и выводит их результаты в виде графика в полулогарифмическом масштабе. Вычисляется также полное сечение как следствие оптической теоремы (4.31). Считается, что налетающая частица имеет массу электрона и, как это принято для атомных систем, все длины измеряются в ангстремах, а энергии —в электрон-вольтах. Потенциал можно выбирать в виде пря- моугольной ямы радиусом 2А, гауссовской ямы V(r) = -V0e-2r2 или потенциала Ленца —Йенсена (4.32). Считается, что все они за пределами сферы радиуса 2А становятся равными нулю. Для потенциала Ленца —Йенсена расходимость типа г-1 обрезается внутри оболочки 1s атома-мишени. При высоких энергиях электронов, когда оба приближения начинают давать близкие результаты, дифференциальное сечение имеет резкий пик в исходном направлении движения электронов. Из-за этого инте- грирование по cos 0 в (4.19) разбито на два интервала для достиже- ния большей точности в области пика рассеяния вперед. Первый из них от 0 = 0 до 0 = ecuf где q .R . = 2п = 2kR . sin ^0 . , ^cut cut cut 2 cui a Rcui равно 1A для потенциала Ленца— Йенсена и 2А для потенциалов других типов. Второй интервал начинается с 0 = 0 и кончается 0. = и. Все перечисленные выше интегралы рассчитываются с помощью квадратурной формулы Гаусса —Лежандра с одинаковым числом узлов, а функция Бесселя нулевого порядка, входящая в (4.30), вычисляется по аппроксимационным формулам (4.4). Следующие упражнения помогут вам углубить понимание этой про- граммы и лежащих в ее основе физических закономерностей.
120 Глава 4 | Упражнение 4.5. Проверьте все приведенные выше алгебраические вы- кладки. Покажите, что в пределе очень больших энергий, когда % на- столько мало, что sin % » %, борновское и эйкональное приближения совпадают. Докажите также, что в приближении эйконала амплитуда рассеяния удовлетворяет оптической теореме (4.31) в предельном слу- чае, когда начальный импульс электрона велик по сравнению с харак- терным масштабом, на котором изменяется потенциал. | Упражнение 4.6. Покажите, что если обычное выражение для f как суммы парциальных волн (см. ниже (IV.4)) аппроксимировать интегра- лом по / (или по b = l/k, что эквивалентно), то в результате полу- чится формула (4.30), где значение %(6) будет определено как фазо- вой сдвиг При этом следует учесть, что при малых 0 и больших / P/COS0) « Jo(/0). Покажите численно или аналитически правильность этого соотношения между бесселевской функцией нулевого порядка и полиномами Лежандра. | Упражнение 4.7. Сравните результаты аналитического и численного расчетов сечения в борновском приближении для прямоугольного и га- уссовского потенциалов с глубиной ямы 20 эВ и начальной энергией электронов от 1 эВ до 10 кэВ. Убедитесь, что в этих случаях для %(6) программа дает ожидаемые значения. Исследуйте изменение чис- ленных результатов с изменением числа узлов в квадратурной формуле. (Обратите внимание, что в подпрограмме, генерирующей веса и абсцис- сы для формулы Гаусса—Лежандра, разрешены лишь вполне определенные значения для N.) | Упражнение 4.8. Установите глубину прямоугольной ямы, равной 20 эВ, и сделайте расчеты для различных значений энергии налетающих электронов, чтобы можно было почувствовать, как при этом меняются дифференциальное и полное сечения. Сопоставьте эти расчеты с сече- ниями для гауссовской потенциальной ямы сравнимой глубины и объяс- ните разницу. Покажите, что для потенциалов обоего вида при высоких энергиях борновское и эйкональное приближения дают согласующиеся результаты и что при более высоких энергиях соотношение оптической теоремы для приближения эйконала удовлетворяется лучше. | Упражнение 4.9. Для потенциала Ленца —Йенсена и фиксированных значений заряда и начальной энергии (скажем, Z = 50 и Е = 1 кэВ)
Специальные функции и квадратурная формула Гаусса[21 исследуйте чувствительность результатов расчетов к числу узлов в квадратурной формуле и параметрам регуляризации потенциала при ма- лых г. Рассчитайте сечения для различных значений Z в интервале от 20 до 100 и энергий от 10 эВ до 10 кэВ. Объясните характер наблюда- ющихся зависимостей. | Упражнение 4.10. Используйте программу проекта I для расчета классического дифференциального сечения рассеяния электронов на по- тенциале Ленца— Йенсена для различных значений Z и начальной энер- гии Е. Сравните эти результаты с сечениями в борновском приближении и приближении эйконала. Не могли бы вы установить в аналитическом виде связь между классическим описанием и квантовыми приближениями? (Детальное обсуждение этого вопроса см. в работе [Ne66].) ПРОЕКТ IV: РЕШЕНИЕ ЗАДАЧИ КВАНТОВОГО РАССЕЯНИЯ В ВИДЕ ПАРЦИАЛЬНЫХ ВОЛН В этом проекте мы используем метод парциальных волн для решения за- дачи квантового рассеяния частиц в центральном потенциальном поле и, в частности, рассмотрим рассеяние электронов низких энергий на нейтральных атомах. Основополагающая идея метода состоит в том, чтобы провести разложение волновой функции рассеянной частицы на парциальные волны и тем самым привести трехмерное уравнение Шрёдингера (4.16) к системе несвязанных одномерных дифференциальных уравнений для радиальных волновых функций. Каждое из них потом ре- шается как краевая задача для определения фазового сдвига и, следо- вательно, амплитуды рассеяния. IV. 1. Разложение волновой функции на парциальные волны Стандартным способом такого CO Ф(г) = I (2/ + 1=0 разложения волновой функции ф является , /3. R.(г) l)i е 1 —— Plcos 0). (IV. 1) kr Когда это разложение подставляется в уравнение Шрёдингера (4.16), получается набор дифференциальных уравнений, которым удовлетворяют радиальные волновые функции R‘ - — А + V(f) + +21)h2~ ^.(г) = 0- (IV.2) 2m dr 2mr 1
122 Глава 4 Это уравнение совпадает с уравнением для волновой функции связанно- го состояния, но граничные условия здесь иные. А именно, R = 0 в начале координат, а на больших расстояниях г имеет следующую асим- птотику: RL kr [cos - sin (IV.3) где jl и ^ — сферические функции Бесселя (см. упражнение 4.3). Амплитуда рассеяния f связана с фазовыми сдвигами соотно- шением 1 °° {(в) = - £ (2/ + Ue sin 3( P;(cos 0), (IV.4) k i-o а полное сечение легко затем находится по формуле (4.19) с учетом условия ортогональности полиномов Лежандра (4.10) <т = Ц £ (2/ + 1) sin26(. (IV.5) k 1=0 Хотя суммирование в (IV.4), (IV.5) проводится по всем /, реаль- но оно выполняется лишь для некоторого конечного числа парциальных волн. Это следствие того, что для больших значений / отталкивающий центробежный потенциал (IV.2) эффективно удерживает частицы за пре- делами области потенциала, и поэтому соответствующий им фазовый сдвиг очень мал. Если потенциал таков, что им можно пренебречь за пределами радиуса гтах> то оценку для самой высокочастотной волны ^тах можно получить, совместив точку поворота с этим радиусом. Тог- да / (/ + l)h2 max' max ’ _ г? что дает оценку I ~ kr Обычно она слегка занижена, так как J max max проникновение частиц под центробежным потенциальным барьером приво- дит к фазовым сдвигам, отличным от нуля для парциальных волн с большими номерами, чем 1тах- IV.2. Нахождение фазовых сдвигов Чтобы найти фазовый сдвиг для данной парциальной волны, мы должны
Специальные функции и квадратурная формула Гаусса 123 решить радиальное уравнение (IV.2), используя, например, обсуждав- шийся ранее метод Нумерова. Хотя граничные условия, определенные условием (IV.3) и нулевым значением R вначале, фиксированы в раз- ных точках, тем не менее мы можем решать эту задачу как задачу Ко- ши. Это следствие линейности уравнения, так что граничному условию при больших г можно удовлетворить просто соответствующей нормиров- кой решения. Если положить R(jr = 0) = 0 и взять для значения в следующем узле сетки R[r = h) любое подходящее достаточно малое число, то можно интегрировать уравнение по г до радиуса > rmax (рис. IV. 1). В общем случае R будет быстро нарастать вблизи центробежного барьера, так что мы должны опасаться аварийных остановов из-за пе- реполнения. В области за барьером V пренебрежимо мало и R должно быть линейной комбинацией решений для свободной частицы krj^kr) и krn^kr): R^ = Akr^ [cos - sin (IV.6) Константа А зависит от значения, выбранного для R(r = h), но это не имеет большого значения для наших целей. Тем не менее это значение должно выбираться настолько малым, чтобы избежать переполнения. Рис. IV. 1. Вверху: схема центробежного потенциала (штриховая кривая) и эффективный общий потенциал (сплошная кривая) для парциальной волны I > 0. Показаны также энергия падающей частицы (горизонталь- ная линия), область действия потенциала (г а ) и два соответствую- щих этой области значения радиуса, /^и Внизу: схематический вид волновой функции рассеянной частицы (сплошная линия) и сво- бодной волновой функции (штриховая кривая) для того же случая, что изображен вверху.
124 Глава 4 Зная лишь R^\ нельзя определить два неизвестных значения А и Но если мы продолжим интегрирование до еще большего значения радиуса № > то получим также Я<2) = Akr(2} [cos б,//*/2*) - sin 3(п((йг<2))]. (IV.7) Два уравнения (IV.6), (IV.7) можно решить относительно 6^. Выполнив некоторые преобразования, находим С/(1)_ /(2) Г(1)Л(2) tan 5' = G = (,v-8> где /*^= j^kr^) и т.д. Заметим, что это уравнение определяет 5^ только с точностью до слагаемого, кратного и. Впрочем, это не ока- зывает влияния на физически наблюдаемые величины (см. (IV.4), (IV.5)). Правильное число этих п для данной энергии можно опреде- лить путем сравнения числа узлов функции R и свободного решения krjt в области г < гтах- При обычных определениях, использованных и нами, фазовый сдвиг каждой парциальной волны становится равным нулю при высокой энергии частицы и приближается к N р. при нулевой энер- гии, где —число связанных состояний в данном потенциале для /-й парциальной волны. IV. 3. Решение уравнений Целью численного исследования этой задачи является изучение рассея- ния электронов с энергиями от 0,5 эВ до 10 кэВ на потенциале вида (4.32) при радиусе rmax - 2А. Для заданных значений заряда Z и энергии Е программа должна рассчитывать фазовый сдвиг и радиальную волновую функцию для каждой парциальной волны, вносящей заметный вклад в результат рассеяния. После этого все эти вклады суммируют- ся, чтобы найти полное сечение и дифференциальное сечение как функ- цию угла в интервале от 0 = 0 до 0 = 180°, скажем через 5°. Такую программу можно создать и работать с ней, последовательно выполняя следующие этапы. Шаг 1. Напишите подпрограмму, которая будет рассчитывать полиномы Лежандра требуемой степени для указанных значений урла и запоминать результаты в некотором массиве. (См. (4.1).) Напишите также подпро- грамму расчета ц и п[ для заданных значений х (см. упр.4.3). Про-
Специальные функции и квадратурная формула Гаусса 125 верьте правильность работы этих программ, сравнив их результаты с табличными значениями функций. Шаг 2. Напишите подпрограмму расчета фазового сдвига для определен- ной парциальной волны. Используя метод Нумерова, проинтегрируйте уравнение до радиусов и № и затем найдите величину сдвига по формулам (IV.8). Заметим, что если № слишком близко к то могут возникнуть некоторые проблемы с точностью результата (как числитель, так и знаменатель в (IV.8) будут весьма малы). Однако слишком большое расстояние между упомянутыми значениями радиуса также не оправданно, поскольку приводит к бессмысленной трате вы- числительных ресурсов. Убедитесь в том, что ваша программа работает правильно. Для этого проверьте, что рассчитанный фазовый сдвиг бу- дет пренебрежимо мал, когда V(r) становится равным нулю, и что он не зависит от выбора значений и при условии, что оба они больше rmax- Проверьте также, что найденные вами значения фазовых сдвигов для прямоугольной потенциальной ямы согласуются с их значе- ниями, полученными аналитическим расчетом. Отметим, что значитель- ная часть всех вычислений связана с расчетом потенциала Ленца — Йенсена (4.32). Поэтому выгоднее всего будет один раз рассчитать значения V во всех узлах сетки, запомнить их в массиве и использо- вать при интегрировании для всех парциальных волн. Шаг 3. Наконец, напишите главный блок программы, из которого при заданных значениях заряда и энергии вызываются написанные ранее подпрограммы и потом выполняется суммирование по всем парциальным волнам для расчета полного и дифференциального сечений. Заметим, что, поскольку язык Бейсик не поддерживает арифметику комплексных чисел, вам придется отдельно рассчитывать действительную и мнимую части амплитуды рассеяния. Убедитесь, что вы используете разумную оценку для lmax в том смысле, что все ненулевые сдвиги вычисляются (и в то же время нет бессмысленного счета) для парциальных волн с пренебрежимо малыми фазовыми сдвигами. Шаг 4. Изучите зависимость сечения от энергии частиц для нескольких значений Z, скажем для 20, 50 и 100. Покажите, что при низких энергиях на отдельных парциальных волнах возникают резонансы, что делает вид угловых распределений очень сложным, а полное сече- ние—чрезвычайно чувствительным к величине энергии электронов. Впрочем, при высоких энергиях все эти зависимости сглаживаются и
126 Глава 4 становятся монотонными. Таблицы экспериментальных данных, с которы- ми вы можете сравнить ваши расчеты, приведены в работе [Ki71]. Сравните также результаты, полученные вами для высоких энергий, с расчетами в борновском и эйкональном приближениях, выполненными с помощью программы примера из гл.III. Шаг 5. Чтобы понять наличие резонансов при низких энергиях, рас- смотрите рис.1У.2, на котором дана зависимость энергий слабосвязан- ных состояний в потенциале Ленца— Йенсена от величины заряда Z. Изучив сечение как функцию Z при фиксированной энергии Е = 5 эВ, покажите, что области вблизи Z = 46 и Z = 59 отражают расширение связанных состояний 2р и Id до континуума. Анализируя для Z = 59 характер зависимости сечения, углового распределения, фазовых сдви- гов и вида радиальной волновой функции от энергии вблизи Е = 5 эВ, покажите, что резонанс возникает действительно в парциальной волне с / = 2. Отметим, что поскольку потенциал Ленца— Йенсена основан на приближении Томаса —Ферми, то не следует ожидать для него особой точности в области вне атома. Поэтому найденные вами ширины резо- нансов и их энергии будут количественно отличаться от значений, из- меренных в экспериментах. Шаг 6. Используйте программу из проекта III для расчета вида потен- циала Ф в нейтральном атоме неона и модифицируйте вашу программу для расчета рассеяния электронов на таком потенциале. Обратите вни- мание, что,, если энергия налетающих электронов велика, они легко «отличимы» от электронов самого атома, и потому роль фоковского (обменного) потенциала будет мала. Сравните полученные в этом слу- чае результаты с расчетом для потенциала Ленца —Йенсена. Дальнейшее обсуждение проблем, связанных с рассеянием электронов на атомах, можно найти в работе [Во74]. 'is Op 2s lp0d3s 2p Id ks 3p Of 2d Рис.IV.2. Слабосвязанные уровни в потенциале Ленца —Йенсена. Штри- ховыми кривыми выделены уровни с отрицательной четностью (р и f).
5. ДЕЙСТВИЯ С МАТРИЦАМИ Линеаризация является распространенным допущением или приближением при описании физических явлений, поэтому системы Линейных уравнений возникают во многих разделах вычислительной физики. Действительно, матричные вычисления, связанные с нахождением собственных значений или решением системы линейных уравнений, часто составляют основную часть вычислительной работы при решении многих физических задач. В данной главе из большого числа матричных операций мы кратко рас- смотрим только две операции: обращение матрицы и приведение ее к диагональному виду. При рассмотрении этих вопросов ограничимся в основном «прямыми» методами, которые более эффективны для «запол- ненных» матриц (у которых большинство элементов отлично от нуля) и порядок которых не превышает нескольких сотен; итерационные методы, используемые для разреженных матриц, возникающих при дискретизации обыкновенных дифференциальных уравнений или уравнений в частных производных, будут рассматриваться в следующих двух главах. Как и для специальных функций, рассматривавшихся в предыдущей главе, для решения матричных задач на всех больших ЭВМ имеются библиотеки стандартных программ, в которых используются различные методы. По- этому в данной главе мы ограничимся несколькими основными методами, чтобы изложить их особенности. Более подробное обсуждение этих воп- росов можно найти в многочисленной литературе, например [Ас70] и [Ви81]. 5.1. ОБРАЩЕНИЕ МАТРИЦЫ Рассмотрим задачу об обращении квадратной (N х М)-матрицы А. Такая задача может встретиться, например, при решении системы линейных уравнений
128 Г лава 5 Ах = Ь (5-1) для неизвестного вектора х и заданного вектора Ь. Наиболее естест- венный путь решения этого матричного уравнения состоит в том, чтобы вспомнить элементарную алгебру и использовать правило Крамера, т.е. найти обратную матрицу А-1, все элементы которой пропорциональны элементам транспонированной матрицы, составленной из алгебраических дополнений к элементам матрицы А. Для нахождения алгебраических до- полнений мы должны будем вычислить N* определителей матриц (N - 1)-го порядка. Если проделать эти вычисления простейшим спосо- бом, при котором нам необходимо будет вычислить определитель detA £ ( 1) (5 2) Р матрицы А размером N х N, где Р—одна из М перестановок из N р бцов, Pi — 1-h элемент перестановки Р, а (-1)—четность переста- новки Р, то объем вычислений оказался бы ужасающе велик. Например, для вычисления выражения (5.2) требуется порядка М умножений. При N = 20 это составляет порядка 2 х 1018 умножений. Если использовать наиболее производительные современные компьютеры, способные выпол- нять до 108 умножений в секунду, то для обращения матрицы 20-го по- рядка потребуется около 103 лет! Очевидно, что этот способ вычисле- ния определителей (или обращения матриц, как мы видели) неприемлем. Одним из простейших практических методов вычисления обратной матрицы А-1 является метод Гаусса—Жордана. Идея этого метода сос- тоит в рассмотрении класса элементарных преобразований над строками матрицы А. Эти преобразования включают умножение строки на число, перестановку двух строк или сложение одной строки с другой, умно- женной на число. Каждая из этих трех операций может быть представ- лена умножением слева матрицы А на матрицу Т простого вида. Напри- мер, при N = 3 матрицы ’10 0' 0 1 о 0 0 2 (5.3) будут соответственно умножать третью строку на 2, менять местами первую и вторую строки и вычитать из третьей строки первую строку, умноженную на 1/2. Стратегия метода Гаусса—Жордана заключается в нахождении последовательности таких преобразований
Действия с матрицами 129 Т « • ’ ’ Т3Т2Т1 • которые, будучи примененными к матрице А, преобразуют ее к единич- ной матрице. Таким образом, ТА » (••• T3T2Tt)A - 1. (5.4) так что матрица Т = А"1 и есть искомая обратная матрица. Равносиль- но, что эта же последовательность преобразований, примененная к единичной матрице, дает в результате обратную матрицу А"\ Нахождение подходящей последовательности преобразований строк лучше всего показать на примере. Рассмотрим матрицу А 3-го порядка и единичную матрицу 12 1* 1 0 0 А х 4 2 2 ; I » 0 1 0 (5.5а) .241. .001. Сначала применим преобразование, обращающее в нуль все элементы первого столбца матрицы А, кроме первого. Умножение первой строки на 4 и вычитание ее из второй дает ’12 1' ’ 1 0 0 ' ТА = 0 -6 -2 ; TI = -4 1 0 , (5.56) .241. .001. а последующее умножение первой строки на 2 и вычитание ее из треть- ей дает '12 1' ’ 1 0 0 ' ТА » 0 -6 -2 ; TI « -4 1 0 (5,5в) .00-1. . -2 0 1 . Теперь мы хотим преобразовать второй столбец, в котором, умножая вторую строку на 1/3 и складывая ее с первой, мы можем обратить в нуль все элементы, кроме второго, • 1 0 1/3 ' •-1/3 1/3 0 ' ТА - 0 -6 -2 ; TI - -4 1 0 , (5.5г) о 0 -1 . . -2 0 1 . а умножение второй строки на —1/6 дает
130 Глава 5 ' 1 0 1/3 -1/3 1/3 0 ‘ ТА = 0 1 1/3 ; TI = 2/3 -1/6 0 (5.5д) 0 0 -1 . . -2 0 1 . Наконец, мы можем преобразовать третий столбец матрицы ТА к требуе- мому виду, умножая третью строку на 1/3 и складывая ее с первой и второй строкой, а затем умножив третью строку на -1: ' 1 0 0 ' -1 1/3 1/3 ' ТА = 0 1 0 ; TI = 0 -1/6 1/3 (5.5е) 0 0 1 . 2 0 -1 . В результате мы нашли обратную матрицу. Несложные рассуждения показывают, как этот алгоритм может быть обобщен для матрицы порядка N х N и что в этом случае для больших о W потребуется порядка W операций умножения и сложения. Таким обра- зом, данный алгоритм в вычислительном плане приемлем, пока W не слишком велико. В практических вычислениях возникает несколько тонких моментов, требующих пояснения. Например, может случиться так, что на каком-то шаге вычислений диагональный элемент матрицы ТА в преобразуемом столбце станет равным нулю. В этом случае перестановкой двух Строк мы получим отличный от нуля этот «ведущий» элемент (если никакой перестановкой строк этого нельзя сделать, то матрица А вырожден- ная). В действительности, точность вычислений требует перестановки строк с Целью постановки на место ведущего элемента в преобразуемом столбце элемента с наибольшей абсолютной величиной. Вопросы, свя- занные с ошибками округления, также могут возникать при обращении матриц, если элементы матрицы сильно различаются по величине. По- этому часто полезно масштабировать строки или столбцы так, чтобы все элементы имели одинаковый порядок величины («выравнивание»). В различных специальных случаях (например, когда матрица А симметри- ческая или когда мы хотим решить только уравнение (5.1) для задан- ного вектора b и нам не нужно вычислять обратную матрицу А”1) объем вычислений может быть уменьшен. Например, во втором случае мы можем применить матрицу Т только к вектору Ь, а не ко всей единичной мат- рице. Наконец, если мы хотим вычислить только значение определителя матрицы А, то последовательным преобразованием строк матрицы, влия- ние которых на определитель легко вычислить, можно привести матрицу ТА к нижне- или верхнедиагональному виду (все элементы равны нулю
Действия с матрицами 131 соответственно выше или ниже главной диагонали). После этого опре- делитель равен произведению диагональных элементов. | Упражнение 5.1. Используя уравнение (5.2), покажите, что переста- новка двух строк матрицы меняет знак ее определителя, умножение элементов одной строки на число и сложение ее с другой не меняет значение определителя, умножение одной строки на число умножает оп- ределитель на это же число. | Упражнение 5.2. Напишите программу (или только блок-схему), кото- рая будет использовать метод Гаусса—Жордана для нахождения обрат- ной матрицы. Включите в нее для повышения точности выбор ведущего элемента, как описано выше. 5.2. СОБСТВЕННЫЕ ЗНАЧЕНИЯ ТРЕХ ДИ АГОН АЛЬНОЙ МАТРИЦЫ Обратимся сейчас к задаче о нахождении собственных значений и соб- ственных векторов матрицы A N-ro порядка. Эта задача заключается в нахождении W чисел и соответствующих этим числам //-мерных векто- ров удовлетворяющих соотношению Ч = (5-6) Очевидно, что собственные значения являются нулями характеристичес- кого многочлена N-й степени матрицы А: РЛ(Х) = det(A - XI) = П (\ - А). (5.7) п= 1 Для простоты ограничимся рассмотрением только действительных и симметрических матриц А; при этом собственные значения всегда будут действительными числами, а собственные векторы можно выбрать орто- нормированными. Это наиболее общий тип матриц, возникающих при мо- делировании физических систем. Мы также рассмотрим только те слу- чаи, когда нам необходимо найти все или большое число собственных значений и, возможно, соответствующих им собственных векторов. Если же нам необходимо найти только несколько наименьших или наибольших собственных чисел матрицы А большого порядка, то в этом случае бо- лее эффективными могут оказаться итерационные методы, описанные в разд. 7.4. Общий подход при диагонализации матрицы состоит в сведении об- 9*
132 Глава 5 щей задачи к легкорешаемой задаче о нахождении собственных чисел и собственных векторов симметрической трехдиагональной матрицы, со- держащей ненулевые элементы только на трех главных диагоналях. Эту операцию всегда можно осуществить, применяя подходящую последова- тельность ортогональных преобразований к исходной матрице, как опи- сано в следующем разделе. Сейчас же мы предполагаем, что матрица А уже трехдиагональная, и рассмотрим алгоритм нахождения ее собствен- ных значений. Для нахождения собственных чисел симметрической трехдиагональ- ной матрицы мы должны найти корни характеристического многочлена (5.7). Этот многочлен выражается через элементы матрицы А с помощью определителя Лп А Л12 ^21 ^22 “ ^23 ^32 ^33 рАт = Л43 . (5.8) AN-\N-1 Л an-\n ANN-1 ANN " Л где все элементы, не указанные явно, равны нулю, а условие симмет- ричности матрицы А означает, что Апт = Атп. Для нахождения нулей многочлена можно использовать любой метод поиска корней из рас- смотренных в разд. 1.3 при условии, что мы можем вычислить значение РА при заданном значении Л. Алгоритм такого вычисления можно удобно записать с использованием рекурсии. Пусть Рл(Л)—значение определи- теля порядка п, составленного из первых п строк и столбцов опреде- лителя (5.8). Очевидно, что Р—многочлен д-й степени, Р к. = Р л — искомый многочлен и Р,(Х) = Ап - X; Р2(Х) = (А22 - Х)Р,(Х) - А*2 . (5.9) Кроме того, раскладывая определитель, соответствующий многочлену Р , на миноры л-го столбца, легко вывести рекуррентное соотношение Р№ = - Vpn-W - (51°) Это соотношение вместе с начальными значениями (5.9) позволяет нам легко вычислить многочлен РА.
Действия с матрицами 133 | Упражнение 5.3. Докажите соотношение (5.10). Некоторые особенности рассмотренной выше задачи значительно об- легчают поиск корней многочлена P# Если для поиска используется вариант метода Ньютона, то можно продифференцировать соотношение (5.10) по Л один или два раза и получить простые рекуррентные соот- ношения для первых и вторых производных многочлена РД(Л). Более то- го, можно показать, что число изменений знака в последовательности 1, Pt(A), Р2(Л), ••• , Рд/Л) равно числу собственных значений, не превышающих Л. Это свойство имеет несколько полезных следствий: оно дает уверенность в том, что при поиске собственных значений мы не пропустили ни одного корня, указывает простой способ начальной локализации корня; его можно ис- пользовать вместе с простым алгоритмом поиска корней для более точ- ной локализации корня, хотя, возможно, и не самым эффективным спо- собом. Для целенаправленного поиска всех собственных чисел (корней многочлена РА) важно определить начальную область поиска. В процес- се поиска, если мы нашли какое-то собственное число, то естественно взять в качестве приближения для следующего, большего по величине собственного числа только что найденное значение, увеличив его на некоторое число. Некоторые указания о нижней и верхней границах расположения собственных чисел можно получить с помощью границ Гершгорина. Несложно показать, что для всех п \ 2 т‘П {Л« " I (5.11а) й Что \ s max {л„ + (5.116) ‘ i*i Для рассматриваемых нами трехдиагональных матриц суммы по индексу / в этих выражениях содержат только два члена. Нижняя граница (соот- ношение (5.11а))—хорошее начальное приближение для поиска наимень- шего собственного значения, а расстояние между верхней и нижней границами дает оценку для среднего расстояния между собственными числами. | Упражнение 5.4. Напишите подпрограмму нахождения всех собственных
134 Глава 5 чисел трехдиагональной матрицы, используя описанную выше процедуру вместе с любым из алгоритмов поиска корней. Проверьте вашу подпро- грамму на трехдиагональной N х jV-матрице следующего вида: А = -2; А . = А 1 = +1, пп пп-1 п-1п ’ собственные числа которой известны аналитически и равны 5.3. ПРИВЕДЕНИЕ МАТРИЦЫ К ТРЕХДИАГОНАЛЬНОМУ ВИДУ Чтобы использовать метод поиска собственных чисел, описанный в пре- дыдущем разделе, мы должны преобразовать действительную симметри- ческую матрицу А общего вида к трехдиагональной матрице, т.е. мы должны найти ортогональную N х jV-матрицу О, удовлетворяющую соотно- шению о’о = 00* = I, (5.12) где О* —транспонированная матрица, такая, что матрица 0*А0 трехдиа- гональна. Элементарное рассмотрение методами линейной алгебры пока- зывает, что собственные числа преобразованной и исходной матриц совпадают. Задача, естественно, состоит в нахождении точного вида матрицы О для любой заданной матрицы А. В этом разделе мы рассмот- рим два метода, осуществляющие такое преобразование. Один из этих методов —метод Хаусхолдера. В этом методе матрица О представляется в виде произведения N - 2 ортогональных матриц О = 0,02 • • • 0^2 , (5.13) каждая из которых последовательно преобразует одну строку и один столбец матрицы А к требуемому виду. (Необходимо только N - 2 пре- образования, так как последние две строки и два столбца уже имеют трехдиагональный вид.) Для нахождения каждой из матриц Оп можно ис- пользовать простой метод. Для того чтобы метод Хаусхолдера стал более понятным, найдем первое ортогональное преобразование Ор которое мы выберем так, чтобы большинство элементов первой строки и первого столбца матрицы А стали равны нулю, т.е.
Действия с матрицами 135 о{ао, = Л11 fe(’) 0 Р1) д(2) Л22 л (2) Л32 0 л (2) Л23 л(2) лзз 0 ... л(2) Я2М ... л(2) ЯЗМ (5.14) 0 л (2) ЛМ2 д(2) ... л(2) J Здесь — элемент, возможно । не равный нулю, а матрица А^ — ре- зультат применения преобразования Oj к последним ( W - 1) строкам и столбцам исходной матрицы А. Если матрица Oj уже найдена и примене- на к матрице А (выбор матрицы О1 будет рассмотрен ниже), то мы мо- жем теперь выбрать матрицу О2, которая окажет на матрицу А^ ана- логичное преобразование —обратит в нуль большинство элементов пер- вой строки и первого столбца этой матрицы и преобразует ее послед- ние N - 2 строки и столбца: Г а(2) Л22 № 0 0 № Я33 л(3) . Л34 .. л(3) лзм °2А<2)°2 = 0 л(3) Я43 д<3) • 44 •• А<3> Л4М (5.15) 0 л(3) ^3 л(3) . ЛМ4 .. л(3) *nn Продолжая применять эти ортогональные преобразования с уменьшающей- ся размерностью, мы в итоге после N - 2 преобразований приведем ис- ходную матрицу к трехдиагональному виду. При этом диагональные эле- менты преобразованной матрицы будут равны , ^22 , ^33 , ...» } , а внедиагональные — Осталось, естественно, найти точный вид каждой из матриц О^. Эту процедуру мы покажем на примере матрицы которую выберем в следующем виде: 1 о О = о* р (5.16)
Глава 5 136 где О—(ДО - 1)-мерный вектор-столбец, состоящий из нулей, 0*— ана- логичный вектор-строка, а Р—симметрическая матрица размером (ДО - 1)х(ДО * 1), удовлетворяющая условию Р8 - I. (5.17) если матрица О должна быть ортогональной. (В этих и последующих вы- ражениях мы для простоты опускаем все верхние и нижние индексы, указывающие на то, что это — первое ортогональное преобразование из рассматриваемой нами последовательности (5.13).) Матрицу Р, удов- летворяющую условию (5.17), выберем в виде Р > I - 2uu‘. (5.18) В этом выражении I—единичная матрица порядка (ДО - 1), и — (ДО - 1)-мерный единичный вектор, удовлетворяющий условию u’u « 1, (5.19) а последний член есть прямое (внешнее) произведение вектора и на самого себя. Каждый элемент соотношения (5.18) поэтому читается как пт пт п т где индексы п и т изменяются от 1 до ДО - 1. (Не должно вызывать ни- какого недоразумения то, что индексы для Р и и изменяются от 1 до ДО - 1, тогда как эти же индексы для матриц О и А изменяются от 1 до ДО.) После применения преобразования (5.16) матрица А становится равной (rtp о‘ао = РЙ (5.20) где мы определили (N - 1)-мерный вектор Й, состоящий из всех, за исключением первого, элементов первого столбца матрицы А, т.е. а. = ® где * изменяется от 1 до ДО - 1. При сравнении (5.20) с требуемым видом (5.14) очевидно, что действие матрицы Р на этот вектор должно давать РЙ = Й - 2u(t? Й) » к, (5*1) где к —вектор: к = [*, 0. О, ••• , 0]‘.
Действия с матрицами/37 Уравнение (5.21) и есть то уравнение, которое мы должны решить для нахождения вектора и и, следовательно, искомого преобразования Р. Для этого мы должны сначала найти скаляр k, что легко сделать, взяв скалярное произведение от обеих частей уравнения (5.21) на их транспонированные величины и использовав условие идемпотентности матрицы Р: k*k = k2 = (РЙ)\рЙ) = Й 2 а2 = [ , (5.22) <-2 откуда k = ±а. Найдя вектор к (выбор знака мы обсудим чуть позже), мы можем затем переписать уравнение (5.21) в виде 2 - к = 2и(и*Й). (5.23) Умножая скалярно обе части этого уравнения сами на себя, используя соотношение Й*к = ±Л21а и уравнение (5.22), получаем 2(u‘ot)2 = (а2 + Л21а), (5.24) и в результате мы можем разрешить (5.21) относительно и: На этом заканчиваются операции, необходимые для нахождения мат- рицы Р. Если вернуться к началу, мы должны выполнить следующие дей- ствия: сначала решить (5.22) и найти Л, затем вычислить КВйДрёТ скалярного произведения (5.24), получить вектор и согласно (1Ш) и, наконец, матрицу Р в соответствий с (S.tfc). При вЫчй&гё№Я (5.24) из условия численной устойчивости желательно ВъгёратЬ знак, при котором правая часть максимальна. Заметим, Ито, пОСкОЛЬй'у вектор и входит в Р квадратично, мы должна вЫЧйсЛйть тоЛькЬ йЫНфАТ скалярного произведения. Отметим также, что вычислении 1ft необходимости перемножать матрицы. Действительно» Из 0.W, N) Шй имеем А(>) = (1 - 2ui?)A(1 - 2«и*) = = А - 2u(Au)* - 2(Au)u* + 4u»l(u*Au), (5;1И) где А в данном выражений обозначает квадратную симметрическую Мат- рицу, составленную из последних N - 1 строк и столбцов исходной матрицы. Таким образом, если найден вектор и, то для определения необходимо вычислить только вектор Au и скаляр ufAu. Наконец,
138 Г лава 5 отметим, что устойчивость вычислений при последовательных преобра- зованиях улучшается, если наибольший по абсолютной величине диаго- нальный элемент находится в верхнем левом углу преобразуемой под- матрицы. Это условие всегда можно выполнить соответствующей пере- становкой строк и столбцов (не меняющей собственных значений) после каждого ортогонального преобразования. | Упражнение 5.5. Написав подробную блок-схему или работающую под- программу, убедитесь в том, что вы понимаете рассмотренный выше ал- горитм Хаусхолдера. Узнав алгоритм преобразования матрицы А к трехдиагональному ви- ду, мы тем самым полностью решим задачу о нахождении собственных значений действительной симметрической матрицы. Если эти значения известны, то нахождение собственных векторов—относительно простая задача. Для этого можно выбрать метод обратной итерации, заключаю- щийся в следующем. Пусть ^^ — произвольное начальное приближение для собственного вектора, соответствующего собственному числу Х^. Это приближение можно улучшить, вычисляя следующее по формуле %2) = [А - (Лп + е)1]-’ (5.27) Здесь е —малая величина, введение которой позволяет обратить мат- рицу. Легко видеть, что эта операция усиливает компоненту в направлении искомого вектора по сравнению с другими компонентами. Нормируя вектор и повторяя улучшение в соответствии с (5.27), получаем быструю сходимость к искомому собственному вектору. При этом часто достаточно только двух итераций. Альтернативой методу Хаусхолдера является метод Ланцоша, кото- рый наиболее удобен, когда необходимо найти только несколько наи- меньших собственных значений матриц очень высокого порядка. Идея этого метода заключается в построении итерационным путем набора ор- тонормированных базисных векторов {Фп}> в котором матрица А являет- ся трехдиагональной. Построение начинается с выбора произвольного начального вектора ф^ нормированного условием ф^ = 1. Затем на- ходится второй вектор базиса по формуле 02 = C2(A0j - А/р, (5.28) Л где = ф^Аф^ (А^ не есть элемент первой строки и первого стол- бца А), а С2 —константа нормировки, обеспечивающая выполнение уело-
Действия с матрицами 139 ВИЯ = 1: С2 = [(А^)‘(А^,) - (Ап)2Г,/2 (5.29) Легко показать, что ф^ф} = 0. Последующие векторы базиса строятся по рекуррентной формуле ф , = С ААф - А ф - А .ф J, (5.30) гп+1 п+г Kn nivn пп-v п-1' ' ' где Сп+1 = [(А^)‘(А^п) - (Апп)2 - (Апп^Г^. (5.31) Таким образом, каждый последующий вектор фп+^ является единичным вектором, связан с фп посредством матрицы А и ортогонален как век- тору фп так и Фп_у В этом базисе матрица А имеет явный трехдиаго- нальный вид, так как согласно уравнению (5.30) действие А на вектор Фп дает слагаемые, пропорциональные только фп, ф^ и фп+г Получе- ние вектора ф^ завершает построение базиса и представление матрицы А в нем. Метод Ланцоша очень удобен для больших матриц, так как он тре- бует только умножения матриц на вектор, и в каждый момент времени необходимо хранить только векторы фп, фп } и Афп. При выборе векто- ра ф^ мы должны следить за тем, чтобы он не оказался собственным вектором матрицы А. Тем не менее метод Ланцоша неприменим для на- хождения всех собственных значений матрицы высокого порядка, так как рекуррентная процедура построения базиса ведет к накоплению ошибок округления, и в результате скалярные произведения базисных векторов с большими и малыми значениями п не будут в точности равны нулю. Метод Ланцоша действительно полезен, когда необходимо найти не все собственные значения, а только несколько из них. Пусть, напри- мер, требуется найти 10 наименьших собственных значений матрицы 1000-го порядка. Для этого необходимо сгенерировать рекурсивно не- которое количество базисных векторов и построить базис с размер- ностью, превышающей число искомых собственных значений (например, 25), а затем найти 10 наименьших собственных значений и соответст- вующих им собственных векторов этой укороченной подматрицы. Если затем составить произвольную линейную комбинацию (например, сумму) из этих собственных векторов и использовать ее в качестве начально-
140 Г лава 5 го вектора при построении нового базиса с размерностью 25, то можно показать, что такой итерационный процесс (генерация конечного бази- са, диагонализация соответствующей трехдиагональной матрицы и ис- пользование нормированной суммы собственных векторов в качестве на- чального вектора для следующего базиса) будет сходиться к искомым собственным значениям и собственным векторам. | Упражнение 5.6. Напишите подпрограмму, использующую метод Ланцоша для генерации полного базиса, в котором исходная симметрическая матрица А является трехдиагональной. Программа должна выдавать диа- гональные и внедиагональные элементы А в этом базисе, а также сами базисные векторы. Покажите на убедительном примере, что если размер матрицы слишком большой, то ошибки округления приводят к ошибкам в базисных векторах. Постарайтесь устранить эту проблему, проводя вы- числения с двойной точностью, и посмотрите, что получается. | Упражнение 5.7. Простой предельный вариант метода Ланцоша получа- ется, когда мы ищем только наименьшее собственное значение и удер- живаем в базисе только векторы и для получения матрицы разме- ром 2x2 и ее диагонализации. Покажите, что меньшее собственное значение этой матрицы всегда меньше или равно А^, так что итераци- онная Процедура ведет к монотонному уменьшению оценки для наимень- шего собственного числа матрицы А. Эта процедура тесно связана с нестационарным алгоритмом, который обсуждается в разД.7Л 5.4. РАСПРЕДЕЛЕНИЕ ПЛОТНОСТИ ЭЛЕКТРИЧЕСКОГО ЗАРЯДА В АТОМНОМ ЯДРЕ Распределение плотности электрического заряда внутри атомного ядра является одним на основных вопросов структуры ядерной матерние Для ияяеждепия этого распределения с большой точностью можно использо- вать взаимодействие электронов и мюонов с ядром; поскольку эти час- ти ЦЫ взаимодействуют почти исключительно посредством хорошо изучен- ного электромагнитного взаимодействия (обсуждение общих вопросов см. в работе [Fo66]). В данном примере МЫ исследуем вопрос, как на основе анализа экспериментальных данных по сечениям упругого рассе- яния быстрых (несколько сотен Мэв) электронов на ядрах можно опре- делить распределение электрического заряда в ядре; метод основан на решении системы линейных уравнений обращением матрицы.
Действия с матрицами__________________________________________________[4£ Чтобы проиллюстрировать основные понятия, рассмотрим сначала процесс рассеяния нерелятивистских электронов с импульсом k и энер- гией Е на неподвижном локализованном распределении электрического заряда р(г), содержащем Z протонов, так что J dr p(r) = 2. (5.32) Электроны взаимодействуют с этим распределенном зарядом через куло- новский потенциал У(г) этого заряда, удовлетворяющий уравнению Пу- ассона V2V = 4пар, (5.33) где а = 1/137,036—постоянная тонкой структуры. .(В дальнейшем, если это не указано явно, мы будем работать в единицах, в которых h = с = 1. Отметим, что he « 197,329 МэВ'ферми.) Каким образом из сечения рассеяния электронов можно получить информацию о распределении заряда, мы рассмотрели в предыдущей гла- ве в рамках борновского приближения для квантовой задачи рассеяния, хотя, чтобы улучшить результаты, необходимо уточнить описание рас- сеяния. Из уравнений (4.18), (4.21) видно, что в борновском прибли- жении сечение рассеяния на угол в пропорционально квадрату фурье- компоненты потенциала с вектором столкновения q (вектором передачи импульса), где q = 2k sin6/2. Применяя преобразование Фурье к урав- нению (5.33), получаем V(q) = - ^ Р(ч). (5.34) Я где p(q) = J dr e-‘4’rp(r) (5.35) — преобразование Фурье от плотности заряда. Таким образом, диффе- ренциальное сечение можно записать в следующем виде (мы для крат- кости используем обозначение о* вместо dtr/cKl): (5.36) В этом выражении используется формула Резерфорда для рассеяния на точечном заряде величиной Z: где т —масса электрона, а ядерный «формфактор> f(q) = Z’^p(q) учи-
142 Глава 5 тывает пространственное распределение рассеивающего заряда. Мы бу- дем рассматривать только такие ядра, спин которых равен 0 (четно- четные) ядра. В таких ядрах распределение плотности заряда имеет сферическую симметрию, поэтому р(г) = р(г) и со F(q) = F(q) = Г drr sin qr p(r). Zq J 0 (5.38) Уравнение (5.36) показывает, как можно использовать рассеяние электронов для изучения структуры ядра. Отличие экспериментальных сечений 6т сечений, вычисленных по формуле Резерфорда, непосредст- венно даёт величину фурье-компоненты плотности заряда ядра. Видно также, что для хорошего пространственного разрешения необходимо изучать рассеяние с большими значениями переданного импульса. По- скольку характерный размер ядер составляет несколько ферми (10”13 см), желательно иметь пространственное разрешение менее 1 ферми. Для этого необходимо, чтобы величина переданного импульса составляла несколько ферми”1, что соответствует энергии пучков в несколько сотен МэВ. (Вспомним, что 2k — максимальная величина им- пульса, передаваемого мишени, которую можно получить в пучке с им- пульсом k.) При таких энергиях электрон становится существенно релятивист- ским (масса электрона составляет всего 0,511 МэВ) и все проделанные выкладки необходимо выполнить снова, взяв за исходное не уравнение Шрёдингера, а уравнение Дирака. Окончательные выражения при этом изменятся. Одно тривиальное изменение обусловлено тем, что в ульт- рарелятивистском случае импульс электрона пропорционален его энер- гии, поэтому величину переданного импульса можно записать в следую- щем виде: q = 2Е sin 0/2. (5.39) Другое изменение касается уравнения (5.36), в котором резерфордов- ское сечение заменяется на сечение Мотта о- = <rM| F(q) I2; <rM = 4Z2a2£2cos2e/2 _ (5.40) где в амплитуде рассеяния появляется дополнительный множитель cos0/2, обусловленный природой электрона, имеющего спин -1/2. Рассмотрим теперь, как из измеренных сечений извлечь информацию о расп|№Лёлении плотности заряда. Предположим, что у иас имеется набор Йз / экспериментальных значений для сечений упругого рассея-
Действия с матрицами 143 ния электронов на конкретном атоме при различных значениях передан- ного импульса (например, угловое распределение при одной или нес- кольких энергиях пучка). Обозначим эти экспериментальные значения через (Уе., а их статистические ошибки—через Предположим также, что мы каким-либо образом параметризовали функцию распределения за- ряда в ядре набором из N параметров С^, так что р(г) = р(г\{С^). Конечно, все эти параметры Сп должны выбираться так, чтобы выполня- лось условие нормировки (5.32) со Z({Cn}) Е 4я J г2р(г,{Сп}) = Z. (5.41) О Конкретный вид этих параметрических зависимостей мы рассмотрим нес- колько позже. В стандартных методах обработки результатов наблюдений [Ве69] показывается, что для конкретного набора экспериментальных данных «наилучшими» значениями параметров будут такие, которые минимизиру- ют сумму Дополнительно на параметры налагается связь в виде условия норми- ровки (5.41). Здесь (/—«теоретические» сечения, вычисленные по формуле Мотта и соответствующим значениям ядерного формфактора; эти сечения зависят от параметров С. Минимальное значение %2 является мерой качества подгонки, приемлемое значение приблизительно равно числу степеней свободы (разности между числом экспериментальных то- чек и числом параметров). Существует несколько численных методов для нахождения парамет- 9 ров, минимизирующих функцию х » или, что равносильно, удовлетворяю- щих системе из N нелинейных уравнений = 0. (5.43) ас п В данном случае мы имеем конкретный пример широкораспространенной задачи о минимизации нелинейной функции, зависящей от нескольких параметров. При решении этой задачи мы встречаемся с рядом труднос- тей [Ас70], не последняя из которых состоит в том, что вместо гло- бального минимума мы можем попасть в локальный. Большинство методов основано на последовательном улучшении «начального приближения» для оптимального набора параметров Сп, и если Это приближение выбрано
144 Глава 5 достаточно близким к искомому* решению, то, как правило, никаких за- труднений не возникает. Один из распространенных методов (метод градиентного спуска) состоит в том, что численно или аналитически вычисляется направление ^мерного вектора градиента (левой части (5.43)) в точке, соответствующей текущему приближению. Затем для получения следующего приближения делается небольшой шаг в С-прост- ранстве в направлении, противоположном градиенту. Примером другого метода может служить обобщение метода Ньютона — Рафсона (уравнение (1.14)) иа многомерный случай. Для наших целей мы выберем простой подход, основывающийся на локальной линеарнзации функции X2 в точ- ке, соответствующей текущему приближению (А Для малых отклонений С от этой точки С = С° + 5С п п п теоретические сечения можно разложить в ряд, ограничившись линейны- ми членами: = <г° + Г Г.ЗС . W. я —! . I I L (Л п in QC Л" 1 п Подставляя эти выражения в формулу для %2 (5.42), получаем 1 N х2 = £ (о* - о» - [ %5Сп)2/Д2 , (5.44) Z-1 ”ж1 где теоретические сечения, соответствующие текущему приближению С°. Аналогично можно линеаризовать и условие нормировки (5.41) ’ Z + I «Сп • (5.45) л-1 0Сл где мы предположили, что текущее приближение уже соответствующим образом нормировано и 2({С^}) ж Z, Система уравнений для отклонений 8СД, при которых функция X2 стационарна, может быть получена, еслн потребовать выполнения усло- вий (Z2 - 2AZ) х 0. dSC п (5.46) Здесь мы ввели множитель Лагранжа 2А, чтобы обеспечить условие нор- мировки. Подставляя выражения (5.44), (5.45) в (5.46), с помощью простых преобразований получаем систему линейных уравнений N У а 6С - —X = b , (5.47а) пт т qq л ' 1 т» 1 л
Действия с матрицами 145 N у 3.L \ дС т= 1 т 6С = 0, т (5.476) где •сС Е сч е < В*"* KI 7 II Е с 1 (ore-o°.)W. _ V ' < г in .L1 д2 I = 1 I (5.48) При заданных можно решить систему (5.47) и определить поп- равки 5Сп, которые будут уменьшать функцию X2» если при этом спра- ведливо приближение линеаризации. Новые улучшенные значения затем можно использовать в качестве следующего приближения, повторяя этот процесс до тех пор, пока х2 не придет к минимуму. Для решения сис- темы (5.47) удобно определить (N + 1) х (W + 1)-матрицу с элемента- ми Апт = Атп = апт ’ ^п.ЛМ = AN+\,n = ’ ^ЛМ.ЛМ = 0 (5.49а) и (W + 1)-мерный вектор Вп=Ьп> Vl = 0- <5-496) (В этих выражениях индексы тип изменяются от 1 до 7V.) В результа- те систему уравнений (5.47) можно записать в следующем виде: W+1 I • (5.50) пт т п ' 7 т= 1 Эта система решается достаточно просто обращением симметрической матрицы А, и мы получаем Л/+1 W 8С = У Л"1 S = У Л’1 b . (5.51) п L пт т L. пт т ' ' т= 1 т=1 После того как описанный выше процесс сойдется к оптимальным значениям С , можно исследовать точность, с которой определены эти параметры. Эту точность можно связать с элементами введенной выше матрицы следующим образом. Рассмотрим совокупность (ансамбль) набо- ров данных, в которых каждое экспериментальное сечение флуктуирует независимо относительно своего среднего значения, т.е. <5< 8<г‘> = Д23.. , (5.52) где <•••> обозначает усреднение по ансамблю, а —отклонение ае. от среднего значения. Эти флуктуации приводят к флуктуациям пара- 10
146 Г лава 5 метров Сп относительно их оптимальных значений. Поскольку коэффици- енты Ьп и экспериментальные сечения связаны линейным соотношением (5.48), флуктуации параметров Сп на основании (5.51) равны N , N , 1 8ve,W. SC = Г /Г 8Ь = У Д’1 У —. (5.53) п L, пт т L, пт L, д 2 ' 7 т= 1 т= 1 i = 1 i Применяя это уравнение дважды (для и 5С^) и усредняя по ансамб- лю, после несложных преобразований получаем <ЗС ЗС > = Д’1 . (5.54) п т пт ' 7 Ошибки в определении параметров плотности можно преобразовать в коррелированные ошибки самой плотности, которые имеют более нагляд- ный физический смысл. Если разложить параметрическую функцию плот- ности при найденных оптимальных параметрах в точках г и г', то для коррелированных ошибок плотности получаем N N <др(Г)8р(г')> = У У ^£11 <ЗСпЗСт>. (5.55) . . ОС ОС п = 1 т=1 п т 1/2 Величину <др(г)др(г')> можно взять в качестве меры точности, с которой определена функция р(г), хотя следует помнить, что ошибки в плотности, вычисленные в разных точках, связаны соотношением (5.55). Обсудим теперь вид параметрической зависимости р(г). Из общих соображений (например, считая, что ядро можно рассматривать как компактное образование с резко выраженной границей или как несжима- емую жидкую каплю) можно предположить, что во внутренней области ядра плотность заряда распределена довольно однородно и уменьшает- ся до нуля в относительно тонком поверхностном слое. Такая картина хорошо подтверждается ранними экспериментами по рассеянию электро- нов [Но57], хотя в этих экспериментах диапазон измерений- был огра- ничен величиной переданного импульса ~ 1,5 ферми-1, которой едва хватает, чтобы увидеть поверхность ядра. Поэтому эти эксперименты могли дать только ограниченную информацию. Было найдено, что рас- пределение плотности удовлетворительно описывается функцией Ферми Ро Р(И = ------• <5-56) 1 + е и зависящей только от трех параметров и приведенной на рис.5.1. По- скольку оказалось, что 4,4/?Q// » 1, параметр pQ определяет плот-
Действия с матрицами 147 ность в центре ядра (т.е. р(г = 0)), параметр R$ — радиус* на кото- ром плотность уменьшается до половины своего значения в центре, а Рис.5.1. Параметризация функции Ферми для плотности заряда ядра. Плотность уменьшается до половины своего значения в центре на ради- усе /?0; / — расстояние, на котором плотность уменьшается от 90 до 10% от значения в центре [Но57]. /, толщина оболочки,—расстояние, на котором происходит падение плотности до нуля. Естественно, что эти три параметра не являются независимыми, а связаны между собой условием нормировки (5.32). Си- стематические исследования по рассеянию электронов на различных яд- рах показали, что удовлетворительное согласие наблюдается при зна- чениях параметров t = 2,4 и R$ = 1,07 Л1/3 ферми, где Л —число нук- лонов в ядре. В более поздних экспериментах по рассеянию электронов использо- вались пучки с более высокой энергией, расширяющие диапазон значе- ний переданного импульса приблизительно до 4 ферми”1. Типичный при- мер диапазона и качества экспериментальных данных приведен на рис. 5.2. Наличие таких данных привело к появлению ряда «модельно-неза- висимых» расчетов [Fr75], в которых применялись очень гибкие пара- метрические зависимости для заряда. В одной из этих работ [Si74] плотность заряда представляется в виде суммы нескольких (порядка 10) функций Гаусса и для наилучшего совпадения с данными подстраи- вается положение каждой гауссоиды и заряд, который она содержит. В другой работе [Fr73], которой мы будем здесь следовать, предполага- ется, что при г < R, где R выбирается значительно ббльшим размера К)
148 Глава 5 ядра /?0» плотность равна нулю. Для внутренней области используется разложение в конечный ряд Фурье. Таким образом, при г < R гр(г) = (5.57) а при г > R положим р(г) = 0. Подставляя разложение (5.57) в (5.32) и (5.38) и выполняя преобразования, получаем N п+1 Z({Cn}) = 4/?2 £ Сп , (5.58) п= 1 Рис.5.2. Экспериментальные сечения упругого рассеяния электронов ( энергией 449,8 МэВ на ядрах 58Ni [Са80].
Действия с матрицами 149 Эти выражения совместно с уравнениями (5.38), (5.40) позволяют получить аналитические выражения для W. и использовать их в рас- 2 смотренной выше процедуре минимизации х • Полезно отметить, что вклад л-го члена ряда Фурье для плотности в формфактор имеет макси- мум вблизи qn = nit/R. Следовательно, оставляя в разложении W чле- нов, мы получаем некоторый контроль над компонентами Фурье с q, превышающими qN = Nu/R. Это максимальное волновое число, содержаще- еся в параметризации, должно быть соизмеримо с максимальной величи- ной переданного импульса qmax> имеющейся в экспериментальных дан- ных. Если qN < Ятах, то данные с большими переданными импульсами будут описаны недостаточно хорошо, а если qN > qmax, то при проце- дуре подгонки недостаточно точно будут определены те параметры С^, для которых п > 9тахК/к- Обсудим теперь адекватность борновского приближения для описа- ния экспериментальных данных. Для предполагаемых профилей распреде- ления заряда (близких к показанной на рис.5.1) наличие относительно резко выделенной ядерной поверхности вызывает появление нулей в формфакторе F(q). Таким образом, при некоторых значениях переданно- го импульса (или, что то же самое, углов рассеяния) борновская ам- плитуда рассеяния становится равной нулю. При этих значениях q ста- новятся относительно более важными поправки, связанные с искажением плоской волны налетающего электрона кулоновским потенциалом ядра, так что на экспериментальных зависимостях эти нули в значительной степени заполнены данными, часто настолько, что от них остаются лишь уступы на быстро спадающей зависимости сечения от q (см. рис. 5.2). Поэтому точное определение ядерной плотности заряда по измеренным сечениям требует и более детального описания процесса рассеяния электронов на кулоновском потенциале. Строгое решение этой задачи включает решение уравнения Дирака для электрона в кулоновском потенциале от предполагаемого распреде- ления заряда [Ye54, Fr73]. Последовательность решения в этом случае очень похожа на ту, которая была проделана в проекте IV: разложение по парциальным волнам, решение радиального уравнения для каждой парциальной волны и определение фазового сдвига, затем суммирование по всем парциальным волнам и определение амплитуды рассеяния для различных углов рассеяния. Хотя в принципе такие расчеты вполне возможны, они все же слишком трудоемки для небольшого компьютера. Тем не менее и при разумном объеме вычислений приближение эйконала может оказаться достаточно точным.
150 Глава 5 Как уже было сказано, окончательные выражения для рассеяния ультрарелятивистских электронов на распределенном заряде в прибли- жении эйконала очень похожи на выражения, полученные в разд.4.3 [Ва64]. Сечение рассеяния связано с комплексной амплитудой рассея- ния f соотношением с* = cos20/2|f I2, (5.60) а сама амплитуда рассеяния выражается с помощью преобразования Фу- рье-Бесселя (ср. уравнение (4.30)) f = -ik f /0(<7б)[е2адь) - 1]М6, (5.61) о где функция % —интеграл от потенциала вдоль прямолинейной траекто- рии налетающего электрона с прицельным параметром Ь: X = - - Г V(r)dz. 2 J -00 Для выбранной нами параметрической зависимости (5.57) в области г > R плотность заряда р равна нулю и потенциал V(r) соответствует потенциалу точечного заряда -Za/r. Поэтому удобно разбить область интегрирования по прицельному параметру в интеграле (5.61) на об- ласти b < R и b > R, с тем чтобы интеграл по второй области можно было взять аналитически. В результате получим R f = tout + fin = tout - ik J - llbdb, (5.62) 0 где fout = % [-2<<z2X/0(X)X2^S_2(.az_1(X) + 4 L + XJ^X^S^.^ Q(X) - XJ^X)], (5.63) a X = qR. В этом выражении S...—функция Ломмеля (по существу непол- ный интеграл от произведения функции Бесселя и степени), которая при больших X имеет полезную асимптотику: SfW(X) ~ Х^[1- + _ ... ] (5.64)
Действия с матрицами 151 Отметим, что поскольку мы, как правило, будем иметь значения R £ 8 ферми и q £ 1 ферми'1, то X будет больше или равен 8, и число пока- занных членов должно быть вполне достаточным. Вклад внутренней области в амплитуду рассеяния f зависит от распределения потенциала при г < R и, следовательно, от характера распределения ядерной плотности заряда. Поскольку у нас имеется простое соотношение между потенциалом и плотностью заряда через уравнение Пуассона (5.33), то нет ничего удивительного в том, что оказывается возможным выразить функцию %(b < R) непосредственно че- рез плотность: R = - Za log [ ~ ” 4naJ r2p(r) <p(b/r)dr, (5. b где Ш = log P + (1 -*2)1/2] - (1 - ,2)1/2. В результате для параметризации вида (5.57) профильную функцию мож- но записать в виде N z(6) = - Za log f 7 1 + X CnXn(b), (5.66а) R п=1 1 %(Ь) = - 4naR2 J zdz sin(nnz) <p(b/zR) (5.666) b/R с заменой переменной интегрирования z = r/R. Уравнения (5.61)—(5.64), (5.66) завершают определение сечения рассеяния в приближении эйконала в зависимости от ядерной плотности заряда. Легко также показать, что величины W.n даются соотношениями о г * 5 f Г.п = 2cos20/2 Relf* ----(5.67а) дС п df R —'- = 2k Г J (ab)e2^b}x(b)bdb. (5.676) дС jut п п О Прежде чем перейти к программе, необходимо сделать некоторые уточнения. Во-первых, ядро не является бесконечно тяжелым, и поэто- му оно испытывает отдачу при столкновении с электроном. Для учета отдачи необходимо все сечения, вычисленные выше в предположении о столкновении электрона с неподвижным зарядом, разделить на фактор
152 Глава 5 tq = 1 + 2-- sin20/2, М где Л4 —масса мишени (приблизительно равная А х 940 МэВ). Отметим, что эта поправка исчезает, когда М становится значительно больше Е. Во-вторых, из-за кулоновского притяжения электроны вблизи ядра име- ют несколько больший импульс, чем в пучке. В приближении эйконала увеличение импульса можно приближенно скорректировать заменой пере- данного импульса q во всех формулах на 1-И Е (5.68) О и умножением амплитуды рассеяния на (q^/q) . Здесь V —некоторое среднее от кулоновского потенциала по объему ядра, принимаемое рав- ным у = _ 4 Za з V где RQ — радиус ядра. Аналогично в борцовском приближении (5.40) ядерный формфактор следует вычислять для qe^ а в формуле Мотта все же оставить q. Текст программы примера 5 можно найти в приложении Бив файле EXAM5.BAS на дискете «Вычислительная физика». Программа использует описанный выше метод для анализа сечений рассеяния электронов на ядрах 40Ca(Z = 20), 58Ni(Z = 28) и 208Pb(Z = 82) и вычисления плот- ности заряда. Для каждой мишени результаты многочисленных экспери- ментов, измеренные при различных углах рассеяния и различных энер- гиях пучка (см., например, [Fr77]), были преобразованы в эквива- лентные сечения для одной энергии пучка [Са80]. Интегралы (5.62), (5.666), (5.676) вычисляются по 20-точечной квадратурной формуле Гаусса—Лежандра, а для обращения матрицы в (5.51) используется эф- фективный метод исключения Гаусса—Жордана [Ru63], После задания ядра-мишени, значения граничного радиуса R и чис- ла синусоид N программа начинает итерировать описанную выше проце- дуру. На каждой итерации выводятся графики подгоночного распределе- ния, относительной ошибки подгонки и распределения плотности заряда ядра, а также параметров Сп и плотности заряда. В программе также предусмотрено использование на начальных итерациях меньшего числа синусоид, чем это требуется в окончательном решении. Затем через каждые несколько итераций число синусоид увеличивается. Этот прием
Действия с матрицами 153 улучшает сходимость наиболее быстро колеблющихся компонент плотнос- ти, поскольку при этом уменьшается эффективная размерность поиска минимума х2 за счет сходимости вначале более плавных компонент плотности. Отметим, что на каждой итерации при вычислении х2 ис- пользуются только те экспериментальные точки, у которых эффективный переданный импульс меньше граничной величины импульса, которую мож- но точно описать текущим числом синусоид. Приведенные ниже упражнения окажутся полезными для понимания важных в этом расчете физических принципов и численных методов. I Упражнение 5.8. Для проверки правильности работы программы вычис- лите по формулам приближения эйконала набор «псевдосечений» с диа- пазоном изменения q от 0,5 до 4 ферми-1, используя в качестве рас- пределения плотности заряда рассмотренную выше функцию Ферми. Убе- дитесь, что эти сечения определены с шагом, характерным для экспе- риментальных данных, и присвойте им характерные статистические ошибки. Затем, используя эти псевдоданные в качестве исходных дан- ных для программы, проверьте, до каких пор наблюдается правильное распределение заряда, т.е. функция Ферми. Один потенциальный источ- ник ошибки, который вы должны исследовать, —«ошибка конечности ря- да», т.е. возможность представить заданное распределение плотности конечным рядом Фурье. Влияние этой ошибки можно изучить, изменяя число синусоид в процедуре подгонки. | Упражнение 5.9. Используя действительные экспериментальные дан- ные, выполните программу и определите плотность заряда для трех рассматриваемых ядер. Исследуйте качество подгонки и величину оши- бок плотности в зависимости от числа членов разложения. Проверьте также, что если начальное приближение для плотности выбрано в ра- зумных пределах, то процедура подгонки сходится к одному и тому же решению. Отметим, что в этих решениях распределение плотности внут- ри ядра не является однородным, скорее наблюдаются «колебания», обусловленные конкретной оболочечноподобной структурой каждого яд- ра. | Упражнение 5.10. Дополните программу процедурой вычисления момен- тов плотности о
154 Глава 5 и ошибок их определения для целых k в диапазоне от 2 до 5. Удобно воспользоваться уравнением (5.57) и выразить эти моменты непосред- ственно через коэффициенты С . 1/3 тов согласована со скейлингом А Проверьте, что величина этих момен- для радиуса ядра. | Упражнение 5.11. Простой моделью для дважды магического ядра 40Са является определитель Слэттера, который получается, если поместить по четыре нуклона (нейтрон и протон, спин вверх и вниз) на 10 наи- низших орбиталей в потенциале сферически-симметричного гармоничес- кого осциллятора. Покажите, что плотность заряда, предсказываемая этой моделью, равна 1/2 где r0 = (h/mw) , т — масса нуклона, а 0) — частота гармонического осциллятора. Найдите величину rQ (и, следовательно, w), необходимую для определения экспериментального значения среднеквадратичного ра- диуса (М2), а затем сравните распределение плотности р, полученное по этой модели, с распределением, вычисленным из экспериментальных данных. | Упражнение 5.12. Модифицируйте программу так, чтобы она вычисляла сечения рассеяния не в приближении эйконала, а в борновском прибли- жении. Сравнением борновских сечений для распределения Ферми с экс- периментальными данными покажите, что это приближение описывает данные очень грубо. | Упражнение 5.13. Модифицируйте программу для вычисления «внедиа- гональных» ошибок плотности, определенных уравнением (5.55), и по- кажите, что с увеличением расстояния между точками корреляция оши- бок сильно уменьшается. ПРОЕКТ V: СХЕМАТИЧЕСКАЯ ОБОЛОЧЕЧНАЯ МОДЕЛЬ Предположение о том, что частицы движутся в потенциальном поле не- зависимо друг от друга, является достаточно общим приближением при описании квантовомеханических многочастичных систем. Например, та- кая картина лежит в основе метода Хартри—Фока, рассматривающего многоэлектронный атом (см. проект III), в оболочечной модели, опи-
Действия с матрицами 155 сывающей движение многих нуклонов в ядре, а также в основе много- численных моделей, описывающих поведение кварков в адроне. Однако во многих случаях это всего лишь грубое приближение, и для подроб- ного описания точных квантовых собственных состояний необходимо учитывать «остаточное» взаимодействие частиц системы друг с другом. Остаточное взаимодействие в атомах и адронах недостаточно сильно, чтобы привести к качественным изменениям спектра, который можно ожидать, если просто поместить частицы на разные орбитали. В ядрах, однако, когерентность и сила остаточных взаимодействий могут при- вести к «коллективному» поведению системы, когда в возбуждениях бу- дет участвовать много нуклонов и характер собственных состояний бу- дет совершенно иным, чем в простейшей модели. Реальные расчеты эффектов остаточного взаимодействия довольно сложны и содержат процедуру диагонализации матриц большого размера, описывающую, как взаимодействие расселяет частицы по орбиталям [Мс80]. Тем не менее коллективный характер явления можно проиллю- стрировать на примере схематической оболочечной модели (предложен- ной Липкиным и др. [Li65]), которую мы рассматриваем в данном про- екте. Модель эта нетривиальна и в то же время достаточно проста, чтобы ее можно было решить при умеренном объеме вычислений. Поэтому эта модель служила тестом для приближенного описания систем многих частиц, а также прототипом для более сложных теоретико-групповых моделей ядерных спектров [Аг81]. V.I. Определение модели Схематическая модель состоит из N различимых частиц, помеченных но- мерами п = 1, 2, • • • , N. Каждая частица может занимать одну из двух орбиталей, верхнюю или нижнюю. Энергия частиц на этих орбита- лях равна +1/2 или -1/2, а сами орбитали различаются соответственно значениями s = -1 и $ = +1 (см. рис.У.1). Таким образом, всего име- ется 2^ различных состояний, каждое из которых определяется тем, какие частицы находятся «вверху», а какие «внизу», и каждое такое состояние имеет невозмущенную энергию (в отсутствие остаточного взаимодействия), равную половине разности между числом частиц на верхней и нижней орбиталях. В нашей модели остаточное взаимодействие проявляется в одновре- менном изменении состояния любой пары частиц; поэтому оно связывает
156 Г лава 5 Е^+1/Z -- • • • - e = -?/Z — — • • • п-1 n = Z П = 3 п ~N Рис«У.1. Иллюстрация орбиталей в схематической оболочечной модели. между собой состояния невозмущенной системы. В частности, удобно выбрать такое остаточное взаимодействие с напряженностью -V, кото- рое переводит любую пару частиц с нижней орбитали на верхнюю или с верхней на нижнюю, как показано на рис.У.2. Можно также рассмотреть и взаимодействие, при котором одна частица переходит вверх, а дру- гая—вниз, но при этом никаких качественно новых свойств не появля- ется. Для точного определения модели проще всего использовать язык t вторичного квантования и ввести оператор ans и сопряженный ему опе- ратор ans, называемые соответственно операторами рождения и уничто- жения частицы на орбитали ns. Поскольку модель построена таким об- разом, что на каждой орбитали не может находиться более одной час- тицы, удобно наделить эти операторы обычными фермионными антикомму- тационными соотношениями {а1 , а+, ,} =0, (V.la) 1 ns п s J v ' {а , а , ,} =0, (V.16) 1 ns п S ’ ' ' {а+ , а , ,} = 3 ,5 (V.Ib) 1 ns п s J пп SS ' ' Рис.У.2. Иллюстрация остаточного взаимодействия в схематической мо- дели.
Действия с матрицами 157 t В результате оператор ansans сч-итает число часгиц на орбитали ns (т.е. его собственные значения равны 0 или 1), а операторы и а* . соответственно поднимают или опускают /?,-ю частицу. Ис- пользуя эти операторы, можно записать гамильтониан системы в следу- ющем виде: 11 = I (anlan1 ' п-1 N N 1 _ _ Ф Ф Ф ф - - V ) ) (а .а ла , .a t л + а ла л a t ла z j, lV.2) п L L v П1 п-1 п 1 п -1 п-1 п1 п -1 п г ' 7 2 п=1 п' =1 где мы не должны заботиться о наличии в остаточном взаимодействии нефизического слагаемого с п' = п, так как, согласно соотношениям (V.1), попытка поднять или опустить одну и ту же частицу дважды да- ет нулевой вклад в гамильтониан. V.2. Точные собственные состояния Рассмотренный выше гамильтониан может быть представлен в виде мат- рицы, связывающей между собой 2^ состояний системы. Помимо симмет- рии и равенства нулю многих ее элементов, заранее не очевидно, что эта матрица имеет какой-то специальный вид. Поэтому ее диагонализа- ция для нахождения точных собственных состояний и собственных век- торов практически для всех значений исключая наименьшие, вызыва- ет значительные вычислительные трудности. К счастью, сравнительно простая структура задачи позволяет сформулировать ее на знакомом языке группы SU(2) (квантовый оператор углового момента), преобра- зования, которое оказывается очень полезным для точной диагонализа- ции, а также даст нам некоторое понимание задачи. Определим следующие операторы: 7г = 9 £(ап1вп1 " вп-1ап-?’ <V3a) п-1 N N J = У а\а 1 , 1 = (/ )’*’ = У .а 1 . (V.36) + L п1 п-1 - v +' ь п-1 nl v ' п=1 п=1
158 Глава 5 Таким образом, оператор / измеряет (в единицах 1/2) разность между числом частиц «вверху» и числом частиц «внизу», тогда как операторы / и /_ последовательно поднимают или соответственно опускают все частицы. Используя эти операторы, гамильтониан (V.2) можно записать в виде н = /г - | V(? + ?) = /г - V(/2 - /2), (V.4) где мы ввели операторы '«j"-*0 '« 1 .(< - /_). (V.5) Используя фундаментальные антикоммутационные правила (V.1), легко показать, что эти три оператора (/z, /+) удовлетворяют комму- тационным соотношениям для квантового оператора углового момента: [У2, /±] = ±/±, [/+, /_] = 2Jг . (V.6) Таким образом, хотя эти операторы «квазиспина» не имеют ничего об- щего с физической величиной углового момента, все методы и опыт ра- боты с квантовыми операторами спина можно непосредственно применить к данной задаче. Начнем с уяснения того факта, что поскольку оператор полного квазиспина /2 = /2 + /2 + /2 X у Z (V.7) коммутирует с операторами ^XyZ нианом, и, следовательно, каждое то он коммутирует и с гамильто- собственное состояние Н можно ха- рактеризовать значением его полного квазиспина /, где /(/ + 1)—собственные значения /2. Поэтому эти собственные состоя- ния можно разбить на невырожденные мультиплеты по 2/ + 1 состояний в каждом, причем все состояния в мультиплете имеют одинаковое зна- чение /. Матричные элементы гамильтониана, связывающие два состоя- ния, отличны от нуля только для состояний, принадлежащих одному и тому же мультиплету. Однако, поскольку Н с J z не коммутирует, соб- ственные состояния Н не будут одновременно и собственными состояни- ями J . 2 Чтобы посмотреть, какие значения / разрешены, можно классифици- ровать все 2jV состояний модели (не путать с собственными состояния- ми Н) в соответствии с их собственными значениями /Единственному состоянию с наибольшим / когда квазиспин всех частиц направлен вверх, соответствует собственное значение т - N/2. Поэтому должен
Действия с матрицами 159 существовать мультиплет из 22V/2 + 1 = N + 1 состояний, соответству- ющих / = N/2. Переходя к состояниям с m = N/2 - 1, мы видим, что имеется N состояний, когда один из N квазиспинов направлен вниз, а все остальные—вверх. Единственная линейная комбинация из этих N состояний (полностью симметричная комбинация) принадлежит мульти- плету с / = N/2. В результате имеется N - 1 мультиплетов с / = = N/2 - 1. Продолжая аналогию, найдем, что существуют N(Af - 1)/2 состояний с m = N/2 - 2 (два квазиспина— вниз, остальные— вверх), из которых одна линейная комбинация принадлежит мультиплету с j = = N/2, a N - 1 линейных комбинаций принадлежат мультиплетам с / = = N/2 - 1. Всего, таким образом, собственному значению / = N/2 - 2 соответствует N(N - 3)/2 мультиплетов. Продолжая таким образом, мы можем разбить 2^ состояний модели, на мультиплеты с /, пробегающим значения от N/2 до 0 или 1/2 для четных и нечетных N соответствен- но. Так как гамильтониан И содержит только операторы квазиспина, то его действие в пределах мультиплета зависит только от текущего зна- чения /. Поэтому для заданного N спектр одного мультиплета годится и для всех других мультиплетов с тем же значением /, а также для мультиплетов с данным / в системах с большим числом частиц N. Сле- довательно, мы можем ограничить наше внимание мультиплетом с макси- мальным значением / = N/2. В результате этих рассуждений мы свели задачу диагонализации полного гамильтониана к диагонализации (V.4) для N + 1 собственных состояний проекции момента импульса J , принадлежащих мультиплету с / - N/2. Обозначим эти состояния через \т>, где m пробегает зна- чения от - / до / с целочисленными шагами. Используя стандартные формулы для действия операторов поднятия и опускания момента им- пульса 7±|m> = C^m ± 1>, С* =[/(/+ 1) - m(m ± 1)]’/2, (V.8) мы можем записать элементы Н в этом базисе в виде <m' \H\m> - md / 11 mm - 1 V[C+C+ ,3 , „ + C~C~ ,8 , „]. (V.9) 2 m m+i m m+2 m m-i m т-2л ' ' Таким образом, гамильтониан Н в этом базисе трехдиагонален и в дей- ствительности разбивается на две несвязанные задачи, включающие со- ответственно состояния с т = -j + 2, • • • , +/ и т = -/ + 1, -/ + 3, ••• , +/ - 1 для случая N четных (/ — целое) и состояния с
160 Глава 5 tn = -/, -j + 2, BBB , +/ - 1 и т = -/ + 1, -/ + 3, ВВВ , +/ для случая N нечетных (/ — полуцелое). При малых значениях / результиру- ющие матрицы можно диагонализовать аналитически, а в системах с большим числом частиц для нахождения собственных значений и собст- венных векторов можно использовать рассмотренные в этой главе чис- ленные методы. Метод квазиспина позволяет нам сделать одно утверждение относи- тельно точного решения модели. Пусть п(1 . .’„)/21/2 /< ~ е -унитарный оператор, приводящий к повороту в квазиспиновом про- странстве на угол п относительно оси (х + у)/ Легко видеть, что такой поворот преобразует операторы квазиспина следующим обра- зом: RJ = J , RJ Л* = J , RJ Rt = - J , (V.10) X у у X Z 2 ' ' так что гамильтониан (V.4) преобразуется как RHR? = -Н. (V.11) Следовательно, если ф —собственное состояние Н с энергией Е, то /^--собственное состояние Н с энергией -Е. Таким образом, собствен- ные значения Н входят парами с равной величиной и противоположными знаками (или оба равны 0). Отсюда видно, что для четных N по край- ней мере одно из собственных значений будет равно нулю. V.3. Приближенные собственные состояния Обратимся теперь к приближенным методам решения нашей схематической модели и рассмотрим сначала обычную теорию возмущений Рэлея —Шрё- дингера. Если рассматривать член / в (V.4) как невозмущенный га- 9 9 2 мильтониан, а член Jх - как возмущение, то невозмущенные собст- венные состояния \т> имеют невозмущенную энергию Е^ = т, а возму- 9 щения раскладываются в ряд по степеням V. Так как <m\J+\m> = 0, по- правка первого порядка к уровню энергии равна нулю, а поправка вто- рого порядка равна <т + 2I1/2 W2|m>2 <т - 2|1/2 V/2|m>2 КР'^t — ---------------—------ + --------------------- т Е{0} - Е(0) Е(0) - Е(0) т т+2 т т-2 (V.12)
Действия с матрицами 161 Вычисляя с помощью уравнения (V.9) входящие в (V.12) матричные эле- менты, можно получить в явном виде поправки второго порядка к энер- гии; при некоторой настойчивости можно получить также и поправки четвертого порядка. В то время как в пределе слабой связи (малые -V) можно приме- нить простую теорию возмущений, приближение для случая сильной свя- зи (большие -V) не столь очевидно. Представляет интерес один из подходов— квазиклассический метод, справедливый в пределе больших N [Ка79, Sh80]. Обсуждение начнем с рассмотрения уравнений движения, описывающих изменение во времени наблюдаемых значений операторов квазиспина: <J> = <[/. , Я]>, • (V.13) где /. — любая из трех компонент квазиспина. Используя гамильтониан (V.4) и перестановочные соотношения (V.6), легко записать уравнение (V.13) для каждой из трех компонент: d dt </> = -</> + V</ / + J J >, x У z у у z (V.14a) d dt </> = </> + V</ / + J J >, у X . Z X xz (V.146) d d t </ > = - 2 Vd J + / J >. 2 У X X у (V.14b) К сожалению, эти уравнения не образуют замкнутую систему, так как производные по времени от наблюдаемых значений отдельных операторов квазиспина зависят от наблюдаемых значений произведений (билиней- ных) этих операторов. Однако если мы проигнорируем тот факт, что / — операторы, и положим, например, что <//> = </ ></ >, X у X у то получим замкнутую систему уравнений: d dt d > = - </ > + 2Vd ></ >, x У z у (V.15a) d dt d > = d > + 2Vd >d >, У У z x (V.156) d dt d > = - 4Vd >d >. z У x (V.15b) Легко показать, что уравнения (V. 15) сохраняют величину J2 = </ >2 + </ >2 + </ >2, X у 2 11 — 1650
162 Глава 5 поэтому удобно перейти к сферическим координатам </^> = J cos 0, d > - J sin 0 cos <p, d> - J sin 0 sin <p, (V.16) где J = [Ki + i)]1/2 * n/2. Далее, если определить переменные р = - A cos 0, q = <p + -- п, (V. 17) 2 4 так что |p| N/2 и 0 q 2п, и ввести подходящую константу связи X = NV ~ 2/К то уравнения (V.15) запишутся в следующем виде: d£.= 2Х. (N - р2] cos 2q = - , (V. 18 а) dt N Ч J dq AS- = 1 + 2-^ p sin 2q = dE[P^} . (V.186) dt N dp Здесь E — наблюдаемое значение гамильтониана E(p,q) = <H> = <1г> - V{<1>2 - <]>2) = (V.19a) = Р - f— - Р21 sin2<y. (V. 196) N И J В результате наших преобразований мы свели задачу о квазиспине к нестационарной классической системе с «импульсом» р и «координа- той» q, удовлетворяющей уравнениям движения (V.18). Поскольку эти уравнения записаны в канонической форме, то р и ?— канонически со- пряженные переменные, а выражение (V. 196) можно отождествить с га- мильтонианом этой классической системы. Теперь мы можем делать выводы о свойствах квантовых собственных состояний, анализируя эту классическую систему. Используя уравнение (V. 196), можно вычислить траектории в фазовом пространстве, т.е. найти значение р при заданных q и Е = <Н> или, что то же самое, рассмотреть линии уровня Е на плоскости (р, q). Анализ этих траек- торий удобно провести отдельно для случая слабой (х < 1) и сильной (X > 1) связи. На рис.У.З показан типичный случай слабой связи для N = 8 и х = = 0,25. Для траектории с наименьшей допустимой энергией, которую
Действия с матрицами 163 Рис.У.З. Линии уровня гамильтониана (V. 196) для случая слабой связи при N = 8 и х = 0,25. Энергия уровня, проходящего через точку (р = = 0, q = 0), равна нулю. Верхняя и нижняя граничные линии р = +N/2 соответствуют уровням энергии +N/2. Энергии соседних уровней отли- чаются на 1 [Ка79]. можно считать основным состоянием квантовой системы, р - -N/2, Е = = -N/2, a q удовлетворяет дифференциальному уравнению движения (V.186). Отметим, что эта траектория проходит через все значения q. В случае сильной связи % > 1 траектории при N = 8 и % = 2,5 вы- глядят, как показано на рис.У.4. На поверхности энергии теперь име- ются минимумы при р = -У/(2х), q = я/4, 5тг/4, которые, как это мож- но показать с помощью уравнений движения (V.18), соответствуют ста- ционарным точкам (т. е. решениям уравнений движения, не зависящим от времени). Энергия в этих минимумах равна Е - ~N(X + и ее можно принять в качестве оценки для энергии основного состояния. При х = 1, следовательно, происходит «фазовый переход» с изменением основного состояния от состояния с р = -N/2 к состоянию с р > -N/2, энергия при таком переходе изменяется непрерывно. Такое качествен- ное изменение характера основного состояния— прямое следствие коге- рентности и силы взаимодействия между частицами. Необходимо также отметить, что по аналогии с обычной квантовой задачей о частице в потенциальной яме с двумя минимумами наличие двух вырожденных ми- 11*
164 Г лава 5 нимумов на рис.У.4 наводит на мысль о том, что основное и первое возбужденное состояния будут почти вырожденными, расщепление между уровнями возникает только из-за'«туннелирования» между ямами. Квазиклассический анализ можно распространить также на предска- зание энергий возбужденных состояний, по сути дела применяя аналог правила квантования Бора —Зоммерфельда (см. уравнения (1.20), (1.21)) [Sh80]. Оказывается, что с увеличением числа частиц N сис- тема становится более «классической». В случае слабой связи все траектории проходят через все значения q. В случае сильной связи имеются два типа траекторий: локализованные (расположенные около минимумов и максимумов энергии) и нелокализованные. С помощью урав- нения (V.196) легко показать, что смена типа траектории происходит при | Е | = 1 (штриховые кривые на рис.У.4). По аналогии с обычной квантовой двойной потенциальной ямой можно ожидать, что состояния, соответствующие локализованным траекториям, появятся в виде почти вырожденных пар. Это вырождение будет нарушаться тем сильнее, чем больше удалена энергия от минимумов или максимумов. Рис.У.4. Линии уровня гамильтониана (V.196) для случая сильной свя- зи при N = 8 и % = 2,5. Точки 2 и В12—соответственно минимумы и максимумы, а С^_4 и —седловые точки. Проходящие через седло- вые точки линии уровня (штриховая кривая) имеют энергии +У/2; эти линии (сепаратрисы) отделяют локализованные траектории от нелокали- зованных. Энергии соседних уровней отличаются на 1 [Ка79].
Действия с матрицами 165 V.4. Методика решения модельной задачи Рассмотренную выше простую квазиклассическую картину можно прове- рить, анализируя точные собственные состояния модели. Эту проверку можно осуществить, выполняя следующую последовательность шагов. | Шаг 1. Проверьте алгебраические выкладки. В частности, покажите, что уравнение (V.4) правильно представляет гамильтониан. Вычислите также по уравнению (V.12) поправки второго порядка к энергиям. | Шаг 2. Проверьте правильность уравнений (V.14), (V.18), (V.19) и рассуждений о линиях уровня энергии для случаев сильной и слабой связи. Для случая сильной связи линеаризуйте уравнения движения вблизи минимумов и максимумов и покажите, что частота гармоническо- го движения вблизи этих точек равна [2(%2 - 1)]1хЧ Эта частота со- ответствует ожидаемому расстоянию между парами почти вырожденных состояний в точном спектре. | Шаг 3. Напишите программу, которая находила бы собственные значе- ния трехдиагональной матрицы гамильтониана (V.9). Если это возмож- но, модифицируйте программу, написанную для упр.5.4. Заметим, что объем вычислений можно уменьшить, рассматривая отдельно состояния с четными и нечетными m и используя свойство симметрии спектра отно- сительно Е = 0. | Шаг 4. Используя программу, написанную на шаге 3, вычислите спектр модели для выбранных значений W = 8—40 и % = 0,1—5. Для слабой связи сравните ваши результаты с оценками теории возмущений (V.12). Для сильной связи сравните энергию основного сотояния с квазиклассической оценкой и проверьте предполагаемую парность вы- рождения низколежащих состояний. Сравните также энергии возбужде- ния этих состояний с вашей оценкой на шаге 2. Как изменяется точ- ность квазиклассической оценки в зависимости от W? | Шаг 5. Напишите программу, которая использовала бы найденные на шаге 2 собственные значения для нахождения собственных векторов ме- тодом обратной итерации (уравнение (5.27)). Выбрав значения N и %, вычислите наблюдаемое значение J? для каждого собственного вектора. В квазиклассической интерпретации это наблюдаемое значение можнс отождествить со средним по времени от импульса р по соответствующей
166 Глава 5 ему траектории в фазовом пространстве. Проверьте, что <1 > изменя- ется по спектру в соответствии с тем, как это можно предположить, исходя из рис.У.З, V.4.
6. ЭЛЛИПТИЧЕСКИЕ УРАВНЕНИЯ Уравнения в частных производных используются при описании практи- чески всех физических явлений, в которых величины изменяются как в пространстве, так и во времени. Круг таких явлений чрезвычайно раз- нообразен—диффузия, электромагнитные волны, гидродинамика, кванто- вая механика (волны Шрёдингера) и т.п. За исключением простейших случаев, решить эти уравнения аналитически не удается, поэтому для получения количественных результатов необходимо применять численные методы. В типично численной постановке задачи зависимые переменные (такие, как температура или электрический потенциал) описываются своими значениями в дискретных точках (узлах решетки или сетки) не- зависимых переменных (например, в пространстве и во времени), и с помощью соответствующей дискретизации уравнение в частных производ- ных сводится к большому набору разностных уравнений. В принципе по- лученные разностные уравнения можно решить прямыми методами, кото- рые были рассмотрены в гл.5. Однако высокий порядок получаемых мат- риц (сравнимый с числом узлов сетки и часто превышающий несколько тысяч) делает такой подход практически невыполнимым. К счастью, ло- кальный характер исходных уравнений (они содержат только производ- ные низкого порядка зависимых переменных) приводит к «разреженнос- ти» разностных уравнений в том смысле, что большинство элементов соответствующей матрицы равно нулю. При обращении и диагонализации таких разреженных матриц могут оказаться очень эффективными итера- ционные методы, которые и составляют предмет обсуждения данной и следующей глав. Большинство важных для физики уравнений в частных производных являются уравнениями второго порядка, которые можно подразделить на три типа: уравнения параболические, эллиптические и гиперболичес- кие. Грубо говоря, параболические уравнения содержат производную первого порядка только по одной переменной, а по остальным— второго
168 Глава 6 порядка. Примерами являются уравнение диффузии и зависящее от вре- мени уравнение Шрёдингера, имеющие первый порядок по времени и вто- рой по пространственным переменным. Эллиптические уравнения содер- жат производные второго порядка от каждой зависимой переменной, причем все такие производные, если их сгруппировать, входят с оди- наковыми знаками. Этот класс включает в себя уравнение Пуассона для электростатического потенциала и не зависящее от времени уравнение Шрёдингера для случая двух и более пространственных переменных. На- конец, в гиперболических уравнениях вторые производные входят с противоположными знаками, как, например, в волновом уравнении, ко- торое описывает колебания натянутой струны. В данной главе мы рас- смотрим несколько численных методов решения эллиптических уравне- ний, а параболические уравнения будут рассмотрены в гл.7. Гипербо- лические уранения во многих случаях можно решать методами, подобны- ми тем, которые мы обсуждаем, хотя при их решении возникают специ- фические трудности [Ri67]. Для конкретности мы будем рассматривать только частные типы эл- липтических краевых задач и задач на собственные значения для поля <р, зависящего от двух пространственных переменных (х, у). Краевая задача описывается уравнением Ф = 5(х, у). (6.1) Хотя это и не наиболее общий тип эллиптического уравнения, тем не менее оно описывает широкий круг разноообразных явлений. Например, в задачах электростатики <р это потенциал, a S соответствует плот- ности заряда (ср. уравнение (3.2)), тогда как в стационарной тепло- вой задаче <р — температура, a S —локальная скорость выделения или поглощения тепла. Наше обсуждение можно непосредственно обобщить на случай других типов эллиптических уранений, например на случай трехмерных уравнений или уравнений с переменным коэффициентом диф- фузии или диэлектрической проницаемостью. Конечно, одного только уравнения (6.1) недостаточно для полного описания задачи—для этого необходимо задать еще некоторые гранич- ные условия. Мы будем использовать граничные условия Дирихле, в ко- торых значения <р задаются на некоторой замкнутой кривой в плоскости (х, у) (удобно рассматривать единичный квадрат) и, возможно, на не- которых дополнительных кривых, расположенных внутри области (рис.6.1). После этого краевая задача заключается в нахождении с помощью уравнения (6.1) значений <р внутри единичного квадрата. Дру- ' Э2 . _д^ ах2 ди2
Эллиптические уравнения 169 Рис.6.1. Слева: двумерная краевая задача Дирихле. Значения <р зада- ются на границах единичного квадрата и на кривых внутри области. Справа: дискретизация задачи на равномерной сетке в декартовых ко- ординатах. гие типы краевых задач, такие, как задача Неймана (где на границе задается нормальная производная <р) или смешанная краевая задача (на границе задается линейная комбинация <р и ее нормальной производ- ной), по методам их решения очень близки к задаче Дирихле. Задачи на собственные значения, которые мы будем рассматривать, могут описываться уравнением 'а2 а? а2 9у2. <р + V(x, у)<р = (6.2) с граничными условиями Дирихле. Такая задача может возникнуть, на- пример, при решении не зависящего от времени уравнения Шрёдингера для волновой функции <р. В этом случае V пропорционально потенциалу, а е связано с собственным значением. Указанное уравнение может так- же описывать распределение полей в акустическом или электромагнит- ном волноводе, а величина е в этом случае связана с квадратом кри- тической частоты. Задача на собственные значения состоит в нахожде- нии значений и соответствующих им собственных функций удов- летворяющих уравнению (6.2) и граничным условиям. Поскольку методы решения этих задач тесно связаны с методами решения соответствующих параболических уравнений, мы обсудим их в гл.7.
170 Г лава 6 6.1. ДИСКРЕТИЗАЦИЯ УРАВНЕНИЙ И ВАРИАЦИОННЫЙ ПРИНЦИП В качестве первого шага преобразуем уравнение (6.1) к виду, удобно- му для численного решения. Для этого в плоскости (х, у) определим сетку, или решетку, покрывающую рассматриваемую область. В целях удобства шаг сетки h выберем равномерным и одинаковым в обоих на- правлениях; в результате единичный квадрат покроется сеткой из (TV + 1) х (N + 1) узлов (см. рис.6.1). Узлы сетки можно обозначить парой индексов (i, j), каждый из которых пробегает значения от 0 до N, так что координаты точки (i, j) равны (х. = ih, у = jh). Если затем определить <р.. = <р(х., у.) и аналогично для S„, то, применяя непосредственно 3-точечную аппроксимацию (1.7) для второй производ- ной по каждому направлению, мы в результате аппроксимируем уравне- ние (6.1) '<р. .. + <р. .. - 2<р.. <р.. . + <р.. . - 2<р.. ' [ ft2 h2 J ‘I ’ ( 3a) или в более удобной записи - + = h2sa (6-36) 9 В этом выражении 5. обозначает разностный оператор второго порядка по индексу I (5^).. = $..,+ <рг - 2<р„ , а д. определяется аналогично. Уравнение (6.3) и есть то искомое уравнение, которое мы будем решать. Тем не менее полезно вывести это уравнение другим способом, основанным на вариационном принципе. Такой подход полезен, напри- мер, когда система координат отлична от декартовой или когда требу- ются более точные разностные формулы. Этот подход гарантирует также получение симметричных разностных уравнений (с эрмитовой матрицей); такое свойство часто оказывается полезным. Вариационный метод поз- воляет также глубже понять алгоритм численного решения. Хороший об- зор этих методов можно найти в работе [Ad84]. Рассмотрим величину Е, определяемую как функционал поля <р сле- дующего вида: 1 1 Е = J dx J dy [i(Vp)2 - S<p], (6.4) О о
Эллиптические уравнения 171 В некоторых случаях величина Е имеет физическую интерпретацию. На- пример, в задачах электростатики -Vp —электрическое поле, a S — плотность заряда и величина Е действительно равна полной энергии системы. Однако в других случаях, как, например, в стационарном уравнении диффузии, Е следует рассматривать просто как полезную ве- личину. Легко показать, что на решении уравнения (6.1) Е принимает ста- ционарное значение при всех вариациях 6р, удовлетворяющих граничным условиям Дирихле. Действительно, вариация Е равна 1 1 дЕ = J dx J dy |vp’V5p - S5pJ, (6.5) О О и, интегрируя по частям член со второй производной, получаем 1 1 дЕ = J dl 5р n-Vp + J dx J dy dp[-V2p - (6.6) C 0 0 где криволинейный интеграл берется по границе рассматриваемой об- ласти (С), а п —единичная нормаль к границе. Так как мы рассматри- ваем только такие вариации, которые удовлетворяют граничным услови- ям, на границе (С) 5р равно нулю, так что криволинейный интеграл также равен нулю. Требование, чтобы 5Е было равно нулю для всех та- ких вариаций, означает, что р удовлетворяет (6.1). В результате мы сформулировали вариационный принцип для нашей краевой задачи. Для вывода дискретной аппроксимации уравнения в частных произ- водных на основе этого вариационного принципа сначала аппроксимиру- ем Е через значения поля в узлах сетки, а затем варьируем Е относи- тельно этих значений. Простейшая аппроксимация для Е получается, 9 если каждую производную, входящую в (Vp) , аппроксимировать в полу- целых точках (посередине между узлами) двухточечной разностной фор- мулой, а для вычисления интеграла использовать правило трапеций. При такой аппроксимации получаем N-\ N-\ £ 11 - к/ + - М2] -h2 £ • <•=1 /-1 1=1 /=1 (6.7) Накладывая условие = о эф,.,.
172 Г лава 6 для всех ij, приходим к полученному ранее разностному уравнению (6.3). Конечно, используя более точные аппроксимационные формулы для первых производных и интеграла, можно получить и более точный дискретный аналог для Е, необходимо только следить за тем, чтобы порядок этих аппроксимаций (производных и интеграла) был согласо- ван. Из формулы (6.7) можно также показать, что на решении уравне- ния величина Е не только стационарна, а более того, является мини- мумом. | Упражнение 6.1. Покажите, что условие равенства нулю производных уравнения (6.7) относительно значений (р в узлах сетки приводит к разностному уравнению (6.3). Докажите или приведите эвристические соображения, что если (р есть точное решение, то Е принимает мини- мальное значение. | Упражнение 6.2. Используя приведенные в табл. 1.2 формулы диффе- ренцирования, выведите дискретный аналог уравнения, более точный по сравнению с (6.3). Видно ли вам, как следует согласовать граничные условия с этими формулами более высокого порядка точности? В каком виде запишется соответствующий дискретный аналог для Е? (Вопросы эти далеко нетривиальны, см. работу [F178].) Теперь мы должны обсудить вопрос, где в нашей системе линейных уравнений используются граничные условия. Если система координат недостаточно хорошо приспособлена к геометрии границ, на которых заданы краевые условия (например, прямолинейные границы в декарто- вых координатах или дуги в цилиндрических или сферических координа- тах), то сеточные узлы будут аппроксимировать геометрию задачи до- вольно грубо (см. рис.6.1). В этом случае всегда можно повысить точность аппроксимации, используя неравномерную сетку с более плот- ным расположением узлов вблизи границ. Можно также соответствующим преобразованием перейти к системе координат, в которой граничные условия записываются более естественным образом. В любом случае граничные условия будут определять значения <р.. на некотором под- множестве сеточных узлов. Для точек, расположенных далеко от гра- ниц, граничные условия в уравнения (6.3) непосредственно не входят. Рассмотрим, однако, (6.3) для точки, непосредственно примыкающей к границе, например (z, N - 1). Поскольку <р.^ определяется как часть граничных условий (которые заданы на всей границе единичного квад- рата), можно переписать (6.36) в виде
Эллиптические уравнения 173 9 4'₽<W-1 " ’’z+W-l " Л-1ЛМ " ViN-2 = h SiN-1 + ViN ’ <6-8а) т.е. теперь <pjN входит в уравнение не как неизвестное, а скорее как известный неоднородный член. Аналогичным образом, если на границе задано условие Неймана, например д<р/ду = g(x) при у = 1 (/ = N), то это условие можно аппроксимировать дискретным аналогом 4>iN ~ «’«ЛМ = hSi • используя который, можно записать уравнение (6.3) для j = N - 1 в следующем виде: 2 3?)iW-l " ’’i+W-l * ^Z-W-l " 9iN-2 = h SiN-\ + (6.86) Проведенное обсуждение показывает, что дискретная аппроксимация дифференциального уравнения (6.1) эквивалентна системе линейных уравнений для неизвестных значений <р во внутренних точках области. В матричной записи эту систему можно записать в виде = s, (6.9) где М —матрица, соответствующая линейной системе (6.3), а неодно- родный член s пропорционален S во внутренних точках области и ли- нейно связан с заданными значениями <р или ее производными на грани- цах. Во всех практических расчетах получаются системы уравнений очень высокого порядка (около 2500 для N = 50), поэтому решение таких систем прямым обращением матрицы М невыполнимо. К счастью, так как дискретная аппроксимация лапласиана содержит только сосед- ние точки, то большинство элементов матрицы М равно нулю (разрежен- ная матрица), а для таких матриц существуют эффективные итерацион- ные методы решения системы (6.9). Обсуждение этих методов начнем с рассмотрения аналогичной, но более простой одномерной краевой за- дачи, а затем вернемся к двумерному случаю. 6.2. ИТЕРАЦИОННЫЕ МЕТОДЫ РЕШЕНИЯ КРАЕВЫХ ЗАДАЧ Одномерная краевая задача, аналогичная двумерной задаче, которую мы обсуждали выше, может быть описана уравнением ,2 - ^2 = (6.Ю) dx с заданными значениями ^(0) и ^(1). Соответствующий вариационный
174 Глава 6 принцип имеет вид (6.И) и для него можно шагом h = 1/# записать дискретный аналог на равномерной сетке с W N-X £ = 77 Е («>,• - Л • <612) 1-1 4=1 Если варьировать это выражение по всем (р„ то мы получим разностное уравнение 2Л- - - 91-х = ’ (6-13) которое, очевидно, совпадает с простейшей дискретизацией уравнения (6.10). Хотя методы решения краевой задачи интегрированием уравнения в прямом и обратном по х направлениям рассматривались в гл.З, но мы можем также рассматривать (6.13) вместе с известными значениями <р$ и как систему линейных уравнений. Для небольшого числа точек (например, N 100) указанную выше систему линейных уравнений можно решить прямыми методами, которые рассмотрены в гл.5, и действитель- но, как показано в гл.7, для таких «трехдиагональных» систем суще- ствует очень эффективный специальный прямой метод. Тем не менее для иллюстрации итерационных методов, применяемых в случае больших раз- реженных матриц, которые получаются при дискретизации эллиптических уравнений, перепишем сначала уравнение (6.13), разрешив его относи- тельно : ч>1 = £ [«’м + '₽1-1 + <614) Хотя польза от этого уравнения не ясна, так как мы не знаем значе- ния (р в правой части, тем не менее его можно интерпретировать как «уточнение» значения р через значения р в соседних точках. Следо- вательно, наша стратегия (итерации Гаусса—Зейделя) состоит в том, чтобы выбрать некоторое начальное приближение для решения, а затем продвигаться систематически по сетке (например, слева направо) и последовательно заменять р в каждой точке на улучшенное значение. Отметим, что самые «новые» значения р^ следует также использовать в правой части уравнения (6.14). Если повторить такой процесс мно-
Эллиптические уравнения 175 гократно, то начальное приближение для р может «срелаксировать» к точному решению. Для исследования сходимости этой процедуры обобщим уравнение (6.14) так, чтобы на каждом шаге релаксации <р. заменялось линейной комбинацией из своего старого значения и «улучшенного» по формуле (6.14): Л- f'i = + “ “ + «’.-i + h2sJ- <615) В данной формуле параметр w может меняться для управления скоростью релаксации: «верхняя релаксация» соответствует значениям со > 1, а «нижняя релаксация»—w < 1. Выбор оптимального значения со, при ко- тором скорость релаксации максимальна, будет рассмотрен ниже. Чтобы увидеть, что (6.15) приводит к «улучшению» решения, вычислим изме- нение функционала энергии (6.12), помня при этом, что все значения ф, за исключением должны быть фиксированы. После несложных пре- образований получим Е' -Е = - £ (^1+ ^-1+ - ф °- (6.16) так что, пока со лежит в пределах 0 < со < 2, энергия никогда не воз- растает и, следовательно, при многократном прохождении узлов должна сходиться к требуемому минимальному значению. (Существование дру- гих, посторонних минимумов энергии должно означать плохую обуслов- ленность линейной системы (6.13).) | Упражнение 6.3. Используя уравнения (6.12) и (6.15), докажите уравнение (6.16). В качестве примера, иллюстрирующего этот релаксационный метод, рассмотрим одномерную краевую задачу вида (6.10) с S(x) = 12х2, <р(0) = <р(1) = 0. Эта задача имеет точное решение <р{х) = х(1 - х3) с энергией Е = - 9/14 = -0,64286.
176 Г лава 6 Ниже приведен текст программы, которая решает эту задачу релаксаци- онным методом и выводит на экран значения энергии после каждого прохода по 21 узлу расчетной сетки. В качестве начального приближе- ния используются значения <р. = 0; это приближение существенно отли- чается от точного решения. 10 N%=20: H=1/N% 'число узлов и шаг 15 OMEGA=1 ( 'параметр релаксации 20 DIM PHI(N%) 'релаксируемая функция 25 DIM S(N%) 'массив для ЬГ2*источник 30 ' 35 FOR l%=0 TO N% 'начальные значения 40 X=I%*H 45 S( l%)=H*H*12*X*X 'задание массива источника 50 PHI(l%)=0 'начальное приближение phi=O 55 NEXT 1% 60 1 65 FOR 1Т%=1 ТО 500 'итерационный цикл 70 FOR l%=1 ТО N%-1 'прохождение по узлам сетки 75 PHIP=( РН1( 1%-1)+РН1( l%+1 )+S( 1%))/2 80 PH l( l%)=( 1-OMEGA)*PHI( l%)+OMEGA*PHIP ' релаксация 85 NEXT 1% 90 IF (IT%-1) MOD 10 о 0 THEN GOTO 130 'вычисление энергии 95 PRINT USING "итерация=### ";IT% 100 Е=0: 105 FOR l%=1 ТО N%: 'цикл по узлам сетки 110 Е=Е+( (РН1( 1%)-РН1( 1%-1))/Н)Л2/2 ' градиентный член 115 E=E-S( 1%)/Н/Н*РН1( 1%) 'источник 120 NEXT 1% 125 PRINT USING "энергия=+##.####Л-----";Е*Н 130 NEXT IT% В табл.6.1 приведены вычисленные значения энергии в зависимости от номера итерации для трех различных значений параметра со. Несмотря на довольно «плохое» начальное приближение для <р, итерации сходятся и окончательное значение энергии не зависит от параметра релакса- ции, хотя и несколько отличается от точного значения из-за ошибок дискретизации (т.е. шаг h не бесконечно мал); конечно, при увеличе- нии N это расхождение уменьшается. Подробное исследование численно- го решения показывает, что оно хорошо совпадает с аналитическим ре-
Эллиптические уравнения 177 зультатом. Заметим, что скорость сходимости, несомненно, зависит от W. Общий анализ [Wa66] показывает, что наилучшее значение параметра релаксации зависит от размера сетки и от геометрии задачи; как пра- вило, w > 1. Оптимальное значение параметра релаксации можно опре- делить опытным путем, исследуя сходимость решения в течение только нескольких начальных итераций. Затем это значение можно использо- вать в дальнейших итерациях. Таблица 6.1. Сходимость функционала энергии в течение релаксационного процесса в одномерной краевой задаче Номер итерации w = 0,5 = 1,0 w = 1,5 1 -0,01943 -0,04959 -0,09459 21 -0,24267 -0,44024 -0,60688 41 -0,36297 -0,56343 -0,63700 61 -0,44207 -0,61036 -0,63831 81 -0,49732 -0,62795 -0,63836 101 -0,53678 -0,63450 -0,63837 121 -0,56517 -0,63693 -0,63837 141 -0,58563 -0,63783 -0,63837 161 -0,60037 -0,63817 -0,63837 181 -0,61100 -0,63829 -0,63837 201 -0,61866 -0,63834 -0,63837 221 -0,62418 -0,63836 -0,63837 241 -0,62815 -0,63836 -0,63837 381 -0,63734 -0,63837 -0,63837 401 -0,63763 -0,63837 -0,63837 | Упражнение 6.4. Используя приведенную выше программу, проверьте, что с увеличением числа узлов сетки N энергия приближается к анали- тическому значению. Исследуйте точность решения в каждом узле сетки и отметьте факт, что энергия может быть вычислена значительно точ- нее, нежели само решение; это —естественное следствие минимизации Е на точном решении. Используйте для решения задачи одну из дискре- тизаций более высокого порядка точности, полученную вами в упр. 6.2. 12—1650
178 Глава 6 Применение описанной выше релаксационной схемы для двух- или даже трехмерных задач теперь очевидно. Разрешая (6.3а) относительно можно получить аналог (6.15): ч>'а = + ; + 'P.-V + + ч>1Н + /*4/]- (6.17) Если этот алгоритм последовательно применяется к каждому сеточному узлу (например, строки пробегаются по порядку сверху вниз, а в каж- дой строке —слева направо), то можно показать, что функционал энер- гии (6.7) всегда уменьшается (если w лежит в соответствующих преде- лах) и процесс сходится к требуемому решению. В практических расчетах может пригодиться несколько советов по улучшению сходимости рассмотренного метода. Во-первых, выбор хоро- шего начального приближения для решения (это может быть решение с похожими, но более простыми граничными условиями) уменьшает необхо- димое число итераций. Во-вторых, необходимо использовать оптималь- ное значение параметра релаксации, которое можно оценить аналити- чески или получить эмпирическим путем, как это описано выше. В-тре- тьих, процесс может оказаться более эффективным, если несколько итераций провести только по некоторой сеточной подобласти, в кото- рой пробное решение известно наиболее слабо; тем самым экономятся затраты на релаксацию уже отрелаксированных частей решения. Нако- нец, всегда можно провести расчет на относительно грубой сетке, для которой объем вычислений невелик, а затем интерполировать получен- ное решение на более мелкую сетку и использовать эти значения в ка- честве начального приближения для последующих итераций. 6.3. ЕЩЕ РАЗ О ДИСКРЕТИЗАЦИИ Часто функционал энергии, соответствующий физической задаче, запи- сывается в более сложном виде, нежели просто «интеграл от квадрата производной», который мы рассматривали до сих пор. Например, в за- дачах электростатики с изменяющимися в пространстве диэлектрически- ми свойствами среды или для уравнения диффузии с переменным коэффи- циентом диффузии соответствующая (6.1) краевая задача описывается уравнением -V-DVip = S(x, у), (6.18)
Эллиптические уравнения 179 где D(x, у) —диэлектрическая проницаемость среды или коэффициент диффузии. Функционал энергии для (6.18) принимает вид (ср. уравне- ние (6.4)) 1 1 Г "I Е = J dx J dy lD(Vg>)2 - S<p . О О (6.19) Хотя можно непосредственно записать дискретный аналог для (6.18), из предыдущего обсуждения должно быть очевидно, что предпочтитель- нее сначала записать в дискретном виде (6.19), а затем дифференци- ровать его по всем значениям поля и получить разностные уравнения. Рассмотрим эти шаги подробно и начнем с записи аналога одномер- ной краевой задачи, определяемой уравнением (6.11) Е 1 г /• Г dx 1р(х) & 2 J [2 [dx S<p (6.20) О Дискретный аналог (6.12) принимает вид N-\ E = Di-V2^ ~ ~ h X ’ <6-21) Z = 1 где Z>z l/2 —коэффициент диффузии в полуцелых точках. Значения коэф- фициентов в полуцелых точках можно вычислить аналитически, если имеется формула для D(x), или аппроксимировать их с соответствующей точностью выражением (D. + D J/2. В обоих случаях необходимо сле- дить за тем, чтобы эти коэффициенты брались в соответствующих полу- целых точках. Варьируя уравнение (6.21), получаем искомые разност- ные уравнения (ср. уравнение (6.13)) ^(+1/2 + °1-\/2^1 DM/2<f>M Di-\/2<f>i-t “ Si ' (6.22) Полученные уравнения можно решить описанным выше релаксационным ме- тодом. Аналогично рассматриваются также задачи в цилиндрической или сферической системе координат. Например, если коэффициент диффузии или диэлектрическая проницаемость не зависят от пространственных координат, то функционал энергии в цилиндрических координатах при- нимает вид 00 Е = J dr 0 1 dy 2 2 [dr. Sy (6.23) 12*
180 Г лава 6 где г —радиус. (Здесь мы опускаем интегрирование по другим коорди- натам.) Это уравнение совпадает с уранением (6.20), если положить D(r) = г и умножить источник на г. Записывая (6.23) в дискретном виде на сетке с координатами узлов г = ih, придем затем к аналогу (6.22): ~ = *^1 <6'24) При I = 0 из этого уравнения получаем д)^ = д)_^ эквивалентно усло- вию дд)/дг = 0 при г = 0. Этот результат следовало ожидать, так как по законам электростатики (теорема Гаусса) радиальное электрическое поле на оси цилиндра (г = 0) равно нулю. При i = 1 уравнение (6.24) содержит три неизвестных значения ф0, д)^ и ф2, но если в качестве грубой аппроксимации нулевой производной на границе положить g)Q = = то получаем уравнение, содержащее только два неизвестных, — результат, который можно было предположить для точек вблизи границы на основе нашего опыта с задачами в декартовых координатах. Более изящная дискретизация для задач с цилиндрической симмет- рией, естественным образом включающая в себя граничное условие с нулевой производной при г = 0, получается, если использовать сетку с координатами узлов г. = (/ —1/2)Л. В этом случае уравнение (6.24) остается справедливым, но при i = 1 коэффициент при неизвестном д) будет равен нулю, и мы сразу получаем уравнение только с двумя неизвестными и ф2. | Упражнение 6.5. Покажите, что при варьировании уравнения (6.21) получается уравнение (6.22). Запишите дискретный аналог уравнения (6.23) на двух различных сетках с координатами г. = ih и г. = = (/ -1/2)Л и убедитесь, что варьирование этих выражений в обоих случаях приводит к уравнению (6.24). Почему в функционале энергии на сетке с г. = (г -1/2)Л можно спокойно пренебречь вкладом от об- ласти, заключенной между г = 0 и г = Л/2, сохранив при этом тот же порядок точности, что и точность аппроксимации производных? 6.4. ДВУМЕРНЫЕ ЭЛЛИПТИЧЕСКИЕ УРАВНЕНИЯ Применение релаксационных методов к решению эллиптических краевых задач иллюстрируется программой примера 6, где решается уравнение Лапласа (Д2ф = 0) на равномерной прямоугольной сетке с единичным
Эллиптические уравнения 181 шагом и граничными условиями Дирихле, которые задаются на границах сеточной области, а также в выбранных точках внутри области. Урав- нение с такими граничными условиями может описывать стационарное распределение температуры в пластине, края которой и некоторые внутренние области поддерживаются при заданной температуре, или за- дачи электростатики, в которых задано несколько эквипотенциальных поверхностей. Вовремя выводятся значения потенциала в области, а также значения функционала энергии (6.7) для наблюдения за сходи- мостью. Текст программы можно найти в приложении Бив файле EXAM6.BAS на дискете «Вычислительная физика». Следующие ниже упражнения, сформулированные на языке электро- статических аналогий, помогут вам лучше понять физические и вычис- лительные принципы, которые иллюстрируются этим примером. | Упражнение 6.6. Проверьте, что решения, соответствующие отдельным граничным условиям внутри расчетной области, согласуются с вашей интуицией. Можно попробовать задать в одной внутренней точке потен- циал, отличный от потенциала на границах; задать различные потенци- алы в двух симметрично расположенных точках или задать на всей пря- мой одинаковый потенциал. Другие возможности включают создание «клетки Фарадея» (замкнутой области, ограниченной поверхностью с заданным потенциалом), изучение квадрупольной картины граничных ус- ловий или вычисление емкости проводников различной конфигурации. Вопрос о том, что происходит при увеличении или уменьшении размера сетки, также представляет интерес. | Упражнение 6.7. При заданных граничных условиях исследуйте ско- рость сходимости процессов верхней и нижней релаксаций. Замените дискретизацию лапласиана формулой более высокого порядка точности, как указано в упр.6.2, и отметьте, как при этом изменяется решение, а также эффективность расчета. | Упражнение 6.8. Измените программу так, чтобы она решала уравне- ние Пуассона, т.е. учитывала заданную в узлах сетки плотность заря- да. Используя эту программу, изучите решения для некоторых простых распределений зарядов. Например, можно попробовать вычислить раз- ность потенциалов между двумя (линейными) зарядами как функцию рас- стояния между ними и сравнить полученные значения с аналитическим выражением.
182 Глава 6 | Упражнение 6.9. Измените программу так, чтобы можно было задавать на некоторых внешних и внутренних границах условия Неймана. Для простых геометрий изучите решения с такими граничными условиями и сравните их с тем, что вы предполагали получить. | Упражнение 6.10. Измените программу так, чтобы она позволяла учи- тывать пространственно неоднородную диэлектрическую проницаемость. (Заметим, что для этого необходимо изменить как релаксационную фор- мулу, так и функционал энергии.) Изучите решения на простых распре- делениях диэлектрической проницаемости с простыми граничными усло- виями (например, половина пространства заполнена диэлектриком). | Упражнение 6.11. Кроме граничных условий Дирихле можно задавать также периодические граничные условия, когда потенциалы на левой и правой, а также на верхней и нижней границах области задаются про- извольными, но равными по величине друг другу, т.е. для всех i и j 4>а = 4>iN > ч>м = 4>Nj Такие условия могут описывать пространственно периодическое распре- деление плотности заряда в кристалле. Модифицировав соответствующим образом программу, решите уравнение Пуассона с этими граничными ус- ловиями. Проверьте, что для простых распределений зарядов решение выглядит так, как этого следовало ожидать. | Упражнение 6.12. Для решения аксиально-симметричных задач измени- те в программе релаксационную формулу и функционал энергии, заменив одну из декартовых координат на радиус. Используйте полученную про- грамму для моделирования конденсатора, образованного двумя цилинд- рическими дисками. В частности, вычислите емкость и распределение потенциала при различных расстояниях между дисками. Сравните ваши результаты для очень больших или очень малых расстояний с тем, что вы ожидали получить. ПРОЕКТ VI: ДВУМЕРНАЯ СТАЦИОНАРНАЯ ГИДРОДИНАМИКА Задача описания течения жидкостей—одна из наиболее богатых по своему содержанию и в то же время наиболее сложных задач для чис- ленного моделирования. Нелинейность уравнений и сложность явлений, которые они описывают (например, турбулентность), иногда делают вы-
Эллиптические уравнения 183 числительную гидродинамику скорее искусством, нежели наукой; ее адекватное описание требует по меньшей мере нескольких книг (см., например, работу [Ro76]). В данном проекте мы рассмотрим только од- ну сравнительно простую задачу, которую можно будет решить описан- ным в этой главе релаксационным методом и которая даст нам некото- рое представление о рассматриваемых проблемах. Это стационарная за- дача об обтекании тела вязкой несжимаемой жидкостью. Для простоты выберем бесконечно протяженное в одном из направлений поперек пото- ка тело с постоянным поперечным сечением, так что сечение будет плоским, и его можно рассматривать в координатах (х, у). Такая за- дача может описывать стационарное обтекание стержня или балки пото- ком воды, набегающим со скоростью VQ. Мы будем также рассматривать стержни только прямоугольного сечения размерами 2W поперек потока и Т вдоль потока (рис.VI. 1). Эти ограничения значительно упрощают за- пись граничных условий, и в то же время задача остается физически наглядной. Вначале мы опишем основные уравнения и их дискретизацию, затем кратко обсудим граничные условия и, наконец, дадим некоторые указания по написанию программы и интерпретации полученных резуль- татов. Рис.VI. 1. Геометрия двумерного обтекания пластины для задачи, кото- рая рассматривается в данном проекте.
184 Глава 6 VI.1. Уравнения и их дискретизация Для описания пространственного течения жидкости важно знать прост- ранственное распределение по крайней мере двух величин: р — про- странственной плотности и V —скорости жидкости. Эти величины связа- ны между собой двумя основными уравнениями гидродинамики [La59]: + V-pV = 0, (Vl.la) dt ОУ. = -(W)V - 1 VP + i>V2V. (VI. 16) dt p Первое из этих уравнений—уравнение непрерывности— выражает закон сохранения массы: плотность в каждой точке пространства может изме- няться за счет втекания или вытекания вещества. Второе уравнение (Навье —Стокса) выражает закон сохранения импульса: скорость изме- няется за счет конвекции— член (V-V)V, пространственных изменений давления—VP и вязких сил—pV •¥. Здесь и обозначает кинематическую вязкость, которую мы будем считать постоянной. Давление обычно свя- зано с плотностью и температурой через «уравнение состояния», и если происходит изменение температуры, то необходимо еще одно до- полнительное уравнение, выражающее закон сохранения энергии. Мы бу- дем предполагать, что температура во всей области течения постоян- на. Поскольку мы будем исследовать стационарные течения, все вре- менные производные в этих уравнениях можно положить равными нулю. Кроме того, предположим, что жидкость несжимаема, поэтому ее плот- ность остается постоянной (это приближение хорошо выполняется для воды в широком диапазоне условий). В результате уравнения (VI. 1) принимают вид V*V=0, (VI.2а) (V-V)V = - 1 VP + 1>V2V. (VI.26) Для двумерного течения эти уравнения можно записать через х- и у- компоненты скорости, обозначив их соответственно через и и v: ди t dv _ q. дх ду (VI.За)
Эллиптические уравнения 185 „ ди + vdu = дх ду 1 Р дР + д х vV2u\ (VI.36) « + = дх ду _ 1 Р S-P + Эу vV2v. (VI.Зв) Здесь, как обычно, использовано обозначение V2 = _а! + ах2 ду2 Уравнения (VI. 3) представляют собой систему трех скалярных уравнений для величин u, v и Р, и при необходимости можно решать непосредственно эти уравнения. В двумерных задачах, однако, удобнее ввести вместо вектора скорости две скалярные величины: функцию тока 0(х, у) и завихренность £(х, у). Первая из этих величин вводится так, чтобы автоматически удовлетворить уравнению неразрывности (VI.За). Функция тока определяется следующим образом: u = ^, v = . (VI.4) ду дх Легко проверить, что такое определение удовлетворяет уравнению не- разрывности (VI.За) для любой функции 0 и что для всех течений, удовлетворяющих уравнению неразрывности, такая функция ф существу- ет. Более того, можно увидеть, что (V-V)0 = 0, откуда следует, что вектор скорости V касателен к линиям с равными значениями ф — «ли- ниям тока». Завихренность определяется соотношением £ = 9« _ , (VI.5) ду дх из которого видно, что она равна (с обратным знаком) ротору скорос- ти. Из определений (VI.4) следует, что завихренность £ связана с функцией тока ф уравнением v2$ = с (VI. 6) Уравнение для завихренности С можно получить, дифференцируя (VI.36) по у, а (VI.Зв) по х. Вычитая затем из первого уравнения второе и используя уравнения неразрывности (VI.За) и соотношения (VI.4), по- сле несложных преобразований получаем
186 Г лава 6 i?v2C = дф дС ду дх дф ас <з% аг/. (VI.7) Наконец, дифференцируя (VI.36) по х и (VI.Зв) по у и складывая их, можно получить уравнение для давления. Выражая все компоненты скорости через функцию тока, находим V2P = 2р <Э20 5х2. д2ф ду2. ’д2ф I2' дхду. (VI.8) Уравнения (VI.6)—(VI.8) представляют собой систему нелинейных эллиптических уравнений, эквивалентных исходным гидродинамическим уравнениям (VI.3). Эта система особенно удобна в тех случаях, когда мы хотим найти только поле скоростей течения; для этого необходимо решить совместно только два уравнения (VI.6), (VI.7), поскольку оба они не содержат давления. Если же мы все-таки хотим найти давление, то его легко получить, решив уравнение (VI.8) после того, как най- дены значения ф и С- Для численного решения уравнений (VI.6), (VI.7) введем в рас- четной области двумерную сетку с равномерным шагом h, состоящую из N* и N узлов по х и у направлениям соответственно, и пусть индексы z и j измеряют координаты узлов (рис. VI. 2). Необходимо отметить, что, поскольку средняя линия прямоугольника является одновременно и осью симметрии, мы можем рассматривать течение только в верхней по- луплоскости у > 0. Кроме того, удобно задать сетку и размеры плас- тины Рис. VI. 2. Построение сетки для расчета обтекания пластины несжима- емой жидкостью для геометрии, приведенной на рис.VI.1.
Эллиптические уравнения[87 так, чтобы края пластины были одновременно и узлами сетки. Положе- ние пластины по отношению к границам области вверх и вниз по потоку может быть произвольным, хотя желательно поместить пластину доста- точно далеко вверх по потоку, чтобы позади нее мог образоваться «спутный след», и в то же время не слишком близко к границе, так как граничные условия могут оказывать ложное влияние на картину те- чения. Удобно также обезразмерить все уравнения, вводя в качестве единицы длины пространственный шаг Л, а в качестве единицы скорос- ти—скорость набегающего потока на бесконечности VQ. Тогда функция тока будет измеряться в единицах УПЛ, завихренность —в единицах VQ//z, а давление удобно обезразмерить на pVQ. Записывая обычным способом разностное уравнение для (VI.6), получаем • (5>).. + (3^).. = , (VI.9) где д2, как и в уравнении (6.36), обозначает симметричную вторую разность. Аналогично можно записать разностное уравнение для (VI.7) (3^).. + | [(5.ф)..(3;.С)?. - (ЗДДО.,], (VI.10) где оператор симметричной первой разности определяется как (5А/ Е - Кц и аналогично для д . Сеточное число Рейнольдса R = VQh/v является безразмерной мерой интенсивности как вязких сил, так и скорости на- бегающего потока (точнее, является отношением этих двух величин). Физическое число Рейнольдса получается из сеточного заменой про- странственного шага h сетки на ширину прямоугольника: Re = 2Wq/p. Наконец, уравнение для давления (VI.8) можно записать в разностном виде как [(З2р).. + (32р)..] = 2[(3^)..(320).. - Л (3.3.ф)2р. (VI.11) VI.2. Граничные условия Для того чтобы эллиптические задачи (VI.6) —(VI.8) были корректно поставлены, необходимо задать на всех границах сеточной области, показанных на рис.VI.2, либо значения, либо нормальные производные для функции тока, завихренности и давления. Эти границы можно раз-
188 Г лава 6 бить на три группы в соответствии с обозначениями рис.VI.3: 1) средняя линия (А и Е); 2) границы, примыкающие к невозмущенному течению (F, G и Н); 3) границы пластины (В, С и D). Мы рассмотрим по очереди граничные условия для ф и £ в каждой из этих групп, а затем граничные условия для давления. Далее при об- суждении граничных условий будем использовать размерные (т.е. физи- ческие) величины. Это поможет также вспомнить, что решение для сво- бодно текущей жидкости (т.е. в отсутствие препятствия) имеет вид и = Уо, v = 0, откуда следует, что ф = VQy и < = 0. Граничные условия на средней линии (поверхности А и Е) опреде- ляются из условия симметрии. На этих поверхностях (/-компонента ско- рости (и) должна быть равна нулю, что соответствует равенству про- изводной от ф по х. Из этого следует, что линии А и Е (каждая в от- дельности) являются линиями тока. Более того, так как нормальная (и, следовательно, тангенциальная производная от ф) на этих линиях также равна нулю, вся граница ABCDE является отдельной линией тока, на которой можно произвольно положить 0 = 0. Отметим тот факт, что скорости зависят только от произвольных 0, поэтому физическое опи- сание задачи не изменяется при добавлении к функции тока константы; выбор 0 на этой линии (ABODE) тем самым определяет эту константу. Из условия симметрии можно также сделать вывод, что на границах А и Е завихренность равна нулю. Рис. VI.3. Граничные условия, накладываемые на функцию тока и завих- ренность.
Эллиптические уравнения 189 Условия на границе вверх по потоку F также достаточно прозрач- ны. Эта граница прилегает к области плавно текущего набегающего по- тока, поэтому вполне разумно задать условия v = - = 0, £ = О на границе F, дх соответствующие положению границы далеко вверх по потоку. Аналогич- но, если расчетная область достаточно большая, можно ожидать, что на верхней границе G условия будут такими же, как и в свободном по- токе, поэтому можно положить и - = V С = 0 на границе G. ду ° Условия на границе вниз по потоку Н гораздо неопределеннее. Пока эта граница находится достаточно далеко от пластины, можно выбрать несколько правдоподобных условий. Но если граница приближается к пластине, то условия на ней могут влиять на вид найденного решения. Один из удобных вариантов— считать, что за пределами сеточной об- ласти течение не изменяется, и положить = о на границе Н. дх дх Рассмотрим теперь граничные условия на поверхности пластины (В, С и D). Одно из точных условий—равенство нулю нормальной скорости течения. Это условие уже было использовано, когда мы потребовали, чтобы эти поверхности были линиями тока. Другое условие, соответст- вующее вязкому течению жидкости (условие прилипания), —это равенст- во нулю тангенциальной скорости. Если использовать это условие, по- ложив нормальную производную ф равной нулю, получим переопределение эллиптической задачи для ф. Вместо этого граничное условие «непро- скальзывания» накладывается на завихренность. Рассмотрим, например, точку ij на верхней поверхности пластины (С). Для функции тока мож- но записать разложение ф.._^ в ряд Тейлора по у в окрестности точки */•’ ^/+1 = ф„ + h ч 3^1 2 ду2 by (VI.12) ^1 Ь/ Поскольку на стенке ставится условие прилипания, и = и = О Зу д2ф Эи _ > ду2 ду
190 Глава 6 так как dv/dx = О, (VI. 12) можно привести к виду , _ 2 ~ h2 на границе С, (VI.13а) который дает нам условия Дирихле для С (Это условие для С записано в общем виде для нее определили ф.. ные аргументы для произвольных значений ф\ вспомним, что мы уже ра- = 0 на поверхности пластины.) Применяя аналогич- условий на поверхностях В и D, получаем ф. .. - ф. л2 на границе В; (VI.136) отметить, с D и D в этих ^-1/ - *'i h2 что в «углах» с С, граничные точках завихренность можно на границе D. (VI.13B) пластины, где пересекаются по- условия определяются неоднознач- вычислять по двум Следует верхности В но, так как различным формулам (горизонтальные или вертикальные разности ф). На практике существует несколько способов разрешения этой неоднознач- 2 2 ности: использовать одно выражение и проверять, что другое дает по- хожие результаты (проверка точности расчета), использовать средние значения или брать горизонтальные разности при релаксации в точках слева или справа от угловой точки и вертикальные— при релаксации в точках, расположенных выше угловой точки. Для давления на всех поверхностях задаются граничные условия Неймана, которые следуют из уравнений (VI.3). Вывод этих условий в явном конечно-разностном виде через значения ф и С на границах мы оставляем читателю в качестве упражнения. Отметим только, что на средней линии из условия симметрии дР/ду = 0. VI.3. Решение уравнений Наша основная задача будет заключаться в решении системы нелинейных эллиптических уравнений (VI.9, 10) для функции тока и завихренности с помощью рассмотренных в этой главе релаксационных методов. Одна из возможных итерационных схем выглядит следующим образом. Вначале для функций ф и С выбираются начальные значения, соответствующие решению для свободного течения: ф = у и £ = 0. Затем выполняется один релаксационный шаг для уравнения (VI.9) и получаются улучшен- ные значения ф. По найденным значениям ф из соотношений (VI. 13) вы-
Эллиптические уравнения 191 числяются граничные условия Дирихле для С на поверхностях пластины и затем выполняется один релаксационный шаг для уравнения (VI. 10). Новые значения С снова используются для релаксации (VI. 9). Этот цикл повторяется многократно до тех пор, пока не получается сходя- щееся решение. Программу, реализующую указанную итерационную схему, можно написать, выполнив следующую последовательность шагов. | Шаг 1. Напишите подпрограмму, выполняющую один релаксационный шаг в уравнении (VI.9) для ф при заданных значениях £ и рассмотренных выше граничных условиях. Предусмотрите возможность использования произвольного параметра релаксации. Эту подпрограмму можно полу- чить, адаптировав программу примера 6; особенно. полезным может ока- заться метод использования символов для вывода на экран грубой кар- тины линий уровня ф. | Шаг 2. Напишите подпрограмму вычисления граничных условий для С на поверхности пластины по известным значениям ф. | Шаг 3. Напишите подпрограмму, которая по заданным значениям ф де- лает один релаксационный шаг в уравнении (VI. 10) для Для вычис- ления граничных условий для С включите в нее подпрограмму шага 2. Предусмотрите возможность произвольного выбора параметра релакса- ции. Если ваш компьютер имеет два дисплея, то полезно выводить на один экран 0, а на другой—С | Шаг 4. Объедините подпрограммы, написанные на предыдущих трех ша- гах, в одну программу, выполняющую несколько итераций для совмест- ной задачи ф-С,. Проверьте сходимость этой схемы на нескольких гру- бых сетках для различных значений числа Рейнольдса и параметра ре- лаксации. | Шаг 5. Выполните несколько расчетов обтекания пластины на подроб- ных сетках (например, 24 х 70), продолжая расчеты до сходимости ре- шения. Используйте несколько увеличивающихся значений сеточного числа Рейнольдса. Характерные размеры пластины могут быть равны W = = 8h и Т = 8h, а сеточное число Рейнольдса может изменяться от 0,1 до 8. При больших числах Рейнольдса могут обнаружиться неустойчи- вости релаксационной процедуры, обусловленные нелинейностью уравне- ний. Эти неустойчивости иногда можно подавить, если использовать параметр релаксации порядка 0,1, а в качестве начального приближе-
192 Глава 6 ния задать картину течения, полученную при меньших числах Рейнольд- са. Убедитесь, что при малых числах Рейнольдса наблюдается плавная картина обтекания пластины, а при увеличении скорости течение отде- ляется от задней поверхности пластины и позади нее развивается не- большой водоворот (вихрь). Проверьте также точность ваших решений, рассчитав два -случая с различными сеточными числами Рейнольдса и одинаковым физическим числом Рейнольдса. | Шаг 6. Из полученной картины течения можно вычислить две физичес- ки интересные величины: результирующая сил давления Fp и результи- рующая вязких сил Fv на единицу длины пластины в направлении, пер- пендикулярном плоскости течения. Вследствие симметрии эти силы на- правлены вдоль оси х, и их удобно измерять в единицах потока им- пульса, набегающего на переднюю поверхность пластины (на единицу 9 длины пластины) 2WpVQ. Сила давления дается выражением Fp = J Pdy - J Pdy, (VI. 14) D В где интегралы берутся по всей передней и задней поверхностям плас- тины. Видно, что важны только относительные значения давления вдоль поверхностей пластины. Значения давления можно получить из рассчи- танной картины течения, используя уравнение (VI.36), (VI.Зв). Рас- смотрим, например, переднюю поверхность пластины. Используя (VI.Зв) вместе с (VI.4), (VI.6) и тот факт, что на поверхности пластины скорость равна нулю, можно записать производную давления вдоль пе- редней кромки пластины — = -vp . (VI.15) д у дх Следовательно, зная £ из рассчитанной картины течения, можно проин- тегрировать это выражение и найти распределение давления (относи- тельную величину) вдоль передней кромки. Аналогичные (VI. 15) выра- жения можно вывести для верхней и задней кромок, и в результате можно вычислить давление (за исключением не относящейся к делу ад- дитивной константы) на всех поверхностях, интегрируя по передней кромке в направлении вверх, вдоль верхней кромки и вниз по задней кромке. Результирующая вязких сил на единицу длины пластины обу- словлена только потоком вблизи верхней (и нижней) поверхности и дается выражением
Эллиптические уравнения 193 F = 2pi> f — dx. (Vi. 16a) " dy C Используя граничное условие на верхней поверхности пластины ди/дх = 0, можно записать силу вязкости в виде интеграла Fu = 2ру J С dx, (VI. 166) с который удобно вычислить из решения задачи. Исследуйте изменение сил вязкости и давления в зависимости от числа Рейнольдса и сравни- те полученные результаты с вашими предположениями. | Шаг 7. Можно исследовать также три других геометрии задачи. Для этого потребуется внести лишь незначительные изменения в написанную программу. Одна из этих геометрий («скачок» или прямой уступ) полу- чается при увеличении толщины пластины до тех пор, пока ее поверх- ность вниз по потоку не достигнет соответствующей границы расчетной области (Н). В другой геометрии пара прямоугольных пластин распола- гается симметрично относительно средней линии и жидкость может течь как между пластинами, так и вокруг них (грубая модель сопла). Нако- нец, можно также рассчитать течение в геометрии с двумя пластинами одна позади другой. Внесите в программу необходимые в каждом из этих случаев изменения и исследуйте картины течения при различных числах Рейнольдса. 13—1650
7. ПАРАБОЛИЧЕСКИЕ УРАВНЕНИЯ Примером уравнений в частных производных параболического типа, встречающихся в физике, является уравнение диффузии & = V-(DV<p) + S, (7.1) д t" где D — коэффициент диффузии (который может зависеть от пространст- венных координат), a S — источник. Другим примером служит нестацио- нарное уравнение Шрёдингера 2 zh — V2</> + V<p, (7.2) д t 2т где V — потенциал. В отличие от краевых задач, рассматривавшихся в предыдущей главе, эти уравнения, как правило, относятся к задачам с начальными условиями. Предполагается, что в начальный момент време- ни функция <р известна во всей области и требуется определить ее в последующие моменты времени. При этом в процессе эволюции во време- ни на функцию <р накладываются определенные граничные условия (на- пример, амплитуда волновой функции на достаточно больших расстояни- ях стремится к нулю; на некоторых поверхностях задается температура или поток тепла). Хо1я методы решения таких уравнений на ЭВМ доста- точно простые» некоторые моменты требуют более детального рассмот- рения. Как будет показано выше, эти методы дают также естественный способ нахождения собственных значений для эллиптических уравнений, особенно когда требуется найти только несколько наибольших или на- именьших собственных значений.
Параболические уравнения г 195 7.1. ПРОСТЕЙШИЙ СПОСОБ ДИСКРЕТИЗАЦИИ И ЧИСЛЕННАЯ НЕУСТОЙЧИВОСТЬ Рассмотрим сначала одномерное уравнение диффузии с постоянным коэф- фициентом диффузии. Пусть независимая переменная х изменяется между О и 1 и заданы граничные условия Дирихле, определяющие значения функции на границах интервала. После обезразмеривания (7.1) получа- ем а<е = + s(x, t). (7.3) dt дх2 Как правило, пространственные производные аппроксимируются конечны- ми разностями на равномерной сетке с числом узлов N + 1 и шагом по пространству h = \/N, а производная по временному шагу А/ аппрокси- мируется простейшей разностной формулой первого порядка точности. Используя верхний индекс п для обозначения шагов по времени (т.е. (рп = (p(tn), tn - nAt), мы можем аппроксимировать (7.3) следующим образом: <рп+] - <рп. 1 , = -j (3V) + 3" . (7.4) Д/ h2 1 При I - 1 и i = N в этом уравнении используются значения функции на границах <р0 и Разностная схема (7.4) явная, так как по заданным значениям ф в определенный момент времени можно сразу вычислить ее значения в следующий момент времени. Действительно, используя для наглядности матричную запись, получаем <рп"' = (1 - НМ)<рп + З'Х (7.5) где действие оператора Н определяется равенством (Н<Р). = --± (82<р). . В качестве примера использования этой явной схемы рассмотрим (7.3) для S = 0 с граничными условиями ф(0) = ф(1) = 0. Предположим также, что начальные условия задаются гауссоидой, центрированной относительно х = 1/2, -20(x-i)2 -20(х-х)2 -20(хД)2 ф(х, t = 0) = е 2 - е - е 2 . 13
196 Глава 7 Две последние сзеркальноотраженные» гауссоиды обеспечивают прибли- женное выполнение граничных условий при х = 1 и х = 0 соответст- венно. Необходимо найти значения ф в последующие моменты времени. Ниже приведена программа, которая с использованием схемы (7.5) ре- шает эту задачу на сетке с W = 25. 5 N%=25: H=1/N% 'параметры сетки 10 DT=.OO1: DTH=DT/H*2 'шаг по времени 15 DIM PHI|N%) 'массив для решения 16 ' функции для аналитического решения 20 DEF FNEXACT(X|=FNGAUSS(X|-FNGAUSS(X-1)-FNGAUSS(X+1) 25 DEF FNGAUSSJX) = ЕХР( -20*( Х-. 5) ~2/( 1+80*Т| ] /SQRTJ 1+80*Т| 30 ' задание начальных условий 35 Т=0 40 PHI(O)=O: PHI(N%)=0 45 FOR l%=1 ТО N%-1 50 PHI( l%| =FNEXACT( 1%*Н| 55 NEXT l% 60 ' 65 FOR 1Т%=1 ТО 50 'цикл шагов по времени 70 РТ=О 'старое PHI в последней точке 75 FOR l%=1 ТО N%-1 'цикл по узлам сетки 80 PS=PHI| 1%) +DTH*( РТ+РНЦ 1%+1) -2*РН1( |%] ] ' новое PHI в >той точке 85 РТ=РН1(1%) 'старое PHI для следую1цем точки 90 РНЦ1%) =Р$ 'запоминание нового PHI 95 NEXT 1% 100 ' 105 IF IT% MOD 5<>0 THEN GOTO 140 'печать через каждые 5 шагов 110 T=IT%*DT 115 PRINT USING "время=#. ######"; Т 120 FOR 1%=1 ТО Н%-1 125 EXACT: FNEXACTf 1%*Н) 130 PRINT USING "phi(##)=+#.###*------точное значением#.##**----- l%,PHI( 1%), EXACT 135 NEXT l% 140 NEXT IT% Характерные результаты расчета по этой программе показаны на рис. 7.1. По-видимому, схема при шаге по времени 0,00075 работает превосходно и результаты достаточно хорошо согласуются с аналити- ческим решением в виде затухающих гауссоид
П араболические уравнения 197 Ч>(Х, /) -1/2 -20(x-i)2. е ^-20(*-|)2/т ^-2O(x+i)2/T т = 1 + 80/. а д-ь=о,ооо75 •••• е* •ег={?^/5к • • • vXX>O<Xxx • ,* Л =0,045 Х** Z I* I £ = 0,02 6 Д1 = 0,001 » 1 = 0 5 10 15 20 25 в Д1 =0,005 91 = 0,02 • хХХХхх • Лхг = о,о4 Ххх. У ч Рис. 7.1. Результаты расчета одномерного уравнения диффузии с на- чальным условием в виде функции Гаусса на сетке с пространственным шагом h = 0,04: а и б —расчет по явной схеме (7.5); в —по неявной схеме (7.8).
198 Глава 1 Тем не менее этот шаг по времени очень мал по сравнению с харак- терным временным масштабом задачи t ~ 0,01, поэтому, прежде чем произойдет заметное изменение решения, необходимо выполнить большое число шагов. Если же мы попытаемся увеличить шаг по времени хотя бы до 0,001, то наше решение сильно исказится; на численном решении развивается нефизическая неустойчивость, приводящая к сильным ос- цилляциям численного решения от одного узла к другому вскоре после момента времени t = 0,02. Несложно понять, что произошло в этом случае. Пусть ^—соб- ственные функции дискретного оператора Я, а — соответствующие собственные значения. Поскольку оператор Н эрмитов, все его собст- венные значения действительны, а собственные векторы могут быть вы- браны ортонормированными. Решение на любой момент времени можно разложить по этому базису собственных функций 'р'1 = Ы V Л Точная временная эволюция решения определяется выражением <рп = е~пН^ из которой следует, что каждая компонента решения должна изменяться во времени по закону А Такой закон соответствует правильному поведению уравнения диффузии, в котором коротковолновые компоненты решения (с большими собствен- ными числами) затухают быстрее и решение со временем «сглаживает- ся». Однако выражение (7.5) показывает, что эволюция численного ре- шения по явной схеме будет определяться коэффициентами разложения = (1 - еЛД/)п (7.6) До тех пор пока шаг А/ выбирается достаточно малым, множитель в вы- ражении (7.6) правильно аппроксимирует exp (-ne^Af) и коротковолно- вые компоненты решения затухают со временем. Однако если шаг по времени слишком велик, то один или несколько множителей 1 - е^А^ по абсолютной величине будут превышать единицу. В этом случае соответ- ствующие компоненты начального решения, даже если они присутствуют в решении только из-за очень малых численных ошибок округления, бу- дут нарастать с каждым шагом по времени и вскоре станут доминиро-
Параболические уравнения 199 вать. Попробуем определить этот предел для А/. В нашей простой мо- дельной задаче собственные значения оператора Н известны аналити- чески. Легко проверить непосредственной йодстановкой в уравнение, что функции =sin являются (ненормированными) собственными функциями оператора Н с точными граничными условиями на сетке из N + 1 узлов для А = 1, 2, N - 1, а соответствующие собственные значения равны Наибольшее собственное значение Н равно » 4/г2, и оно соответ- ствует собственному вектору, компоненты которого меняют знак при переходе от одного сеточного узла к следующему. Из условия |1 - < 1 следует ограничение на временной шаг А/, который не должен превышать (1/2)/Л Для рассматриваемого примера это зна- чение равно 0,0008. Понятие устойчивости существенно отличается от понятия точнос- ти, так как ограничение на шаг по времени определяется величиной пространственного шага, а не характерным временным масштабом зада- чи, который значительно больше. С этой точки зрения рассмотренная нами явная схема неудовлетворительна, так как условие устойчивости вынуждает нас использовать гораздо меньший шаг по времени, чем это требуется для правильного описания процесса. Естественно, что поло- жение еще более ухудшается, если мы попытаемся, для повышения точ- ности численного решения использовать более мелкую пространственную сетку. Хотя выведенное нами ограничение на шаг А/ является iстрогим только для рассмотренного простого случая, тем не менее оно дает полезную оценку и для более сложных случаев, так как компоненты собственного вектора оператора И с максимальным собственным значе- нием всегда будут менять знак при переходе от одного узла сетки к следующему; следовательно, это собственное значение совершенно не- чувствительно к общим свойствам задачи. | Упражнение 7.1. Используя приведенную выше программу, убедитесь, что если уменьшать пространственный шаг, то неустойчивость возника- ет при все более малых шагах по времени, и что максимально возмож- ный шаг А/ приблизительно равен (1/2)А2. Покажите, что неустойчи-
200 Глава 7 вость возникает и при других начальных условиях, а ошибки округле- ния приводят к неустойчивости при расчете временной эволюции даже точного решения в виде собственной функции оператора Н с наименьшим собственным значением. 7.2, НЕЯВНЫЕ СХЕМЫ И ОБРАЩЕНИЕ ТРЕХДИАГОНАЛЬНЫХ МАТРИЦ Один из способов улучшения устойчивости рассмотренной выше явной схемы заключается в том, чтобы, сохраняя общий вид уравнения (7.4), заменить вторую производную по пространству на производную от реше- ния на новый момент времени. Таким образом, уравнение (7.4) заменя- ется следующим: -1-------1- = (32фп+\ + S'! . (7.7) А/ h Такая схема неявная, так как неизвестные значения входят в обе части уравнения. Конечно, можно разрешить это уравнение относитель- но и записать (рп+' = -1----[»>" + $ПА/]. (7.8) 1 + НЫ Эта схема эквивалентна схеме (7.5) с точностью до членов порядка At Тем не менее она гораздо предпочтительнее, так как может ис- пользовать ббльшие шаги по времени. Это обусловлено тем, что собст- венные значения оператора (1 + /7А/)”1 равны (1 + е^А/)-1 и все они по абсолютной величине меньше 1 для любого шага А/. Поэтому . все компоненты решения затухают на каждом шаге по времени, как это и должно быть. И хотя закон затухания для наиболее быстро колеблющих- ся компонент не является точным (т.е. неэкспоненциальный), это не очень существенно, так как при хорошей пространственной дискретиза- ции амплитуда этих компонент в начальных условиях не должна быть большой. В любом случае компоненты не усиливаются, что означает ус- тойчивость схемы. Изменение амплитуды медленно меняющихся компонент решения, соответствующих малым собственным значениям, на каждом ша- ге по времени хорошо аппроксимируется экспонентой. Отметим, что если бы мы захотели повысить точность схемы (7.7), используя среднее значение второй производной на двух рассматривае- мых моментах времени,
Параболические уравнения 201 = 4 (З2 1/2(фп+1 + ?>"]), + Sn , (7.9) А/ h так что эволюция решения будет определяться уравнением ф"*1 = -----'---[(1 - (1/2)НЫ)<рп + SnA/], (7.10) то такая схема окажется настолько же хорошей, как и неявная схема (7.7), так как коэффициенты затухания всех компонент решения по аб- солютной величине также меньше единицы. Потенциальный недостаток схемы (7.8) состоит в том, что на каж- дом шаге по времени для нахождения необходимо решать систему линейных уравнений (хотя и трехдиагональную), что равносильно при- менению матрицы, обратной матрице 1 + ЯА/, к вектору, записанному в скобках. Так как элементы обратной матрицы не зависят от времени, эта матрица может быть найдена только один раз в начале расчета, а затем применяться для всех моментов времени. Тем не менее непосред- ственное применение обратной матрицы требует порядка № арифмети- ческих операций на каждом шаге по времени. К счастью, существует алгоритм (метод исключения Гаусса и обратная подстановка [Va62]), обеспечивающий очень эффективное решение (порядка N операций) трех- диагональных систем уравнений, которые возникают, например, при ре- шении уравнений типа (7.8). Рассмотрим алгоритм решения трехдиагональной системы уравнений = b (называемый также методом прогонки) относительно неизвестных значений ЛЛ-1 + A°?i + = ь1 (7.И) Здесь обозначают отличные от нуля элементы матрицы А, а Ь.— известные величины. Уравнения именно такого типа возникают при ре- шении уравнения (7.8) относительно причем значения р0 и <pN задаются граничными условиями Дирихле. В частности, в нашем случае Ь. = <рп + SnAt, Л° = 1 + ^, Л1 = -Ц • ‘ ‘ ‘ ‘ Л2 ' А2 Для решения этой системы уравнений предположим, что искомое решение удовлетворяет рекуррентному соотношению, связывающему значения ф в соседних узлах i и i + 1,
202 Г лава 7 Ч>М = “А + Р,- • (712) где а. и р.~коэффициенты, которые необходимо определить. Подстав- ляя это соотношение в (7.11), получаем A^i-t+ Л<Х-+ л7ал+ = ь, (7-13) Это соотношение можно разрешить относительно что дает ч>(= з'<лл-1+ у/лХ - bi>' <714) где При сравнении уравнений (7.14) и (7.12) видно, что они тождествен- ны, если коэффициенты а. и (3. удовлетворяют рекуррентным соотноше- ниям a._t = уЛ7 ; (7.16а) = Г/Л^З. - 6.). (7.166) Теперь алгоритм решения системы должен бцть очевиден. В форму- лах обратного хода по узлам сетки для определения коэффициентов а. и 3. мы будем использовать рекуррентные соотношения (7.15) и (7.16), в которых индекс I будет изменяться от N - 2 до 0. В каче- стве начальных значений следует взять аАМ = °’ fyv-1 = ’ что будет гарантировать нам правильное значение ф в последнем узле сетки. Вычислив эти коэффициенты, мы можем в формулах прямого хода использовать рекуррентное соотношение (7.12), в котором i изменяет- ся от 0 до N - 1. Необходимое для начала прямого хода значение <pQ известно из граничных условий. В итоге мы нашли решение системы всего только за два прохода по сетке, выполнив при этом порядка W арифметических операций. В приведенной ниже программе для решения модельной диффузионной задачи, которую мы уже рассматривали, используется схема (7.8). Ре- зультаты расчета приведены на рис.7.1,^ из которого вцдно, что точные решения могут быть получены с шагом по времени гораздо боль- шим, чем шаг, используемый в явной схеме. Объем вычислений при этом увеличивается всего лишь в 2 раза. Ответим, что коэффициенты а. ц
Параболические уравнения 203 у. не зависят от вектора Ь, и, так как обращение необходимо выпол- нять на каждом шаге по времени, эффективнее вычислить эти коэффици- енты только один раз в начале расчета и запомнить (строки 70—95); далее при каждом обращении необходимо вычислять только |3. (строки 115-130). 5 N%=25: H=1/N% 'параметры сетки 10 DT=.OO5: DTH=DT/H^2 'шаг по времени, константы 15 DIM РНЦN%) 'массив для решения 20 DIM ALPHA(N%),ВЕТА(N%),GAMMAfN%) 'массивы для коэффициентов 24 ' функции для аналитического решения 25 DEF FNEXACT(X)=FNGAUSS(X)-FNGAUSSfX-1)FNGAUSS(X+1) 30 DEF FNGAUS$(X]=EXP(-20*[X-.5)^2/(1+80*T) )/SQR( 1+80*Т) 35 ' задание начальных условий 40 Т=0 45 РНЦО)=О: PHI|N%|=0 50 FOR l%=1 ТО N%-1 55 РН1( 1%) =FNEXACT( 1%*Н) 60 NEXT 1% 65 ' вычисление коэффициентов ALPHA и GAMMA 70 AP=-DTH: AZ=1+2*DTH 'коэффициенты А 75 ALPHA[N%-1) =0: GAMMA( N%-1)=-1/AZ 'начальные значения 80 FOR l%=N%-1 TO 1 STEP -1 'обратный ход 85 ALPHA! I%-1)=GAMMA| 1%) *AP 90 GAMMAf I%-1 J =-1/( AZ+AP*ALPHA( l%-1) J 95 NEXT i% 100 ' 105 FOR 1Т%=1 ТО 50 110 ' 115 120 125 130 135 ' 140 145 150 155 160 ' 165 'цикл шагов по времени 'вычисление ВЕТА 'начальное значение 'обратный ход ВЕТА( N%-1)=0 FOR l%=N%-1 TO STEP -1 BETA! I%-1) =GAMMA( l%) ♦[ AP*BETA( \%] -РНЦ1%)) NEXT 1% вычисление новых значений PHI РНЦО)=О 'начальное значение FOR l%=0 ТО N%-1 'прямой ход РНЦ l%+1J=ALPHA( 1%1*РНЦ 1% j +ВЕТА( 1%) NEXT 1% вывод результатов на каждом шаге по времени T=IT%*DT
204 Глава 7 170 PRINT USING "время:*. Т 175 FOR l%=1 ТО N%-1 180 EXACT:FNEXACT( 1%*Н| 185 PRINT USING "phi(##)=+•.###*---точное значение:*#. ##*жжжж"; 1%,РН1( 1%), EXACT 190 NEXT 1% 195 NEXT IT% | Упражнение 7.2. Используя приведенную выше программу, исследуйте точность и устойчивость явной схемы при различных значениях про- странственного и временного шага. Изучите эволюцию различных на- чальных условий и убедитесь, что она соответствует вашей интуиции. Включите в узлах сетки источники и стоки тепла и изучите получающи- еся решения, задав начальное условие <рр = 0) = 0. | Упражнение 7.3. Модифицируйте эту программу для решения уравнения по схеме (7.10) и изучите устойчивость этой схемы. Исследуйте влия- ние на решение различных линейных комбинаций <рп и <pn+1 в правой части уравнения (7.9) (например, (3/4)(рп + (l/4)pn+1). | Упражнение 7.4. Простой способ задания граничных условий типа Неймана ? I =е дх 1 х=0 сводится к условию <р^ = <р0 + hg. Покажите, что в этом случае на- чальное значение в формуле прямого хода (7.12) равно Как записать аналогичное выражение для вытекающее из более точ- ного условия = (р_^ + 2hg? Какие значения следует использовать для начала расчета коэффициентов а и р по формулам обратного хода (7.15), (7.16), если на правой границе сетки задано условие Нейма- на? Измените программу так, чтобы включить граничное .условие д<р/дх = 0 при х = 0 (что соответствует наличию изолятора в тепловой задаче), и пронаблюдайте влияние этого условия на решения. Покажи- те, что рассмотренная выше схема обращения трехдиагональных матриц неприменима в случае периодических граничных условий (т.е. (pN = = v0).
Параболические уравнения 205 ( Упражнение 7.5. Решите краевую задачу, сформулированную в упр. 3.4, проведя дискретизацию и обратив полученную трехдиагональную матрицу. Сравните ваше решение с решением, полученным методом функ- ции Грииа, и с аналитическим результатом. 7.3. УРАВНЕНИЕ ДИФФУЗИИ И ДВУМЕРНЫЕ КРАЕВЫЕ ЗАДАЧИ Проведенное выше обсуждение показывает, что одномерное уравнение диффузии лучше всего решается с помощью неявного метола и что не- обходимое для этого метода обращение трехдиагональной матрицы — сравнительно простая задача. Поэтому вполне естественно распростра- нить этот подход иа случай двух и более пространственных измере- ний. Дискретизация двумерного уравнения диффузии = ?2Ф dt достаточно очевидна, и по аналогии с одномерной задачей временная эволюция решения должна описываться уравнением где К сожалению, хотя матрица Н сильно разрежена, она не является трех- диагональной и алгоритм, который так хорошо работал в одномерном случае, к ней неприменим; можно показать, что никакой перестановкой строк или столбцов эту матрицу нельзя привести к трехдиагональному виду. Тем не менее то обстоятельство, что оператор Н можно запи- сать в виде суммы операторов, каждый из которых содержит разности только по индексу i или /: н = н.+ н,- Нч = -^8\.. (7.18) означает, что выражение 0n+1 = -----1---------1--- <рп (7.19) 1 + Н.М 1 + Н At I /
206 Глава 7 эквивалентно (7.17) с точностью до членов порядка А/. Теперь полу- ченное уравнение может быть решено точно, поскольку каждое из тре- буемых обращений сводится к решению системы с трехдиагональной мат- рицей. В частности, если ввести вспомогательную функцию фп+1/2, то можно записать фи+1/2 -----1-- фп; mn+1 1 + H£t ___1_ 1 + нм I Таким образом, оператор (1 + действует по формулам прямого и обратного ходов по индексу / независимо для каждого значения I. /атем аналогично применяется оператор (1 + НЫ)"* по индексу i независимо для каждого значения /. Как легко видеть, эта схема «пе- ременных направлений» оказывается устойчивой при любых значениях шага по времени и легко обобщается на трехмерный случай. Возможность точного обращения трехдиагональной матрицы, а также идея отдельного рассмотрения каждой из вторых производных лапласиа- на приводят нас к классу итерационных методов переменных направле- ний [Wa66] для решения эллиптических краевых задач, рассмотренных в гл. 6. В этих методах исходная матрица записывается в виде суммы нескольких слагаемых, каждое из которых содержит вторые разности только по одному сеточному индексу. Например, в двумерном случае мы хотим решить уравнение (ср. уравнение (6.36)) (Н. + Н.)<р = $. (7.20) Если мы добавим к обеим частям уравнения член цр, где w —константа (см. ниже), то полученное выражение можно разрешить относительно <р двумя различными способами: <Р = ----Ц- [S - (Н - ь>)ф];' (7.21а) й) + Н t 1 <Р = ----Ц- [s - (Я, - И)(Р]. (7.216) ш + Н t ‘ Эта пара уравнений составляет основу итерационного метода реше- ния: оба уравнения решаются по очереди, при этом значения в пра- вых частях берутся с предыдущей итерации; для решения используётся только обращение трехдиагональных матриц. Выбор оптимального значе- ния «параметра ускорения» О) зависит от вида матриц; более того,
Параболические уравнения 207 этот параметр может меняться от одной итерации к следующей для улучшения сходимости. Нахождение оптимального значения w требует довольно сложного анализа [Wa66]. Тем не менее на практике хорошим приближением является w = (а|3)1/2, (7.22) где а и /3—соответственно нижняя и верхняя границы собственных зна- чений операторов Н. и Н.. Как правило, методы переменных направле- ний гораздо эффективнее простой релаксационной схемы, обсуждавшейся в гл.6, хотя они и несколько сложнее в программировании. Отметим, что некоторое усложнение возникает также при задании граничных ус- ловий во внутренних областях сетки. 7.4. ИТЕРАЦИОННЫЕ МЕТОДЫ РЕШЕНИЯ ЗАДАЧ НА СОБСТВЕННЫЕ ЗНАЧЕНИЯ Проведенный нами анализ уравнения диффузии (7.1) показывает, что суммарный результат эволюции решения во времени состоит в усилении компонент, соответствующих малым собственным значениям оператора Н, относительно компонент с большими собственными значениями. Действи- тельно, на больших временах решение определяется только компонентой с наименьшим собственным значением, хотя амплитуда этой компоненты и очень мала. Такое поведение решения позволяет предложить алгоритм нахождения наименьшего собственного значения эллиптического опера- тора, определенного уравнением (6.2); выбирается начальное прибли- жение для собственного вектора, которое подвергается эволюции в фиктивном времени. В результате такой эволюции посторонние компо- ненты «отфильтруются» и решение придет к собственному вектору с на- именьшим собственным значением. Так как мы решаем линейную задачу, неизбежное уменьшение или увеличение амплитуды решения можно избе- жать, если на каждом шаге по времени проводить перенормировку. Для конкретнбсти изложения рассмотрим одномерное, не зависящее от времени уравнение Шрёдингера с h = 2т = 1. Задача на собственные значения имеет вид .2 —х- + V(x) (р = е<р dx (7.23) с условием нОрмйрОвки
208 Глава 7 J dx ф2 = 1 (функцию всегда можно выбрать действительной, если V действитель- но). Соответствующий задаче функционал энергии равен Е-( dx 1/2 dgl2 dx + V(x)p2(x) (7.24) И? общих соображений мы знаем, что на собственной функции величина Е стационарна относительно любых вариаций ф, удовлетворяющих усло- вию нормировки, и что это значение Е есть собственное значение для данной собственной функции. Для вывода дискретной аппроксимации задачи дискретизируем Е в виде 9 Е = I Л [1/2 + И.#>2 , . Л2 (7.25) с условием нормировки I = 1 (7.26) При варьировании относительно всех <р. получаем задачу на собствен- ные значения (#(Р). S ~ (S2<p). + Vip. = е<р. , (7.27) где е входит в виде множителя Лагранжа, чтобы обеспечить условие нормировки. (Сравните с выводом уравнений Хартри—Фока, данным в проекте III.) Уравнение (7.27) можно рассматривать как постановку задачи о нахождении действительных собственных значений и собственных векто- ров симметричной трехдиагональной матрицы (большого порядка), опре- деляющей оператор И. Хотя прямые методы решения такой задачи уже рассматривались в гл.5, но они неприменимы для ленточных матриц очень большого порядка, возникающих при дискретизации двух- и трех- мерных задач. Однако в таких задачах представляет интерес, как пра- вило, только несколько наибольших или наименьших собственных значе- ний, и для их нахождения можно применить диффузионную аналогию. Итак, рассмотрим задачу
Параболические уравнения 209 = -н<р, дт где т обозначает «фиктивное» время. Для удобства предположим, что наименьшее собственное значение оператора Н положительно определе- но. (Это условие всегда можно выполнить сдвигом оператора Н на кон- станту, не зависящую от пространства, так что полученные при этом сдвиге V. будут положительны для всех i.) Для решения этого уравнения в «фиктивном» времени можно приме- нить любой из рассмотренных ранее алгоритмов. Простейший из них — явная схема (7.5): <pn+1 ~ (1 - НЬт)<рп, (7.28) где Дт —малый положительный параметр. В этом уравнении знак ~ ука- зывает на то. что <рп+^ должно нормироваться на единицу согласно условию (7.26). Начальное приближение <pQ можно выбрать произвольно, лишь бы оно не было ортогонально точной собственной функции, хотя близость приближения к решению ускорит сходимость. На каждом шаге такого процесса уточнения решения вычисляется энергия по формуле (7.25), которая дает оценку для искомого собственного значения. В качестве примера рассмотрим задачу, в которой V = 0, <р(0) = ф(1) = О, что соответствует движению свободной частицы в потенциальной яме единичной ширины. Эта задача имеет аналитическое решение для нор- мированных собственных функций 0^ = 21/2 sin Лях и соответствующих им собственных значений = Л2п2. Л Здесь Л —целое число, отличное от нуля. Ниже приведен текст про- граммы, которая использует схему (7.28) на сетке из 21 узла и вы- числяет на каждой итерации энергию по формуле (7.25). В качестве начального приближения выбрана функция <р ~ х(1 - х), которая грубо аппроксимирует точное основное состояние. 5 N%=25: H=1/N% 10 DT=.OOO5: DTH=DT/KT2 15 DIM PHI(N%) 14-1650 'параметры сетки 'шаг по времени, константы 'массив для решения
210 Глава 7 25 FOR l%=1 ТО N% 30 X=I%*H: РН1(1%)+Х*(1-Х) 35 NEXT l% 40 GOSUB 1000 45 ' 50 FOR 1Т%=1 ТО 60 'начальное приближение для PHI ' нормировка приближения для PHI 55 60 65 70 75 80 85 ' 90 95 100 105 'итерационный цикл 'действие оператора (1-H*DT) FOR l%=1 ТО N%-1 PS=PHI( l%) +DTH*( РТ+РНЦ 1%+1) -2*РН!( 1%)) PT=PHI(I%): PHI(I%)=PS NEXT l% GOSUB 1000 'нормировка PHI Е=0 FOR l%=1 ТО N% 'вычисление энергии Е=Е+( РНЦ 1%)-РН1( 1%-1) Г 2 NEXT l% 110 ' 'вывод результатов 115 PRINT USING "номер итерации=## энергия=+##>.####ЛЖЛЖ"; 1Т%,Е/Н 120 NEXT !Т% 125 END 1000 ' ж*********************************************************************** 1005 'подпрограмма нормировки phi на единицу 1010 '************************************************************************ 1015 NORM=0 1020 FOR 1%=1 ТО Н% 1025 NORM=NORM+PHI( 1%] ж2 1030 NEXT l% 1035 NORM=1/SQR(H*NORM) 1040 FOR l%=1 ТО N% 1045 РНЦ \%] = РНl( l%] *NORM 1050 NEXT l% 1055 RETURN Результаты расчета по этой программе для нескольких различных значений Ат приведены в табл.7.1. Заметим, что при значениях Ат, меньших предела устойчивости (1/2А2) ~ 0,00125, энергия сходится к ожидаемому ответу и эта сходимость для большего Ат более быстрая. Если же Ат становится слишком большим, компоненты начального при-
Параболические уравнения 211 Таблица 7.1. Сходимость решения к наименьшему собственному значению в задаче с прямоугольной потенциальной ямой. Аналитическое значение равно 9,86960; точное конечно-разностное значение—9,84933 Номер итерации Дт = 0,0005 Дт = 0,0010 Дт = 0,0015 4 9,93254 9,90648 9,88909 8 9,90772 9,87841 9,86569 12 9,89109 9,86441 9,87311 16 9,87946 9,85719 10,05357 20 9,87116 9,85342 12,34984 24 9,86519 9,85146 42,96950 28 9,86086 9,85044 379,69290 32 9,85773 9,84991 1301,501 36 9,85544 9,84963 1565,746 40 9,85378 9,84949 1587,891 44 9,85257 9,84941 1589,690 48 9,85169 9,84937 1589,966 52 9,85105 9,84935 1590,061 ближения с большими собственными значениями, вместо того чтобы за- тухать, усиливаются. В этом случае окончательное значение энергии соответствует наибольшему собственному значению оператора Н, точное конечно-разностное значение которого равно (см. обсуждение, следую- щее после уравнения (7.6)) 1600 sin2f—1 = 1590,15. I 40J Такое поведение решения показывает, как можно найти максимальное по абсолютной величине собственное значение оператора Н\ необходимо просто многократно применить оператор Н к начальному приближению. Хотя изложенный выше в общих чертах алгоритм работает, он все же недостаточно хорош, поскольку ограничение на шаг Дт обусловлено пространственным шагом и для уточнения начального приближения, да- лекого от точного решения, часто требуется большое число итераций. Эту ситуацию можно до некоторой степени улучшить выбором хорошего начального приближения. Гораздо эффективнее использовать неявную схему (например, (7.8)), в которой при любых шагах Дт компоненты с 14*
212 Глава 7 большими собственными значениями не усиливаются. Другая возможность состоит в использовании выражения ехр(-ЯДт) для улучшения начально- го приближения. Хотя точное вычисление этой матрицы может оказаться трудной задачей, особенно для рассматриваемых нами матриц высокого порядка, ее можно хорошо представить разложением в ряд с конечным числом- членов. Этот ряд легко вычислить, так как для этого требует- ся только многократно применить матрицу Н к пробной функции. Как правило, в этом случае шаг Дт больше, чем при аппроксимации экспо- ненты только с первым порядком точности по Дт (7.28). Пока мы показали только то, как можно применить рассматриваемый метод для нахождения наименьшего или наибольшего собственного зна- чения оператора или матрицы. Чтобы показать, как найти другие соб- ственные значения и соответствующие им собственные функции, рас- смотрим задачу о нахождении второго наименьшего собственного значе- ния. Для этого найдем сначала изложенным выше методом наименьшее собственное значение. Затем выбирается начальное приближение для второй собственной функции, которое улучшается аналогичным спосо- бом. При этом необходимо на каждом шаге следить за тем, чтобы реше- ние было ортогонально ранее найденной наинизшей собственной функ- ции. Это легко можно сделать, выделяя на каждом шаге компоненту ре- шения, неортогональную наинизшей собственной функции. (Такое выде- ление не нужно делать, если задача обладает какой-либо симметрией, например зеркальной, которая отделяет два наинизших решения и кото- рая сохраняется при применении процедуры уточнения.) Если мы нашли этим способом вторую наинизшую собственную функцию, то третья наи- низшая функция может быть найдена аналогично, необходимо только следить, чтобы в процессе ее уточнения она оставалась ортогональной обеим собственным функциям с меньшими собственными значениями. Тем не менее такой алгоритм неприменим для нахождения большого числа наинизших (или наивысших) собственных векторов, так как численные ошибки округления при ортогонализации решения к большому числу ра- нее найденных собственных векторов быстро нарастают и становятся определяющими. Хотя рассмотренный выше метод иллюстрировался на примере одно- мерной задачи, очевидно, что его можно непосредственно применять для нахождения собственных значений и собственных векторов эллипти- ческого оператора для двух и более измерений, используя, например, соотношение (7.19). | Упражнение 7.6. Дополните приведенную выше программу, чтобы она
П араболические уравнения 213 могла находить собственные функции и собственные значения для пер- вых двух возбужденных состояний каждой четности в одномерной прямо- угольной потенциальной яме. Сравните ваши результаты с точными ре- шениями и с аналитическими конечно-разностными значениями. | Упражнение 7.7. Напишите программу (или измените приведенную вы- ше) для нахождения нескольких наименьших или наибольших собственных векторов двумерного оператора Лапласа в области, состоящей из квад- рата с квадратным отверстием в центре. Исследуйте, как изменяются ваши результаты в зависимости от размера отверстия. 7.5. НЕСТАЦИОНАРНОЕ УРАВНЕНИЕ ШРЁДИНГЕРА Численное моделирование нестационарного уравнения Шрёдингера, опи- сывающего одномерное движение частицы, служит хорошей иллюстрацией возможностей рассмотренных выше методов и некоторых удивительных примеров операций в квантовой механике [Go67]. Рассмотрим задачу об эволюции (комплексной) волновой функции ф, которая описывается уравнением (7.2), если известны ее значения в некоторый начальный момент времени. После стандартной дискретизации по пространству мы получаем параболическое уравнение aip -7 = . (7.29) аг где Я —оператор, определенный в (7.27), и мы положили h = 1. Для дискретизации по времени мы можем использовать любой из трех мето- дов, рассмотренных выше для уравнения диффузии. Явная схема (7.5), в которой эволюция решения определяется оператором (1 - iH&t), не- устойчива при любом значении Af, так как все собственные значения этого оператора, (1 - iexA/), по абсолютной величине равны (1 + е2Д/2),/2 и больше единицы. Наоборот, неявная схема (7.8) устойчива при любом А/, так как абсолютная величина всех собственных значений оператора перехода
214 Глава 7 (1 < е2д/2г1/2 ' Л ' всегда меньше единицы. И все же эта схема нас не удовлетворяет, по- скольку численное решение не обладает важным свойством унитарности точного решения по времени; норма волновой функции численного реше- ния непрерывно уменьшается со временем. К счастью, очень удобной оказывается схема (7.10), которая в нашем случае запишется так: '1 - tyW .1 + 4ЯД/ pn+1 (Рп. (7.30) Очевидно, что ее оператор перехода унитарен (вспомним, что оператор Н эрмитов), а все собственные значения по абсолютной величине равны единице, так что норма <р, вычисленная согласно (7.26), остается по- стоянной при переходе от одного момента времени к следующему. (Ко- нечно, квадрат действительной волновой функции в (7.26) следует за- менить на абсолютную величину квадрата комплексной волновой функ- ции.) Кроме того, алгоритм (7.30) обладает таким хорошим свойством, что он аппроксимирует точный экспоненциальный оператор перехода ехр(—Z//AZ) со вторым порядком точности по Д/, т.е. на порядок выше, чем это можно было предположить из простейших соображений. Для практических численных расчетов очень удобно переписать (7.30) в виде Ф 2 .1 + i^Hht - 1 <рп = X - <рп. (7.31) Такая запись устраняет один проход по узлам сетки, необходимый для вычисления числителя в (7.30). Для нахождения на каждом шаге по времени промежуточной функции х» определяемой уравнением (1 + Д//Д/)Х = 2фп, 2 перепишем это уравнение в явном виде —Z + 2ft2 '+1 1 + h‘ 4 + — v X - ±Цх, ] = 2ф" 2 2 'I 1 2h2 ' (7.32) 9 и после деления обеих частей на -ibd/2h получим
Параболические уравнения 215 + [’2 + чг ’ л2ф/+ V1= <7-33) Полученное уравнение по форме совпадает с уравнением (7.11), поэто- му его можно решить рассмотренным ранее методом прогонки. В программе примера 7, листинг которой приведен в приложении Б, для решения нестационарного уравнения Шрёдингера используется опи- санный выше метод. В этой программе на сетке из 160 узлов можно за- дать несколько различных аналитических зависимостей для потенциала (прямоугольная яма или барьер, яма или барьер в виде функции Гаус- са, ступенчатый потенциал или параболическая яма), которые затем можно изменять поточечно, используя клавиши управления курсором. В качестве начального условия задается гауссовский или лоренцевский волновой пакет с заданным средним положением, импульсом и шириной. Затем форма этого волнового пакета эволюционирует во времени, удов- летворяя при этом условию <р = 0 на границах сеточной области. На а каждом шаге по времени выводятся плотность вероятности |р | и по- тенциал, а также полные вероятности и средние положения частей вол- нового пакета слева и справа от выбранной точки. Если расчет по времени прерывается нажатием на клавишу «е», то после этого можно изменить потенциал или форму волнового пакета для моделирования другого случая. Поскольку язык BASIC не поддерживает действия с комплексными числами, действительные и мнимые части всех выражений были записаны отдельно. Приведенные ниже упражнения будут полезны для лучшего понимания этого примера. В качестве основных параметров в этих упражнениях удобно выбрать следующий набор: прямоугольный потенциал высотой или глубиной 0,1 и полушириной 20, начальный волновой пакет со средним импульсом « 0,4 и шириной « 15, шаг по времени, равный 1 или 2. | Упражнение 7.8. Проверьте точность интегрирования следующим прие- мом. Проинтегрируйте уравнение на некотором интервале времени, за- тем измените знак шага по времени и проинтегрируйте в обратном на- правлении на таком же интервале времени и посмотрите, вернулись ли вы к начальной форме волнового пакета. Напишите подпрограмму для вычисления средней энергии волнового пакета на каждый момент време- ни и проверьте, что энергия сохраняется точно независимо от вели- чины шага по времени.
216 Г лава 7 В Упражнение 7.9. Проверьте, что волновые пакеты в отсутствие како- го-либо потенциала и в параболической потенциальной яме ведут себя так, как это и ожидается. | Упражнение 7.10. Исследуйте падение пакетов волн с различной ши- риной и энергией на барьеры и ямы разного размера и формы. Объясни- те все наблюдаемые особенности временнбй эволюции. Для прямоуголь- ной потенциальной ямы и ступенчатого потенциала сравните относи- тельные вероятности для прохождения и отражения волнового пакета с аналитическими значениями коэффициентов пропускания и отражения. Задайте резонансный случай, рассмотрев рассеяние на потенциалах с «ямой», и пронаблюдайте распад начального волнового пакета на быст- рую и затухающую компоненты. Рассмотрите случай туннелирования в «двойной яме» и исследуйте эволюцию пакета. | Упражнение 7.11. Замените алгоритм (7.30) на неустойчивый явный метод или на неунитарный неявный метод и исследуйте эффекты от та- кой замены. | Упражнение 7.12. Замените граничное условие Дирихле <р = 0 на од- ной границе сетки на условие Неймана с нулевой производной и посмо- трите, что произойдет при приближении волнового пакета к этой гра- нице. | Упражнение 7.13. В двух- и трехмерных расчетах большое число се- точных узлов вынуждает увеличивать пространственный шаг, насколько это возможно, поэтому необходимо использовать для аппроксимации пространственных производных формулы более высокого порядка точнос- ти [F178]. Замените 3-точечную формулу для второй производной по пространству на более точную 5-точечную, приведенную в табл. 1.2. Разработайте алгоритм обращения получающейся при этом пятидиаго- нальной матрицы. Примените его в программе и отметьте какие-либо отличия в результатах или в эффективности вычислений. ПРОЕКТ VII: САМООРГАНИЗАЦИЯ В ХИМИЧЕСКИХ РЕАКЦИЯХ Работы последних лет в различных областях физики показали, что ре- шения нелинейных уравнений могут описывать широкий круг явлений. В
Параболические уравнения 217 качестве примера можно привести такое явление, как «отбор» структу- ры, когда из бесструктурных начальных условий самопроизвольно воз- никают устойчивые нетривиальные структуры в пространстве и (или) во времени. В данном проекте будет численно и аналитически исследована модель химических реакций, называемая брюсселятором. Поведение ре- шений этой модели обнаруживает большое сходство с удивительными яв- лениями, наблюдаемыми в реальных химических системах [Wi74]. Наше изложение будет следовать работам [Ni77] и [Во76]. Vll.1. Описание модели Рассмотрим совокупность химических реакций, в которой вещества-реа- генты А и В превращаются в продукты реакции D и Е через промежуточ- ные продукты X и Y: А X; (VII.1а) В + Х-> У + D\ (VII.16) 2Х + У —> ЗХ; (VII.Ib) X Е. (VII.1г) Предположим, что концентрация веществ А и В постоянна во времени и однородна по пространству и что продукты D и Е являются «мертвыми» в том слысле, что они либо химически инертны, либо немедленно уда- ляются из реагирующего объема. Предположим также, что процессы (VII. 1а —г) существенно экзотермические, поэтому влиянием обратных реакций можно пренебречь. При этих предположениях мы можем записать следующие уравнения для изменяющихся во времени концентраций проме- жуточных продуктов X и У: = kaA - kbBX + kcX2Y - kdX + DxV2X- (VII.2a) = kbBX - kX2Y + DyV2y. (VII.26) d t Здесь обозначают соответственно константы скоростей реакций (VII.la —г), a Dx у — коэффициенты диффузии продуктов X и У. Для упрощения анализа нелинейных диффузионных уравнений (VII.2)
218 Глава 7 удобно записать их в безразмерном виде. Если мы будем измерять вре- мя в единицах &”1, пространство в единицах /, где / — характерный размер реагирующего объема, концентрации X и Y в единица/Х (/г^//гс)1/2, А в единицах (^/^с)1/2, Я в единицах kj/kb и Dxy в единицах /г^/2, то уравнения (VII.2) примут вид А - (В + 1)Х + X2Y + DJJ2X; (VII.3a) dt Л = BX - X2Y + DyV2Y. (VII.36) Из проведенного обезразмеривания видно, что константы А и В могут быть порядка единицы, в то время как коэффициенты D* у могут оказа- ться значительно меньшими в зависимости от размера /. Наши уравнения допускают единственное тривиальное решение, со-, ответствующее однородному стационарному состоянию. Приравнивая все производные нулю, получаем систему алгебраических уравнений, реше- ние которой даст нам равновесную точку. После несложных преобразо- ваний найдем, что равновесие соответствует значениям X = хо = А У = Уо = 7 • Для полноты постановки задачи мы должны задать граничные усло- вия. Среди различных возможностей два типа условий представляют особый физический интерес. Это условие «отсутствия потоков» на гра- ницах, в котором требуется, чтобы нормальные производные от X и Y на поверхности реагирующего объема были равны нулю (что соответст- вует химическим превращениям в замкнутом сосуде), и «фиксированные» граничные условия, в которых требуется, чтобы X и Y на границах бы- ли равны своим равновесным значениям. VII.2. Линейный анализ устойчивости Чтобы получить некоторую информацию о поведении рассматриваемой си- стемы, прежде чем начинать численное моделирование, полезно проана- лизировать поведение малых отклонений относительно равновесного со- стояния. Для этого положим X = Хо + дХ(г, /), (VII.4а)
Параболические уравнения 219 Y = Уо + 5У(г, /), (VII.46) где г описывает пространственные переменные, а дХ и 5У —малые вели- чины, зависящие от пространства и времени. Подставляя эти соотноше- ния в (VII.3) и линеаризуя систему относительно малых величин, по- лучаем = (2ХПУП - В - 1 + DJ)2)8X + Х2ЗУ; (VII.5a) д t = (В - 2Х0У0)6Х + (DyV2 + Х2)6У. (VII.56) Рассмотрим теперь одномерную задачу в отсутствие потоков на границах. В этом случае дХ можно разложить в ряд: СО 1 b) t dX(r, t) = £ т cos т7Гг» (VII.6) «1=0 и аналогично для 6У. Здесь 0 г 1—пространственная координата, а значение величины определяет устойчивость т-й нормальной моды. В частности, если Re 0)^ < 0, то мода устойчива (затухает со време- нем); если Re и>т > 0, то мода неустойчива (возрастает со временем); если (^ — комплексная величина, то мода во время своего роста или затухания испытывает колебания. Для фиксированных граничных условий разложение, аналогичное (VII.6), содержит множители sin тпг. Подставляя разложение в ряд Фурье (VII.6) в линеаризованную си- стему (VII.5а, б) и приравнивая коэффициенты при каждой пространст- венной моде, получаем однородную систему уравнений для нахождения собственных значений Ь) : т “А = (2^0У0 - В - 1 - + ’ (VII.7) и ЗУ = (В - 2ХПУП)ЗХ - (X2 + В„т2п2)ЗУ . т т ' О О' «г ' О У ' т Легко видеть, что эти уравнения справедливы для обоих типов гранич- ных условий, а собственные значения удовлетворяют характеристичес- кому уравнению ь>2 + (В - а )ь> + Д2В - а В =0, (VII.8) т х т т' т т' т ' '
220 Г лава 7 где ат = В - 1 - m2n2Dx , Рт = А2 + m2n2Oy . (VII.9) (Здесь мы выразили XQ и Уо через А и В.) Корни этого квадратного уравнения равны о; = l/2{am - Вт ± [(ат + 0J2 - 4Л2В]’/2}. (VII. 10) Подробный анализ уравнений (VII.9), (VII. 10) выявляет несколько интересных аспектов относительно устойчивости однородного равновес- ного состояния. Легко увидеть, что если т —» со при фиксированных значениях А, В и В%У' то оба корня 0“ становятся отрицательными большими числами; следовательно, моды с большими волновыми числами устойчивы. Пусть теперь А и Dxy фиксированы, а В изменяется. Урав- нение (VII.8) будет иметь комплексные корни, если дискриминант в (VII. 10) будет отрицательным. Из этого следует, что колебательные моды будут наблюдаться только при условии (Л - ду2)2 < в < (Л + ду2)2. (VII.11) где Д = 1 + m2n2(Dv - DA т ' X Y' Так как должно выполняться неравенство Д >0, это означает, что колебания будут только при условии Кроме того, в случае комплексных собственных значений их действи- тельная часть будет положительной (неустойчивые моды) при условии В >В = 1 + Л2 + m2n2(DY + DA т ' X Y' Результаты для колебательных мод обобщены на рис.VII. 1. Моды с действительными положительными частотами имеются только при - А2 В > 0, откуда следует, что В > . 1 Dym2n2 + Dxrn2n2. (VII.12) Если предположить, что т принимает непрерывные значения, то легко увидеть, что Вт имеет минимум, равный
Параболические уравнения 221 О 7 2 3 4 тп Рис.VII. 1. Диаграмма линейной устойчивости однородного равновесного сотояния относительно колебательных мод. Для фиксированных гранич- ных условий мода m = 0 отсутствует ([Ni77]). при m „ А V'2 м = UdA)’/2] • Конечно, поскольку в действительности m принимает целочисленные значения, то при возрастании В от 0 первой неколебательной модой, которая становится неустойчивой при В = В^ соответствующей целому /ис, будет мода, ближайшая к минимуму (ц, как показано на рис. VH.2. Рис. VII. 2. Диаграмма линейной устойчивости однородного равновесного состояния относительно экспоненциально растущих возмущений ([Ni77]).
222 Г лава 7 Подведем итоги нашего обсуждения. Однородное равновесное состо- яние неустойчиво относительно колеблющихся во времени возмущений, если В > или В1 соответственно для граничных условий в отсутст- вие потоков и фиксированных граничных условий. Аналогично неустой- чивость относительно экспоненциально растущих во времени возмущений возникает при В > Вс- VII.3. Численное решение модели Хотя представленный нами анализ устойчивости дает некоторые сведе- ния о поведении системы при различных параметрах, все богатство не- линейных решений нашей модели может быть обнаружено только путем численных экспериментов. Эти эксперименты можно провести, выполнив следующую последовательность шагов. | Шаг 1. Проверьте алгебраические выкладки в приведенном выше ана- лизе устойчивости. Зафиксируйте значение А = 2 в одномерном случае и вычислите В^ и Вс для нескольких значений коэффициентов диффузии величиной порядка 10”3. Как изменятся ваши результаты в двумерном случае, если реакция протекает в единичном квадрате? | Шаг 2. Напишите программу для решения нелинейных диффузионных уравнений (VII.За, б) в одномерном случае на отрезке [0, 1] с гра- ничными условиями в отсутствие потоков; приемлемое число простран- ственных точек может быть от 25 до 100. Диффузионные члены следует записать в неявном виде, чтобы избежать нефизических численных не- устойчивостей, а скоростные члены можно представить в явном виде. Происходит ли в вашей программе перераспределение концентраций X и Y на каждом шаге по времени? | Шаг 3. С помощью вашей одномерной программы исследуйте поведение решений при различных значениях В, DYV. Разумные начальные значе- — з —3 ния коэффициентов диффузии могут быть D% = 1 х 10 , Dy = 4 х 10 ; затем из линейного анализа можно оценить значения В, представляющие интерес для расчета. Исследуйте начальные условия, соответствующие наложению на однородную равновесную конфигурацию возмущения в виде плавной синусоиды и возмущения, имеющего в каждой точке случайную амплитуду (второй тип возмущения можно получить с помощью встроен-
Параболические уравнения 223 ной функции RND). Убедитесь, что вы можете обнаружить случаи, когда система релаксирует к исходному равновесному состоянию, когда она асимптотически приближается к не зависящему от времени решению с нетривиальным пространственным распределением (диссипативная струк- тура) и когда она приближается к решению, осциллирующему в про- странстве и во времени. Во всех случаях проверяйте, что выбранный вами шаг по времени достаточно мал и допускает точное интегрирова- ние уравнений. | Шаг 4. Модифицируйте вашу одномерную программу для решения дву- мерного брюсселятора с граничными условиями в отсутствие потоков, используя, например, метод переменных направлений аналогично урав- нению (7.19). Нарисуйте полученное распределение X на каждый момент времени. (Для этого может оказаться полезной методика вывода на эк- ран массива символов, приведенная в программе примера 6.) Исследуй- те тот же диапазон параметров и начальные условия, что и на шаге 3.
8, МЕТОДЫ МОНТЕ- КАРЛО Системы с большим числом степеней свободы часто представляют значи- тельный интерес для физики. К таким системам относятся, например, множество атомов в кусочке конденсированного вещества, множество электронов в атоме или (бесконечно большое) множество значений квантового поля во всех течках некоторой пространственно-временной области. Описание таких систем часто требует вычисления (или может быть сведено к нему) интегралов очень большой размерности. Напри- мер, классическая функция распределения газа, находящегося при тем- пературе 1//3 и состоящего из М частиц с потенциалом парного взаимо- действия и, пропорциональна ЗЛ-мерному интегралу г = J А, ••• d3rAe (8.1) За исключением очень малых значений А не может быть и речи о непо- средственном вычислении подобных интегралов с помощью рассмотренных в гл.1 и 4 квадратурных формул. Чтобы убедиться в этом, предполо- жим, что в квадратурной формуле по каждой координате берется 10 различных точек (что нельзя считать очень хорошей аппроксимацией), тогда подынтегральную функцию необходимо будет вычислить в 10ЗЛ точках. Для умеренного значения А = 20 и очень мощного компьютера с у производительностью порядка 10 операций в секунду такой расчет займет около 1053 с, что более чем в 1034 раз превышает возраст Вселенной! Конечно, различные ухищрения, например использование пе- рестановочной симметрии в подынтегральном выражении, могут сущест- венно понизить эту оценку, однако все равно остается очевидным, что непосредственное интегрирование— безнадежное дело. Методы Монте-Карло, рассматриваемые в этой главе, представляют собой эффективный способ вычисления многомерных интегралов. Назва- ние «Монте-Карло» возникло из-за случайного, или «вероятностного»,
Методы Монте-Карло 225 характера метода и от названия известного казино в Монако. Основная идея метода состоит в том, чтобы вычислять подынтегральную функцию не в каждом узле интегрирования, число которых очень велико, а только при значениях абсцисс, являющихся репрезентативной случайной выборкой (выборкой по важности). Ситуация в данном случае аналогич- на предсказанию результатов выборов путем опроса небольшого числа избирателей. Хотя совсем не очевидно, что из набора случайных чи- сел, генерируемых компьютером, может возникнуть что-либо «разум- ное», тем не менее стратегия методов Монте-Карло оказывается очень подходящей для широкого класса задач статистической и квантовой ме- ханики. Более подробное изложение этих методов можно найти в рабо- тах [На64] и [Ка85]. 8.1. ОСНОВЫ МЕТОДА МОНТЕ-КАРЛО Хотя основное преимущество методов Монте-Карло проявляется при вы- числении многомерных интегралов, основные идеи метода легче всего проиллюстрировать на одномерной задаче. Пусть нам необходимо вычис- лить интеграл 1 1 = J f(x)dx о от некоторой заданной функции f. В гл.1 и 4 было рассмотрено не- сколько различных формул интегрирования, в которых использовались значения f в некоторых выделенных значениях х (например, в равноот- стоящих точках). Однако можно предложить и другой путь вычисления /, рассматривая его как среднее значение функции f на отрезке [О, 1]. При таком подходе «правдоподобная» квадратурная формула запи- шется в виде N 1 1 <8-2) N Z= 1 В этой формуле среднее значение f вычисляется усреднением ее N зна- чений при значениях абсцисс {х^.}, равномерно распределенных на от- резке [0, 1]. Ниже мы рассмотрим методы генерации таких «случайных» чисел, сейчас же нам достаточно предположить, что имеется встроен- ная функция (например, RND в языке BASIC), которая обеспечивает нам последовательность этих чисел необходимой длины. 13 — 1650
226 Глава 8 Для оценки погрешности полученной формулы интегрирования мы мо- жем рассматривать f = f(x^) как случайную величину и при больших N привлечь центральную предельную теорему теории вероятностей. Ис- пользуя законы статистики, получаем О2. ~ = ~ ~ I fl “ ~Y.fi 1 N 1 N N L, 1 N L‘ L 1= I 1= 1 2' (8.3) где обозначает дисперсию f, т.е. меру отклонения функции f от своего среднего значения по всей области интегрирования. Из уравнения (8.3) вытекают два очень важных следствия, касаю- щихся вычисления интегралов методом Монте-Карло. Во-первых, ошибка в оценке значения интеграла уменьшается как ЛГ1/2. Следователь- но, при увеличении числа точек мы будем получать и более точный от- вет, хотя ошибка с ростом числа точек уменьшается очень медленно (для уменьшения ошибки в 2 раза объем вычислений увеличивается в 4 раза). Из-за очень медленного убывания ошибки метод Монте-Карло в данном примере уступает по эффективности другим методам, например правилу трапеций, в котором ошибка, согласно уравнениям (1.8), (1.9), убывает как ЛГ2 и которое при одинаковом объеме вычислений дает гораздо большую точность. (Для многомерных интегралов это пре- имущество, как будет показано выше, исчезает.) Второй важный мо- мент, вытекающий из (8.3), состоит в том, что точность оценки тем выше, чем меньше разброс а? значений функции, т.е. функция f должна изменяться как можно меньше. Рассмотрим два предельных случая. Пусть функция f является константой, тогда для вычисления ее сред- него значения необходимо определить ее значение только в одной точ- ке. Пусть теперь f равна нулю везде, за исключением очень узкого пика в окрестности некоторой точки х. Если выбирать случайные абс- циссы х., равномерно распределенные на отрезке [0, 1], то очень ве- роятно, что большинство точек будет лежать вне этого пика f и толь- ко несколько значений f. будут отличны от нуля; в этом случае оцен- ка интеграла I будет плохой. В качестве примера вычисления интегралов методом Монте-Карло рассмотрим интеграл 1 Г _dx = п = 0,78540. J 1+х2 4 о (8.4) Ниже приведена программа вычисления этого интеграла вместе с оцен- кой точности интегрирования. Число точек N задается пользователем.
Методы, Монте-Карло 227 10 DEF FNF( X) =1/( 1+Х~2] ' подынтегральная функция 20 INPUT "введите значение N"; N% 30 SUMF=0: SUMF2=0 'начальные суммы равны нулю 40 FOR l%=1 ТО N% 'цикл по испытаниям 50 X=RND: FX=FNF(X] 60 SUMF=SUMF+FX: SUMF2= SUMF2+FXA2 'накопление сумм 70 NEXT l% 80 FAVG=SUMF/N% ' окончательный результат SIGMA=SQR( (SUMF2/N%-FAVG~2| /N%) 90 100 PRINT USING "интеграл=#.##### +-#.#####"; FAVG, SIGMA Результаты счета по этой программе для различных значений М приве- дены в первых трех столбцах табл.8.1. Вычисленный результат отли- чается от точного всего на несколько (обычно менее чем на одно) стандартных чивается. отклонений и точность результата с ростом М увели- Таблица 8.1. Оценка интеграла (8.4) методом Монте-Карло для двух различных весовых функций ш(х). Точное значение равно 0,78540 = 1 а! шр) = 1/3(4-2х) а! 10 0,81491 0,79982 0,00418 20 0,73535 0,03392 0,79071 0,00392 50 0,79606 0,02259 0,78472 0,00258 100 0,79513 0,01632 0,78838 0,00194 200 0,78677 0,01108 0,78529 0,00140 500 0,78242 0,00719 0,78428 0,00091 1000 0,78809 0,00508 0,78524 0,00064 2000 0,78790 0,00363 0,78648 0,00045 5000 0,78963 0,00227 0,78530 0,00028 Согласно уравнению (8.3), ошибка интегрирования в методе Монте- Карло пропорциональна дисперсии подынтегральной функции. Отсюда легко предложить достаточно общую схему для уменьшения этой диспер- сии и, следовательно, повышения эффективности метода. Умножим и разделим подынтегральную функцию на положительную весовую функцию ш(х), нормированную условием
228 Глава 8 1 J dx w(x) = 1. o В результате наш интеграл запишется в виде 1 I = Г dx w(x) . (8.5) J w(x) О Если теперь сделать замену переменной х на у(х) = J dx' w(x'), (8.6) О так что = w(x)\ у(х = 0) = 0; у(х = 1) = 1, dx то интеграл становится равным 1 I = Г dy . (8.7) J w(x(y)) О Оценка этого интеграла методом Монте-Карло проводится так же, как это было сделано выше, усреднением значений f/w по случайной выборке точек у, равномерно распределенных на интервале [0, 1]: N w(x(y.)) ' (8.8) Польза от такой замены переменной должна быть очевидной. Если мы выберем такую функцию w, которая ведет себя так же, как и f (т.е. она велика там, где велика f, и мала там, где мала f), то подынте- гральная функция f/w в (8.7) может быть сделана очень слабо меняю- щейся, что приводит к уменьшению дисперсии в оценке интеграла (8.8) методом Монте-Карло. Указанное преимущество, естественно, зависит от выбора подходящей весовой функции w и от возможности обратить соотношение (8.6) для получения х(у). Чтобы понять с более общих позиций, почему замена переменной может оказаться полезной, необходимо ясно представлять, что равно- мерное распределение точек по у соответствует распределению точек
Методы Монте-Карло 229 по х с плотностью вероятности dy/dx - w(x). Это означает, что точки сгущаются около наиболее «важных» значений х, где w (и, как мы ожи- даем, и f) велика, и что вычисление подынтегральной функции в «не- существенных» точках х, где w и f малы, составляет малую часть от всего объема вычислений. В качестве примера того, как замена переменной может повысить эффективность интегрирования методом Монте-Карло, рассмотрим снова интеграл (8.4). Хорошим выбором для весовой функции будет функция w(x) = 1/3(4 - 2х), которая положительна и монотонно падает на отрезке интегрирования (так же, как и f) и нормирована на 1. Кроме того, поскольку f/w - = 3/4 как при х - 0, так и при х = 1, то функция w хорошо аппрокси- мирует поведение f. Согласно (8.6), новая переменная интегрирования будет равна у = (1/3)х(4 - х), откуда можно выразить обратную функцию х = 2 - (4 - 3</)1/2. Теперь можно вычислить наш интеграл I по формуле (8.8), используя приведенную ниже программу. 10 DEF FNF(Х)=1/( 1+Хж2): FNW( X) =( 4-2*Х)/3 'подынтегральная функция 15 DEF FNX(Y|=2-SQR(4-3*Y| 20 INPUT "Введите значение N"; N% 30 SUMFW=0: SUMFW2=0 'начальные суммы равны нулю 40 FOR l%=1 ТО N% 'цикл по испытаниям 50 Y=RND: X=FNX(Y| 55 FOVERW=FNF( X) /FNW( X| 60 SUMFW=SUMFW+FOVERW: SUMFW2=SUMFW2+FOVERVT2 'накопление сумм 70 NEXT 1% 80 FWAVG=SUMFW/N% 'окончательный результат 90 SIGMA=SQR( (SUMFW2/N%-FWAVGA2| /N%) 100 PRINT USING "интеграл=#.##### +-#.#####"; FWAVG, SIGMA Результаты счета по этой программе для различных значений W приве- дены в последних двух столбцах табл.8.1, из которых отчетливо видно повышение точности по сравнению со случаем w = 1. Рассмотренный нами одномерный случай легко может быть обобщен
230 Г лава 8 для вычисления d-мерных интегралов вида I = J ddx f(x). По аналогии с (8.2) запишем N 1 а ^7 £ f(x,)- (8.9) N Z=1 где несколько компонент случайных точек х. должны выбираться неза- висимо друг от друга. Таким образом, следующая программа вычисляет двумерный интеграл 1 1 и = 4 j* dx} j* dx2 0(1 ~ х% - х* ), О О равный отношению площадей четверти круга единичного радиуса и еди- ничного квадрата (0—единичная ступенчатая функция): 10 N%=5000: COUNT%=0 20 FOR l%=1 ТО N% 30 X=RND: Y=RND: 40 IF X*2+Y*2<1 THEN COUNT%=COUNT%+1 50 NEXT 1% 60 PI4=COUNT%/N%: SIGMA=SQR( PI4*( 1-PI4) /N%) 70 PRINT USING "Pl=#.#### +- #.####"; 4*PI4, SIGMA После выполнения эта программа выдает вполне удовлетворительный ре- зультат, равный 3,1424 ± 0,0232. | Упражнение 8*1. Убедитесь, что используемая в этой программе в строке 60 оценка ошибки интеграла совпадает с формулой (8.3). Рассмотренный выше метод замены переменной может быть также обобщен и на многомерный случай. В этом случае для весовой функций w(x), нормированной так, чтобы интеграл от нее по всей области ин- тегрирования был равен единице, соответствующей новой переменной интегрирования будет у с якобианом преобразования |5у/5х| = ш(х). В общем случае найти обратную функцию х(у) в явном виде очень трудно (если вообще возможно), поэтому удобнее представлять себе эту заме- ну переменных в многомерном случае как операцию, которая распреде- ляет точки xt{yp с плотностью вероятности w. Ниже мы рассмотрим различные практические методы замены переменных для произвольной функции w. Хотя в приведенных выше примерах результаты были вполне удов-
Методы Монте-Карло 231 летворительными, по-видимому, метод Монте-Карло для вычисления ин- тегралов не очень эффективен. Даже при выборе «хорошей» весовой функции w результаты, согласно табл.8.1, при N = 5000 имеют точ- ность порядка 10'4, в то время как стандартное правило трапеций при 5000 узлах обеспечивает точность, лучшую чем 10-5. Рассмотрим, од- нако, многомерные интегралы, аналогичные (8.1). Предположим, что мы намерены ограничиться заданным объемом вычислений (например, хотим вычислить подынтегральную функцию N раз) и хотим сравнить эффек- тивность интегрирования традиционными методами и методом Монте-Кар- ло. В традиционных методах, например в многомерном аналоге правила трапеций, если общее число точек равно N, то каждое измерение в ди- мерном интеграле разбивается на ~ NVd интервалов длиной h ~ N~Vd. Многомерный аналог формулы (1.9) показывает, что ошибка интегриро- вания по ячейке объемом hd пропорциональна O(/zrf+2), поэтому суммар- ная погрешность интегрирования по всем ячейкам в традиционном мето- де равна АГО^2) = O(AT2/d); при больших d эта погрешность с ростом N уменьшается очень медлен- но. С другой стороны, уравнение (8.3) показывает, что ошибка в ме- -1/2 тоде Монте-Карло уменьшается как N и не зависит от d. Если предположить, что оба численных множителя в этих оценках порядка единицы, то легко увидеть, что метод Монте-Карло становится более эффективным при d 4. Конечно, точная оценка зависит от используе- мой традиционной схемы интегрирования или от того, насколько удачно выбрана весовая функция в методе Монте-Карло, тем не менее основной результат состоит в том, что при больших d скорости уменьшения ошибки с ростом М в рассмотренных двух случаях сильно различаются. 8.2. ГЕНЕРАЦИЯ СЛУЧАЙНЫХ ВЕЛИЧИН С ЗАДАННЫМ РАСПРЕДЕЛЕНИЕМ Проведенное выше обсуждение показывает, что вычисление интегралов методом Монте-Карло состоит из двух основных операций: генерации точек, распределенных в области интегрирования с заданной плотнос- тью вероятности ш(х) (которая может быть равна 1), и последующего вычисления функции f/w в этих точках. Вторая операция очевидна, че- го нельзя сказать о первой: как генерировать случайные числа с по- мощью детерминированного устройства, каким является компьютер? В
232 Г лава 8 этом разделе мы рассмотрим несколько стандартных методов. В основе практически любых действий с распределениями сложного вида лежит такая компьтерная операция, как генерация случайных чи- сел с равномерным распределением. Для генерации этого основного распределения, а также для проверки, что это распределение действи- тельно равномерное, существуют многочисленные методы. Один из наи- более распространенных алгоритмов —«линейный конгруэнтный» генера- тор, который используется, например, в функции RND языка BASIC7. Этот метод позволяет получить последовательность случайных чисел, начинающуюся с произвольною «стартового» числа. Каждое следующее случайное число в этой последовательности получается из предыдущего умножением его на первое «магическое» число, прибавлением второго магического числа и вычислением остатка от деления полученной суммы на третье магическое число (операция mod). Таким образом, - (ах. + с) mod т, (8.10) где / — номер случайного числа в этой последовательности, а а, с и т — магические числа. Эти магические числа часто выбираются очень большими, и их точные значения зависят от длины машинного слова в используемом компьютере. Заметим, что на самом деле числа х. не мо- гут быть случайными, поскольку они получены из начального числа по вполне определенному детерминированному алгоритму; ’и действитель- но, две последовательности, начинающиеся с одного и того же «затра- вочного» числа, получаются одинаковыми. Поэтому такие числа часто называют псевдослучайными. Тем не менее для многих практических це- лей генерированные этим методом псевдослучайные числа можно исполь- зовать так же, как если бы они были действительно случайными. Хоро- шее изложение генераторов с равномерным распределением, а также тестов для их проверки можно найти в работе [Кп69]. Теперь мы уже знаем, как получать одномерные случайные величи- ны, распределенные с заданной весовой функцией ш(х). Согласно изло- жению предыдущего раздела, для этого необходимо найти функцию у, которая есть неполный интеграл от w и распределена равномерно, а затем, применяя обратное преобразование к (8.6), найти х. Таким об- разом, если нам требуется вычислить интеграл со 1 = J dx e~xg(x), о где g — относительно мало меняющаяся функция, целесообразно генери-
Методы Монте-Карло 233 ровать случайную величину х, распределенную на интервале от 0 до со с плотностью вероятности е~х, а затем усреднять g по этим значени- ям. В соответствии с (8.5) получаем У = 1 - е~х, X = -log(l - у). Приведенная ниже строка кода на самом деле представляет собой под- программу, генерирующую значения х с требуемым распределением. 110 X=-LOG (1-RND): RETURN | Упражнение 8.2. Убедитесь, что приведенная выше подпрограмма ге- нерирует случайную величину X с требуемой плотно'стью распределения. Для этого нужно генерировать большое число значений х. и построить для них гистограмму. Используйте эти числа при вычислении интеграла 9 о / и ошибки интегрирования для g(x) = х, х их и сравните ваши ре- зультаты с аналитическими значениями. Понятна ли вам тенденция из- менения вычисленных погрешностей? Хотя метод генерации неполного интеграла действует безошибочно, для его применения необходимо уметь находить обратную функцию х(у), ко- торую можно получить в аналитическом виде только для сравнительно малого класса функций. Например, если бы мы захотели использовать весовую функцию w(x) = 6/5(1 - х?/2) для вычисления интеграла (8.4), то нам пришлось бы решать кубичес- кое уравнение. И хотя, конечно, это уравнение можно решить и найти у(х), все же выбор весовых функций, наиболее близких к f, будет приводить, как правило, к более сложным интегралам, для которых нельзя будет найти обратную функцию в аналитическом виде. Тем не менее можно вычислить интеграл и найти обратную функцию численно. Предположим, что нам известна таблица значений х^\ при которых неполный интеграл от w принимает ряд значений с равномерным шагом на отрезке [0, 1], т.е. = j/M, j = 0, 1, ...,М. Тогда • х ( ^(/) = — = Г dxfw(x'). (8.11) лл J о
234 Глава 8 В результате значения для целых /, выбираемых с равной вероят- ностью из набора чисел 0, 1, М, будут аппроксимировать требуе- мое распределение. (Для концевых точек j = 0 и j = М необходимо от- дельное рассмотрение.) Задача, таким образом, состоит в нахождении х1. Для этого проинтегрируем численно дифференциальное уравнение dy/dx = ш(х), применив простую дискретизацию w(x^). Так как - у^ = 1/М, мы получаем удобное рекуррентное соот- ношение для нахождения х^\ Х(Н) = х(/) + 1 Mw(x^) (8.12) которое используется вместе с начальным значением х^ = 0. Другим, удобным методом генерирования одно- или многомерных слу- чайных величин с неравномерным распределением является метод отбо- ра-отказа, предложенный фон Нейманом. Геометрическая интерпретация этого метода дана на рис.8.1. Предположим, что мы хотим генериро- вать случайную величину х, распределенную между 0 и 1 с вероятнос- тью w(x), и пусть и/(х) — положительная функция, удовлетворяющая во всей Области интегрирования условию w* (х) > ш(х). Заметим, что в Рис.8.1. Геометрическая интерпретация метода отбора— отказа, пред- ложенного фон Нейманом для генерации случайных чисел, распределен- ных с плотностью вероятности ш(х).
Методы Монте-Карло 235 этом случае определенный интеграл от ш' будет больше 1. Удобно, хо- тя и не всегда полезно, выбрать w' константой, превышающей максимум w в рассматриваемой области. Если мы теперь сгенерируем точки в двумерной области, равномерно заполняющие площадь под кривой w'(x), а затем отберем только точки, лежащие под кривой и>(х), то последние будут распределены с плотностью вероятности w. На практике это оз- начает следующее: берутся две случайные величины х. и 7}, причем первая распределена пропорционально w', а вторая— равномерно между О и 1. Значение х. принимается в том случае, если 1) меньше отноше- ния w(x.)/w'(%р; если точка отвергается, то мы продолжаем дальше и генерируем следующую пару чисел х. и 7). Этот метод эффективен толь- ко в том случае, если функция сравнения w' выбирается близкой к w во всей области, в противном случае на генерацию бесполезных отбро- шенных точек будет затрачиваться много машинного времени. | Упражнение 8.3. Сгенерируйте методом отбора— отказа выборку точек на отрезке [0, 1], распределенную по закону ш(х) = |(1-^х2), и с помощью этой выборки оцените интеграл (8.4), а также погрешность этой оценки. Сравните эффективность вашего расчета для различных функций сравнения w'. Гауссово (или нормальное) распределение с нулевым средним и единичной дисперсией, именно ш(х) = (2п)-1/2 ехр(-х2/2), играет важную роль в теории вероятностей, и именно поэтому оно час- то используется в расчетах методом Монте-Карло. Это распределение можно сгенерировать (хотя этот способ и не очень эффективен), нахо- дя обратную функцию от интегральной функции распределения с помощью различных полиномиальных аппроксимаций функции ошибок. Существует более «разумный» метод, использующий центральную предельную теоре- му. Из этой теоремы следует, что сумма большого числа равномерно распределенных случайных чисел будет приближаться к нормальному распределению. Поскольку среднее и дисперсия равномерного распреде- ления на интервале [0, 1] равны соответственно 1/2 и 1/12, сумма 12 равномерно распределенных случайных чисел будет иметь среднее зна- чение 6 и дисперсию 1 и будет хорошо аппроксимировать нормальное распределение. Таким образом, приведенная ниже подпрограмма возвра- щает нормально распределенную случайную величину GAUSS с нулевым средним и единичной дисперсией.
236 Г лава 8 100 'подпрограмма генерации нормально распределенного числа GAUSS 110 GAUSSzO 120 FOR l%=1 ТО 12 130 GAUSS=GAUSS+RND 140 NEXT 1% 150 GAUSS=GAUSS-6 160 RETURN | Упражнение 8.4. Постройте гистограмму для большого числа значений GAUSS и убедитесь, что полученное распределение очень близко к нор- мальному. Можете ли вы получить количественную оценку степени от- клонения полученного распределения от нормального? Сравните полу- ченные результаты с результатами суммирования 6 и 24 равномерно распределенных случайных чисел. (Последние суммы имеют средние зна- чения соответственно 3 и 12 и дисперсии 1/2 и 2.) Другой эффективный метод генерации нормального распределения основывается на двумерном (%г %2) нормальном распределении, в ко- тором число точек, попадающих в дифференциал площади, пропорцио- нально exp {-1/2(*2 + х^)} dx}dx2 . Если перейти к полярным координатам г = (х* + х*)’/2, е = tan-’ , то получим e~r2/2 rdrd б 9 и, делая замену и = г /2, окончательно получаем е~и du d 0. Следовательно, если мы сгенерируем и в диапазоне от 0 до со с экспо- ненциальным распределением, а 0—с равномерным распределением на отрезке [0, 2п], то соответствующие значения = (2w)1/2 cos 0, %2 = (2w)1/2 sin 0 будут распределены по нормальному закону. Приведенная ниже подпро- грамма возвращает два случайных числа GAUSS1 и GAUSS2 с нормальным распределением.
Методы Монте Карло 237 100 "подпрограмма возвращает 105 ' числа GAUSS1 и GAUSS2 110 TWOU=-2*LOG( 1-RND) 120 RADIUS=SQR(TWOU) 130 ТНЕТА=2*3.14159*RND 140 GAUSS1=RADIUS*COS(THETA) 150 GAUSS2=RADIUS*SIN(THETA) 160 RETURN два нормально распределенных Для генерации нормального распределения со средним х и ди^ Персией О', именно ш(х) = (2п(Г2)"1/2 ехр[-^ф~1, L 2(Г J нужно значения, полученные приведенной выше подпрограммой, умножить на О' и прибавить к ним х. 8.3. АЛГОРИТМ МЕТРОПОЛИСА И ДР. Хотя рассмотренные выше методы генерации случайных чисел с заданным распределением могут быть в некоторых случаях очень эффективными, в общем случае трудно, если вообще возможно, обобщить их для сложных многомерных весовых функций. Поэтому необходимы другие подходы. Очень общий метод генерации случайных чисел с произвольным распре- делением предложили Метрополис, Розенблют, Розенблют, Теллер и Тел- лер [Ме53]. В этом методе необходимо только уметь вычислять весовую функцию при заданных значениях переменных. В силу своей простоты этот метод широко применялся в задачах статистической механики, где весовая функция канонического распределения может быть очень слож- ной функцией координат системы (см. (8.1)), и для нее нельзя доста- точно просто организовать выборку другими методами. Однако этот ме- тод не лишен и недостатков, о которых будет сказано ниже. Хотя алгоритм Метрополиса и др. можно применять разными спосо- бами, мы начнем изложение с одной простой реализации. Предположим, что мы хотим сгенерировать набор точек в пространстве (возможно, многомерном) переменных X, распределенный с плотностью вероятности ш(Х). В алгоритме Метрополиса генерируется последовательность точек XQ, Хр ..., представляющая собой последовательные пункты, посещае- мые бродягой-пешеходом в процессе случайного блуждания в Х-про-
238 Глава 8 странстве; причем, чем дольше длится блуждание, тем точнее последо- вательность точек аппроксимирует заданное распределение. Процесс случайного блуждания в конфигурационном пространстве определяется следующими правилами. Пусть в какой-то момент пешеход находится в точке Х^. Для получения следующей точки Х^+1 он делает пробный шаг в новую точку Xf Эта новая точка может быть выбрана любым подходящим способом, например, равномерно распределенной внутри многомерного куба со стороной 5 с центром в Х^. Этот пробный шаг затем «принимается» или «отвергается» в зависимости от отноше- ния = нхр Г = -(Хп) ' Если г больше единицы, то шаг принимается (т.е. мы полагаем Х^+1 = = Хр, а если г меньше единицы, то шаг принимается с вероятностью г. Для этого удобно сравнить г с равномерно распределенным на от- резке [0, 1] случайным числом 1) и принять шаг, если 7) < г. Если пробный шаг не принимается, то он отвергается, и мы полагаем Х^+1 = = Х^. В результате мы получаем новое число Хп+Г Следующее число X^+2 генерируется аналогично; для этого делается небольшой пробный шаг в окрестности Хп+1. В качестве стартовой точки случайного блуж- дания выбирается произвольная точка XQ. Приведенная ниже подпрограмма иллюстрирует применение алгоритма Метрополиса для выборки двумерной случайной величины. При каждом обращении подпрограмма выполняет следующий шаг случайного блуждания и возвращает значения переменных XI и Х2; в основной программе не- обходимо инициализировать эти переменные, а также присвоить значе- ние переменной DELTA и задать распределение FNW(X1,X2). 1000 'подпрограмма делает один шаг 1010 X1T=X1+DELTA*(2*RND-1) 1020 X2T=X2+DELTA*( 2*RND-1) 1030 R=FNW(X1T,X2T)/FNW(X1,X2) 1040 IF RND>R THEN GOTO 1060 1050 X1=X1T: X2=X2T 1060 RETURN алгоритма Метрополиса 'выбрать пробный шаг в квадрате ' с центром (Х1,Х2) 'вычислить отношение 'этап отбрасывания 'этап принятия Этот код можно сделать более эффективным, если сохранять значения весовой функции в текущей точке случайного блуждания. При этом не требуется вычислять ее еще раз при решении вопроса о принятии или отбрасывании пробного шага. В методе Монте-Карло с использованием
Методы Монте-Карло 239 алгоритма Метрополиса вычисление w часто является наиболее трудоем- кой операцией. Для доказательства того, что описанный алгоритм действительно генерирует последовательность точек, распределенных в соответствии с весовой функцией w, рассмотрим большое число пешеходов, начинаю- щих одновременное движение из различных начальных точек и движущих- ся в Х-пространстве независимо друг от друга. Если через Мп(Х) обо- значить число пешеходов в точке X после п шагов, то полное число пешеходов, которые на следующем шаге перейдут из точки X в точку Y, будет равно ААГ(Х) = ЛГп(Х)Р(Х —> Y) - tf„(Y)P(Y -> X) = \N (Y) n/v - = N lYiM Y) -----------P(Y X> = ATn(Y)P(X Y) (8.13) An(Y) P(X Y) Здесь P(X —» Y) обозначает вероятность перехода пешехода в точку Y, если перед этим он находился в точке X. Полученное уравнение пока- зывает, что равновесие, т.е. отсутствие изменений в населенностях, наступит при условии jVe(X) = P(Y —> X) Ne(\) P(X Y) (8.14) Если же система не находится в равновесии, то изменения в населен- ностях N(X) стремятся привести ее к равновесию (т.е. ДМ(Х) положи- тельно, если в точке X «слишком много» пешеходов, или если Nr(X)/Nn(y) превышает свое равновесное значение). Из этого следует (и это можно доказать), что после большого числа шагов населенность пешеходов придет к своему равновесному значению N . Остается показать, что вероятности переходов в алгоритме Метро- полиса приводят к равновесному распределению пешеходов ~ ш(Х). Вероятность перейти из точки X в точку Y равна Р(Х —> Y) = Т(Х Y)X(X Y), где Г —вероятность сделать пробный шаг из X в Y, а Л— вероятность принять этот шаг. Если точка Y может быть достигнута из X за один шаг (т.е. она лежит внутри куба со стороной д с центром в X), то Т(Х -> Y) = T(Y X), откуда следует, что равновесное распределение при случайном блужда-
240 Г лава 8 нии удовлетворяет условию = Л(У X) *e(Y) Л(Х Y) Если ы/(Х) > w(\r), то А(У X) = 1 и Л(Х —» Y) = , »(Х) а если ы/(Х) < ку(У), то 4(Y -» X) = w(Y) и Л(Х —> Y) - 1. Следовательно, в обоих случаях равновесные насе- ленности я алгоритме Метрополиса удовлетворяют условию _ <Х1 ?/e(Y) w(Y) ’ так что пешеходы действительно распределены с заданной вероятнос- тью. Отметим, что, хотя для конкретности изложения точка Xf выбира- лась вблизи Х^, мы можем использовать любые правила перехода и при- нятия шага, которые удовлетворяют условию ^Х1 = ПУ Х)Л(У -* X) (8 1б) и/(У) Т(Х -> У)Л(У X) Действительно, рассмотрим один предельный случай, когда вероятность перехода ЦХ —» У) = ш(У) и не зависит от X и Л = 1. Такой выбор можно считать наиболее эффективным, так как не отвергается ни один пробный шаг. Тем не менее этот выбор отчасти неосуществим, так как если бы мы знали, как выбрать w для пробного шага, то у нас бы не было необходимости использовать этот алгоритм. Возникает закономерный вопрос: «Если пробные шаги должны выби- раться в окрестности точки Х^, то каким должен быть шаг д?>. Для ответа на этот вопрос предположим, что Х^ находится в максимуме ш, наиболее вероятном месте ее нахождения. Если шаг д большой, то ы/(Хр будет, вероятно, гораздо меньше, чем ы/(Х^), и большинство пробных шагов будет отвергнуто, что приведет к неэффективной выбор- ке w. Если шаг д очень мал, большинство пробных шагов будет приня- то, однако пешеход в своем случайном блуждании никогда не сдвинется достаточно далеко, что также ведет к недостаточно хорошей выборке. На практике хорошим выбором будет такая величина пробного шага, при
Методы Монте-Карло 241 которой принимается около половины всех пробных шагов. Алгоритм Метрополиса не лишен и недостатков. Один из них связан с тем, что последовательные точки выборки XQ, • • • не являются независимыми, что следует просто из способа их получения; точка X г вероятнее всего, оказывается в окрестности точки Х^. В ре- зультате, хотя при длительном блуждании точки могут иметь правиль- ное распределение, они не будут статистически независимы одна от другой, и для вычисления интегралов следует принимать некоторые ме- ры. Например, если мы вычисляем интеграл Г dx«.(X)f(X) / - —------------- J dXa»(X) путем усреднения значений f по точкам случайного блуждания, то стандартная оценка дисперсии (8.3) неверна, так как значения f(X.) не являются статистически независимыми. Эту зависимость точек можно определить количественно, вычисляя автокорреляционную функцию <f f > _ >2 C(k) = ------J— . (8.17) <Н> - </,•> Здесь <...> обозначают усреднение по случайным блужданиям, напри- мер, N-k -±-k Очевидно, что С(0) = 1, а отличные от нуля значения С при k * 0 оз- начают, что значения f коррелированы. На практике для устранения этого эффекта следует вычислять интеграл и его дисперсию, используя точки траектории случайного блуждания, разделенные друг от друга фиксированным интервалом. Величина интервала выбирается такой, что- бы корреляция между используемыми точками была как можно меньше. Подходящий интервал выборки точек можно оценить по значению k, при котором С становится малым (например, 0,1). Другой вопрос применения алгоритма Метрополиса касается выбора начальной точки случайного блуждания XQ. В принципе любое началь- ное положение является приемлемым, и результаты не будут зависеть от начального выбора, как только пешеходы «термализуются» после не- скольких начальных шагов. На практике стартовую точку XQ выбирают 16—1650
242 Г лава 8 там, где вероятность w велика. Затем делается несколько термализа- ционных шагов, чтобы устранить влияние стартовой точки, и только после этого генерируется выборочная последовательность. | Упражнение 8.5. Примените алгоритм Метрополиса для генерации од- номерного нормального распределения. Для различных значений пробно- го шага исследуйте долю принятых пробных шагов, корреляционную фун- кцию (и, следовательно, приемлемую частоту выборки) и суммарную эф- фективность расчета. Воспользуйтесь сгенерированными вами случайны- ми числами для вычисления интеграла 00 9 J dx х2е~х /2 -00 и оцените ошибку вашего ответа. Исследуйте, как ваши результаты за- висят от начальной точки и от числа термализационных шагов, предва- ряющих выборку. Сравните эффективность алгоритма Метрополиса с эф- фективностью расчета одним из рассмотренных в разд.8.2 методов, где непосредственно генерируется нормальное распределение. 8.4. ДВУМЕРНАЯ МОДЕЛЬ ИЗИНГА Модели, в которых степени свободы располагаются на решетке и взаи- модействие между ними носит локальный характер, встречаются в раз- личных задачах физики конденсированного вещества и теории поля. Простейшей из них является модель Изинга [НибЗ], которую можно рас- сматривать как грубое описание магнитных веществ или бинарных спла- вов. В данном примере мы будем использовать методы Монте-Карло для расчета термодинамических свойств этой модели. Если перейти на язык магнитных взаимодействий, то в модели Изинга в качестве степеней свободы выступают спины, взаимодействую- щие друг с другом и с внешним магнитным полем. Эти спины могут представлять собой, например, магнитные .моменты атомов в твердом теле. Конкретно мы будем рассматривать двумерную модель, в которой спиновые переменные располагаются в узлах N х х N квадратной решет- ки. Эти спины можно обозначить как S.. , где I и / — индексы по двум пространственным переменным, или как Sa, где а —обобщенный номер узла. Каждая из спиновых переменных может находиться в состоянии либо «вверх» (Sa = +1), либо «вниз» (Sa = -1). Такая картина \|рак-
Методы Монте-Карло 243 терна для частиц с полуцелым спином, хотя отметим, что мы рассмат- риваем спины как классические степени свободы и не вводим ДЛЯ них правил коммутации, характерных для крантоцдгр описания углового мо- мента. (Введение этих правил будет соответствовать модели Гейзен- берга.) Гамильтониан системы записывается стандартным образом: Н = ~J I SaS3 - В [ Sa . (8.18) <a₽> a Здесь запись <а/3> означает, что сумма берется по всем ближайшим со- седним парам спинов; константа обменной связи J характеризует сиду взаимодействия соседних спинов (см. рис.8.2). Таким образом, спиц, находящийся в узле //, взаимодействует со спинами в уздах /±1/ и ij ± 1. (Мы предполагаем здесь периодические граннчнуе урлория на решетке, так что, например, соседями снизу для спинрр е / = К х бу- дут спины с i = 1, а соседями слева для спинов с / = 1 будут спины с j = Ny ; следовательно, наша решетка имеет топологию тора.) Если J > 0, то энергия меньше, когда спиц ориентирован в том же направ- лении (параллельно), что и его соседи (ферромагнетизм), а если J < < 0, то спин будет стремиться установиться антипарадледьно своим соседям (антиферромагнетизм). Второе слагаемое описывает взаимодей- ствие спинов с внешним магнитным полем В, которое стремится распо- ложить все спины в одном направлении. • • > Рис.8.2. Схематическая иллюстрация двумерной модели Изицга. Нас будет интересовать термодинамика этой систему. В ЭТОМ 'Слу- чае удобно измерять энергии связей J ц В в единица,х темцердтурв!, 16'
244 Г лава 8 тогда нагревание системы будет соответствовать ослаблению этих свя- зей. Возможные конфигурации системы определяются заданием значений N всех У х У У спиновых переменных, а вклад любой из 2 5 спино- X - у S г вых конфигураций S определяется весовой функцией для канонического ансамбля e>(S) = C-W(S) I (8.19) где функция распределения равна Z(J,B) = £ е H(S). (8.20) S Нас будут интересовать такие термодинамические величины, как намаг- ниченность dlogZ г л М = —— =£HS) £Sa. (8.21а) дВ S а магнитная восприимчивость Z = ^=J>S)([sJ2-Af2, (8.216) дВ S a энергия Е = £ ^(S)//(S) (8.21в) S и удельная теплоемкость при постоянном поле Св = [ w(S)H2(S) - Е2. (8.21г) S В пределе бесконечно большой решетки (N* со) модель Изинга имеет точное решение; многочисленные обсуждения этого решения, пер- воначально полученного Онзагером, можно найти в работах [НибЗ] и [Мс73]. Все выражения упрощаются при В = 0. В этом предельном слу- чае энергия системы дается выражением Е = -Ns Z(coth2/) [1 + Ik'K/k)], (8.22а) удельная теплоемкость равна
Методы Монте-Карло 245 СВ = N, й(/со‘Ь2/)2[2К1(к)-2Е1(к)-(1-к/)[ ^к'К/к)]], (8.226) тогда как намагниченность при / > Jс равна /4 , ~2\ 1/4 / 4 й<у2. 4\1/8 м = ± Ns <1+г } (1^2)t/2 } (8.22в) и исчезает при J < Jc. В этих выражениях использованы обозначения к = 2 sinh2/ < J к, = 2tanh22/ - 1, cosh22/ полные эллиптические интегралы первого и второго рода п/2 п/2 к/к) = J 2 1?2 . £,(<) = J a<p(i-K2sin2<p)1/2, * J (1-к sin ф) J о о z = e~2J\ a Jс - 0,4406868 (критическое значение /, при котором к = = 1); К} имеет логарифмическую расходимость. Таким образом, все термодинамические функции при J = Jc расходятся, что предполагает наличие фазового перехода. Наличие фазового перехода подтверждается поведением намагниченности, которая исчезает ниже критической связи (или выше критической температуры) и может принимать одно из двух одинаковых по величине и противоположных по знаку значений выше критической связи. Численное решение модели Изинга полезно и как иллюстрация рас- смотренных приемов, и потому, что это решение легко обобщается для гамильтонианов более сложного вида [Fo63]. Из-за большого числа слагаемых о прямом вычислении сумм в уравнениях (8.21) не может быть и речи. (Даже для достаточно малой 16 х 16-решетки имеется 2256 « ю77 различных конфигураций.) Следовательно, эффективнее всего сгенерировать спиновые конфигурации S с вероятностью w(S) ал- горитмом Метрополиса, а затем усреднить искомые наблюдаемые величи- ны по этим конфигурациям. Применяя алгоритм Метрополиса, мы могли бы выбрать такой пробный шаг от S к при котором все спины одно- временно изменяются случайным образом. Однако такой пробный шаг привел бы нас к конфигурации, сильно отличающейся от S, и, следова- тельно, вероятность отбросить эту конфигурацию была бы велика, по- этому предпочтительнее взять более мелкие шаги. Мы рассмотрим проб- ные конфигурации, которые от предшествующих отличаются переворотом только одного спина. Такая процедура выполняется последовательным проходом по узлам решетки, и для каждого спина принимается решение
246 Г лава 8 перевернуть его или нет, причем каждый раз переворачивается только один спин. Следовательно, каждый раз мы рассматриваем две конфигу- рации S и S*, Ьтличающйеся переворотом только одного спина Sa = г S... Принятие такого пробйогО шага зависит от отношения весовых функций k <. + о. *. + о.. , + о.. 1+1/ 1-1/ 1/+1 1/-\ четырех спинов, соседних с тем, который перево- f может принимать только 5 различных значений w(S) г = ---— = е ®(S) В частности* если г > 1 или если г < 1, но больше, чем равномерно распределенное между 0 и 1 случайное число, то спин Sa переворачи- вается; в противном случае он остается неизменным. Из (8.18) видно, что вклад И г будут давать только слагаемые* содержащие S , и пос- ле несложный преобразований мы получим -2S (Jf+B) г = е Здесь f есть сумма рйчиВается. Так как О, i2, ±4, всего Может получиться Только 10 различных значений г (Имеются два возможных значения Sa); чтобы не вычислять каждый раз экспоненту* удобно вычислить и зайомййть таблицу значений г в нача- ле расчета. Заметим, что если бы мы использовали пробные конфигура- ций, в которых перевернуто несколько спинов, то вычислить г было бы намного Сложнее. В программе примера 8, листинг которой Приведен в приложении Б, ^осуществляется моделирование методом Монте-Карло модели Изинга с использованием только что описанного алгоритма. Начальная конфигу- рации Сййнов Взбирается случайным образом. В процессе случайного блуждания решетка Выводится на дисплей после каждого прохода по всей узлам. Предусмотрены также начальные термализационные проходы (без вычисления наблюдаемых величин); эти проходы приводят к пеше- ходам (^успокоению») случайных блужданий перед накоплением наблю- даемый величий. Во время расчета выводятся значения следующих вели- чин На ОДНИ сййн: энергий, намагниченности, восприимчивости и удёльПОЙ теплоемкости, а также доля принятых пробных шагов. ОДИН особенность данной программы требует более подробного объяснения. Она касается простой методики, используемой для слеже- ния за корреляцией от прохода к проходу в наблюдаемых, что свойст- венно алгоритму Метрополиса. Основные наблюдаемые (энергия и намаг-
Методы Монте-Карло 247 ниченность) вычисляются через каждые FREQ% проходов. Затем эти зна- чения накапливаются в «группах» по SIZE% членов. В каждой группе вычисляются средние значения и стандартные отклонения для энергии и намагниченности. Когда число групп будет достаточно большим, сред- ние объединяются в общее среднее. Один из способов вычислить по- грешность общего среднего такой: групповые средние рассматривать как независимые измерения и использовать формулу (8.3). Другой спо- соб—усреднить групповые стандартные отклонения. Если частота вы- борки достаточно большая, то эти две оценки будут близки. Однако если частота выборки слишком мала и если наблюдается заметная кор- реляция в последовательных измерениях, то значения в пределах каж- дой группы будут распределены очень скученно и вторая оценка по грешности будет значительно меньше первой. По этой причине обе оценки погрешности общих средних для энергии и намагниченности вы- водятся на экран. Заметим, что данный прием неприменим столь просто для удельной теплоемкости и восприимчивости, так как сами эти вели- чины по своей природе являются флуктуациями энергии и намагничен- ности (уравнение (8.216), (8.21г)), и поэтому для них выводятся только значения погрешностей их общих средних, рассчитанные первым способом. Приведенные ниже упражнения будут полезны для лучшего понимания этого примера. | Упражнение 8.6. При / = 0 гамильтониан (8.18) упрощается и описы- вает поведение невзаимодействующих между собой спинов во внешнем поле. Задача решается элементарно. Получите для этого случая анали- тические выражения для термодинамических наблюдаемых и проверьте, что они воспроизводятся в программе. | Упражнение 8.7. Для бесконечной решетки, используя уравнение (8.22), вычислите и постройте графики энергии, удельной теплоемкос- ти и намагниченности на один спин при В = 0 для значений /, изменя- ющихся от 0 до 0,8. | Упражнение 8.8. Модифицируйте код для вычисления по формуле (8.17) корреляционных функций для энергии и намагниченности между отдельными проходами. Проведите расчеты на сетке 16 х 16 при В = 0 и нескольких значениях / в диапазоне от 0,1 до 0,6. Оцените соот- ветствующую частоту выборки для каждого значения константы связи. Покажите, что если выбирается соответствующая частота выборки, то
248 Глава 8 две оценки для погрешностей в энергии и намагниченности согласуются между собой, а если выборки берутся слишком редко, то эти оценки не совпадают (группа из 10 испытаний может считаться достаточной). По- кажите также, что при приближении системы к фазовому переходу кор- реляция между отдельными проходами становится сильнее (эффект кри- тического замедления). | Упражнение 8.9. Пропустите несколько раз программу и получите ре- зультаты для решеток 8x8, 16 х 16 и 32 х 32 при В = 0 и последо- вательности значений константы связи от 0,1 до 0,6 (ферромагнетик); уделите особое внимание области вблизи предполагаемого фазового пе- рехода. Сравните ваши результаты с точным решением для бесконечной решетки и покажите, что конечный размер решетки приводит к сглажи- ванию особенностей в термодинамических величинах. Заметьте, что при связи, близкой к критической, размер магнитных доменов становится очень большим. | Упражнение 8.10. Примените программу для исследования термодина- мических свойств модели с конечным В при характерной для антиферро- магнетиков константе связи J < 0. Рассмотрите также модель, в ко- торой спин S.. взаимодействует со своими соседями, как в ферромаг- нетике, а с соседями по диагонали (S. .. S. .. S. .. „ V Z-1/-1 Z+1/-1 1-1/4 Г S/+1/41), как в антиферромагнетпке. | Упражнение 8.11. Вариантом алгоритма Метрополией для выборки ка- нонического ансамбля является алгоритм «тепловой бани». В этом ал- горитме каждый спин принимает значение +1 с вероятностью 1/(1 + g) и значение -1 с вероятностью g/(l + g), где g - exp[2(Jf + В)]. Та- кое поведение можно рассматривать как стремление спина к равновесию с тепловой баней, поддерживаемой при постоянной температуре. Убеди- тесь, что этот алгоритм соответствует случаю, когда в уравнении (8.16) А = 1, а вероятность перехода Т равна T(S —> S') = ------al(S)'— , w(S') 4- w(S) что приводит к правильной выборке спиновых конфигураций. Модифици- руйте код для использования алгоритма тепловой бани и сравните его эффективность с традиционным алгоритмом Метрополиса.
Методы. Монте-Карло 249 ПРОЕКТ VIII: КВАНТОВЫЙ МЕТОД МОНТЕ-КАРЛО ДЛЯ МОЛЕКУЛЫ Н2 Здесь мы рассмотрим методы Моите-Карло, которые могут применяться для расчета точных характеристик основного состояния квантовых мно- гочастичных систем. В их основе лежит формальная аналогия между уравнением Шрёдингера в мнимом времени и многомерным уравнением диффузии (см. разд.7.4). И поскольку последнее уравнение можно ре- шать методами Монте-Карло (обычная диффузия есть результат большого числа случайных столкновений диффундирующих частиц), те же самые методы можно применять и к уравнению Шрёдингера. Конечно, метод Монте-Карло не универсален: с его помощью можно точно оценить энер- гию только основного состояния— при выборе хорошей пробной волновой функции этого состояния, и, кроме того, его вообще трудно применить к системе фермионов. Но этот метод успешно применялся к жидкому 4Не [Ка81], электронному газу [Се80], молекулам небольшого размера [Re82] и в решеточных калибровочных теориях [СЬ84]. Более подробное изложение метода Монте-Карло можно найти в указанных ссылках, а также в работе [Се79], где содержится хороший общий обзор. VIII. 1. Постановка задачи Рассмотрим конкретную задачу о структуре молекулы Н2, в которой два протона связаны между собой двумя электронами, в соответствии с точным приближением Борна— Оппенгеймера, в основе которого лежит предположение о том, что тяжелые протоны по сравнению со значитель- но более легкими электронами движутся медленно. В этом приближении потенциальная энергия U(S), определяющая движение протонов, находя- щихся на расстоянии S, есть сумма энергии электростатического от- талкивания двух протонов и собственного значения EQ(S) уравнения Шрёдингера для двух электронов: U(S) = |- + E0(S). (VIII. 1) О Электронное собственное значение определяется из решения уравнения Шрёдингера Я(3)Ф0(гг r2; 3) s [К + У(3)]Ф0 = £0(3)Ф0(гг r2; 3). (VIII.2)
250 Г лава 8 узлов и (VIII.За) притяже- электро- (VIII.36) В этом уравнении электронная волновая функция $0 является функцией пространственных координат 2 двух электронов и параметрически зависит от межпротонного расстояния S. Если мы интересуемся основ- ным состоянием электронов в молекуле и хотим пренебречь слабым вза- имодействием электронных спинов, то можем предположить, что элек- троны имеют антисимметричные спины (синглетное состояние); в этом случае принцип Паули требует, чтобы $0 была симметричной функцией относительно перестановки координат электронов и г2< Таким обра- зом, хотя электроны представляют собой два фермиона, уравнение, ко- торому удовлетворяют их волновые функции, аналогично уравнению для двух бозонов; следовательно, волновая функция $0 не имеет может быть выбрана положительной во всей области. Кинетическая энергия электронов, входящая в (VIII.2), равна к = - — (V? + V2), 2т 1 2 где /л —масса электрона. Потенциальная энергия V описывает ние электронов к каждому из ядер и взаимное отталкивание нов: V = ~fi2 + + Г~ + Г~] + L4L r2L r\R r2/?J 12 Если поместить протоны в точки с координатами +S/2 на оси г, то расстояние между электроном 1 и левым (L) или правым (/?) протоном будет равно rlL,R = 'Г1 ± 2 SZ' Расстояние r%L % между электроном 2 и протонами дается аналогичной формулой. Расстояние между электронами равно = |г] - г2|. (См. рис. VIII.1.) Наша задача в этом проекте, следовательно, состоит в решении шестимерного уравнения в частных производных на собственные значе- ния (VIII.2) для наименьшего собственного значения EQ при различных S, а значит, нахождении из уравнения (VIII. 1) потенциальной кривой U(S). Эта потенциальная кривая должна быть очень похожа на потенци- ал 6—12 или потенциал Морса (см. гл.1); глубина и положение мини- мума, а также кривизна U вблизи этого минимума связаны с наблюдае- мыми характеристиками спектра молекулы Н2. Мы также сможем вычис- лить точную энергию основного состояния двухэлектронных атомов —
Методы Монте-Карло 251 E^(S = 0). (Аналогичные системы рассматривались в приближении Харт- ри—Фока в проекте III.) Рис.VIII. 1. Координаты, используемые для описания молекулы Н2. VIII. 2. Вариационный метод Монте-Карло и пробная волновая функция Рассмотрим вариационный метод Монте-Карло для задачи на собственные значения. Если Ф(г)—произвольная пробная волновая функция (которую мы можем выбрать действительной), не ортогональная точному решению для основного состояния Фо, то вариационный функционал для энергии <Ф|Я|Ф> <Ф | Ф> J dr$2(r) ^ЯФ(г)] j г/гФ2( г ) (VIII.4а) (VIII.46) является верхним пределом для электронной энергии (собственного значения) основного состояния. В этом уравнении для краткости г обозначает шесть пространственных координат задачи 2, и мы запи- сали уравнение (VIII.46) в несколько необычном виде. Заметим, что в последнем уравнении вариационную энергию можно интерпретировать как усреднение «локальной энергии» е(г) = Ф” 4//Ф(г) = ф-’КФ(г) + У(г) = 2 - — + V(r) (VIII.5) i=l,2
252 Г лава 8 по всей шести мерной r-области с весом и>(г) ~ Ф2(г). Следовательно, для оценки вариационной энергии методом Монте-Карло нам необходимо только сгенерировать конфигурации (значения г12, распределенные в соответствии со значениями Ф2, например алгоритмом Метрополиса), а затем усреднить € по этим конфигурациям. Очевидно также, что этот метод легко обобщается на системы с ббльшим числом координат. Выбор пробной функции Ф ограничен условиями, что она должна быть достаточно простой, чтобы можно было удобно вычислять Ф2 и е и в то же время быть хорошим приближением для точной функции основ- ного состояния Фо. Действительно, если нам удастся выбрать такую Ф, которая является точным решением, то тогда е не будет зависеть от г, а метод Монте-Карло даст точную энергию с нулевой дисперсией. Таким образом, выбор более лучшего приближения Ф к Ф дает не только более точную вариационную границу для энергии, но и уменьшает дис- персию оценки интеграла методом Монте-Карло. Пробная волновая функ- ция должна быть также симметрична относительно перестановки двух электронов, однако не обязательно нормированной, так как нормиро- вочная константа сокращается при вычислении (VIII.4). В качестве пробной функции можно взять коррелированное произве- дение молекулярных орбиталей Ф(гг r2) = (VIII.6а) Первые два сомножителя представляют собой волновые функции каждого электрона на молекулярной орбитали, на которой он распределен по- ровну между двумя протонами. Простым выбором для молекулярной орби- тали будет симметричная линейная комбинация атомных орбиталей (P(rp = ехр[- + ехр£- (VI1I.66) Последний сомножитель в пробной волновой функции описывает корреля- цию между двумя электронами из-за кулоновского отталкивания. Таким образом, мы предполагаем, что при малых f должна быть мала, а при удалении электронов на значительное расстояние она должна выхо- дить на большую константу. Удобным и разумным выбором для f будет f(r) = exp г_______ а(1 + 0г). (VIII.6в) где а и 0—дополнительные положительные вариационные параметры. За- метим, что 0 регулирует расстояние, на котором пробная волновая функция выходит на свое некоррелированное значение при увеличении
Методы Монте-Карло 253 расстояния между электронами. Расходимость кулоновского потенциала при малых расстояниях на- кладывает дополнительные ограничения на пробную функцию. Если один из электронов (например, электрон 1) приближается к какому-либо яд- ру (например, левому), а другой остается фиксированным, то соответ- ствующая потенциальная энергия в е становится большой отрицательной величиной, так как становится малым. Если мы хотим, чтобы е ос- тавалась плавной функцией и имела малую дисперсию для интегрирова- ния методом Монте-Карло, то эту отрицательную расходимость необхо- димо устранить соответствующей положительной расходимостью в члене с кинетической энергией. Таким образом, пробная функция при - О должна иметь касп (заострение), т.е. молекулярные орбитали должны удовлетворять условию г h 1 п Л л lim - -----------— ?,ф(г17) - т— = конечное выражение. (VIII.7) L 2"1 1lJ Аналогичные условия должны выполняться всякий раз, когда любое из расстояний r^, или г12 стремится к нулю. Используя (VIII.6), несложными выкладками легко показать, что из указанных ограничений следует трансцендентное уравнение для определения а: = “0_______ (1 + e~s/o) (VIII.8) 2 2 и что а = 2aQ, где aQ = h /те — боровский радиус электрона. Таким образом, в нашем распоряжении остается только один варьируемый па- раметр ₽. Заметим, что рассмотренные выше ограничения не играли бы столь важную роль, если бы для оценки вариационной энергии мы ис- пользовали другие методы интегрирования, так как в них каждая рас- ходимость в е устранялась бы при усреднении из-за геометрического о фактора г . Выбрав пробную волновую функцию согласно (VIII.6), можно выпи- сать в явном виде выражения для е(г) через значения производных от <р и f. Следует отметить, что данный вид пробной функции неприменим при очень больших межпротонных расстояниях, так как в этом случае вероятность обнаружить два электрона вблизи одного протона остается конечной.
254 Глава 8 VIII.3. Оценка точной энергии методом Монте-Карло Обратимся теперь к методу Монте-Карло для оценки точного электрон- ного собственного состояния EQ. В основе метода лежит эволюция уравнения Шрёдингера в мнимом времени, в результате которой пробная волновая функция приближается к точному основному состоянию. В час- тности, точную функцию можно получить, применяя оператор exp(-//f/h) к пробному состоянию Ф и рассматривая предел больших времен t —> со. (Для подробностей см. разд. 7.4, где рассматриваются собственные значения эллиптических операторов.) Таким образом, мы определим Ф(г,/) = ехр t J En(t')dt'/h (VIII.9) Lo где E пока неопределенная с-мерная функция. Заметим, что по- скольку <Ф01 Ф> * О, Ф(/) будет с ростом t приближаться к (ненорми- рованному) точному основному состоянию Фо- Наш метод —метод Монте- Карло для интегралов по траекториям—эквивалентен численной оценке интеграла по траектории (VIII.9). В другом методе (метод Монте- Карло для функций Грина [Се79]) для уточнения пробной функции в (VIII.9) вместо экспоненты следует записать обратный оператор для смещенного гамильтониана. Для вычисления точной энергии основного состояния EQ рассмотрим небольшое обобщение вариационной энергии (VIII.4), привлекая эрми- товость Н\ f б/гФ(г)Ф(г,/)е(г) E(t) = <Ф|/»|ФЩ> = J . (VIII. 10) <Ф|Ф(<)> J йгФ(г)Ф(г,0 Очевидно следующее: E(t = 0) = Ev, где Е^ — вариационная энергия, соответствующая Ф; E(t —> со) = Е^ E(t) не зависит от функции В уравнении (VIII. 10) точная энергия записана в удобной для ме- тода Монте-Карло форме. Чтобы убедиться в этом, определим G(r, t) = = Ф(г)Ф(г, /), и в результате (VIII. 10) примет вид Е(0 = J drG(r,f)e(r) J drG(r,t) (VIII.И) Таким образом, точная энергия E(t) есть среднее от локальной энер-
Методы Монте-Карло 255 гии £ по распределению G(r, /). (Заметим, что в рассматриваемой за- даче G всюду положительна, так как ни Ф, ни Ф не имеют узлов.) Сле- довательно, для оценки Е методом Монте-Карло необходим «ансамбль» из # конфигураций {гг • • •, г^}, распределенных согласно G(r, /), по которому можно оценить E(t) по формуле £(/) « 1 I £(Г.), (VIII. 12) N /=1 с оценкой для дисперсии, аналогичной (8.3). Заметим, что если Ф(г) в действительности точное основное состояние Фо , то е(г) = EQ и не зависит от г, откуда E(t) = EQ с нулевой дисперсией. Конечно, приведенные выше выражения бесполезны, если не указан способ генерации ансамбля конфигураций. При t = 0, G(r, t) = = |Ф(г)|2, поэтому для генерации начального ансамбля с характерным числом членов N ~ 30 можно применить метод, аналогичный алгоритму Метрополиса. Для описания эволюции ансамбля во времени заметим, что, поскольку = (Еп - Н)У, G удовлетворяет нестационарному уравнению dG _ h-’[£n(0 - Ф(г)Я -1-1 С(г, 0 = I " $(r)j (VIII.13а) h a2G(r,/) 2 m 8r2 jb[D(r)G(r, 0] - dr - h-1[e(r) - En(0]G(r, /). (VIII.136) В этом уравнении мы использовали очевидные обозначения для про- странственных производных. Уравнение (VIII. 136) можно рассматривать как уравнение диффузии для функции G с дрейфовой скоростью _D(r) = — — ^1 = — 11221. (VIII. 14) m Ф(г) dr m dr Уравнение (VIII. 13) показывает, что кинетическая энергия действует на G как диффузия, D стремится сохранить G в тех ограниченных об-
256 Глава 8 ластях, где Ф велико, и что «источник» увеличивает G там, где е(г) минимально. На небольшом интервале времени от / до / + А/ эволюцию G можно описать с точностью до членов порядка А/ интегральным уравнением G(r, t + ДО = J dr'P(r, r';At)G(r', t) с ядром Р(г, г* ;Д/) = ехр {-[е(0 - £„(O]A//h} х Г т I3 f-[r-r'-D( г ')Д/]2 --- ехр -----------------—_ |2nhA/J 2hbt/m (VIII.15) (VIII.16) Это ядро (всюду положительное) можно рассматривать как условную ве- роятность того, что конфигурация из точки г' в момент времени t пе- рейдет к моменту времени t + А/ в точку г. Эта вероятность содержит множитель, связанный с кинетической энергией, которая стремится «размазать» систему относительно точки г' с вероятностью нормально- го распределения с дисперсией hAZ/m и средним DAf Другой множитель в Р связан с локальной энергией и стремится сохранить систему в тех областях пространства, где е наиболее отрицательно, увеличивая ве- роятность переходов в эти положения. Таким образом, квантовомехани- ческая структура основного состояния определяется балансом этих двух конкурирующих процессов. После изложенного выше алгоритм эволюции ансамбля должен быть очевиден. Конфигурация, находящаяся в момент времени t в точке г', генерирует вклад в G(r, t + А/), равный Р(г, г'; А/). Для этого но- вый ансамбль помещается в конфигурацию г в соответствии с распреде- лением ехр « '-[г-г'~Р( г ' )Д/]2~ 2hA//m а затем взвешивается важность этой конфигурации с весом ехр {- [е(г) - £n(OJA</h}. Один из способов взвешивания на практике сводится к копированию или удалению конфигурации в новом ансамбле с вероятностью, определяемой последней функцией. В этом случае число членов ансамбля W флуктуи-
Методы Монте-Карло 257 рует от одного шага по времени к следующему, но постоянной регули- ровкой Еп его можно сохранять приблизительно постоянным. Действи- тельно, чтобы сохранить постоянным J dr G(r, t) (и, следовательно, Af), En(t) должна быть равной £(/), и тогда Еп также дает оценку E(t). В другом способе взвешивания, когда энергия вычисляется путем усреднения е, каждой конфигурации присваивается ее «важность» (т.е. вес W Другими словами, слагаемые в (VIII. 12) заменяются на №\£(г.). На каждом шаге по времени W. для каждой конфигурации умно- жается на первый множитель в (VIII.16) с одновременным изменением Е t чтобы сохранить средний вес каждой конфигурации в ансамбле рав- ным 1. Этот метод требует меньшего обоснования, цем метод копирова- ния и удаления, однако он может оказаться неэффективным, например, в случае, когда конфигурация приобрела очень малый вес, и тем не менее возникает во время эволюции. Изложим кратко общую схему метода. Система описывается ансамб- лем конфигураций, каждая из которых имеет свой относительный вес в описании свойств системы. Первоначально конфигурации распределены в r-пространстве в соответствии с пробной функцией |Ф(г)|2. Эффек- тивность метода в сильной степени зависит от выбора этой пробной функции. Для эволюции ансамбля во времени каждый член движется в г с вероятностью смещенного нормального распределения (второй множи- тель в (VIII. 16)), а его вес умножается на первый множитель в урав- нении (VIII. 16). Величина £п(0, которая подстраивается после каж- дого шага, чтобы сохранить средний вес ансамбля равным 1, в каждый момент времени дает оценку энергии в виде взвешенного среднего от е(г) по ансамблю. Более того, если полное время эволюции достаточно велико, чтобы отфильтровать пробную функцию, последующая эволюция генерирует независимые ансамбли, распределенные в соответствии с точной волновой функцией основного состояния. Это позволяет улуч- шить статистику расчета до любой требуемой точности. Следует отметить, что поскольку ансамбль движется в конфигура- ционном пространстве со скоростью, определяемой шагом М, который для справедливости и точности уравнений (VIII.15), (VIII.16) должен быть достаточно малым, то оценки энергии на последовательных шагах по времени не будут статистически независимыми. Поэтому при форми- ровании средних и вычислении дисперсий необходимо выбирать ансамбли только на достаточно больших интервалах /, где величины некоррели- рованы. Величину этих интервалов удобно определять, исследуя авто- корреляционные функции оценки. С другой стороны, можно использовать 17—1650
258 Глава 8 метод разбиения значений на группы, как было рассмотрено для модели Изинга в разд. 8.4. Следует также отметить, что из-за конечности временного шага необходимо провести расчеты для нескольких различ- ных значений Lt и экстраполировать результаты к пределу Lt = 0. Для оценки масштаба Lt удобно воспользоваться нормальным распределением (VIII. 16), для которого средняя величина шага приблизительно равна (hLt/этот шаг должен быть мал по сравнению с пространствен- ными масштабами волновой функции. В отличие от энергии другие ожидаемые значения наблюдаемых ве- личин в основном состоянии получаются в данном методе не так прос- то. Чтобы увидеть это, рассмотрим ожидаемое значение основного со- стояния для некоторой наблюдаемой величины А, которая не коммутиру- ет с гамильтонианом. <Ф0|Л|Ф0> s lim /->со <Ф(Н1Л|Ф(П> = J </гФ2( г,/)Ф-1ЛФ(г,/) J </гФ2(г,0 (VIII.17) Для оценки этого интеграла необходим ансамбль конфигураций, распре- деленный как |Ф|2. В то же время описанный выше диффузионный про- цесс генерирует конфигурации, распределенные как G = ФФ, что не со- впадает с тем, что нам требуется. Хотя с помощью довольно сложного алгоритма можно’ использовать для вычисления ожидаемых значений точ- ного основного состояния и этот ансамбль, хорошая оценка получает- ся при использовании этого ансамбля непосредственно для расчета первого члена разложения <ФП |Л |ФП> » Игл 2 _ <ФМ1ф> , (VIII.18) 0 0 Ьоо <Ф|Ф(^)> <Ф|Ф> второй член легко оценивается по ансамблю, распределенному как Ф2. Таким образом, это выражение указывает способ коррекции возмущения ожидаемого значения в пробном состоянии; несложные выкладки показы- вают, что формула имеет второй порядок точности относительно ошибки в пробной функции (Фо - Ф).
Методы Монте-Карло 259 VIII.4. Решение задачи Численное моделирование свойств молекулы Н2 рассмотреньями выше ме- тодами Монте-Карло можно провести, выполнив следующую последова- тельность шагов. | Шаг 1. Проверьте, что из уравнения (VIII.8) и условия а = 2aQ следует, что волновая функция (VIII. 6) удовлетворяет условию (VIII.7). Выведите в явном виде аналитические выражения для е(г) (уравнение (VIII.5)) и D(r) (уравнение (VIII. 14) для волновой функ- ции (VIII.6). | Шаг 2. Напишите программу, использующую метод Монте-Карло, для расчета оценки вариационной энергии с пробной волновой функцией (VIII.6). Для этого вам понадобятся подпрограммы вычисления Ф2 и е для заданной конфигурации. При выборке Ф2 используйте алгоритм Мет- рополиса. Для определения минимально допустимой частоты выборки вдоль траектории случайного блуждания исследуйте автокорреляционную функцию для е. | Шаг 3. Для разных значений межпротонного расстояния S найдите па- раметр 3, минимизирующий электронное собственное значение, и опре- делите вариационный потенциал молекулы Н2. Убедитесь, что зависи- мость ошибок от 3 ведет себя в ваших результатах так, как это и ожидалось. Ваши результаты для S = 0 можно сравнить с вариационными результатами, полученными в проекте III, изменив масштаб волновых функций водородоподобного атома и приближения Хартри—Фока. | Шаг 4. Подтвердите справедливость уравнений (VIII.15), (VIII.16), раскладывая G(rz, t) в ряд Тейлора вблизи г и интегрируя полученную функцию Гаусса по г'. (Вам потребуется сделать приближение D(r') » » D(r), точность которого О(ЛО-) | Шаг 5. Проверьте схему метода Монте-Карло интегрирования по тра- екториям для нахождения точной энергии основного состояния гамиль- тониана на простой модели частицы в одномерном потенциале гармони- ческого осциллятора. Напишите программу, в которой для пробной фун- кции возьмите нормальное распределение с неправильной шириной и убедитесь, что эволюция во времени уточняет энергию в ожидаемом на- правлении. Достаточным будет ансамбль из 20—30 членов. Исследуйте 17*
260 Глава 8 качество ваших результатов в зависимости от ошибки в пробной волно- вой функции и от используемого шага по времени. | Шаг 6. Объедините написанные вами на шагах 2 и 5 программы в одну программу, которая будет определять точное собственное значение ос- новного состояния в задаче с двумя электронами и, следовательно, потенциал молекулы Н2 при различных расстояниях. В частности, опре- делите положение минимума потенциальной кривой и сравните его с эм- пирическими значениями из разд. 1.4. Для пробных функций, полученных на шаге 2, проверьте, что ваши точные энергии всегда меньше вариа- ционных значений. Подтвердите также, что ваши точные результаты не зависят от конкретного выбора р и что они плавно экстраполируются как функция А/. Определите энергию связи атома Не, рассмотрев слу- чай S = 0, и сравните ее с точным значением, приведенным при обсуж- дении проекта III.
Приложение А КРАТКИЙ ОБЗОР ЯЗЫКА ПРОГРАММИРОВАНИЯ БЕЙСИК Данное приложение содержит краткое описание языка (вариант IBM или Microsoft GW BASIC), использованного для написания программ в этой книге. Обзор никоим образом не претендует на полноту и в нем не со- общается ни о всех операторах языка, ни о всех деталях каждого опе- ратора. В целом это приложение скорее имеет целью дать читателю, знакомому с каким-нибудь другим языком высокого уровня (Фортран, Паскаль, Си), возможность читать тексты прилагаемых программ. Обзор вовсе не предназначен для обучения новичков программированию. Для этого им следует обратиться, к соответствующим учебникам. Более под- робную информацию о Бейсике можно найти в любом руководстве для пользователей, обычно поставляемом вместе с персональным компьюте- ром, или в многочисленных имеющихся пособиях. Ниже в тексте операторы Бейсика набраны прописными буквами, входящие в них переменные величины— курсивом, необязательные эле- менты заключены в квадратные скобки. Формат записи строк Все строки программы на Бейсике начинаются с последовательно возра- стающих номеров. Диапазон нумерации от 0 до 65529. В одной строке можно записывать нескрлько операторов, разделяя их двоеточием (:). Все пробелы, использованные в записи операторов, и любой текст, расположенный в строке за знаком апострофа (’), игнорируются. Переменные Имена переменных могут быть любой длины, но существенны только пер- вые 40 литер. Имя должно начинаться с буквы (допускаются только
262 Приложение А прописные буквы). В именах разрешено использовать только буквы, цифры и десятичную точку. Исключением является последняя литера имени, указывающая тип переменной. Четырем допустимым типам пере- менной соответствуют следующие последние литеры: целая переменная (2 байта, диапазон от -32768 до +32767) вещественная переменная с одинарной точностью (4 байта, точность 7 десятичных знаков) вещественная переменная удвоенной точности (8 байтов, точность 17 десятичных знаков) строковая переменная. Таким образом, имена var!, var%, var# и var$ обозначают различ- ные переменные. По умолчанию (при отсутствии специального конечного знака) предполагается вещественный тип с одинарной точностью. Массивы Оператор DIM переменная (индексы) [,переменная (индексы)]... объявляет переменную массивом, размерность которого определяется индексами. Максимальное число измерений равно 255, а максимальная величина каждого измерения равна 32767. Нумерация элементов по каж- дому измерению начинается с нуля. Кроме того, выполнение оператора DIM обнуляет все элементы определяемых массивов. Арифметические операции Элементарные арифметические операции в порядке увеличения их стар- шинства: х + у сумма х и у х - у разность х и у х / у частное от деления х и у х Л у возведение х в степень у х MOD у остаток от целочисленного деления х на у Здесь пара х и у — любые арифметические выражения или переменные.
Краткий обзор языка Бейсик 263 Кроме того, в Бейсике имеется еще ряд встроенных арифметических функций: ABS(x) возвращает абсолютную величину x ASC(xtf) возвращает ASCII-код первой литеры строки х$ ATN(x) возвращает арктангенс от х CINT(x) преобразует вещественную величину х в целую путем округления COS(x) возвращает косинус от х CSNG(x%) преобразует целую величину х% в вещественную с одинарной точностью EXP(x) возвращает значение е (=2,71828) в степени х FIX(x) преобразует вещественную величину х в целую путем отбрасывания дробной части LEN(xtf) возвращает число литер в строке х$ LOG(x) возвращает натуральный логарифм (по основанию е) от х RANDOMIZE устанавливает начальное состояние генератора случайных чисел, вызываемого из RND, запрашивая начальное число с клавиатуры RND возвращает значение вещественной случайной переменной, равномерно распределенной от 0 до 1. SGN(x) возвращает знак х (+1 или -1) SIN(x) возвращает синус от х SQR(x) возвращает квадратный корень от х VAL(xtf) возвращает числовое значение строки х$ Логические операции и сравнения Переменная Или выражение имеет логическое значение «истина», если его числовое значение отлично от нуля, и логическое значение «ложь», если оно равно нулю. Однако в данной книге для значения «истина» Используется только число -1, поскольку NOT х дает «ложь» лишь при х - -1., В Бейсике предусмотрены следующие логические выражения: NOT х ложно, если х истинно, и истинно, если х ложно
264 Приложение А х AND у х OR у истинно, только если истинны как х, так и у, в противном случае ложно истинно, если истинно х или у, иначе ложно Здесь пара х и (/ — любые арифметические операторы или выражения. Кроме того, имеются следующие операторы, позволяющие сравнивать значения переменных нлн выражений: * = У истинно, если X равно у, иначе ложно хоу истинно, если х неравно у, иначе ложно, это можно также записать в виде х >< у Х>у истинно, если X больше (/, иначе ложно Х<У истинно, если X меньше у, иначе ложно Х>~У истинно, если X больше или равно у, иначе ложно х <~ У истинно, если X меньше или равно у, иначе ложно Заметим, что можно сравнивать между собой и строки. Они считаются равными, лишь когда все литеры в них попарно совпадают. Во всех других случаях они не равны. Строковые функции Следующие функции Бейсика возвращают строковые переменные: CHR$(n) возвращает литеру, ASCII-код которой равен п INKEYS возвращает очередную литеру из буфера клавиатуры LEFT$(x$,n) возвращает первые п литер строки х$ RIGHT$(x$,n) возвращает последние п литер строки х$ SPACE$(n) возвращает строку нз п пробелов STRING$(n,m) возвращает строку из п литер с ASCH-кодом т TIMES возвращает строку из восьми литер вида чч:мм:сс, содержащую текущие показания часов компьютера в часах (чч, от 00 до 23), минутах (мм, от 00 до 59) и секундах (сс, от 00 до 59). Здесь х$ обозначает любую строковую переменную, а п и т — целые числа.
Краткий обзор языка Бейсик 265 Функции, определяемые пользователем В Бейсике предусмотрено определение функций самим пользователем с помощью оператора DEF FNujw^ [(аре [,арг ]...)] = выражение. Этим определяется функция с именем FNujca от указанных аргументов (арг). FNu-мя, будучи использовано в некотором операторе программы, возвращает значение выражения при текущих значениях аргументов и любых других переменных, входящих в выражение. Используемые в опе- раторе DEF FN аргументы являются формальными и не связаны с пере- менными программы. Управляющие операторы Группа следующих операторов управляет порядком исполнения инструк- ций программы: STOP или END Прерывают исполнение программы. GOTO номер строки Передает управление на строку с указанным номером. IF выражение THEN оператор Если логическое значение выражения равно «истина», то выполня- ется оператор и все другие операторы, стоящие далее в той же строке. В противном случае управление передается в следующую строку. Если в качестве оператора выступает GOTO номер строки, то можно опустить либо слово THEN, либо GOTO, но не оба сразу. IF выражение THEN оператор 1 ELSE оператор 2 Если логическое значение выражения равно «истина», то выполня- ется оператор 1 и управление передается на следующую строку. Если же логическое значение выражения равно «ложь», то выполня- ется оператор 2 и все другие операторы, стоящие далее в той же строке.
266 Прилежание А FOR i = т ТО п [STEP р] операторы NEXT i Данная конструкция является основной структурой цикла. Операто- ры, следующие за строкой FOR, выполняются последовательно, пока управление не доходит до NEXT. Здесь величина i получает прира- щение р и управление вновь Цередается на FOR, где значение i проверяется перед повторным выполнением операторов. Операторы между строками FOR и NEXT исполняются до тех пор, пока выполня- ется условие i п (для положительных р) или i £ п (для отрица- тельных р). По умолчанию значение р равно 1. Циклы FOR —NEXT могут быть вложенными. WHILE выражение операторы WEND Если логическое значение выражения равно систина», то операторы выполняется и по достижении WEND управление вновь передается на оператор WHILE. Если же логическое Значение выражения равно «лол<ь>, то управление передается на строку, следующую за WEND. Циклы WHILE—WEND могут быть вложенными. GOSUB номер строки Этот оператор в Бейсике является формой обращения к подпрограм- ме. GOSUB передает управление на подпрограмму, начинающуюся со строки с указанным номером. Далее исполняются операторы этой подпрограммы до тех пор, пока не достигается оператор RETURN. После Этого управление возвращается на оператор, следующий не- посредственно за GOSUB. RETURN [номер строки] Завершает выполнение подпрограммы путем передачи управления на строку С указаййым номером. Если номер Строки опущен, управле- ние переходит на оператор, следующий непосредственно за вызыва- ющим оператором GOSUB.
Краткий обзор языка Бейсик 267 Операторы ввода и вывода В Бейсике заложено, что текстовый дисплей содержит 25 строк по 80 позиций. Графический дисплей используется в программах, включенных в настоящую книгу, только в режиме с высоким разрешением (640 точек по горизонтали х 200 точек по вертикали). Следующие далее операторы определяют способы представления информации на этих дисплеях, обме- на данными между программой и оперативной памятью или файлами на магнитных дисках» а также ввода данных с клавиатуры. SCREEN режим Этот оператор устанавливает атрибуты экрана. -Параметр режим ра- вен лйбо 0 (текст, 25 строк по 80 позиций), 1 (графика со сред- ним разрешением 320 х 200 точек; в данной книге не применяется) либо 2 (графика с высоким разрешением 640 х 200 точек). Для ал- фавйтно-цйфровых дисплеев допустим только режим = 0. KEY OFF Выключает стандартный вывод в 25-ю строку экрана функциональных клавиш Бейсика. CLS Очищает экран. COLOR [т] |>] Текущий цвет знаков и фона определяется параметрами ш и п. Для монохромного дисплея черному цвету отвечает значение 0, зелено- му—число из диапазона 2—7, а 10—15 соответствуют ярко-зеле- ному цвету. Для графических дисплеев в текстовом режиме тип задают 16 различных цветов. Более подробно управление цветом описывается в руководствах по Бейсику. LOCATE [строка] [,столбец] [.курсор] Выставляет курсор в указанные строку и столбец текстового экра- на. Допустимые диапазоны: 1 строка ^25 и 1 £ столбец 80. Если курсор = 1, то курсор будет виден. Если курсор = 0, то курсор не высвёйивается. Если параметр строка опущен, использу- ется текущий номер строки, в которой находится курсор.
268 Приложение А PRINT выражение 1 [.выражение 2,...] [;] Выводит на экран значения выражений. Эти выражения могут содер- жать числовые или строковые переменные, нли математические фор- мулы (например, Х*5+2). Завершающая список вывода точка с запя- той предотвращает переход курсора после вывода в следующую строку экрана. PRINT USING "строка"', выражение! [.выражение 2,...] [;] Печатает значения выражений в формате, указанном в строке: * представляет одну цифру выводимого числа, положение десятичной точки должно указываться явно + перед первой цифрой (#) указывает, что число будет выводится со знаком (+ или -) задает экспоненциальную запись выводимого числа В строке также может содержаться текст, который будет выводить- ся вместе с переменными. PSET (х.у) Выводит на графическом экране точку с координатами (х.у). В ре- жиме с высоким разрешением 0 х 639 и 0 у 199. LINE [(xl,0)]-(x2,i/2) [,[цвет] [,В [,F]]] Проводит в графическом режиме прямую линию, соединяющую точки (xl.yl) и (х2,у2). При наличии параметра «В> будет нарисован прямоугольник с указанной линией в качестве диагонали. При на- личии обоих параметров «B,F> внутренняя область прямоугольника будет закрашена цветом. Если (xl,yl) опущено, то будут исполь- зованы текущие координаты последней опорной точки. CIRCLE (х.у),г В графическом режиме рисует окружность радиусом г с центром в точке (х,у). ВЕЕР Подает на громкоговоритель компьютера звуковой сигнал длитель- ностью примерно 0,25 с.
Краткий обзор языка Бейсик 269 INPUT [;] ["лодсказка";] переменная 1 [.переменная 2,...] Запрашивает ввод с клавиатуры указанных переменных, При этом на экран выводится подсказка и знак <?», после чего система ожида- ет нажатия клавиши <Enter>. Если количество или тип введенных (через запятую) переменных отличается от указанного, то система выдает сообщение «Redo from start» (повторите ввод) и ожидает повторного ввода. Наличие «;» сразу за словом INPUT отменяет перевод курсора в начало новой строки после ввода переменных. OPEN имя файла FOR режим AS Аномер файла Открывает файл с именем имя файла для работы в заданном режиме. Допустимые режимы: INPUT для ввода и OUTPUT для вывода. Целое число номер файла, равное 1, 2 или 3, обозначает данный файл в последующих операторах INPUT#, WRITE# или CLOSE*. INPUT Аномер файла, переменная! [.переменная 2,... ] Считывает указанные переменные из файла с заданным номером. WRITE Аномер файла, выражение 1,[,выражение 2,...] Записывает значения выражений, указанный в списке, в файл с меткой номер файла. CLOSE Аномер файла Завершает все обмены с файлом с указанным номером файла. READ переменная 1 [.персменная 2....] Присваивает перечисленным переменным значения, содержащиеся в очередном операторе DATA. Перенос данных из DATA несколькими операторами READ происходит в порядке их исполнения, начиная с оператора DATA, указанного в команде RESTORE. DATA константа 1 [,константа 2,...] Определяет список констант, которые будут присвоены переменным посредством оператора READ.
270 Приложение А RESTORE номер строки Устанавливает, что операторы READ должны считывать данные, на- чиная с оператора DATA в строке с указанным номером. РЕЕК (т) Возвращает байт (0 -5- 255), считанный из памяти по адресу, сме- щенному на m байтов (0 * 65535) относительно адреса, заданного последним выполненным оператором DEF SEG. РОКЕ т,п Заносит байт п (0 * 255) в память по адресу, смещенному на tn байтов (0 т 65535) относительно адреса, заданного последним вы- полненным оператором DEF SEG. DEF SEG [=адрес] Задает адрес памяти, относительно которого рассматриваются сме- щения в операторах РЕЕК и РОКЕ.
Приложение Б ПРОГРАММЫ ДЛЯ ПРИМЕРОВ В этом приложении собраны листинги с текстами, программ, которые описывались в предыдущих главах в качестве примеров. Все они напи- саны на стандартной версии языка Бейсик (GW BASIC фирмы Microsoft) для компьютеров серии IBM РС/ХТ/АТ. Программы будут работать не только на этих компьютерах, но и на других вычислительных системах, совместимых с этими машинами по операционной системе MS-DOS. При создании программ мы пытались придерживаться методов «хоро- шего программирования», рассмотренных, например, в [Ке78]. При этом «элегантность» или машинная эффективность программ часто приноси- лись в жертву их большей понятности. Однако, чтобы сохранить разум- ную длину кодов, в программах не была обеспечена полная «защита от дурака» и поэтому многие программы можно «поломать», введя в них неадекватные данные. Перед каждой программой в этом и следующем приложениях в качестве примеров приводятся наборы входных парамет- ров, обеспечивающие успешное выполнение некоторого типичного вари- анта расчета. Во всяком случае, изучение текста соответствующей программы позволяет быстро выяснить, что вызвало ошибку. Программы разбиты на подпрограммы, каждая из которых выполняет строго определенную задачу. Все подпрограммы начинаются в строках с номерами, кратными 1000. В заголовке описано назначение данной под- программы и используемые в ней переменные. Последние бывает четырех видов: ВХОДНЫЕ и ВЫХОДНЫЕ переменные (их значения соответственно берутся из других частей программы или передаются в другие части), ГЛОБАЛЬНЫЕ переменные (доступны в любом месте программы, как пере- менны!? из CQMMON-блоков в языке Фортран) и ЛОКАЛЬНЫЕ переменные (определяемые и используемые только внутри данной подпрограммы). И хотя в Бейсике все переменные фактически являются глобальными, по- лезно различать переменные двух последних типов, так как часто бы- вает удобно использовать в разных подпрограммах переменную с одним
272 Приложение Б и тем же именем, например в качестве параметра цикла. Тексты программ отформатированы таким образом, чтобы облегчить их чтение. По мере возможности, переменные снабжены мнемоническими именами, а циклы и области, охваченные операторами IF, выделены отступами. Текущие комментарии, расположенные во многих строках справа от операторов, поясняют выполняемые в этом месте вычисления. Основные разделы программ отделены друг от друга пустыми строками. Поскольку большая часть любой программы так или иначе связана с вводом, выводом и заурядной «бухгалтерией*, важные части программ выделены на листингах жирным шрифтом. Графическое представление результатов расчетов значительно по- вышает качественные возможности многих из приведенных программ. И хотя все программы будут работать при наличии только алфавитно-циф- рового дисплея, эффективность многих гораздо выше при выполнении на компьютерах с графическим выводом, а в некоторых случаях лучше все- го иметь даже два отдельных дисплея— графический и текстовый. Во всех программах, однако, графический дисплей используется как в графическом режиме с высоким разрешением (640 х 200 точек), так и в текстовом режиме. Возможности цвета используются лишь во втором случае. Каждая программа начинает работу с предъявления титульного экрана-заставки и запроса пользователю о конфигурации дисплея ком- пьютера. В зависимости от данных ответов будет выбран наиболее эф- фективный способ последующего представления результатов. Если вам не известна точная конфигурация дисплея вашего компьютера, лучше всего при первом запуске программы ответить «нет» (нажимая клавишу "N") на вопрос «Есть ли на вашем компьютере графический дисплей?». Переключение с одного дисплея на другой в некоторых программах осуществляется двумя стандартными подпрограммами (например, в про- грамме примера 1 они начинаются со строк 7000 и 8000). Они рассчи- таны на аппаратуру компьютеров IBM PC/XT/АТ, но их можно легко пе- ределать и приспособить для других машин. Еще один случай зависи- мости от оборудования связан с использованием буферов дисплеев в памяти. Некоторые наши программы посылают данные непосредственно в эти буферы оператором РОКЕ, что быстрее по сравнению с выводом в Бейсике с помощью оператора PRINT. В тех случаях, когда использует- ся этот прием, пользователь уведомляется об этом в начале работы, и ему предоставляется возможность выбрать более медленнный вариант с оператором PRINT. Если вы пользуетесь графическим дисплеем или вер- сией Бейсика, несовместимой со стандартом IBM, разумнее всего при- нять этот вариант, по крайней мере при первом запуске программы.
Программы для примеров БЛ. ПРИМЕР 1 273 Данная программа вычисляет квазиклассическое приближение для энер- гий связанных состояний в системе с потенциалом Ленард Джонса для вводимого значения у = (2ma2E0/h2)1/2. Основная задача состоит в том, чтобы найти для каждого целого п величину е^, удовлетворяющую уравнению (1.22). После определения числа связанных состояний (строки 1190—1200) находится энергия каждого уровня (цикл в стро- ках 230—300). Для этого методом секущих вычисляется положение нуля функции f = s - (п + 1/2)я (цикл в строках 2070 — 2140) Подпрограм- ма, начинающаяся со строки 3000, рассчитывает величину действия s по заданному значению энергии. Используется простой метод пошагово- го поиска для определения положения внутренней (цикл 3070—3120) и внешней (цикл 3140—3190) точек поворота Затем по правилу Симпсона вычисляется интеграл, при этом интегрирование вблизи точек поворота проводится специальным образом. После определения всех энергий е подпрограмма, начинающаяся строкой 5000, рисует для каждого уровня траектории в фазовом пространстве k(x). Если на запрос о величине GAMMA ввести число 50, то вы получите типичный для данной программы вариант выдачи результатов расчета. 10 1 *************************************************************************** 20 'Пример 1: Квантование по Бору-Зоммерфельду энергии связанных 30 ' состояний для системы с потенциалом Ленард-Джонса 31 'COMPUTATIONAL PHYSICS by Steven E. Koonin 32 'Copyright 1985, Addison-Wesley Publishing Company 40 '*************************************************************************** 50 GOSUB 6000 'вывод экрана-заставки 60 r 70 Pl=3.14159 'определение констант и функций 80 МАХ%=100 'макс, число связанных состояний 90 DIM Е(100) 'массив энергий уровней 100 DIM XIN( 100),XOUT( 100) 'массивы координат точек поворота 110 'Если вы изменили МАХ%, то измените размерность Е, XIN и XOUT 120 TOLX=.0005: TOLE=.0005 'погрешности координат и энергии 130 NPTS%=40 'число узлов интегрирования 140 NGRAPH%=100 'число точек на графике 150 XMIN=2*( 1/6) 'положение минимума потенциала 160 DEF FNV(X)=4*(X~(-12) -Хл(-6)) 'потенциал Ленард-Джонса 170 'Если вы изменяете форму потенциала, то отнормируйте его 18—1650
274 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 Приложение Б 'минимум на -1 и замените ХМ IN на новое положение равновесия GOSUB 1000 t Е1=-1: F1=0-PI/2 FOR N%=0 TO NMAX% IF INKEY$="e" THEN GOTO 200 E2=E1+ABS(E1)/4 DE=2*TOLE GOSUB 2000 E1=E2 F1=F2-PI: NEXT N% » IF GRAPHICS% THEN GOSUB 5000 GOTO 200 'ввод GAMMA, вычисление NMAX% 'оценки основного состояния 'цикл расчета всех NMAX% уровней 'нажатие клавиши <е> прерывает расчет 'удобные параметры для ' метода секущих 'расчет энергии уровня N% ' начальные оценки следующего уровня 'лишнее PI из-за увеличения N% 'вывод графиков для уровней ' новое GAMMA и повторение расчета ' Цс*Ф********************************************************************** 'Подпрограмма для ввода значения GAMMA и вычисления NMAX% ' входные переменные: нет ' выходные переменные: GAMMA, NLEV%, NMAX% 'глобальные переменные: GRAPHICS%, MONO%, МАХ%, PI, TOLE 'локальные переменные: Е ' 4с>|с4с4сз(с*************4с************************************************ФФ4с4<** LOCATE 23,18,1: ВЕЕР PRINT "Введите Gamma=sqr(2ma"+CHR$(253)+"V/hbar"+CHR$(253)+")"; INPUT; " или 0 ( выход)"; GAAAMA IF GAAAMA=>0 GOTO 1150 LOCATE 24,26: BEEP PRINT "Gamma должна быть больше нуля"; LOCATE 23,18: PRINT SPACE$(61); GOTO 1070 'повторное приглашение для GAAAMA IF GAAAMA=0 THEN END IF GRAPHICS% AND MONO% THEN GOSUB 8000 ' на текстовый дисплей LOCATE ,,0 » E--TOLE: GOSUB 3000 'расчет S при очень малой E для NMAX%=S/PI-.5: NLEV%=NMAX%+1' нахождения числа связанных состояний IF NLEV%<=MAX% GOTO 1280 'проверка на переполнение массивов LOCATE 23,18: PRINT SPACE$(61): LOCATE 23,22,1: BEEP PRINT USING "Число уровней должно быть меньше ###";МАХ%
Программы для примеров 275 LOCATE 24,23 PRINT "Попробуйте уменьшить величину gamma." LOCATE 23,22: PRINT SPACE$(57) GOTO 1070 CLS: LOCATE 2,24,0 PRINT USING "Gamma=####.## Число уровней=###"; GAMMA, NLEV% PRINT "" RETURN r 9 ********************************************************************* 'Подпрограмма расчета энергий связанных состояний 'входные переменные: DE, El, Е2, F1, Ы%, S, XIN, XOUT 'выходные переменные: Е, Е2, E(l%), F2, XIN(I%), XOUT(I%) ' глобальные переменные: TOLE 'локальные переменные: нет ************************************************************************** 1240 1250 1260 1270 1280 1290 1300 1310 1320 2000 2010 2020 2030 2040 2050 2060 2070 WHILE ABS(DE)>=TOLE 2080 Е=Е2: GOSUB 3000 2090 F2=S-(N%+.5)*PI 2100 IF F2=F1 THEN GOTO 2160 2110 DE=-F2*( E2-E1) /(F2-F1) 2120 E1=E2: F1=F2: E2=E1+DE 2130 IF E2>0 THEN E2=-TOLE 2140 WEND 2150 2160 2170 2180 2190 2200 2210 2220 2230 3000 3010 3020 3030 3040 3050 3060 3070 XIN=XMIN: DX=.1 вычисление энергии методом секущих вычисление S при новой энергии вычисление F при новой энергии выход, если F не изменяется приращение энергии изменение энергии и F энергия должна быть отрицательна IF((N%+1)MOD 18)=0 THEN GOSUB 4000 'очистка экрана по заполнении PRINT USING " N=## Энергия =+#.######"; N%,E; PRINT USING " Xin=##.###### Xout=##. ######"; XIN, XOUT E(N%)=E: XIN(N%)=XIN: XOUT(N%)=XOUT 'сохранение для графиков RETURN '************************************************************************* ' Подпрограмма расчета действия S в единицах 2*(h/2pi) входные выходные глобальные локальные переменные: переменные: переменные: переменные: Е S, XIN, XOUT (точки возврата - ТВ) FNV(X), GAMMA, NPTS%, TOLX, XMIN DX, FAC, H, SUM 'расчет внутренней ТВ поиском влево is*
276 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 3330 3340 3350 3360 3370 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 Приложение Б WHILE DX>TOLX XIN=XIN-DX IF FNV(XIN)<E THEN GOTO 3120 XIN=XIN+DX: DX=DX/2 WEND r XOUT=XMIN: DX=.1 'расчет внешней ТВ поиском вправо WHILE DX>TOLX XOUT=XOUT+DX IF FNV(XOUT)<E THEN GOTO 3190 XOUT=XOUT-DX: DX=DX/2 WEND H=(XOUT-XIN| ZNPTS%: SUM=0 'формула Симпсона от XIN-H до XIN+H SUM=SUM+SQR( E-FNV( XIN+H)) FAC=2 FOR l%=2 TO NPTS%-2 X=XIN+I%*H IF FAC=2 THEN FAC=4 ELSE FAC=2 SUM=SUM+FAC*SQR( E-FNV(X)) NEXT l% SUM=SUM+SQR( E-FNV( XOUT-H)) SUM=SUM*H/3 r SUM=SUM+(SQR(E-FNV(XIN +H|)|«2»H/3 'учет особенностей SUM=SUM+[SQR(E-FNV[XOUT-H)|)»2»H/3 ' на концах интервала Г S=GAMMA*SUM RETURN 9 9 ^****^***********************************************************^^**^^* 'Подпрограмма очистки экрана после его заполнения ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: GAMMA, NLEV% ' локальные переменные: нет ' ************************************************************************* LOCATE 24,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 4090 CLS: LOCATE 2,24,0
Программы для примеров 277 4110 4120 4130 4140 5000 5010 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 PRINT USING "Gamma=####.## Число уровней=###"; GAAAMA, NLEV% PRINT "" RETURN Подпрограмма вывода фазовых траекторий ( волновые числа К от X) ' входные переменные: ' выходные переменные: ' глобальные переменные: ' локальные переменные: Е, XIN, XOUT нет GAAAAAA, MONO%, NGRAPH%, NMAX% Н, l%, К, KMIN%, KSCALE, К1%, K1OLD%, К2%, K2OLD%, MARK%, X, Х%, XMIN%, XOLD%, XSCALE, Y% LOCATE 24,20,1: ВЕЕР 'приглашение с ожиданием команды PRINT "Для рисования графика нажмите клавишу <д>"; IF INKEY$o"g" GOTO 5100 LOCATE ,,0 n IF MONO% THEN GOSUB 7000' переключение на графический дисплей SCREEN 2,0,0,0 CLS: KEY OFF 'режим графики высокого разрешения LINE (60,180)-(640,180) LINE (60,1)-(60,180) t 'ось X 'ось К FOR MARK%=1 TO 5 X%=70+AAARK%*568/5 LINE (X%, 178)-(X%, 182) NEXT MARK% LINE (70,178)-(70,182) FOR l%=0 TO 5 IF l%<>5 THEN LOCATE 'разметка штрихами оси X 'штрих для XIN(NMAX%) 'оцифровка оси X 24, (9+l%*14) ELSE LOCATE 24,(6+l%*14) PRINT USING XIN(NAAAX%)+(XOUT(NMAX%)-XIN(NMAX%))*l%/5; NEXT 1% LOCATE 22,78: PRINT "X"; 'обозначение оси X FOR MARK%=0 TO 4 Y%=MARK%*180/4 LINE (58, Y%)-(62, Y%) NEXT AAARK% FOR l%=2 TO -2 STEP -1 LOCATE (12-5.5*1%), 2 'разметка штрихами оси К 'оцифровка оси К
278 Приложение Б 5370 5380 5390 5400 5410 5420 5430 5440 5450 5460 5470 5480 5490 5500 5510 5520 5530 5540 5550 5560 5570 5580 5590 5600 5610 5620 5630 5640 5641 5650 5660 5670 5680 5690 5700 5710 5720 5730 5740 5750 5760 PRINT USING l%*GAAAMA/2; NEXT 1% LOCATE 4,3: PRINT "К"; 'обозначение оси К г LOCATE 1,60 'вывод названия графика PRINT "Фазовые траектории" LOCATE 2,61 PRINT USING "Gamma=###.##";G АЛАМА; Г XSCALE=569/(XOUT(NMAX%)-XIN(NMAX%)) 'масштабы по осям KSCALE=180/( 2*GAMMA) Г XMIN%=70+(XMIN-XIN(NMAX%))*XSCALE 'ставим "+" в (XMIN,K=0) KMIN%=180-GAAAMA*KSCALE LINE (XMIN%+2, KMIN%)-(XMIN%-2,KMIN%) LINE (XMIN%, KMIN%+2)-(XMIN%,KMIN%-2) i FOR N%=0 TO NMAX% ' цикл рисования графиков для всех уровней H=(XOUT(N%)-XIN(N%))/NGRAPH% 'шаг по X для графика уровня N% FOR l%=0 ТО NGRAPH% ' цикл по нанесению всех точек на график X=XIN(N%)+H*I% 'координата X текущей точки X%=70+(X-XIN(NMAX%))*XSCALE K=GAAAMA*SQR(E(N%)-FNV(X)) 'волновое число в текущей точке K1%=180-(K+GAMMA)*KSCALE K2%=180+(K-GAMMA)*KSCALE 'возможно К > 0 и К < 0 IF l%=0 GOTO 5650 'соединяем текущую точку с предыдущей LINE (XOLD%,K1OLD%)-(X%,K1%) LINE (XOLD%,K2OLD%)-(X%,K2%) ' замыкание траектории IF l%=0 OR l%=NGRAPH% THEN LINE (X%,K1%)-(X%,K2%) K1OLD%=K1%: K2OLD%=K2% ' обновление предыдущих значений XOLD%=X% NEXT 1% NEXT N% i LOCATE 19,23: BEEP 'приглашение с ожиданием команды PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 5730 IF MONO% THEN GOSUB 8000'возврат на текстовый дисплей SCREEN 0: WIDTH 80: LOCATE ,,1,12,13 'возврат в текстовый режим RETURN
Программы, для примеров 279 5770 6000 1 1 ************************************************************************* 6010 6020 6030 6040 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 6280 6290 6300 6310 6320 6330 6340 6350 6360 'Подпрограмма вывода экрана-заставки ' входные переменные: нет ' выходные переменные: GRAPHICS%, MONO% ' глобальные переменные: нет 'локальные переменные: G$f М$, ROW% 1 ************************************************************************* SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме Г LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32; PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; f LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%, 70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); » COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРИМЕР 1"; COLOR 7 LOCATE 9,21: PRINT "Квантование по Бору-Зоммерфельду энергии" LOCATE 10,22: PRINT "связанных состояний в потенциале 6-12" LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ 6370 6380 6390 IF LEFT$(G$,1)="y" OR LEFT$(G$, 1)="n" GOTO 6400 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 6350
280 Приложение 6400 IF LEFT$(G$, 1)="у" GOTO 6430 6410 GRAPHICS%=0: MONO%=-1 6420 RETURN 6430 GRAPHICS%=-1 6440 LOCATE 18,15: PRINT SPACE$(55) 6450 LOCATE 19,13: PRINT SPACE$(57) 6460 LOCATE 19,14: BEEP 6470 INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ 6480 IF LEFT$(M$, 1)="Y" OR LEFT$(M$, 1)="n" GOTO 6500 'проверка ответа 6490 LOCATE 18,35: PRINT "Повторите...": GOTO 6450 6500 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 6510 RETURN 6520 ' 7000 'жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 7010 'Подпрограмма переключения с текстового дисплея на графический 7020 'входные переменные: нет 7030 "выходные переменные: нет 7040 3 глобальные переменные: нет 70 "2 'локальные переменные: нет 7060 '+******^^ 1Q7Q DEF SEG=0 7080 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 7090 SCREEN 0: WIDTH 40: LOCATE ,,1,6,7 7100 RETURN 7110 3 8000 ' жжжжжжжж^жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 8010 ' Подпрограмма переключения с графического дисплея на текстовый 8020 3 входные переменные: нет 8030 3 выходные переменные: нет 8040 3 глобальные переменные: нет 8050 'локальные переменные: нет 8060 гЖЖЖЖЖЖЖЖЖЖЖжЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ*ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ 8070 DEF SEG=0 8080 POKE &Н410, (РЕЕК(&Н410) OR &Н30) 8090 SCREEN 0: WIDTH 80; LOCATE ,,1,12,13 8100 RETURN 8110 '
Программы для примеров Б. 2. ПРИМЕР 2 281 Данная программа рассчитывает траектории частицы, движущейся в потенциале Энона — Хейлеса (2.35), и находит соответствующие поверх ности сечения. После ввода пользователем величины энергии (строки 1080 — 1090) рассчитываются границы области для поверхности сечения на плоскости (у, pj (подпрограмма 2000). После этого пользователь выбирает начальные условия движения частицы в пределах указанной области (подпрограмма 3000 или 5000; заметим, что как х, так и рх в начальный момент полагаются равными нулю). Затем выполняется интег- рирование уравнений по времени (цикл в строках 330—520) по схеме Рунге —Кутты четвертого порядка (один шаг интегрирования выполняет- ся в подпрограмме 11000; производные координат и импульсов вычисля- ются подпрограммой 12000). Положение частицы на плоскости (х, у) выводится на каждом шаге по времени (подпрограмма 13000 или 14000). А на поверхность сечеиия точка наносится подпрограммой 15000 лишь при пересечении траекторией оси у (т.е. при х = 0). При этом, как это описывалось в тексте гл. 2, координата х в расчете временно считается независимой переменной. Интегрирование уравнений продол- жается до поступления с клавиатуры какой-нибудь команды (эти коман- ды обрабатываются подпрограммой 9000). Обратите внимание на то, что поверхность сечения может включать не более 2000 точек. Типичный вариант расчета можно получить, вводя значение энергии Е - 01 и начальные условия Y = 0,095 и Ру = 0,096. 10 * **Ж*******^***М**********4^4^**Ж*******>|иМ^******>Мг4и|и|»*1|иМИ(|4и|«<и|с1|с***4(<и 20 "Пример 2: Траектории в потенциале Энона-Хейлеса 21 "COMPUTATIONAL PHYSICS by Steven E. Koonin 22 "Copyright 1985, Addison-Wesley Publishing Company 30 * ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ**ЖЖЖЖЖ**ЖЖЖЖЖЖЖЖЖЖЖЖЖЖ*Ж*ЖЖЖЖЖЖЖЖЖЖЖ 40 GOSUB 16000 50 ' 60 FIRST%=-1 70 TSTEP=.12 80 EINIT=O 90 TOLY=.0005 "вывод экрана-заставки 'определение коистаит и функций "шаг по времени "первое значение для начальной энергии "погрешность поиска Ymin и Углах 100 " константы для вывода графиков 110 XSCALE=319/SQR(3) ’ масштабы для траектории в плоскости X-Y 120 YSCALE=130/(3/2) 130 NPTS%=50: DIM YBORD%( 50) " число точек на графике и массивы для них
282 Приложение Б 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530 DIM PYBORD%( 50), PYNEGBORD%( 50) 'граничный контур поверхности сечения DIM SSY%(2000),SSPY%(2000) 'массивы точек поверхности сечения (ПС) REPLOT%=0 'признак повторного вывода всех ПС NCROSS%=0 'счетчик точек поверхности сечения CROSS%=0 'признак нанесения очередной точки ПС ' константы для интегрирования методом Рунге-Кутты (МРК) DIM К1(4),К2(4),К3(4),К4(4) 'рабочие массивы для МРК DIM VAR(4), OLDVAR(4), VARINIT(4) ' четыре компоненты массивов DIM F( 4) ' сответствуют X, Y, Рх, Ру DEF FNV(X,Y) =(X*X+Y*Y)/2+X*X*Y-Y*3/3 'потенциал Энона-Хейлеса DEF FNXDERIVJX,Y) =-(X+2*X*Y) 'производная потенциала по X DEF FNYDERIVJX,Y)=-(Y+X*X-Y*Y) 'производная потенциала no Y GOSUB 1000 'ввод начальных условий IF FIRST% THEN GOSUB 7000 ' начальный вывод на экран списка команд GOSUB 8000 'подготовка к выводу результатов N%=0: H=TSTEP 'начальный момент времени t=0 'начало цикла интегрирования K$=INKEY$ IF K$<>"" THEN N%=N%+1 GOSUB 11000 'главный цикл GOSUB 9000 'проверка, не команда ли 'приращение счетчика шагов по времени 'вычисление шага методом Рунге-Кутты T=N%*TSTEP 'текущее время EPOT=FNV(VAR(1),VAR(2)) 'текущие значения энергии EKIN=. 5*( VAR( 3f2+VAR( 4)^2) E=EKIN+EPOT IF GRAPHICS% THEN GOSUB 13000 ELSE GOSUB 14000 'вывод ' смена знака этой величины указывает, CHECK=VAR(1)*OLDVAR(1) 'что X пересекает 0 г FOR J%=1 ТО 4 'замена прежних значений переменных текущими OLDVAR(J%)=VAR(J%) NEXT J% t IF CHECK<=0 THEN GOSUB 15000 'нахождение точки на ПС, 'если X пересекла 0 GOTO 330 ' переход к следующему шагу интегрирования 1000 ' *************************************************************************
Программы для примеров 283 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 'Подпрограмма ввода энергии и начальных условий 'входные переменные: PY%, VAR(I%), Y% 'выходные переменные: Е, EINIT, OLDVAR(I%), PYINIT%, VAR(I%), ' VARINIT(I%), YINIT% ' глобальные переменные: GRAPHICS^ 'локальные переменные: 1% '************************************************************************* CLS LOCATE 3,20: PRINT "Для ограниченной траектории 0 < Е <= 1/6"; IF FIRST% GOTO 1120 LOCATE 4,18: 1115 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 2000 2010 2020 2030 2040 2050 2060 2070 PRINT USING "Последнее значение энергии было.равно #.####";EINIT; LOCATE 5,36: ВЕЕР: INPUT; "Е=";Е IF Е>0 AND Е<=(1/6) GOTO 1210 'проверка значения Е ВЕЕР LOCATE 3,18: PRINT SPACE$(44); LOCATE 4,18: PRINT SPACE$(44); LOCATE 5,30: PRINT SPACE$(20); LOCATE 2,35: PRINT "Повторите..."; GOTO 1090 t IF EoEINIT THEN GOSUB 2000 'расчет величин, зависящих от Е Г IF GRAPHICS% THEN GOSUB 3000 ELSE GOSUB 5000 'ввод Y и Py f YINIT%=Y%: PYINIT%=PY%: EINIT=E 'запоминание начальных значений FOR l%=1 TO 4 VARINIT(I%)=VAR(I%) OLDVARf l%)=VAR( l%) NEXT 1% f RETURN f 'Подпрограмма расчета величин, зависящих от энергии ' входные переменные: Е 'выходные переменные: DELTAY, PYBORD%(I%), PYNEGBORD%( 1%), ' PYZERO%, SSPYSCALE, SSYSCALE, YBORD%(I%), YMAX, YMIN, YZERO% 'глобальные переменные: FNV(X,Y), GRAPHICS%, NPTS%, TOLY ' локальные переменные: DY, 1%, PY, Y
284 Приложение Б 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 2430 2440 2450 2460 3000 ЗОЮ YMAX=O: DY=.1 'поиск YMAX от Y=0 наружу WHILE DY>TOLY YMAX=YMAX+DY IF FNV{ 0, YMAX)<E THEN GOTO 2130 YMAX=YMAX-DY: DY=DY/2 WEND 9 YMIN=0: DY-J 'поиск YMIN от Y-0 внутрь WHILE DY>TOLY YMIN=YMIN-DY IF FNV(0, YMIN)<E THEN GOTO 2200 YMIN=YMIN+DY: DY=DY/2 WEND f IF NOT GRAPHICS% THEN RETURN 9 DELTAY-YMAX-YMIN SSYSCALE=280/DELTAY 'масштабы для графиков ПС SSPYSCALE=130/SQR( 8*Е) f YZERO%=35-YMIN»SSYSCALE 'положение на экране начала координат PYZERO%=150-SQR(2*E)*SSPYSCALE f FOR l%=0 ТО NCROSS% 'обнуление массивов поверхности SSY%(l%)=0 ' сечения в связи с изменением энергии SSPY%(l%)=0 NEXT 1% NCROSS%=0 'обнуление счетчика точек пересечения 9 FOR l%=0 ТО NPTS% 'из условия сохранения энергии Y=YMIN+DELTAY*I%/NPTS% 'нахождение на графике ПС PY=SQR(2*(E-FNV(0,Y))) 'граничного контура, на котором Рх=0 YBORD%( l%)=35+{ DELTAY*I%/NPTS%)*SSYSC ALE PYBORD%( l%)=150- ( PY+SQR( 2*E))*SSPYSC ALE PYNEGBORD%( l%)=150- (- PY+SQR( 2*E) )*SSPYSC ALE NEXT 1% f RETURN 9 f ****4сф**********>к******************************************************** 'Подпрограмма ввода начальных значений Y и Ру (только в граф, режиме)

286 Приложение Б 3430 FOR 1%=1 ТО 4 'перед началом движения курсора 3440 VAR(I%)=VARINIT(I%) 'переменным присваиваются их 3450 NEXT \% 'начальные значения 3460 Y%=YINIT%: PY%=PYINIT% 3470 ' 3480 LOCATE 22,4: PRINT USING "X=#.###"; VARINIT(1); 3490 LOCATE 22,19: PRINT USING "Y=#.###"; VARINIT(2); 3500 LOCATE 22,33: PRINT USING "Px=#.###"; VARINIT(3); 3510 LOCATE 22,49: PRINT USING "Ру=#.#*#";VARINIT(4); 3520 LOCATE 22,64: PRINT USING "Pot E=#.###"; FNV(0, VARINIT(2)); 3530 IF EoEINIT GOTO 3550 3540 LOCATE 23,17: PRINT "Курсор стоит в последнем начальном положении"; 3550 LOCATE 24,2: ВЕЕР 3560 PRINT "Клавишами "+CHR$(24)+CHR$(25)+CHR$(26)+CHR$(27)+" выста"; 3570 PRINT "вьте курсор в начальное положение. Затем нажмите <Enter>."; 3580 ' 3590 PSET(Y%,PY%) 3600 ' 3610 3620 t K$=INKEY$ 'цикл движения курсора по графику Y-Py 3630 IF K$=CHR$(13) GOTO 3910 'выход из цикла - клавишей <Enter> 3640 IF LEN(K$)<2 GOTO 3620 'перемещения курсора вырабатывают 3650 CURSOR$=RIGHT$(K$,1) 'специальные двухбайтовые коды 3660 3670 PYOLD%=PY%: YOLD%=Y% IF CURSOR$=CHR$(77) THEN Y%=Y%+2 'курсор вправо 3680 IF CURSOR$=CHR$(75) THEN Y%=Y%-2 'курсор влево 3690 IF CURSOR$=CHR$(72) THEN PY%=PY%-2 'курсор вверх 3700 IF CURSOR$=CHR$(80) THEN PY%=PY%+2 'курсор вниз 3710 3720 Г VAR(2)=YMIN+(Y%-35)/SSYSCALE ’координата Y 3730 VAR(4)=-SQR(2*E)-(PY%-150)/SSPYSCALE 'координата Ру 3740 EPOT=FNV(0,VAR(2)) 'потенциальная энергия 3750 3760 1 IF EPOT+VAR(4)*VAR(4)/2<=E GOTO 3820 'курсор внутри контура? 3770 Y%=YOLD%: PY%=PYOLD% 'возврат на шаг назад 3780 3790 3800 3810 VAR(2)=YMIN+(Y%-35)/SSYSCALE - VAR(4)=-SQR(2*E)-(PY%-150)/SSPYSCALE GOTO 3620 ' ' стирание старого курсора 3820 PSET (YOLD%,PYOLD%),0: PSET(Y%,PY%) 'и рисование нового 3830 VAR(3)=SQR(2*(E-EPOT)-VAR(4)*VAR(4)) 'расчет Рх по энергии
Программы для примеров 287 3840 3850 3860 3870 3880 3890 3900 3910 3920 3930 3940 3950 3960 3970 3980 3990 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 5000 5010 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 LOCATE 22,19: PRINT USING "Y=#.###";VAR(2); LOCATE 22,33: PRINT USING "Px=#.###"; VAR(3); LOCATE 22,49: PRINT USING "Py=#.###"; VAR(4); LOCATE 22,64: PRINT USING "Pot E=#.###";EPOT; GOTO 3620 'за следующей командой SSY%(0)=355+(VAR(2)-YMIN)*SSYSCALE 'начальное положение на SSPY%(0)=150-(VAR(4)+SQR(2*E))*SSPYSCALE ' поверхности сечения LINE (Y%+2,PY%)-(Y%-2,PY%) LINE (Y%,PY%+2)-(Y%,PY%-2) r 'маркировка начального положения XOLD%=1+( SQR(3)/2)*XSCALE YOLD%=150-(VAR(2)+. 5)*YSCALE REPLOT%=0 'положение на экране первой точки ' на Х-Y траектории 'сброс признака REPLOT% IF EoEINIT THEN GOTO 4090 'надо ли рисовать ПС? LOCATE 23,1: PRINT SPACE$(79); LOCATE 24,1: PRINT SPACE$(79); LOCATE 24,1 PRINT "Хотите ли Вы рисовать все поверхности сечения для данной"; INPUT; " энергии (y/n)"; REPLYS IF REPLY$="y" THEN REPLOT%=-1 ELSE REPLOT%=0 r RETURN r '************************************************************************* 'Подпрограмма ввода начальных условий (только в текстовом режиме) 'входные переменные: Е, VARINIT(I%) ' выходные переменные: VAR( 1%) 'глобальные переменные: FIRST%, FNV(X,Y), YMAX, YMIN 'локальные переменные: EPOT, РХ, PY, PYMAX, Y '************************************************************************* LOCATE 7,37: PRINT "X=0.00"; LOCATE 8,12 PRINT "(Поскольку все пути пересекают ось Y, это не есть ограничение.)"; LOCATE 11,30: PRINT USING "#.#### <= Y <= #.####"; YMIN, YMAX; IF FIRST% GOTO 5140 5130 LOCATE 12,26: PRINT USING "Последний Y равнялся #.####"; VARINIT(2)
288 Приложение Б 5140 LOCATE 13,36: INPUT; "Y=";Y 5150 IF Y>YMIN AND Y<YMAX GOTO 5230 'проверка значения Y 5160 BEEP 5170 LOCATE 11,25: PRINT SPACE$(30); 5180 LOCATE 12,25: PRINT SPACE$(40); 5190 LOCATE 13,30: PRINT SPACE$(30); 5200 LOCATE 10,35: PRINT ''Повторите...''; 5210 GOTO 5110 5220 e 5233 EPOT=FNV( 0, Y) 5240 PYMAX=SQR( 2*( E-EPOT)) 5250 LOCATE 16,30: PRINT USING "0.00 <= Py <= #.****"; PYMAX; 5260 IF FIRST% GOTO 5280 5270 LOCATE 17,25: PRINT USING "Последний Ру равнялся #.****"; VARINIT( 4); 5280 LOCATE 18,36: INPUT; "Py=";PY 5290 IF PY>=0 AND PY<=PYMAX GOTO 5370 'проверка значения Ру 5300 BEEP 5310 LOCATE 16,25: PRINT SPACE$(30); 5320 LOCATE 17,25: PRINT SPACE$(30); 5330 LOCATE 18,35: PRINT SPACE$(20); 5340 LOCATE 15,35: PRINT "Повторите..."; 5350 GOTO 5250 5360 i 5370 PX=SQR(2*(E-EPOT)-PY*PY) 'получение Px из энергии 5380 LOCATE 20,36: PRINT USING ”Px=#.**#'';PX; 5390 r 5400 LOCATE 24,23: PRINT "Для продолжения нажмите клавишу <с>"; 5410 IF INKEY$o"c" GOTO 5410 5420 9 5430 VAR(1)=0: VAR(2)=Y: VAR(3)=PX: VAR(4)=PY 'начальные условия 5440 Г 5450 CLS 5460 9 5470 RETURN 5480 r 6000 ^*ММ****М**М***М*^****^**#*^*********4с***************4с*********ф 6010 'Подпрограмма проведения и разметки осей для графика ПС; их 6020 ' положение по горизонтали задается параметрами OFFSET% и PICOFFSET% 6030 ’ входные переменные: Е, OFFSET%, PICOFFSET% 6040 ' выходные переменные: нет 6050 'глобальные переменные: DELTAY, PYZERO%, YMIN, YZERO%
Прог1 оаммы, для примеров 289 6060 'локальные переменные: 1%, MARK%, PY%, Y% 6070 ************************************************************************** 6080 IF OFFSET%<>40 GOTO 6110 'название графика только справа 6090 LOCATE 1,51: PRINT "Поверхность сечения" 6100 г 6110 LINE (PlCOFFSET%+35,20)-(PICOFFSET%+35,150) 'ось Ру 6120 LINE (PICOFFSET%+35,150)-(PICOFFSET%+315,150) 'ось Y 6130 г 6140 FOR MARK%=0 TO 3 'деления по оси Y 6150 Y%=PICOFFSET%+35+MARK%*280/3 6160 LINE (Y%,148)-(Y%,152) 6170 NEXT MARK% 6180 FOR l%=-1 TO 2 . 'оцифровка оси Y 6190 LOCATE 20,(OFFSET%+15+11*I%) 6200 PRINT USING (YMIN+DELTAY*(l%+1)/3); 6210 NEXT 1% 6220 LOCATE 20,(OFFSET%+33): PRINT "Y"; 'обозначение осн Y 6230 r 6240 FOR MARK%=0 TO 4 'деления по оси Py 6250 PY%=20+MARK%*130/4 6260 LINE (PICOFFSET%+33, PY%)-(PICOFFSET%+37, PY%) 6270 NEXT MARK% 6280 FOR l%=2 TO -2 STEP -1 'оцифровка оси Ру 6290 LOCATE (11-I%*4),(OFFSET%+1) 6300 PRINT USING l%*SQR(E/2) 6310 NEXT 1% 6320 LOCATE 5,(OFFSET%+1): PRINT "Ру"; ' обозначение оси Py 6330 ' метка начала координат 6340- LINE (YZERO%+2+PICOFFSET%, PYZERO%)-(YZERO%-2+PICOFFSET%, PYZERO%) 6350 LINE (YZERO%+PICOFFSET%, PYZERO%+2)- (YZERO%+PICOFFSET%, PYZERO%-2) 6360 9 6370 RETURN 6380 r 7000 7010 'Подпрограмма вывода на экран описания команд управления 7020 ' входные переменные: нет 7030 ' выходные переменные: нет 7040 ' глобальные переменные: FIRST% 7050 ' локальные переменные: нет 19—1650
290 Приложение Б 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 8120 8130 8140 8150 8160 8170 8180 8190 8200 ' ************************************************************************* FIRST%=0 'эта информация выводится на экран лишь один раз CLS LOCATE 2,19 PRINT "Клавиша <р> - приостановка интегрирования;"; LOCATE 3,14 PRINT "далее счет будет продолжен при нажатии любой клавиши"; LOCATE 7,10 PRINT "Клавиша <i> - возобновление счета с новыми начальными условиями"; LOCATE 11,10 PRINT "Клавиша <с> - стирание Х-Y траектории (только в граф, режиме)"; LOCATE 15,23 PRINT "Клавиша <е> - завершение программы"; LOCATE 24,23: ВЕЕР: PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 7200 f CLS r RETURN f r ************************************************************************* 'Подпрограмма подготовки экранов к выводу информации 'входные переменные: REPLOT%, SSPY(I%), SSY(I%) ' выходные переменные: OFFSET%, PICOFFSET% ' глобальные переменные: GRAPHICS% ' локальные переменные: нет '************************************************************************* IF GRAPHICS% GOTO 8120 LOCATE 23,25 'заголовок только для вывода PRINT "Координаты поверхности сечения" 'в текстовом режиме RETURN г IF REPLOT% GOTO 8200 'сохранение ПС, если она перерисо- CLS ' вывается, иначе вывод сначала GOSUB 10000 'стирание графика Х-Y траектории OFFSET%=40: PICOFFSET%=320 'перерисовка осей для графика ПС GOSUB 6000 PSET(SSY%(0),SSPY%(0)) 'первая точка лежит на ПС RETURN г LOCATE 1,1: PRINT SPACE$(39); 'очистка верхней строки экрана
Программы, для примеров 291 8210 8220 8230 8240 8250 9000 9010 9020 9030 9040 9050 9060 9070 9080 9090 9100 9110 9120 9130 9140 9150 9160 9170 9180 9190 9200 9210 9220 9230 9240 9250 10000 10010 10020 10030 10040 10050 10060 10070 10080 10090 19 GOSUB 10000 LINE (0,163)-(640,199), 0, BF PSET(SSY%(0), SSPY%(0)) RETURN стирание графика Х-Y траектории 'стирание нижних строк экрана ' 1-я точка лежит на ПС ' ************************************************************************* ' Подпрограмма обработки вводимых команд ' входные переменные: К$ 'выходные переменные: нет 'глобальные переменные: GRAPHICS% 'локальные переменные: ANSWERS IF К$о"е" GOTO 9140 'нажатие <е> завершит программу IF GRAPHICS% THEN LOCATE 22,16 ELSE LOCATE 24,16 BEEP: INPUT; "Вы действительно хотите закончить работу (y/n)"; ANSWERS IF ANSWER$="y" THEN END IF GRAPHICS% THEN LOCATE 22,16 PRINT SPACE$(50); ELSE LOCATE 24,16 IF K$="i" THEN RETURN 270 'возобновление с новыми нач. условиями IF K$="c" THEN GOSUB 10000 r 'стирание графика траектории IF K$o"p" THEN RETURN IF GRAPHICS% THEN LOCATE 22,22 'пауза в ходе интегрирования ELSE LOCATE 24,22 ВЕЕР: PRINT "Для продолжения нажмите любую клавишу"; IF INKEY$="" GOTO 9210 IF GRAPHICS% THEN LOCATE 22,20 PRINT SPACE$(40); RETURN 'ожидание команды ELSE LOCATE 24,20 'стирание сообщения ' ************************************************************************ ' Подпрограмма стирания с экрана графика Х-Y траектории ' входные переменные: нет ' выходные переменные: нет 'глобальные переменные: нет 'локальные переменные: Е '************************************************************************ LINE (0,0)-(315,160), 0, BF LINE (310,120)-(320,170),0,BF 'очистка левой части экрана
292 Приложение Б 10100 10110 10120 10130 10140 10150 10160 10170 10180 10190 10200 10210 10220 10230 11000 11010 11020 11030 11040 11050 11060 11070 11080 11090 11100 11110 11120 11130 11140 11150 11160 11170 11180 11190 11200 11210 11220 11230 11240 11250 11260 LOCATE 1,14: PRINT "Х-Y Траектория"; * вывод заголовка и LINE (160,20)-( 1,150): LINE (1,150)-(320,150) 'рисование треугольника LINE ( 320,150)-( 160,20) LOCATE 2,3: PRINT "КОМАНДЫ" LOCATE 3,2: PRINT "p-пауза"; LOCATE 4,2: PRINT "i-начальные"; LOCATE 5,4: PRINT "условия" LOCATE 6,2: PRINT "с-стирание X-Y"; LOCATE 7,2: PRINT "e-конец"; LINE (1,6)-(99,56), 1, В Г RETURN 'вывод меню команд ' Подпрограмма интегрирования методом Рунге*Кутты 4-го порядка 'входные переменные: F(J%), Н, OLDVAR(J%), VAR(J%) 'выходные переменные: VAR(J%) ' глобальные переменные: нет 'локальные переменные: J%, K1(J%), K2(J%), K3(J%), K4(J%) GOSUB 12000 FOR J%=1 TO 4 VAR( J%) =OLDVAR( J%)+K1| J% j /2 NEXT 'вычисление KI 'цикл no 4 переменным ' 1| X; 2) Y; 3| Px; 4) Py GOSUB 12000 'вычисление K2 FOR J%=1 TO 4 K2(J%)=WF|J%) VAR| J%) =OLDVAR| +K2( J%) /2 NEXT J% r GOSUB 12000 FOR i%=1 TO 4 K3[ J%|=H»F( VAR( J%) =OLDVAR( *K3| J% j NEXT J% 'вычисление КЗ GOSUB 12000 FOR J%=1 TO Л 'вычисление К4
Программы, для примеров 293 11270 'новые значения 11280 11290 NEXT 11300 RETURN 11310 12000 1 ***де**зМ'****]М‘#4‘************4'4<*****ДО********************************** 12010 12020 12021 12030 12040 12050 12060 12070 'Подпрограмма расчета производных от х,у, рх,ру 'входные переменные: CROSS%, FNXDERIV(X,Y), ' FNYDERIV(X,Y), VAR(I%) 'выходные переменные: F(l%) ' глобальные переменные: нет ' локальные переменные: нет IF CROSS% THEN GOTO 12150 'найдена ПС 12080 t 12090 F(1|sVAR(3| ’dX/dt=Px 12100 F|2|sVAR|4| ' dY/dt=Py 12110 F(3|3FNXDERIV(VAR(1),VARf2|| 'dPx/dt=-dV/dx 12120 F(4)=FNYDERIV(VAR(1],VAR(2|] ’dPy/dt=-dV/dy 12130 RETURN 12140 f 12150 F(1|s1 'для точек вблизи ПС 12160 F(2|sVAR(4)/VAR(3) ' все производные 12170 F(3)=FNXt)ERIV(VAR(1|fVAR(2|)/VAR(3) ' делятся на Рх 12180 F( 4) sFNYDERIVf VAR( 1) , VAR( 2) J ZVARJ 3) 12190 RETURN 12200 » 13000 ’ ♦****♦♦**♦♦*★*♦*♦*♦***♦♦♦*♦*♦♦♦♦♦♦*♦♦♦♦*♦♦********♦****♦**************** 13010 'Подпрограмма вычерчивания X-Y траектории (только в граф, режиме) 13020 'входные переменные: Е, EINIT, EKIN, EPOT, Т, VAR(I%) 13030 ' выходные переменные: нет 13040 'глобальные переменные: XSCALE, YSCALE 13050 'локальные переменные: Х%, XOLD%, Y%, YOLD% 13060 'фффф^фф^г*^****^********************** ♦♦♦**♦♦*****♦********♦********** 13070 Х%=1+(VAR(1)+SQR(3)/2)*XSCALE ' продление X-Y траектории 13080 Y%=150-(VAR(2)+.5)*YSCALE * до текущей точки 13090 LINE (X%,Y%>-(XOLD%,YOLD%) 13100 XOLD%=X%: YOLD%=Y% 'эта точка становится текущей 13110 г 13120 LOCATE 23,3: PRINT USING "Время=#**#.#*";Т; 'вывод текущих 13130 LOCATE 23,24: PRINT USING *X=#.#*#";VAR(1); 'значений
294 Приложение Б 13140 13150 13160 13170 13180 13190 13200 13210 13220 13230 14000 14010 14020 14030 14040 14050 14060 14070 14080 14090 14100 14110 14120 14130 14140 15000 15010 15020 15030 15031 15040 15050 15060 15070 15080 15090 15100 15110 15120 15130 15140 LOCATE 23,39: PRINT USING '<Y=*.***";VAR(2); LOCATE 23,54: PRINT USING "Px=#.***"; VAR(3); LOCATE 23,70: PRINT USING "PY=#.###"; VAR(4); LOCATE 24,2: PRINT USING "Энергия=#. #####"; E; LOCATE 24,19: PRINT USING "Начальная=*. ****"; E IN IT; LOCATE 24,37: PRINT USING "Кинетическая;;*. *****''; EKIN; LOCATE 24,59: PRINT USING "Потенциальная=*. *****''; EPOT; RETURN 1************************************************************************ 'Подпрограмма вывода результатов на экран текстового дисплея 'входные переменные: Е, EINIT, EKIN, EPOT, Т 'выходные переменные: нет ' глобальные переменные: нет 'локальные переменные: нет ' ************************************************************************ LOCATE 25,2,0: PRINT USING "Время=**#*.*#";Т; LOCATE 25,18: PRINT USING "Энергия=*. ****#"; E; LOCATE 25,36: PRINT USING "Начальная=*. ****"; EINIT; LOCATE 25,55: PRINT USING "Кин. =*.***"; EKIN; LOCATE 25,68: PRINT USING "Пот. =*.***"; EPOT; RETURN 9 '♦♦***♦*♦♦****♦**♦♦*♦**♦****♦*♦*********♦♦♦****************************** 'Подпрограмма отыскания точек поверхности сечения 'входные переменные: OLDVAR(I%), VAR(I%) 'выходные переменные: CROSS%, Н, NCROSS%, SSY(I%), ' SSPY(I%) VAR(I%) 'глобальные переменные: Е, GRAPHICS%, SSPYSCALE, SSYSCALE, YMIN 'локальные переменные: 1% H=-VAR(1) NCROSS%=NCROSS%+1: CROSS%=-1 f 'интервал интегрирования по X 'приращение счетчика и установка признака IF NCROSS%<>1950 GOTO 15160 LOCATE ATE 22,1: BEEP 'предупреждение о заполнении 'массива PRINT USING "На момент имеется";T; PRINT " 1950 из 2000 возможных точек"; PRINT " поверхности сечения.";
Программы для примеров 295 15150 15160 15170 15180 15190 15200 г GOSUB 11000 'расчет шага Рунге-Кутты по X г IF GRAPHICS% GOTO 15250 'если только текстовый дисплей, LOCATE 24,30 'то вывод точки ПС PRINT USING Ру=#.###"; VAR(2), VAR(4) 15210 15220 15230 15240 15250 15260 15270 15280 15290 LOCATE 1,1: PRINT "КОМАНДЫ p: пауза"; PRINT " i: изменение начальных условий e: конец"; GOTO 15290 t SSY%(NCROSS%)=355+(VAR(2)-YMIN)*SSYSCALE 'координаты на экране SSPY%(NCROSS%)=150-(VAR(4)+SQR(2*E))*SSPYSCALE 'точки ПС PSET (SSY%( NCROSS%), SSPY%( NCROSS%)) ' нанесение точки на график t H=TSTEP: CROSS%=0 'восстановление шага и сброс признака 15300 15310 15320 15330 FOR 1%=1 ТО 4 'восстановление переменных траектории VAR(I%)=OLDVAR(I%) NEXT 1% f 15340 15350 16000 16010 RETURN t 1 ************************************************************************ 'Подпрограмма вывода экрана-заставки 16020 16030 ' входные переменные: нет ' выходные переменные: GRAPHICS%, MONO% 16040 ' глобальные переменные: нет 16050 16060 16070 16080 16090 16100 16110 16120 'локальные переменные: G$, М$, ROW% 1 ************************************************************************ SCREEN 0 ' программа стартует в текстовом режиме CLS: KEY OFF г LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 16130 16140 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; 16150 16160 16170 LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; i 16180 LOCATE 5,10 'рисование рамки 16190 PRINT CHR$(201)+STRING$(59,205)+CHR$( 187);
296 Приложение Б 16200 FOR ROW%=6 : ГО 19 16210 LOCATE ROW%,10: PRINT CHR$(186); 16220 LOCATE ROW%,70: PRINT CHR$(186); 16230 NEXT ROW% 16240 LOCATE 20,10: PRINT CHR$(200)+STRING$(59,205)+CHR$(188); 16250 1 16260 COLOR 15 'вывод заголовка программы и т.д. 16270 LOCATE 7,36: PRINT "ПРИМЕР 2"; 16280 COLOR 7 16290 LOCATE 10,18: PRINT "Траектории в потенциале Энона-Хейлеса" 16300 LOCATE 13,35: PRINT 'Ч********»" 16310 LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." 16320 LOCATE 16,20: PRINT "Выход при ожидании ввода - cctrl-brealo." 16330 i 16340 LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея 16350 INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ 16360 IF LEFT$(G$,1)= "у" OR LEFT$(G$,1)="n" GOTO 16390 16370 LOCATE 19,13: PRINT SPACE$(57): BEEP 16380 LOCATE 18,35 : PRINT "Повторите...": GOTO 16340 16390 IF LEFT$(G$,1)= "y" GOTO 16420 16400 GRAPHICS%=0 : MONO%=-1 16410 GOTO 16520 16420 GRAPHICS%=-1 16430 LOCATE 18,15: PRINT SPACE$(55) 16440 LOCATE 19,13: PRINT SPACE$(57) 16450 LOCATE 19,13: BEEP 16460 INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ 16470 IF LEFT$(M$,1)= "у" OR LEFT$(M$,1)="n" GOTO 16500 16480 LOCATE 19,13: PRINT SPACE$(57): BEEP 16490 LOCATE 18,35 : PRINT "Повторите...": GOTO 16450 16500 IF LEFT$(M$,1)= "y" THEN MONO%=-1 ELSE MONO%=0 16510 * 16520 LOCATE 21,10 'пояснение к программе 16530 PRINT "Траектория частицы в потенциале Энона-Хейлеса ограничена," 16540 LOCATE 22,10 16550 PRINT "если ее энергия < 1/6 и начальное положение лежит в треу-" 16560 LOCATE 23,10 16570 PRINT "гольнике с вершинами (1,0), (+sqr(3)/2,. 5) и (-sqr(3)/2,. 5)." 16580 LOCATE 24,23: ВЕЕР: PRINT "Для продолжения нажмите клавишу <с>"; 16590 IF INKEY$o"c" THEN GOTO 16590 16600 ’
Программы для примеров 297 16610 16620 16630 16640 17000 17010 17020 17030 17040 17050 17060 17070 17080 17090 17100 17110 18000 18010 18020 18030 18040 18050 18060 18070 18080 18090 18100 IF GRAPHICS% AND MONO% THEN GOSUB 17000 'переход в графим. ' ' режим RETURN г 1 ************************************************************************ 'Подпрограмма переключения с текстового дисплея на графический входные переменные: нет выходные переменные: нет глобальные переменные: нет локальные переменные: нет 1 ************************************************************************ DEF SEG=0 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 SCREEN 2,0,0,0: KEY OFF: CLS RETURN r 9************************************************************************ 'Подпрограмма переключения с графического дисплея на текстовый ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: нет 'локальные переменные: нет DEF SEG=0 0ОКЕ &Н410, (РЕЕК(&Н410) OR &Н30) SCREEN 0: WIDTH 80: LOCATE , ,1,12,13 RETURN
298 Приложение Б Б.З. ПРИМЕР 3 Данная программа находит стационарные решения одномерного уравнения Шрёдингера для частицы, движущейся в потенциале, нормированном та- ким ъобразом, что максимум и минимум его равны соответственно +1 и -1. Масса частицы определяется параметром у, который рассматривался ранее в тексте гл. 3. Форму потенциала можно выбрать из трех имею- щихся аналитических зависимостей (строки 80—160). Кроме того, по- тенциал можно дополнительно откорректировать перемещением точек его графика на экране с помощью курсора (подпрограмма 3000). Программа ведет поиск 50 уровней, лежащих выше заданной начальной энергии (цикл в строках 280—560). Для каждого уровня ищется энергия, удов- летворяющая уравнению (3.23). Сначала ведется шаговый поиск до тех пор, пока величина f не изменит знака, после чего применяется метод секущих (строки 390—440). Чтобы найти f при некотором текущем зна- чении энергии, уравнение Шрёдингера интегрируется методом Нумерова как от левой, так и от правой границ области действия потенциала (подпрограмма 9000) и найденные решения сшиваются в крайней левой точке поворота (строка 9200). В процессе поиска собственного значе- ния на экран выводится график волновой функции (подпрограмма 11000) и подсчитывается число ее узлов. Когда поиск завершается, найденный уровень отмечается на графике потенциала (подпрограмма 13000). Типичный вариант расчета можно получить, если использовать по- тенциал в виде параболической ямы при значении у = 30, начальной энергии Е =-0,99 и приращении энергии DE = 0,02. 10 г *************************************************************************** 20 'Пример 3: Связанные состояния в одномерном потенциале 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 0 ' *************************************************************************** 40 GOSUB 15000 'вывод экрана-заставки 50 ' 60 FIRST%=-1: VSAVE%=0: ENDING%=0 'задание флагов, констант, функций 70 NPTS%=160 'число узлов сетки 80 'потенциал в виде прямоугольной ямы 90 DEF FNV1(XJ=-1 100 XMIN1=-2: ХМАХ1=2: DX1=(XMAX1-XMIN1)/NPTS% 110 'потенциал в виде параболической ямы 120 DEF FNV2(X)=-(1-.5*X*X)
Программы для примеров 299 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530 XMIN2=-2: ХМАХ2=2: DX2=(XMAX2-XMIN2) /NPTS% ' потенциал Ленард-Джонса DEF FNV3( X) =4*(Х*(-12)-Х*(-6)) XMIN3=.9: ХМАХЗ=1.9: DX3=(XMAX3-XMIN3)/NPTS% V(160): PSI(160): DIM DIM TOLF=. 00005 DIM V%(160) DIM PSI%(160) 'если вы изменяете NPTS%, то изме- ' ните и размерность этих массивов 'допустимая погрешность GOSUB 1000 IF FIRST% THEN IF GRAPHICS% THEN GOSUB 6000 GOSUB 7000 GOSUB 5000 ввод потенциала 'выдача на экран списка команд 'вывод графика потенциала 'ввод GAMMA, Е, DE EIGENE=-1 FOR N%=1 TO 50 SECANT%=0: START%=-1: F=TOLF WHILE ABS(F)=>TOLF K$=INKEY$ IF K$<>"" THEN GOSUB 8000 IF ENDING% GOTO 580 GOSUB 9000 'минимальное значение Е 'цикл по уровням 'задание нач. значений для поиска Е 'проверка: не введена ли команда 'завершение итераций ' интегрирование уравнения Шредингера IF GRAPHICS% THEN GOSUB IF IF IF 11000 ELSE GOSUB 12000 'вывод результатов 'сохранение первого значения F START% THEN FSTART=F F*FSTART<0 THEN SECANT%=-1 'далее после смены знака F F=FOLD GOTO 430 ' применяется метод секущих IF SECANT% THEN DE=-F*(E-EOLD)/(F-FOLD) EOLD=E: FOLD=F E=E+DE START%=0 IF E<-1 THEN GOSUB 10000 WEND GOSUB 13000 DE=ABS( ( EOLD-EIGENE)/3) IF ABS(DESAVE)<DE THEN DE=ABS( DESAVE) 'сохранение старых значений 'приращение Е 'уже не первый раз 'Е должно быть больше -1 'вывод результатов 'новый шаг DE, если он меньше исходного DE
300 Приложение Б 540 550 560 570 580 590 1000 1010 1020 1030 1040 1045 1050 1060 1070 1080 1090 1100 1110 1120 ИЗО 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 EIGENE=EOLD E=EOLD+DE NEXT N% f 'сохранение собственного значения 'приращение Е для начала ' следующего поиска ENDING%=0: GOSUB 14000 'параметры для продолжения ' ************************************************************************* 'Подпрограмма ввода формы одномерного потенциала 'входные переменные: DX1, DX2, DX3, FNV1, FNV2, FNV3, ' ОРТ$, SAVE%, XMIN1, XMIN2, XMIN3 'выходные переменные: COLUMN%, DX, РОТ$, V(l%), V%(l%), ' VSCALE, XMIN ' глобальные переменные: GRAPHICS%, NPTS% 'локальные переменные: D$, E$, F$, 1% IF VSAVE% THEN GOTO 1730 Г 'если VSAVE%,<>0, то начинаем c ’ текущего вида V(x) GOSUB 2000 9 'ввод формулы для потенциала ' в зависимости от выбранной IF ОРТ$<>"1" THEN GOTO 1200 XMIN=XMIN1: DX=DX1 FOR l%=0 TO NPTS% V( l%)=FN VI (XMIN+DX*I%) IF V(l%)>1 THEN V(l%)=1 NEXT 1% ' формы задаются DE, XMIN, V( 1%) ' прямоугольная яма 'должно быть: -1<=V<=1 COLUMN%=32: РОТ$="Прямоугольная\яма" 'выводимый текст IF ОРТ$<>"2" THEN GOTO 1280 XMIN=XMIN2: DX=DX2 FOR l%=0 TO NPTS% V( l%)=FNV2( XMIN+DX*I%) IF V(l%)>1 THEN V(l%)=1 NEXT 1% 'параболическая яма COLUMN%=31: РОТ$="Параболическая яма" IF OPT$<>"3" THEN GOTO 1360 XMIN=XMIN3: DX=DX3 FOR !%=0 TO NPTS% V( l%)=FN V3( XMIN+DX*I%) IF V(l%)>1 THEN V(l%)=1 NEXT 1% 'потенциал Ленард-Джонса
Программы для примеров 301 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 1460 1470 1480 1490 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590 1600 1610 1620 1630 1640 1650 1660 1670 1680 1690 1700 1710 1720 1730 1740 COLUMN%=29: РОТ$="Потенциал Ленард-Джонса" i IF NOT GRAPHICS% THEN RETURN VSCALE=170/2 'масштабирование V для графина FOR 1%-0 TO NPTS% V%( l%)=»70-( V( l%H)*VSCALE NEXT 1% s CLS 'директивы по изменению формы V LOCATE 2,2,0 PRINT "Теперь вы можете с клавиатуры изменить V(X) в любом из 160"; LOCATE 2,60 PRINT " узлов сетки:"; LOCATE 6,14: PRINT "Клавиши "+CHR$(24)+CHR$(25)+" увеличивают"; LOCATE 6,36: PRINT " и уменьшают V(х) при данном х."; LOCATE 9,10: PRINT "Клавиши PgUp и Home увеличивают и"; LOCATE 9,43: PRINT " уменьшают х, не меняя V(x|."; LOCATE 12,9 PRINT "Клавиши "+CHR$(26)+CHR$(27)+" увеличивают"; LOCATE 12,31 PRINT " и уменьшают х с заменой V(x+dx) на V(x)."; LOCATE 16,14 PRINT "Когда вы закончите коррекцию, программа отнормирует"; LOCATE 17,23 PRINT "новый потенциал так, чтобы Vmin=-1"; LOCATE 19,14 PRINT "После этого вы снова сможете изменить этот потенциал,"; LOCATE 20,21 PRINT "так что не бойтесь экспериментировать."; г LOCATE 24,3: ВЕЕР: PRINT "Вы будете изменять потенциал (1)"; ИНПУТ;" или возьмете аналитическую форму (2)";D$ IF D$="2" THEN RETURN IF D$="1" THEN GOTO 1730 LOCATE 24,1: PRINT SPACE$(79);: BEEP LOCATE 23,35: PRINT "Повторите..."; GOTO 1650 GOSUB 3000 VSAVE%=0 'изменение V с клавиатуры 'сброс флага
302 Приложение Б 1750 1760 1770 1780 1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 LOCATE 24,5: ВЕЕР PRINT "Вас устраивает такой потенциал (1) или вы будете его еще"; LOCATE 24,61 INPUT; " изменять (2)";Е$ IF Е$="1" THEN RETURN IF Е$="2" .GOTO 1850 LOCATE 23,35: PRINT "Повторите..."; GOTO 1760 9 LOCATE 23,1: PRINT SPACE$(79);: LOCATE 24,1: PRINT SPACE$(79); LOCATE 24,12: BEEP PRINT "Желаете ли Вы начать снова с аналитической формы (1) или"; LOCATE 25,12 INPUT; "будете изменять потенциал, который сейчас на экране (2)";F$ IF F$="1" THEN GOTO 1100 IF F$="2" THEN GOTO 1950 LOCATE 23,25 'реакция на ошибку ввода PRINT "Повторите... 9 SPACE$(79); GOTO 1860 LOCATE 23,1: PRINT LOCATE 24,1: PRINT SPACE$(79); LOCATE 25,1: GOTO 1730 PRINT SPACE$(79); '************************************************************************* 'Подпрограмма выбора аналитической формы для потенциала входные переменные: нет выходные переменные: ОРТ$ глобальные переменные: нет локальные переменные: нет ************************************************************************** CLS LOCATE 1,8,0 'вывод на экран вариантов V(x) PRINT "В этой программе можно выбрать одномерные потенциалы:"; LOCATE 5,4 PRINT "1) Прямоугольная яма: V(x)=-1 (-2 <= х <= 2)"; LOCATE 8,4 PRINT "2) Параболическая яма: V(x)=-(1-. 5*х*х) (-2 <= х <= 2)"; LOCATE 11,4 PRINT "3) Потенциал Ленард-Джонса: V(x)=4*(x~(-12)-x~(-6))";
Программы для примеров 303 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 3000 ЗОЮ 3020 3030 3040 3050 3051 3060 3070 3080 3090 3100 3110 3120 LOCATE 11,59 PRINT " (.9 <= х <= 1.9)"; LOCATE 15,6 PRINT "Все эти потенциалы имеют стенки {V{ х)=бесконечность)"; LOCATE 15,58 PRINT " при xmax и xmin,"; LOCATE 16,11 PRINT "приводящие к нулевым краевым условиям для "; LOCATE 16,53 PRINT "волновой функции."; LOCATE 17,13 PRINT "Мы налагаем также условие: -1 <= V(x) <= 1 для всех х."; LOCATE 20,4 PRINT "Можно также выйти из программы и ввести в код свою "; LOCATE 20,55 PRINT "функцию для потенциала"; LOCATE 21,17 PRINT "(см. подпрограмму, начинающуюся строкой 1000)."; f LOCATE 24,12: ВЕЕР INPUT; "Введите номер требуемого потенциала или <е> для выхода"; OPTS IF (ОРТ$="1" OR ОРТ$="2" OR ОРТ$="3") THEN CLS: LOCATE ,,0: RETURN IF OPT$="e" THEN END LOCATE 24,1: PRINT SPACE${79);: LOCATE 23,20 PRINT "Повторите; правильные ответы 1,2,3 или е:"; GOTO 2350 ************************************************************************** 'Подпрограмма изменения формы потенциала по графику на экране 'входные переменные: DX, V(l%), V%(l%), VSCALE, XMIN 'выходные переменные: LENGTH%, V(l%), V%(l%), XROW% ’ глобальные переменные: NPTS% 'локальные переменные: В, CURSORS, 1%, IOLD%, K$, NORM, ' V%, VMAX, VMIN, VOLD% ’************************************************************************* LENGTH%=170: XROW%=10 'задание констант для GOSUB 4000 'подпрограммы рисования осей FOR l%=0 ТО NPTS% 'график потенциала LINE (l%*4, V%( 1%))- ((l%*4)+2, V%( 1%)) NEXT 1%
^3 & о м X С-:


Программы для примеров 307 5110 LOCATE 5,14 5120 PRINT "Клавиша <р> - пауза; продолжение счета любой клавишей"; 5130 LOCATE 8,14 5140 PRINT "Клавиша <е> - конец работы"; 5150 LOCATE 11,14 5160 PRINT "Клавиша <п> - изменить энергию и DE"; 5170 LOCATE 14,14 5180 PRINT "Клавиша <d> - изменить только DE (приращение энергии)"; 5200 LOCATE 24,23,0: ВЕЕР 5210 PRINT "Для продолжения нажмите клавишу <с>"; 5220 IF INKEY$o"c" THEN GOTO 5220 5230 ' 5240 FIRST%=0 'этот экран выводится только один раз 5250 ' 5260 LOCATE ,, 0: CLS ' выключение подсветки курсора 5270 ' 5280 RETURN 5290 ' 6000 ' ♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ 6010 ' Подпрограмма вывода графика потенциала в верхней половине граф, экрана 6020 'входные переменные: V%(l%) 6030 'выходные переменные: LENGTH%, XROW% 6040 'глобальные переменные: NPTS% 6050 'локальные переменные: VHALF 6060 ' ************************************************************************* 6070 LENGTH%=86: XROW%=5 6080 GOSUB 4000 6090 ' 6100 VHALF=86/170 ' перемасштабирование V для вывода 6110 FOR l%=1 ТО NPTS% 'в верхней половине экрана 6120 LINE ((l%-1 )*4, VHALF*V%( l%-1))-( l%*4, VHALF*V%( 1%)) 6130 NEXT 1% 6140 ' 6150 RETURN 6160 ' 7000 '************************************************************************* 7010 ' Подпрограмма для ввода GАЛАМА, Е, DE 7020 'входные переменные: COLUMN%, РОТ$ 7030 'выходные переменные: DE, DESAVE, Е, GAAAMA 7040 'глобальные переменные: GRAPHICS%, TOLE 7050 'локальные переменные: LINE1, LINE2 20
308 Приложение Б 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 7370 7380 7390 7400 7410 7420 7430 7440 7450 7460 :эас********************************************* LOCATE 24,1,0: PRINT SPACE$(79); 'ввод GAMMA LOCATE 25,1: PRINT SPACE$(79); LOCATE 24,26 PRINT "Gamma=sqr[2m( a^2)V/hbaH2]="; LOCATE 24,54: INPUT; GAMMA IF GAMMA>0 GOTO 7170 LOCATE 24,1: PRINT SPACE$(79);: BEEP 'обработка ошибок ввода LOCATE 25,24: PRINT "Gamma должно быть положительным."; GOTO 7090 LOCATE 24,1,0: PRINT SPACE$(79); 'ввод E LOCATE 25,1: PRINT SPACE$(79); LOCATE 24,36 INPUT; "Энергия=";Е IF E>-1 GOTO 7260 'обработка ошибок ввода LOCATE 24,1: PRINT SPACE$(79);: BEEP LOCATE 25,20: PRINT "Поскольку V >= -1, то E должно быть > -1"; GOTO 7190 LOCATE 24,1,0: PRINT SPACE$(79); 'ввод DE LOCATE 25,1: PRINT SPACE$(79); LOCATE 24,16: INPUT; "DE - шаг поиска собственного значения энергии ="; DE IF DE<1 AND DE>TOLE GOTO 7340 'обработка ошибок ввода LOCATE 24,1: PRINT SPACE$(79);: BEEP LOCATE 25,33: PRINT USING "#.### < DE < 1";TOLE; GOTO 7280 DESAVE=DE r LOCATE 24,1: PRINT SPACE$(79);: LOCATE 25,1: PRINT SPACE$(79); r IF NOT GRAPHICS% THEN LOCATE 21,COLUMN%: PRINT POT$; 'вывод ' типа потенциала IF GRAPHICS^ THEN LINE1=1 ELSE LINE1=22 'вывод GAMMA LOCATE L1NE1.34,0: PRINT USING "Gamma=***.**"; GAMMA r IF GRAPHICS^ THEN LINE2=25 ELSE LINE2=1 'вывод списка команд LOCATE LINE2,12,0 PRINT "p: пауза e: конец n: изменить энергию d: изменить DE";
Программы для примеров 309 7470 7480 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 8120 8130 8140 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 8300 8310 8320 8330 8340 8350 8360 8370 8380 RETURN г 1 зи**************зк*************************зк***********************зкзкзк***** 'Подпрограмма проверки команд управления ' входные переменные: К$ 'выходные переменные: DE, DESAVE, Е, ENDING%, SECANT%, START% ' глобальные переменные: GRAPHICS^ 'локальные переменные: А$ ************************************************************************** LOCATE 23,1: PRINT SPACE$(79); г IF K$o"e" GOTO 8160 'конец работы программы LOCATE 23,20: BEEP INPUT; "Вы хотите прекратить итерации (yes/no)";A$ IF A$="yes" THEN ENDING%=-1 LOCATE 23,1,0: PRINT SPACE$(79); RETURN I IF K$o"p" GOTO 8230 'пауза LOCATE 23,22,1: BEEP PRINT "Для продолжения нажмите любую клавишу"; IF INKEY$="" GOTO 8190 LOCATE 23,1,0: PRINT SPACE$(79); RETURN f IF K$o"n" THEN GOTO 8320 'изменение величины энергии BEEP LOCATE 23,36: INPUT; "Энергия="; E LOCATE 23,1: PRINT SPACE$(79); LOCATE 23,38: INPUT; "DE=";DE DESAVE=DE LOCATE 23,1,0: PRINT SPACE$(79); START%=-1: SECANT%=0: RETURN I IF K$o"d" THEN RETURN 'изменение приращения энергии IF NOT SECANT% THEN GOTO 8370 LOCATE 23,18 PRINT "Нельзя менять DE во время поиска корня."; RETURN E=E-DE LOCATE 23,38; INPUT; "DE=";DE
310 Приложение Б 8390 E=E+DE: DESAVE=DE 8400 LOCATE 23,1,0: PRINT SPACE$(79); 8410 9 8420 RETURN 8430 i 9000 '************************************************************************* 9010 ' Подпрограмма интегрирования уравнения Шредингера 9020 ' входные переменные: DX, GAMMA 9030 ' выходные переменные: F, ILEFT%, IMATCH%, IRIGHT%, NCROSS%, 9040 1 NODES%, PSI(I%), PSIMAX 9050 'глобальные переменные: NPTS% 9060 'локальные переменные: C, l%, K, KI, KIM1, KIP1, KLAST, LEFT%, 9070 9 NORM, PSIMMTCH, PSIPMTCH, RIGHT% 9080 1 ************************************************************************* 9090 С=(DX*DX/12)*GAMMA*GAMMA 'вычисление константы 9100 1МАТСН%=0 'обнуление номера узла сшивки 9110 9 9120 PSI(O)=O 'краевое условие на левом конце 9130 Р51(1)=9.999999Е-10 9140 9 9150 К1М1=С»( E-V( 0)) 'начальные значения К*К 9160 KI=C»(E-V(1)) 9170 9 9180 FOR l%=1 ТО NPTS%-1 'алгоритм Нумерова, 5=0 9190 KIP1=C*(E-V(I%+1| | 9200 IF( KI*KIP1<=0 AND KbOJTHEN IMATCH%=I%: GOTO 9290 'узел сшивки 9210 PSI( l%+11 =( PSI( l%) *( 2-10*KI) -Р5Ц l%-1) *( 1+KIM1) | /(1+KIP11 9220 IF ABS( PSI( l%+1) )<( 1E+10) GOTO 9260 ' перемасштабирование всех 9230 FOR K%=1 TO l%+1 ' предыдущих точек, если 9240 PSI(K%)=PSI(K%)*9.999999E-06 ' PSI слишком выросла 9250 NEXT K% 9260 KIM1=KI: KI=KIP1 'передача значений К*К 9270 NEXT 1% 9280 r 9290 IF IMATCH%=0 THEN IMATCH%=NPTS%-10 'если нет точки поворота, 9300 'то сшиваем волновые функции у правого конца 9310 PSIMMTCH=PSI( IMATCH%| 'сохранение значения для нормировки 9320 г 9330 PSI|NPTS%)=0 'краевые условия на правом конце 9340 PSI( NPTS%-1) =9.999999Е-10 9350 9
Программы для примеров 311 9360 KIP1=C*(E-V(NPTS%)) 'начальные значения К*К 9370 KI=C*(E-V(NPTS%-1)) 9380 Г 9390 FOR l%=NPTS%-1 ТО IMATCH%+1 STEP -1 'алгоритм Нумерова, 5=0 9400 KIM1=C*(E-V( 1%-1)| 9410 PS l( 1%-1) =( PSI( l%) *( 2-10*KI) - PSI( 1%+1) *( 1+KIP1)) /(1+KIM1) 9420 IF ABS(PSI( l%-1) )<(1Е+10) GOTO 9460 ' перемасштабирование всех 9430 FOR K%=NPTS%-1 ТО l%-1 STEP -1 ' предыдущих точек, если 9440 PSI(K%)=PSI(K%)*9.999999E-06 ' PSI слишком выросла 9450 NEXT К% 9460 К1Р1=К1: К1=К1М1 'передача значе^й К*К 9470 NEXT l% 9480 KIM1=C*(E-V( 1МАТСН%-1]] 'нужно для логарифмической производной 9490 PSIPMTCH=( PSI( IMATCH%) *| 2-10*KI) -PSI| 1МАТСН%+1) *( 1+KIP1) J ZJ UKIM1) 9500 9510 NORM=PSI( IMATCH%] ZPSIMMTCH 'нормировка PSI слева на P5I 9520 FOR 1%=1 ТО 1МАТСН%-1 ' справа с сохранением знака 9530 PS I (\%\ = PSI (l%) *ABS( NORM) 9540 NEXT l% 9550 * 9560 IF NORM>0 THEN GOTO 9620 'смена знака PSI справа, если 9570 FOR l%=IMATCH% ТО NPTS% 'NORM отрицательна 9580 PSI(I%)=-PSI|I%) 9590 NEXT l% 9600 PSIPMTCH=-PSIPMTCH 9610 r 9620 PSIMAX=ABS|PSI(1)) 'нахождение максимума PSI 9630 FOR l%=1 TO NPTS% 9640 IF ABS(PSI|I%))>PSIMAX THEN PSIMAX=ABS(PSI( l%)) 9650 NEXT l% 9660 r 9670 F=(PSI|IMATCH%-1)-PSIPMTCH)/PSIMAX 'вычисление условие 9680 Г 9690 NODES%=0 'подсчет числа у , сщпи 9700 FOR l%=2 ТО NPTS%-1 9710 IF SGN(PSI(l%))*SGN(PSI(l%-1))<0 THEN NODES%=NODES%+1 9720 NEXT \% 9730 9 9740 LEFT%=0: RIGHT%=0: 'установка флагов 9750 l%=0 'поиск левой точки поворота 9760 WHILE NOT LEFT%
312 Приложение Б 9770 9780 9790 9800 9810 9820 9830 9840 9850 9860 9870 9880 9890 9900 9910 9920 9930 9940 10000 10010 10020 10030 10040 10050 10060 10070 10080 10090 10100 10110 10120 10130 10140 10150 10160 10170 11000 11010 11020 11025 11030 IF (E-V(l%))>=0! THEN ILEFT%=I%: LEFT%=-1 WEND l%=NPTS% 'поиск правой точки поворота WHILE NOT RIGHT% IF (E-V(l%))>=0! THEN IRIGHT%=I%: RIGHT%=-1 WEND / KLAST^E- V( ILEFT%): NCROSS%=0 FOR !%=ILEFT%+1 TO IRIGHT%-1 'поиск классически K=E-V(I%) ' запрещенных областей IF K*KLAST<=0 AND K<0 THEN NCROSS%=NCROSS%+1 KLAST^K NEXT l% / RETURN r ’ Ф****Ф4г****Мс*^*****^**************************************************** 'Подпрограмма обеспечения условия Е > -1 входные переменные: нет выходные переменные: DE, DESAVE, Е, SECANT%, START% глобальные переменные: нет локальные переменные: нет * фф^^^фффф^ф************************************************************ LOCATE 23,1: PRINT SPACE$(79); LOCATE 23,26 INPUT; "Сейчас E<-1, введите новое Е";Е 'приглашение для нового Е LOCATE 23,1: PRINT SPACE$(79); LOCATE 23,37: INPUT; "DE=";DE LOCATE 23,1: PRINT SPACE$(79); / START%=-1: DESAVE=DE: SECANT%=0 'сброс флагов / RETURN f 8 ************************************************************************ 'Подпрограмма рисования графика волновой функции 'входные переменные: F, IMATCH%, NCROSS%, NODES%, ' PSI(I%), PSIMAX ' выходные переменные: нет
Программы для примеров 313 11040 11050 ' глобальные переменные: NPTS% 'локальные переменные: PSI%(I%), PSISCALE llUoU 11070 LINE (0,90)-(640,191), 0, BF 'очистка нижней половины экра 11080 LINE (0,90)-(0,174) 11090 LINE (0,132)-(640,132) 'перерисовывание оси х 11100 LOCATE 14,2: PRINT "PSI(x)"; 11110 LOCATE 18,78: PRINT "x"; 11120 FOR l%=1 TO 4 11130 MARK%=I%*( 640/4) 11140 LINE (MARK%, 130)- (MARK%, 134) 11150 NEXT 1% 11160 9 11170 PSISCALE=84/( 2*PSIMAX) 11180 r 11190 PSI%(0)=174-(PSI(0)+PSIMAX)*PSISCALE 'левая часть графика P 11200 FOR l%=1 TO IMATCH% 11210 PSI%( l%)=174- (PSI< l%)+PSIMAX)»PSISCALE 11220 LINE ((l%-1)»4, PSI%(l%*4, PSI%( 1%)) 11230 NEXT 1% 11240 1 11250 PSI%(NPTS%)=174-(PSI(NPTS%)+PSIMAX)»PSISCALE 'правая часть графи! 11260 FOR l%=NPTS%-1 TO IMATCH% STEP -1 11270 PSI%( l%)=174-( PSI( l%)+PSIMAX)*PSISCALE 11280 LINE «l%+1)*4, PSI%(l%+1))-(l%*4. PSI%( 1%)) 11290 NEXT 1% 11300 9 11310 IF NCROSS% < 1 THEN GOTO 11350 11320 LOCATE 23,9,0 11330 PRINT "Внимание: точность волновой функции может быть мала."; 11340 9 11350 LOCATE 24,10,0 11360 PRINT USING "Энергия=***.***** DE=##.##"^ ";Е, DE; 11370 LOCATE 24,47 11380 PRINT USING "F=##.##AAAA Узлы=###";F,NODES%; 11390 i 11400 RETURN 11410 9 IZUUU 12010 ' Подпрограмма вывода волновой функции на текстовый дисплей 12020 'входные переменные: DE, Е, F, GAMMA, NODES%
314 Приложение Б 12030 12040 12050 12060 12070 12080 12090 12100 12110 12120 12130 13000 13010 13020 13030 13040 13050 13060 13070 13080 13090 13100 13110 13120 13130 13140 13150 13160 13170 13180 13190 13200 13210 13220 13230 13240 13250 13260 13270 13280 13290 ' выходные переменные: нет ' глобальные переменные: нет 'локальные переменные: нет 1 ************************************************************************ LOCATE 25,2,0 PRINT USING "Gamma=###.## Энергия=##.*#### ";GAMMA,E; LOCATE 25,38 PRINT USING "DE=#.##~~ F=##.##~---- Узлы=###"; DE, F, NODES%; r RETURN '************************************************************************ 'Подпрограмма вывода собственной энергии 'входные переменные: DX, EOLD, F, ILEFT%, IRIGHT%, NODES%, ХМ IN ' выходные переменные: нет ' глобальные переменные: GRAPHICS^ 'локальные переменные: Е%, XIN, XOUT 1 ************************************************************************ IF NOT GRAPHICS^ THEN GOTO 13170'вывод на график E%=86-(EOLD+1)*86/2 'график собственной энергии LINE (4*ILEFT%, E%)-(4*IRIGHT%, Е%) LOCATE 23,1: PRINT SPACE$(79); LOCATE 23,8,1: BEEP: PRINT "Связанное состояние найдено."; LOCATE 23,38: PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 13130 LOCATE 23,1,0: PRINT SPACE$(79); RETURN XIN=XMIN+DX*ILEFT% XOUT=XMIN+DX*IRIGHT% 'вывод текстовых данных 'расчет точек поворота LOCATE 23,1,0 'вывод характеристики состояния PRINT USING "Собств.энергия=##.##### Узлы=### ";EOLD, NODES%; LOCATE 23,39 PRINT USING "Xin=##.### LOCATE 23,64 PRINT USING " DE=##.##' XoiH=**.#*#"; XIN, XOUT; pg. LOCATE 24,1,0: PRINT " " Г 'прокрутка экрана LOCATE 1,12,0 'выдача списка команд
Программы для примеров 315 13300 13310 13320 13330 14000 14010 14020 14030 14040 14050 14060 14070 14080 14090 14100 14110 14120 14130 14140 14150 14160 14170 14180 14190 14200 14210 14220 14230 14240 14250 14260 14270 15000 15010 15020 15030 15040 15050 15060 15070 15080 PRINT "р:пауза е: конец п: изменить энергию d: изменить DE"; RETURN ффффффф***************************************************************** Подпрограмма выдачи списка вариантов продолжения программы входные переменные: нет выходные глобальные переменные: VSAVE% переменные: GRAPHICS^ локальные переменные: А% CLS LOCATE 1,26: PRINT "Варианты продолжения счета:"; LOCATE 3,10: PRINT "1) Изменить gamma"; LOCATE 5,10: PRINT "2) Начать сначала с новым потенциалом"; LOCATE 7,10 PRINT "3) Изменить данный потенциал (только в графическом режиме)"; LOCATE 9,10: PRINT "4) Завершить работу программы"; LOCATE 11,25: PRINT SPACE$(50) LOCATE 11,25: BEEP: INPUT "Введите номер своего варианта"; А% IF А%>=1 AND А%<=4 THEN GOTO 14180 ELSE GOTO 14150 IF NOT GRAPHICS% AND A%=3 THEN A%=2 CLS IF А%<>1 THEN GOTO 14220 RETURN 240 IF A%<>2 THEN GOTO 14240 RETURN 220 IF A%<>3 THEN END VSAVE%=-1 RETURN 220 'Подпрограмма вывода экрана-заставки ' входные переменные: нет 'выходные переменные: GRAPHICS%, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме
316 Приложение Б 15090 15100 15110 15120 LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; 15130 LOCATE 3,32: PRINT "Steven E. Koonin"; 15140 15150 15160 15170 15180 LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; 9 LOCATE 5,10 ’рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); 15190 15200 FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); 15210 LOCATE ROW%,70: PRINT CHR$(186); 15220 NEXT ROW% 15230 LOCATE 20,10 15240 15250 15260 15270 15280 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); 9 COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРИМЕР 3"; COLOR 7: LOCATE 10,14 15290 PRINT "Квантовые связанные состояния в одномерном потенциале" 15300 LOCATE 13,35: PRINT "**********" 15310 LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." 15320 15330 LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." 9 15340 15350 15360 LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$, 1)="у" OR LEFT$(G$, 1)="n" GOTO 15390 15370 LOCATE 19,13: PRINT SPACE$(57): BEEP 15380 LOCATE 18,35: PRINT "Повторите...": GOTO 15340 15390 IF LEFT$(G$, 1)="y" GOTO 15420 15400 GR APHICS%=0: MONO%=-1 15410 15420 RETURN GRAPHICS%=-1 15430 LOCATE 18,15: PRINT SPACE$(55) 15440 15450 LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP 15460 15470 INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$, 1)="у" OR LEFT$(M$, 1)="n" GOTO 15490 'проверка ответа 15480 LOCATE 18,35: PRINT "Повторите...": GOTO 15440 15490 IF LEFT$(M$, 1)="y" THEN MONO%=-1 ELSE MONO%=0
Программы для примеров 317 15500 15510 16000 16010 16020 16030 16040 16050 16060 16070 16080 16090 16100 16110 17000 17010 17020 17030 17040 17050 17060 17070 17080 17090 17100 17110 RETURN г '************************************************************************ 'Подпрограмма переключения с текстового дисплея на графический ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: нет ' локальные переменные: нет DEF SEG=0 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 SCREEN 2,0,0,0: WIDTH 80: LOCATE ,,1,6,7 RETURt4 » ' >|с>|с4с>|с>|с4с>|с4<*4с**>|с4с4с>|н|с>|с4с>|с4»|с*4с4с4с**4с4с*>|с*4с***>|с*>|с**>|с*>|с*4с>|с>|с>|с4|4с>|с*>|с>|с>|с*4с>|с**4с>|с**4с>|с4с>|сз|с4с 'Подпрограмма переключения с графического дисплея на текстовый входные переменные: нет выходные переменные: нет глобальные переменные: нет локальные переменные: нет DEF SEG=0 POKE &Н410, (РЕЕК(ЛН410) OR &Н30) SCREEN 0: WIDTH 80: LOCATE „1,12,13 RETURN
318 Приложение Б Б.4. ПРИМЕР 4 В данной программе вычисляются амплитуды и сечения рассеяния в при- ближениях Борна и эйконала (соответственно формулы (4.21) и (4.29), (4.30)) для рассеяния электронов на потенциалах в виде прямоуголь- ной ямы, гауссовой ямы или Ленца —Йенсена. Во всех случаях полное сечение рассчитывается путем интегрирования дифференциального сече- ния по углам рассеяния вперед и назад (циклы в строках 2160—2200 и 2250—2290). Кроме того, полное сечение рассчитывается на основе оптической теоремы (4.31) (строка 2350) из амплитуды рассеяния в приближении эйконала. Само же дифференциальное сечение вычисляется в подпрограмме 4000 (борновское приближение) и в подпрограмме 6000 (приближение эйконала). При этом необходимые значения функции Бес- селя находятся в подпрограмме 7000. Все интегралы получаются по квадратурной формуле Гаусса —Лежандра одного и того же порядка точ- ности. Список предусмотренных значений для числа узлов квадратуры приведен в строке 12030. После представления числовых результатов на экран выводятся графики дифференциальных сечений в полулогариф- мическом масштабе. Типичные результаты работы этой программы получаютя для потен- циала в виде прямоугольной ямы глубиной Vzero = 20 и энергии падающих электронов Е = 20 при квадратуре с 20 узлами. 10 * an************************************************************************** 20 'Пример 4: Квантовое рассеяние частиц в приближениях Борна и эйконала 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 0 ' 40 GOSUB 9000 50 ' 60 FIRST%=-1 70 Pl=3.14159 80 SQHALF=SQR(.5) 90 E2=14.409 100 HBARM=7.6359 110 ' 120 DIM XLEG(48), WLEG(48) 'вывод экрана-заставки 'определение констант и функций 'квадрат заряда электрона ' (h/2pi)~2/(масса электрона) 'массивы абсцисс и весов квадратуры
Программы для примеров 319 130 DIM DEGREE(96) 'углы, для которых надо вести расчеты 140 DIM SIGE(96),SIGB(96) 'массивы для dsigma/domega 150 DIM СН1(48) 'функция профиля эйконала chi 160 RMAX=2 'вне RMAX потенциал V равен нулю 170 г 180 GOSUB 1000 'ввод V, Vzero, Z, Е, NLEG% 190 Г 200 GOSUB 2000 'расчет полного сечения SIGMA 210 9 220 LOCATE 24,23: PRINT "Для продолжения нажмите клавишу <с>"; 230 IF INKEY$o"c" GOTO 230 240 г 250 IF GRAPHICS% THEN GOSUB 8000'построение графика sigma 260 i 270 GOTO 180 'повторение счета с новыми данными 280 1 1000 ' ************************************************************************* 1010 1020 1030 1040 1050 1060 'Подпрограмма ввода Z, энергии и числа узлов квадратурной формулы ' входные переменные: нет ' выходные переменные: Е, К, NLEG%, OPTS, RCUT, VS, V%, VZERO, Z, Z6 ' глобальные переменные: FIRST% 'локальные переменные: ESAVE, ILLEGAL%, NSAVE%, VZSAVE, ZSAVE 1 ************************************************************************* 1070 CLS 1080 9 1090 LOCATE 1,23 'ввод потенциала 1100 PRINT "Предусмотрены следующие потенциалы:"; 1110 LOCATE 2,10 1120 PRINT "1) Потенциал Ленца-Йенсена для электрона и нейтрального атома"; 1130 LOCATE 3,18 1140 PRINT "2) Прямоугольная яма 3) Гауссова яма"; 1150 LOCATE 4,14 1160 INPUT; "Введите номер выбранного потенциала или 0 для выхода"; OPTS 1170 IF ОРТ$="0" OR ОРТ$="1" OR ОРТ$="2" OR ОРТ$="3" THEN GOTO 1220 1180 LOCATE 5,19: BEEP 1190 PRINT "Повторите. Правильные ответы 0, 1, 2 или 3"; 1200 LOCATE 4,1: PRINT SPACE$(79); 1210 GOTO 1150 1220 IF OPT$="0" THEN END 1230 IF OPT$="1" GOTO 1360 1240 i
320 Приложение Б 1250 1260 1270 1280 1290 BOO B10 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 1460 1470 1480 1490 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590 1600 1610 1620 1630 1640 1650 IF FIRST% GOTO 1280 'ввод глубины ямы LOCATE 8,19 PRINT USING "Последнее значение Vzero было равно +###.##";VZSAVE LOCATE 9,24 INPUT; "Ухего=глубина потенциальной ямы~"; VZERO VZSAVE=VZERO IF OPT$="2" THEN У$="Прямоугольная яма" ELSE V$='Tауссова яма" IF OPT$="2" THEN V%=17 ELSE V%=12 RCUT=2 GOTO 1510 r IF FIRST% THEN GOTO 1390 'ввод заряда ядра LOCATE 8,19 PRINT USING "Последнее значение заряда Z было равно ###";ZSAVE; LOCATE 9,29 INPUT; "2=заряд атомного ядра="; Z IF Z>0 THEN GOTO 1460 LOCATE 10,17: BEEP PRINT "Повторите еще раз. Z должно быть положительным"; LOCATE 9,1: PRINT SPACE$(79); GOTO 1390 ZSAVE=Z У$="Ленц- Йенсен": V%=11 RCUT=1 Z6=ZM66667 9 IF FIRST% GOTO 1540 'ввод энергии пучка LOCATE 13,20 PRINT USING "Последняя энергия пучка была #####.### эВ"; ESAVE; LOCATE 14,25 INPUT; "Е=энергия падающих частиц в эВ="; Е IF Е>0 THEN GOTO 1610 LOCATE 15,17: ВЕЕР PRINT "Повторите еще раз. Е должна быть положительной"; LOCATE 14,1: PRINT SPACE$(79)' GOTO 1540 ESAVE=E K=SQR(2*E/HBARM) 'вычисление волнового числа I IF FIRST% GOTO 1670 'ввод числа узлов квадратуры LOCATE 18,22
Программы для примеров 321 1660 1670 1680 1690 1700 1710 1720 1730 1740 1750 1760 1770 1780 1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2^30 2140 PRINT USING "В последней квадратуре было ## узлов"; NLEG%; LOCATE 19,24 INPUT; "Число узлов квадратурной формулы="; NLEG% ILLEGAL%=0 'установка флага GOSUB 12000 'задание весов и абсцисс IF NOT ILLEGAL% THEN GOTO 1760 LOCATE 20,12: BEEP PRINT "Предусмотрено 2,3,4,5,6,8,10,12,16,20,24,32,40 и 48 узлов"; LOCATE 19,1: PRINT SPACE$(79); GOTO 1670 NSAVE%=NLEG% f CLS 9 IF OPT$="1" GOTO 1840 LOCATE 1,14 PRINT USING "Vzero=+*##.## Энергия=#####.## ";VZERO,E; GOTO 1860 LOCATE 1,18 PRINT USING "Z=### Епегду=#####.## ";Z,E; PRINT USING "Число узлов=##"; NLEG% I FIRST%=0 'больше не первый раз 9 RETURN i 1 ************************************************************************* 'Подпрограмма расчета полного сечения SIGMA 'входные переменные: IMFEO, SIGBT, SIGET 'выходные переменные: COSTH, IMFEO, L%, SIGBT, SIGET, SIGOPT 'глобальные переменные: К, NLEG%, PI, SQHALF, XLEG(I%) 'локальные переменные: COSCUT, \%, SIGBTFOR, SIGBTBACK, SIGETFOR, ' SIGETBACK, SINHALF, THETACUT ************************************************************************** SINHALF=PI/( K*RCUT) 'угол, при котором IF SINHALF>SQHALF THEN SINHALF=SQHALF ' q*rcut=2*pi, делит THETACUT=2*ATN(SINHALF/SQR(1-SINHALF*SINHALF)) ' интеграл на рассея- COSCUT=COS(THETACUT) ' ние вперед и назад г ' 'sigma для малых углов SIGBT=0: SIGET=0: 'обнуление полных сечений 21 — 1650
322 Приложение Б 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 2430 2440 2450 2460 2470 2480 2490 2500 2510 2520 2530 2540 2550 IMFE0=0 FOR l%=1 TO NLEG% 'обнуление Im части ампл. pace, вперед 'рассеяние вперед на COSTH=COSCUT+(XLEG[ 1%) +1) *( 1-COSCUT) /2 ' углы от 0 до THETACUT L%=l% GO5UB 3000 NEXT 1% SIGBTFOR=PI*( 1-COSCUT) *SIGBT SIGETFOR=PI*( 1-COSCUT) *SIGET r 'расчет сечения при данном угле 'множитель (1-COSCUT)/2 появляется ' из замены переменных SIGBT=0: SIGET=0 FOR l%=1 TO NLEG% 'обнуление полных сечений расе, назад 'вклады от рассеяния назад на углы COSTH=-1+(XLEG( 1%)+1) *( COSCUT+1)/2 ' от THETACUT до 180 L%=I%+NLEG% GOSUB 3000 NEXT l% SIGBTBACK=PI*( COSCUT+1) *SIGBT 'расчет сечения при данном угле SIGETBACK=PI*( COSCUT+1) *SIGET SIGBTzSIGBTFOR+SIGBTBACK SIGETzSIGETFOR+SIGETBACK SIGOPT=4*PI/K*IMFEO 'полное сечение есть сумма вкладов ' от рассеяния вперед и назад 'полное сечение из оптической теоремы PRINT PRINT "" IF NLEG%<10 GOTO 2460 IF OPT$="1" GOTO 2430 LOCATE ,14 PRINT USING "Vzero=+###.## GOTO 2450 LOCATE ,18 'перемещение текста на экране 'повторный вывод значения Е, если ' оно ушло с экрана Энергия=#####. ## VZERO, Е; PRINT USING "Z=### Энергия=#####.## ",Z,E; PRINT USING "Число узлов=##"; NLEG% LOCATE ,24 PRINT USING "Полное сечение (Борн)=+#.###~--";SIGBT LOCATE ,23 PRINT USING "Полное сечение (эйконал)=+#.###~^л"; SIGET LOCATE ,17 PRINT USING "Полное сечение (оптическая теорема)=+#.###л~~~";SIGOPT LOCATE ,28 PRINT USING "Угол разреза fheta=###.##"; (180*THETACUT/PI) r RETURN
Программы для примеров 323 2560 3000 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 4110 4120 4130 'Подпрограмма расчета дифференциального сечения при данном угле и ' его вклада в полное сечение рассеяния ' входные переменные: COSTH, L% 'выходные переменные: DEGREE) l%),< $IGB(I%), SIGE(I%),SIGBT, SIGET 'глобальные переменные: К, PI, WLEG(I%) 'локальные переменные: THETA IF INKEY$="e" THEN RETURN 180 r THETA=ATN( SQR( 1-COSDT 2) /COSTH) IF THETA<0 THEN THETA=THETA+PI DEGREE) L%) =THETA*180/PI Q=2*K*SIN(THETA/2) 9 GOSUB 4000 SIGBT=SIGBT+SIGB( L%) *WLEG( l%) GOSUB 6000 SIGET=SIGET+SIGE( L%) *WLEG( l%) 'нажатие <e> завершает программу ' переменной интегрирования ' является cos theta 'передаваемый импульс 'дифф, сечение в прибл. Борна 'полное сечение в прибл. Борна 'дифф, сечение в прибл. эйконала 'полное сечение в прибл. эйконала PRINT USING "Theta=###.## DEGREE)L%),Q; PRINT USING "sigma) Борн)=+#.###~~ ";SIGB(L%); PRINT USING "sigma) эйконал)=+#. SIGE(L%) RETURN ************************************************************************** 'Подпрограмма вычисления dsigma/domega в борновском приближении ' входные переменные: L%, Q 'выходные переменные: R, SIGB(I%) 'глобальные переменные: HBARM, NLEG%, RMAX, WLEG(l%)f XLEG(I%) 'локальные переменные: FBORN, J% FBORN=0 'обнуление борн. амплитуды 9 FOR J%=1 ТО NLEG% R=RMAX*(XLEG(J%)+1)/2 'пересчет переменной GOSUB 5000 'вычисление потенциала FBORN=FBORN+SIN( Q*R) *V*R*WLEG( J%) ' интеграл амплитуды NEXT J%
324 Приложение Б 4140 4150 4160 4170 4180 4190 5000 5010 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 6000 6010 6020 6030 6040 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 FBORN=-RMAX/( Q*HBARMJ *FBORN SIGB( L%) =FBORN*FBORN 'умножение на константы 'диф. сечение = амплитудаА2 RETURN ************************************************************************** 'Подпрограмма вычисления потенциала V(r) для прямоугольной ямы, ' гауссовой ямы или Ленца-Йенсена ' входные переменные: R ' выходные переменные: V 'глобальные переменные: Е2, OPTS, VZERO, Z, Z6 'локальные переменные: RR, R1S, U г************************************************************************* IF ОРТ$="2" THEN V=-VZERO: RETURN 'прямоугольная яма IF ОРТ$="3" THEN V=-VZERO*EXP(-2*R*R): RETURN 'гауссова яма RR=R: R1S=.529/Z 'потенциал Ленца-Йенсена, IF R<R1S THEN RR=R1S ' обрезание по радиусу U=4.5397*Z6*SQR( RR) ' оболочки 1s V=-( (Z*E2) /RR) *EXP( - U) *( 1+U+U*U*(. 3344+U*(. 0485+. 002647*U))) r RETURN ' ************************************************************************* 'Подпрограмма вычисления dsigma/domega в приближении эйконала 'входные переменные: BESSJO, L%, Q, V 'выходные переменные: IMFEO, R, SIGE(I%), X ' глобальные переменные: HBARM, К, NLEG%, RMAX, WLEG( l%), XLEG( l%) 'локальные переменные: В, CHI(I%), IMFE, К%, М%, REFE, ZMAX, ZZ г ************************************************************************* REFE=O: IMFE=0 'обнуление Re и Im частей ампл. FOR К%=1 ТО NLEG% 'интегрирование по Ь для F B=RMAX*( XLEG( К%) +1) /2 IF L%>1 THEN GOTO 6240 'расчет CHI(b) только один раз LOCATE 24,22: PRINT "Потерпите, пожалуйста! Идет расчет."; СН1(К%)=0 ZMAX=SQR( RMAX*RMAX-B*B) ' Г 2=zA2+bA2 FOR М%=1 ТО NLEG%
Программы для примеров 325 6160 ZZ=ZMAX*( XLEG( М%] +1] /2 6170 R=SQR(ZZ*ZZ+B*B] 6180 GOSUB 5000 'вычисление V 6190 CH l( К%) =CHI( К%) +V*WLEG( М%) 6200 NEXT М% 6210 СНЦ K%|=-(ZMAX/(2*K*HBARM] ] *СН1( К%) 'вклад в CHI 6220 IMFE0=IMFE0+B*SIN(CHI( К%)) ~2*WLEG( К%) ' расчет Im Fe( 0] 6230 9 6240 X=Q*B 6250 6260 GOSUB 7000 'вычисление функции Бесселя 9 6270 REFE=REFE+B*BESSJO*SIN( 2*CHI( К%]) *WLEG( К %). 6280 IMFE=IMFE+B*BESSJO*SIN( СН1( К%]) *SIN( СН1( К%)) *WLEG( К%) 6290 • 6300 NEXT К% 6310 6320 IMFE=K*RMAX*IMFE 'умножение на константы 6330 REFE=K*RMAX*REFE/2 6340 6350 SIGE( L%] =IMFE*IMFE+REFE*REFE ' sigma= | f | ^2 9 6360 IF L%=1 THEN IMFE0=K*RMAX*IMFE0 6370 IF L%=1 THEN LOCATE 24,1: PRINT SPACE$(79);: LOCATE 3,1 'стирание 6380 ' ' сообщения 6390 6400 RETURN r 7000 '************************************************************************* 7010 'Подпрограмма вычисления JO по полиномиальной аппроксимации 7020 ' входные переменные: X 7030 'выходные переменные: BESSJO 7040 'глобальные переменные: нет 7050 'локальные переменные: TEMP, Y, Y2 7060 1 ДО*********************************************************************** 7070 7080 Y=X/3: Y2=Y*Y 9 7090 7100 IF ABS(X)>3 THEN GOTO 7170 9 7110 TEMP=-. 0039444+. 00021*Y2: TEMP=. 0444479+Y2*TEMP 7120 TEMP=-.3163866+Y2*TEMP: TEMP=1.2656208#+Y2*TEMP: 7130 TEMP=-2.2499997#+Y2*TEMP 7140 BESSJ0=1+Y2*TEMP 7150 RETURN
326 Приложение Б 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 7260 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 8120 8130 8140 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 Y=1/Y ТЕМР=-7.2805Е-04+1.4476E-04*Y: ТЕМР=1.37237E-03+TEMP*Y ТЕМР=-9.512E-05+TEMP*Y: ТЕМР=-. 0055274+TEMP*Y: TEMP=-7.7E-07+TEMP*Y: TEMP=.79788456#+TEMP*Y TEMP2=- 2.9333E- 04+1.3558E- 04*Y: TEMP2=- 5.4125E- 04+TEMP2*Y TEMP2=2.62573E-03+TEMP2*Y: TEMP2=-3.954E-05+TEMP2*Y TEMP2=-4.166397E-02+TEMP2*Y: TEMP2=X-. 78539816#+TEMP2*Y BESSJO=TEMP*COS( TEMP2) ZSQR( X) RETURN 9 ************************************************************************** 'Подпрограмма вывода графика дифф, сечения как функции угла theta 'входные переменные: DEGREE(I%), SIGB(I%), SIGE(I%), SIGBT, ' SIGET, SIGOPT, V$, V% ' выходные переменные: нет 'глобальные переменные: Е, MONO%, NLEG%, ОРТ$, VZERO, Z 'локальные переменные: COL%, ЕХРМАХ%, EXPMIN%, LSIGE, LSIGB, ' MARK%, NORD%, ROW%, S%, SB%, SE%, ' SBOLD%, SEOLD%, SIGMAX, SIGMIN, SIGSCALE, T%, TOLD%, TSCALE ' ************************************************************************* IF MONO% THEN GOSUB 10000 'переход в графический режим CLS: SCREEN 2,0,0,0 9 SIGMAX=0 'нахождение наибольшего sigma FOR L%=1 TO 2*NLEG% IF SIGE(L%)>SIGMAX THEN SIGMAX=SIGE(L%) IF SIGB(L%)>SIGMAX THEN SIGMAX=SIGB(L%) NEXT L% 9 SIGMIN=SIGMAX 'нахождение наименьшего sigma FOR L%=1 TO 2*NLEG% IF SIGE(L%)<SIGMIN THEN SIGMIN=SIGE(L%) IF SIGB(L%)<SIGMIN THEN SIGMIN=SIGB(L%) NEXT L% i EXPMAX%=INT(LOG(SIGMAX)/LOG(10)+1)'определение макс, и мин. EXPMIN%=INT(LOG(SIGM1N)/LOG(10)) ' порядков для sigma NORD%=EXPMAX%-EXPMIN% ' размах в логарифм, шкале 9 TSCALE=584/180 'масштаб по оси theta
Программы для примеров 327 8300 8310 8320 8330 8340 8350 8360 8370 8380 8390 8400 8410 8420 8430 8440 8450 8460 8470 8480 8490 8500 8510 8520 8530 8540 8550 8560 8570 8580 8590 8600 8610 8620 8630 8640 8650 8660 8670 8680 8690 8700 SIGSCALE=175/NORD% 'масштаб по оси sigma LINE ( 56,0)-( 56,175) LINE (56,175)-(640,175) LOCATE 3,1: PRINT "Sigma"; LOCATE 23,68: PRINT "Theta"; LOCATE 1,(80-V%) PRINT V$; IF OPT$="1" THEN GOTO 8440 'ось sigma 'ось theta 'обозначение оси sigma 'обозначение оси theta 'вывод названия потенциала 'вывод E, Z, Vzero LOCATE 2,54 PRINT USING "Vzero=+###.## E=#####.##"; VZERO, E; GOTO 8460 LOCATE 2,62 PRINT USING "Z=### E=#####.##";Z,E; LOCATE 3,53 PRINT "Маркеры: Х=Борн, о=эйконал"; LOCATE 24,2 PRINT USING "Полное сечение: Борн=+#.###лллл "; SIGBT; PRINT USING "эйконал=+#.оптическое=+#.###лллл"; SIGET, SIGOPT; г FOR MARK%=0 TO 4 'деления оси theta T%=56+MARK%*584/4 LINE (T%, 173)-(T%, 177) COL%=6+MARK%*18 IF MARK%=4 THEN COL%=77 'оцифровка оси theta LOCATE 23,COL% PRINT USING "###"; MARK%*45; NEXT MARK% r FOR MARK%=0 TO NORD% 'деления оси sigma S%=MARK%*175/NORD% LINE (54,S%)-(58,S%) ROW%=MARK%*22/NORD%: IF ROW%=0 THEN ROW%=1'оцифровка LOCATE ROW%, 1 ' оси sigma PRINT USING "1E+##"; (EXPMAX%-MARK%) NEXT MARK% r FOR l%=1 TO 2*NLEG% 'график дифф, сечения в прибл. T%=56+DEGREE( l%)*TSCALE ' эйконала в полулог. масштабе
328 Приложение Б 8710 8720 8730 8740 8750 8760 8770 8780 8790 8800 8810 8820 8830 8840 8850 8860 8870 8880 8890 8900 8910 8920 8930 8940 8950 8960 8970 8980 8990 9000 9010 9020 9030 9040 9050 9060 9070 9080 9090 9100 9110 LSIGE=LOG( SIGE( l%))/LOG( 10) SE%=175-(LSIGE-EXPMIN%)*SIGSCALE CIRCLE (T%,SE%),3 'маркировка точек кружками IF l%=1 THEN GOTO 8760 LINE (TOLD%, SEOLD%)-(T%, SE%) TOLD%=T%: SEOLD%=SE% NEXT 1% r FOR l%=1 TO 2*NLEG% 'график дифф, сечения в прибл. T%=56+DEGREE(I%)*TSCALE ' Борна в полулог. масштабе LSIGB=LOG( SIGB( l%))/LOG( 10) SB%=175-(LSIGB-EXPMIN%)*SIGSCALE LINE (T%+2,SB%+2)-(T%-2,SB%-2) 'маркировка точек крестиками LINE (T%+2,SB%-2)-(T%-2,SB%+2) IF l%=1 GOTO 8870 LINE (TOLD%, SBOLD%)-(T%,SB%) TOLD%=T% SBOLD%=SB% NEXT 1% r LOCATE 25,23,1: BEEP: PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 8920 LOCATE ,,0 i IF MONO% THEN GOSUB 11000 'возврат в текстовый режим CLS RETURN 'Подпрограмма вывода экрана-заставки ' входные переменные: нет 'выходные переменные: GRAPHICS^, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме I LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7
Программы для примеров 329 9120 9130 9140 9150 9160 9170 9180 9190 9200 9210 9220 9230 9240 9250 9260 9270 9280 9290 9300 9310 9320 9330 9340 9350 9360 9370 9380 9390 9400 9410 9420 9430 9440 9450 9460 9470 9480 9490 9500 9510 9520 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; r LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); 9 COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРИМЕР 4"; COLOR 7 LOCATE 10,11 PRINT "Квантовое рассеяние частиц в приближениях Борна и эйконала"; LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." Г LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$, 1)="у" OR LEFT$(G$, 1)="n" GOTO 9400 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 9350 IF LEFT$(G$, 1)="y" GOTO 9430 GRAPHICS%=0: MONO%=-1 GOTO 9520 GRAPHICS%=-1 LOCATE 18,15: PRINT SPACE$(55) LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$,1)="y" OR LEFT$(M$, 1)="n" GOTO 9500 'проверка ответа LOCATE 18,35: PRINT "Повторите...": GOTO 9450 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 9 LOCATE 21,10
330 Приложение Б 9530 PRINT "Эта программа вычисляет полное и дифференциальное сечения"; 9540 LOCATE 22,10 9550 PRINT "рассеяния электронов на заданном потенциале с использованием"; 9560 LOCATE 23,12 9570 PRINT "как борновского приближения, так и приближения эйконала."; 9580 LOCATE 24, 9 9590 PRINT "Все энергии - в эВ, углы - в градусах, длины - в Ангстремах."; 9600 LOCATE 25,23,1: ВЕЕР 9610 PRINT "Для продолжения нажмите клавишу <с>"; 9620 IF INKEY$o"c" GOTO 9620 9630 LOCATE ,,0 9640 ' 9650 IF MONO% AND GRAPHICS^ THEN GOSUB 11000'переход в текстовый 9660 ' ' режим 9670 RETURN 9680 ' 10000 '************************************************************************ 10010 'Подпрограмма переключения с текстового дисплея на графический 10020 'входные переменные: нет 10030 'выходные переменные: нет 10040 'глобальные переменные: нет 10050 'локальные переменные: нет 10060 '************************************************************************ 10070 DEF SEG=0 10080 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 10090 SCREEN 0: WIDTH 80: LOCATE ,,0 10100 RETURN 10110 ' 11ООО ' ************************************************************************ 11010 'Подпрограмма переключения с графического дисплея на текстовый 11020 'входные переменные: нет 11030 'выходные переменные: нет 11040 'глобальные переменные: нет 11050 'локальные переменные: нет 11060 ' ************************************************************************ 11070 DEF SEG=0 11080 POKE &Н410, (РЕЕК(&Н410) OR &Н30) 11090 SCREEN 0: WIDTH 80: LOCATE ,,0 11100 RETURN 11110 ' 12000 ' ************************************************************************
Программы для примеров 331 12010 12020 12030 12040 12050 12060 12070 12080 12090 12100 12110 12120 12130 12140 12150 12160 12170 12180 12190 12200 12210 12220 12230 12240 12250 12260 12270 12280 12290 12300 12310 12320 12330 12340 12350 12360 12370 12380 12390 12400 12410 'Подпрограмма установки абсцисс и весов квадратуры Гаусса-Лежандра; ' предусмотрены квадратуры с числом узлов ' 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40 и 48 входные выходные глобальные локальные переменные: переменные: переменные: переменные: NLEG% ILLEGAL%, WLEG(I%), XLEG( 1%) нет ILEG% IF NLEG%= 2 THEN GOTO 12330 'переход на таблицу для IF NLEG%= 3 THEN GOTO 12360 ' введенного числа узлов NLEG% IF NLEG%= 4 THEN GOTO 12400 IF NLEG%= 5 THEN GOTO 12440 IF NLEG%= 6 THEN GOTO 12490 IF NLEG%= 8 THEN GOTO 12540 IF NLEG%=10 THEN GOTO 12600 IF NLEG%=12 THEN GOTO 12670 IF NLEG%=16 THEN GOTO 12750 IF NLEG%=20 THEN GOTO 12850 IF NLEG%=24 THEN GOTO 12970 IF NLEG%=32 THEN GOTO 13110 IF NLEG%=40 THEN GOTO 13290 IF NLEG%=48 THEN GOTO 13510 ILLEGAL%=-1 'если NLEG% неправильное, RETURN ' то возврат и повторный ввод FOR ILEG%=1 TO FIX(NLEG%/2) 'поскольку веса и абсциссы XLEG(NLEG%-ILEG%+1)=-XLEG(ILEG%) ' всегда соответственно WLEG(NLEG%-ILEG%+1)=WLEG(ILEG%) ' четные и нечетные функции, NEXT ILEG% ' то другая половина массива RETURN ' заполняется тривиально XLEG(1)=. 577350269189626# GOTO 12270 : WLEG(1)=1* 'NLEG%=2 г NLEG%=3 XLEG(1)=. 774596669241483# XLEG(2)=0 GOTO 12270 Г : WLEG(1)=. 555555555555556* : WLEG(2)=. 888888888888889* NLEG%=4 XLEG( 1 )=. 861136311594053* XLEG(2)=. 339981043584856* : WLEG(1)=. 347854845137454* : WLEG(2)=. 652145154862546*
332 Приложение Б 12420 12430 12440 12450 12460 12470 12480 12490 12500 12510 12520 12530 12540 12550 12560 12570 12580 12590 12600 12610 12620 12630 12640 12650 12660 12670 12680 12690 12700 12710 12720 12730 12740 12750 12760 12770 12780 12790 12800 12810 12820 GOTO 12270 9 XLEG( 1 )=. 906179845938664# XLEG(2)=. 538469310105683* XLEG(3)=0 GOTO 12270 i XLEG( 1)=. 932469514203152* XLEG(2)=. 661209386466265* XLEG( 3)=. 238619186083197* GOTO 12270 9 XLEG(1)=. 960289856497536* XLEG(2)=. 796666477413627* XLEG(3)=.525532409916329* XLEG(4)=. 18343464249565* GOTO 12270 i XLEG( 1)=. 973906528517172* XLEG(2)=.865063366688985* XLEG( 3)=.679409568299024* XLEG( 4)=. 433395394129247* XLEG(5)=. 148874338981631* GOTO 12270 i XLEG( 1)=. 981560634246719* XLEG(2)=. 904117256370475* XLEG(3)=. 769902674194305* XLEG(4)=. 587317954286617* XLEG( 5)=. 36783149899818* XLEG( 6)=. 125233408511469* GOTO 12270 i XLEG(1)=. 98940093499165* XLEG(2)=.944575023073233* XLEG( 3)=. 865631202387832* XLEG( 4)=.755404408355003* XLEG(5)=. 617876244402644* XLEG(6)=. 458016777657227* XLEG(7)=. 281603550779259* XLEG( 8)=. 095012509837637* WLEG(1)=. 236926885056189* WLEG(2)=. 478628670499366* WLEG(3)=. 568888888888889* NLEG%=6 WLEG(1)=. 17132449237917* WLEG(2)=. 360761573048139* WLEG(3)=. 467913934572691* NLEG%=8 WLEG(1)=. 101228536290376* WLEG(2)=. 222381034453374* WLEG(3)=. 313706645877887* WLEG( 4)=. 362683783378362* NLEG%=10 WLEG(1)=. 066671344308688* WLEG(2)=. 149451349150581* WLEG( 3)=. 219086362515982* WLEG(4)=. 269266719309996* WLEG(5)=. 295524224714753# NLEG%=12 WLEG(1)=. 047175336386512* WLEG(2)=. 106939325995318* WLEG(3)=. 160078328543346* WLEG(4)=. 203167426723066* WLEG( 5)=. 233492536538355* WLEG(6)=. 249147045813403* NLEG%=16 WLEG(1)=. 027152459411754* WLEG(2)=. 062253523938648* WLEG(3)=. 095158511682493* WLEG(4)=. 124628971255534* WLEG(5)=. 149595988816577* WLEG(6)=. 169156519395003* WLEG(7)=. 182603415044924* WLEG(8)=. 189450610455069*
Программы для примеров 333 12830 12840 12850 12860 12870 12880 12890 12900 12910 12920 12930 12940 12950 12960 12970 12980 12990 13000 13010 13020 13030 13040 13050 13060 13070 13080 13090 13100 13110 13120 13130 13140 13150 13160 13170 13180 13190 13200 13210 13220 13230 GOTO 12270 г XLEG(1)=. 993128599185094# XLEG(2)=. 963971927277913# XLEG(3)=. 912234428251325# XLEG( 4)=.839116971822218# XLEG(5)=.74633190646015* XLEG(6)=.636053680726515# XLEG(7)=. 510867001950827# XLEG( 8)=. 373706088715419# XLEG(9)=. 227785851141645# XLEG(10)=. 076526521133497 GOTO 12270 9 XLEG(1)=. 995187219997021# XLEG(2)=. 974728555971309# XLEG( 3)=. 938274552002732# XLEG(4)=. 886415527004401# XLEG( 5)=.820001985973902# XLEG(6)=.740124191578554# XLEG(7)=.648093651936975# XLEG(8)=. 545421471388839# XLEG( 9)=.433793507626045# XLEG(10)=. 315042679696163 XLEG( 11)=. 191118867473616 XLEG(12)=. 064056892862605 GOTO 12270 9 XLEG(1)=. 997263861849481# XLEG(2)=. 985611511545268# XLEG(3)=.964762255587506# XLEG(4)=.934906075937739# XLEG(5)=. 896321155766052# XLEG(6)=. 849367613732569# XLEG(7)=.794483795967942# XLEG(8)=. 732182118740289# XLEG(9)=.663044266930215# XLEG( 10)=. 587715757240762# XLEG( 11)=. 506899908932229# XLEG( 12)=. 421351276130635# XLEG(13)=. 331868602282127# NLEG%=20 WLEG(1)=. 017614007139152# WLEG(2)=. 040601429800386# WLEG(3)=. 062672048334109# WLEG(4)=. 083276741576704# WLEG(5)=. 10193011981724# WLEG(6)=. 118194531961518# WLEG(7)=. 131688638449176# WLEG(8)=. 142096109318382# WLEG(9)=. 149172986472603# WLEG(10)=. 152753387130725# NLEG%=24 WLEG(1)=. 012341229799987# WLEG(2)=. 028531388628933# WLEG( 3)=. 044277438817419# WLEG(4)=. 059298584915436# WLEG(5)=. 07334648141108# WLEG(6)=. 086190161531953# WLEG(7)=. 097618652104113# WLEG(8)=. 107444270115965# WLEG(9)=. 115505668053725# WLEG( 10)=. 121670472927803# WLEG(11)=. 125837456346828# WLEG(12)=. 127938195346752# NLEG%=32 WLEG( 1 )=. 00701861000947# WLEG(2)=. 016274394730905# WLEG( 3)=. 025392065309262# WLEG(4)=. 034273862913021# WLEG( 5)=. 042835898022226# WLEG( 6)=. 050998059262376# WLEG(7)=. 058684093478535# WLEG( 8)=. 065822222776361# WLEG(9)=. 072345794108848# WLEG( 10)=. 07819389578707# WLEG(11)=. 083311924226946# WLEG( 12)=. 087652093004403# WLEG(13)=. 091173878695763#
334 13240 13250 13260 13270 13280 13290 13300 13310 13320 13330 13340 13350 13360 13370 13380 13390 13400 13410 13420 13430 13440 13450 13460 13470 13480 13490 13500 13510 13520 13530 13540 13550 13560 13570 13580 13590 13600 13610 13620 13630 13640 Приложение Б XLEG( 14)=. 239287362252137# XLEG( 15)=. 144471961582796* XLEG( 16)=. 048307665687738* GOTO 12270 Г XLEG(1)=. 998237709710559* XLEG(2)=. 990726238699457* XLEG(3)=. 977259949983774* XLEG( 4)=. 957916819213791* XLEG( 5)=. 932812808278676* XLEG(6)=. 902098806968874* XLEG(7)=. 865959503212259* XLEG( 8)=. 824612230833311* XLEG(9)=. 778305651426519* XLEG( 10)=. 727318255189927* XLEG(11)=. 671956684614179* XLEG( 12)=. 61255388966798* XLEG( 13)=. 549467125095128* XLEG( 14)=. 483075801686178* XLEG( 15)=. 413779204371605* XLEG( 16)=. 341994090825758* XLEG( 17)=. 268152185007253* XLEG( 18)=. 192697580701371* XLEG( 19)=. 116084070675255* XLEG( 20)=. 03877241750605* GOTO 12270 r XLEG(1)=. 998771007252426* XLEG(2)=. 99353017226635* XLEG( 3)=. 984124583722826* XLEG(4)=.970591592546247* XLEG(5)=. 95298770316043* XLEG(6)=. 931386690706554* XLEG(7)=. 905879136715569* XLEG(8)=. 876572020274247* XLEG(9)=. 843588261624393* XLEG(10)=. 807066204029442* XLEG(11)=.76715903251574* XLEG(12)=. 724034130923814* XLEG( 13)=.677872379632663* XLEG(14)=. 628867396776513* WLEG( 14)=. 093844399080804* WLEG( 15)=. 095638720079274* WLEG(16)=. 096540088514727* NLEG%=40 WLEG(1)=. 004521277098533* WLEG(2)=. 010498284531152* WLEG(3)=. 016421058381907* WLEG(4)=. 022245849194166* WLEG( 5)=. 027937006980023* WLEG(6)=. 033460195282547* WLEG(7)=. 038782167974472* WLEG(8)=. 043870908185673* WLEG( 9)=. 048695807635072* WLEG( 10)=. 053227846983936* WLEG(11)=. 057439769099391* WLEG( 12)=. 061306242492928* WLEG(13)=. 064804013456601* WLEG(14)=. 067912045815233* WLEG(15)=. 070611647391286* WLEG( 16)=. 072886582395804* WLEG( 17)=. 074723169057968* WLEG(18)=. 076110361900626* WLEG( 19)=. 077039818164247* WLEG(20)=. 077505947978424* NLEG%=48 WLEG(1)=. 003153346052305* WLEG(2)=. 007327553901276* WLEG(3)=. 011477234579234* WLEG(4)=. 015579315722943* WLEG(5)=. 019616160457355* WLEG( 6)=. 023570760839324* WLEG(7)=. 027426509708356* WLEG( 8)=. 031167227832798* WLEG(9)=. 03477722256477* WLEG(10)=. 03824135106583* WLEG(11)=. 041545082943464* WLEG( 12)=. 044674560856694* WLEG(13)=. 04761665849249* WLEG(14)=. 050359035553854*
Программы для примеров 335 13650 XLEG( 15)=. 577224726083972* WLEG( 15)=. 052890189485193* 13660 XLEG( 16)=. 523160974722233* WLEG( 16)=. 055199503699984* 13670 XLEG( 17)=. 466902904750958* WLEG( 17)=. 057277292100403* 13680 XLEG( 18)=. 408686481990716* WLEG( 18)=. 059114839698395* 13690 XLEG( 19)=. 34875588629216* WLEG(19)=. 060704439165893* 13700 XLEG( 20)=. 287362487355455* WLEG(20)=. 062039423159892* 13710 XLEG( 21 )=. 224763790394689* WLEG(21)=. 063114192286254* 13720 XLEG( 22)=. 161222356068891* WLEG( 22)=. 063924238584648* 13730 XLEG( 23)=. 097004699209462* WLEG(23)=. 06446616443595* 13740 XLEG(24)=. 032380170962869* WLEG(24)=. 064737696812683* 13750 GOTO 12270 13760 '
336 Приложение Б Б.5. ПРИМЕР 5 В данной программе определяется распределение плотности электричес- кого заряда в ядре атома путем подгонки теоретических сечений упру- гого рассеяния электронов на ядрах к экспериментальным значениям. Метод подгонки описан в тексте. В подпрограмме 1000 выбирается яд- ро-мишень и считываются экспериментальные данные. Принимается, что начальное распределение плотности заряда и коэффициенты разложения Фурье отвечают функции Ферми (подпрограмма 3000). Перед началом итераций вычисляются и запоминаются внутренние профильные функции, определяемые выражением (5.66) (строки 2290—2420), а также функции Бесселя 1 в узлах квадратурной формулы (строки 2450—2520 и под- программа 9000) и вклад во внешнюю амплитуду рассеяния в каждой точке данных (строки 2550—2650). Вычисление всех интегралов прово- дится по 20-точечной квадратурной формуле Гаусса— Лежандра. На каж- дой итерации процедуры подгонки (цикл 390—470) находятся уточнен- ные коэффициенты разложения. Для этого согласно определению (5.49) строятся матрица А и вектор В (строки 8080—8450), эта матрица об- ращается (подпрограмма 11000) и решается уравнение (5.51) (строки 8500—8560). Следует отметить, что вследствие однородности уравне- ния (5.476) его можно надлежащим образом отнормировать на величину того же порядка, что и остальные строки матрицы А (строка 8390). На 9 каждой итерации вычисляется величина % (подпрограмма 4000), а так- же плотность заряда как функция координаты (цикл 4360—4560). В хо- де расчета на экран выводятся графики подгоняемой зависимости сече- ния рассеяния (подпрограмма 5000), относительной погрешности под- гонки и плотности (подпрограмма 6000), а также количественная ин- формация о результатах подгонки (подпрограмма 7000). Для демонстрации результатов работы этой программы можно выб- рать следующие параметры: ядро-мишень Са, граничный радиус 7 фер- ми, 8 синусоид в разложении плотности, а процедуру подгонки также начать с 8 синусоид (см. обсуждение перед упр. 5.8). Итерационный процесс подгонки будет продолжаться до нажатия клавиши <е>. 10 ' *************************************************************************** 20 'Пример 5: Вычисление плотности электрического заряда в ядре 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 30 ' *************************************************************************** 40 DIM ТНЕТА(ЮО), QEFF(100) 'эксперим. углы и эффективные Q
Программы для примеров 337 50 DIM SIGE(IOO), DSIGE(IOO) 60 DIM REFOUT(100),IMFOUT(W0) 70 DIM REFT(IOO), IMFT(IOO) 80 DIM SIGT(IOO) 90 DIM CHIN(20,15) 100 DIM JTABLE(20,100) 110 DIM CZERO(15) 120 DIM SCHI(20),CCHI(20),S2CHI(20) 130 DIM W(15) 140 DIM A#(16,16), BVECTOR(16) 150 DIM R%(20),Q#(20),P#(20) 160 DIM XLEG(20), WLEG(20) 170 DIM RHO(90),DRHO(90) 180 ' 'эксперим. сечение и погрешности 'веществ, и мнимая части внешней ( 'веществ, и мнимая части полной f 'теоретическое сечение 'chi(n) в узлах квадратуры 'функция Бесселя в узлах квадратуры 'коэфф, разложения rho по синусам 'тригон. функции chi в узлах квадрат, 'массив производных sigma 'обращаемая матрица и вектор В 'рабочие массивы для обращения 'абсциссы и веса квадратуры 'rho(r) и ее погрешности 190 DEF FNFF(R)=1/(1+EXP(4.4*(R-RTARGET)/THICKJ) 'функция Ферми 200 DEF FNG(Y)=LOG((1+SQR(1-Y*2) )/Y)-SQR(1-Y*2j 'функция phi в (5.65) 210 Pl=3.141593: ALPHA=1/137.036: HBARC=197.329 'физические константы 220 NLEG%=20 'число узлов квадратуры 230 ' 240 GOSUB 12000 'вывод экрана-заставки 250 GOSUB 1000 'выбор мишени, считывание данных 260 GOSUB 2000 'вычисление chi(n), функций Бесселя 270 ' ' и внешней f 280 LOCATE 22,24 290 ВЕЕР: INPUT "Введите начальное число синусоид"; NSTART% 300 IF NSTART%=NBASIS% THEN GOTO 330 310 LOCATE 2?,17 320 BEEP: INPUT "Введите частоту добавления количества синусоид"; FREQ% 330 NSAVE%=NBASIS%: NBASIS%=NSTART% 340 IF FREQ%<=0 THEN FREQ%=1 350 ' 360 GOSUB 3000 'начальные Cn из плотности Ферми 370 GOSUB 4000 'вычисление нач. подгонки, вывод 380 г ' результатов на экран 390 FOR ITER%=1 TO 100 400 IF NBASIS%>=NSAVE% OR ITER% MOD FREQ% <>0 THEN GOTO 430 410 NBASIS%=NBASIS%+1 420 CZERO(NBASIS%)=0 430 GOSUB 8000 'вычисление новых коэффициентов Сп 440 IF INKEY$="e" THEN GOTO 480 450 GOSUB 4000 'вычисление и вывод подгонки 22—165"
Приложение Б 460 470 480 490 500 1000 1010 1020 1030 1040 1050 W60 1070 1080 1090 1100 Ш0 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 mo 1320 1330 1340 1350 IF INKEY$="e" THEN GOTO 480 NEXT ITER% LOCATE 25,23: PRINT "Для продолжения нажмите клавишу <с>";: ВЕЕР IF l«EY$="c" THEN GOTO 250 ELSE GOTO 490 r4t4c*4c4c*4c4c4c4c4c>K>K4c4c4c4c>K>K4c>K4c4c>K4c*******«*********************************4c4c**4c4c4c 'Подпрограмма ввода данных ' входные переменные: нет * выходные переменные: ATARGET, DSIGE, EBEAM, КВЕАМ, NPOINTS%, ' ОМАХ, SIGE, THETA, TARGETS, VC1, ZA, ZTARGET ' глобальные переменные: ALPHA, HBARC, ITER%, PI 'локальные переменные: CHOICE%, 1%, QLAB, RECOIL CLS 'выбор ядра-мишени LOCATE 10,10 PRINT "Данная программа содержит данные для ядер:" LOCATE 12,20: PRINT "1) 40Са" LOCATE 14,20: PRINT "2) 58Ni" LOCATE 16,20: PRINT "3) 208Pb" LOCATE 18,10: BEEP INPUT "Введите номер варианта или 0 для выхода"; СНО1СЕ% IF CHOICE%=0 THEN END IF CHOICE%=1 THEN RESTORE 15000 IF CHOICE%=2 THEN RESTORE 16000 IF CHOICE%=3 THEN RESTORE 17000 READ TARGETS,ZTARGET,ATARGET,EBEAM,NPOINTS% 'считывание данных ZA=ZTARGET*ALPHA: KBEAM=EBEAM/HBARC VC1=1+4/3*ZTARGET*ALPHA*HBARC/( EBEAM*1.07*ATARGEF (1/3)) ' кулон. QMAX"0 'поправка FOR 8%=1 TO NPOINT$% READ THETAj >%) • SIGE( 1%), DSIGE|1%) ' обеспечение малости IF DSIGE! I%)>=SIGE(I%) THEN DSlGEf 1%) =. 8*SIGE( l%J ' погрешности THETA( 1%|=ТНЕТА(1%)*Р1/180 'угол в радианах QLAB=2*KBEAM«SIN( THEfA( l%J /2) QEFF(l%)=QLAB*VC1 'кулоновская поправка IF QEFF( 1% j >QMAX THEN QMAX=QEFF( 1%) 'макс. Q в данных RECOIU1+2*EBEAM/940/ATARGET*SIN(THETA(I%)/2)A2 'учет отдачи SIGE| 1%) =SIGE( 1%) «RECOIL DSIGEf 1%)=DSIGE( 1%) «RECOIL NEXT 1%
Программы для примеров 339 1360 1370 1380 2000 2010 2020 2030 2040 2050 2055 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 ITER%=0 'номер итерации = 0 RETURN » 'Подпрограмма вычисления функций chi(n), Бесселя и внешней ( ' входные переменные: нет ' выходные переменные: CHIN, IMFOUT, JTABLE, NBASIS%, REFOUT, RMAX ' глобальные переменные: A*, ALPHA, ATARGET, BESSJO, BESSJ1, EBEAM, ' KBEAM, NLEG%, NPOINTS%, ORDER%, PI, QEFF, ' QMAX, TARGETS, X, XLEG, WLEG, ZA 'локальные переменные: В, ILEG%, IMF, JLEG%, KBS, M%, N%, R, REF, SUM ’ ******************Чс*************************Лс**************************** CLS 'ввод радиуса и числа синусоид LOCATE 5,10 PRINT "Для мишени "+TARGETS LOCATE 5,27 PRINT USING "имеются данные при энергии пучка ###.## МэВ"; ЕВЕ AM LOCATE 6,13: PRINT "Максимальный передаваемый импульс равен "; LOCATE 6,53: PRINT USING "##.### ферми"-1"; ОМАХ LOCATE 7,18: PRINT "Радиус ядра приблизительно равен "; LOCATE 7,51: PRINT USING "#.### ферми"; 1.07* ATARGET", 3333 LOCATE 10,18: BEEP INPUT "Укажите, какой использовать граничный радиус"; RMAX LOCATE 12,19: ВЕЕР INPUT "Введите число синусод в разложении (<=15)";NBA$IS% LOCATE 14,20: PRINT "При этих параметрах Отах = "; LOCATE 14,47: PRINT USING "##.### 1/ферми";НВА$1$%*Р1/РМАХ LOCATE 16,19: ВЕЕР INPUT "Хотите ли вы изменить эти параметры (у/п)";КВ$ IF KB$-"Y" THEN GOTO 2080 V GOSUB 10000 'задание квадратуры LOCATE 18,23: PRINT "Вычисляются chi[n)"; FOR N%=1 TO NBASIS% FOR 9LEG%-1 TO NLEG% 'расчет chl(n) при каждом b Bs|UXLEG|ILEG%|S/2 SUMsO FOR JLEG%s1 TO NLEG% 'интеграл ио г для chl(n| RsB^l 1-B j /2*4 UXLIG( j SUM=SUM+WLEG( JLEG% j *R*SIN (N%*PI*R) *FNG| B/R) 2360 22 ‘ NEXT JLEG% \
340 Приложение Б 2370 2380 2390 2400 2410 2420 2430 2440 2450 2460 2470 2480 2490 2500 2510 2520 2530 2540 2550 2560 2570 2580 2590 2600 2610 2620 2630 2640 2650 2660 2670 3000 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 3090 CHIN( ILEG%, N%) =-4*PI*ALPHA*RMAX 2*SUM*| 1- В) /2 NEXT ILEG% FOP M%=1 TO NBASIS% ' обнуление матрицы A* A#(N%,M%)=0 NEXT M% NEXT N% LOCATE 19,23: PRINT "Вычисляется таблица функций Бесселя"; ORDER%=0 FOR ILEG%=1 TO NLEG% 'заполнение таблицы функций B=( 1+XLEG( ILEG%) j /2 ' Бесселя FOR l%=1 TO NPOSNTS% X=OEFF(I%)*RMAX*B: GOSUB 9000 JTABLEf 1LEG%,!%) =BESSJO*B*WLEG( ILEG%) /2 NEXT l% NEXT ILEG% LOCATE 20,23: PRINT "Вычисляется внешняя f"; FOR l%=1 TO NPOINTS% 'цикл по эксперимент, точкам X=OEFF| 1%)*RMAX 'вычисление и запоминание ORDER%=0: GOSUB 9000 ' вещественной части внешней f REF=( 1+4*( ZA/X) A2-( 2/X) ~4*ZA~2*[ 5-ZAA2)) «BESSJO ORDER%=1: GOSUB 9000 REF=REF+16*ZAA2/X~3«BESSJ1 REFOUTf l%) =2*XBEAMZQEFF( 1%) A2*ZA*REF IMF=BESSJ0*(1-8*(1-2*ZA^2)/X^2) 'тчмсление и запоминание IMF=IMF~X*BESSJ1/2*[1-4*(1-ZAA2)/XA2) ' мнимой части внешней f IMFOUTf l%) =-8*KBEAM«ZA~2/(QEFF! I%) *Х) ~2*IMF NEXT l% RETURN 'Подпрограмма вычисления начальных коэффициентов разложения ' входные переменные: нет ' выходные переменные: CZERO 'глобальные переменные: ATARGET, NBASIS%, PI, RMAX, ZTARGET ' локальные переменные: DR, N%, RAD, RRHO, RTARGET, SN, SUM, THICK RTARGET=1.07*ATARGET\3333: THICK=2.4 'параметры плотности Ферми FOR N%=1 TO NBASIS% 'обнуление коэф, разложения CZERO(N%)=0
Программы для примеров 341 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 4000 4010 4020 4030 4040 4050 4055 4060 4065 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 NEXT N% DRs.1 FOR RADsDR TO RMAX STEP DR 'интеграл по г для Cn RRHO=RAD*FNFF(RAD) FOR N%=1 TO NBASIS% CZEROf N%) =CZERO( N%) +RRHO*SIN( N%*PI«RAD/RMAX) NEXT N% NEXT RAD SUM=0 'нормировка Cn на заряд Z FOR N%=1 TO NBASIS% SN=-RMAX~2/N%/PI IF N% MOD 2 =1 THEN SN=-SN SUM=SUM+SN*CZERO( N%) NEXT N% SUM=ZTARGET/[ 4*PI*SUM) FOR N%=1 TO NBASIS% CZEROf N%) =CZERO( N%) *SUM NEXT N% RETURN r ' ************************************************************************* 'Подпрограмма вычисления хи-квадрата и rho, вывод графика подгонки ' входные переменные: CZERO 'выходные переменные: CHISQ, IMFT, NDOF%, REFT, SIGT ' глобальные переменные: CCHI, CHIN, DSIGE, GRAPHICS%, JTABLE, KBEAM, ' MONO%, NBASIS%, NLEG%, NPOINTS%, PI, ' QMAX, RMAX, SCHI, S2CHI, SIGE, VC1, W, ZA ' локальные переменные: CHI, DRRHO, 1%, ILEG%, IMF, J%, N%, RAD, REF, ' RRHO, SUM, TENMORE% ************************************************************************** FOR ILEG%=1 TO NLEG% 'расчет полного chi при каждом Ь CHI=-ZA*LOG( (1+XLEG( ILEG%)) /2) FOR N%=1 TO NBASIS% CHI=CHI+CZERO( N%) *CHIN( ILEG%, N%) NEXT N% SCHI(ILEG%)=SIN|2*CHI) 'запоминание тригонометрических CCHI(ILEG%)=COS(2*CH!) ' функций от chi S2CHI( ILEG%) =SIN( CHI) ~2 NEXT ILEG%
342 Приложение Б 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 4300 4310 4320 4330 4340 4350 4360 4370 4380 4390 4400 4410 4420 4430 4440 4450 4460 4470 4480 4490 4500 4510 4520 4530 4540 4550 4560 4570 4580 QMAX=NBASIS%*PI/RMAX CHISQsO: NDOF%=0 FOR J%=1 TO NPOINTS% REF=O: IMF=0: FOR ILEG%=1 TO NLEG% REF=REF+JTABLE|ILEG%, 1%) *SCHt( H-EG%) IMF=IMF+JTABLE( ILEG%, 1%) *S2CHI( ILEG%] NEXT ILEG% REFT( 1%) =REFOUT( 1%) +KBEAM*RMAX~2*REF IMFT( 1%) =IMFOUT( 1%) +2*KBEAM*RMAX~2*IMF 'макс. Q для данного 'расчет теор.сечения и базиса хи- квадрата и мнимая веществ. ' части внутренней f ' веществ, и мнимая ' части полной f ' 'sigma в мбарн с кулон, поправкой SIGT( 1%) =Ю*СО5( ТНЕТА( 1%) /2] ж2*( REFT( 1%) *2+IMFT( 1%) ж2) *УСГ 4 IF QEFF(I%)>QMAX THEN GOTO 4330 CHISQ=CHISQ+( ( $IGE( 1%) -SIGT( 1%) ] ZOSlGEf 1%)) A2 NDOF%=NDOF%+1 NEXT 1% NDOF%=NDOF%- NB ASIS% 'степени свободы FOR J%=1 TO 90 'вычисление rho и ее погрешностей RHO(J%]=0: DRHO(J%)=0 RAD=J%*.1 'интервал от 0.1 до 9 ферми IF RAD>RMAX THEN GOTO 4560 RRHO=0 DRRHO=0 FOR N%=1 TO NBASIS% W(N%] =SIN( N%*PI*RAD/RMAX) 'W временный массив для синусов RRHO=RRHO+CZERO(N%) *W( N%) SUM=0 IF NOT GRAPHICS% THEN GOTO 4530 'погрешности нужны FOR M%=1 TO N% ' только для графиков FAC=2 IF M%=N% THEN FAC=1 SUM=SUM+FAC*A*(N%, M%) *W( M%) NEXT M% DRRHO=DRRHO+W( N%j *SUM NEXT N% RHO(J%)=RRHO/RAD DRHO( J%) =SQR( ABS(DRRHO)) /RAD NEXT ' 'вывод зависит от дисплея IF NOT GRAPHICS% THEN GOTO 4700
Программы для примеров 343 4590 4600 4610 4620 4630 4640 4650 4660 4670 4680 4690 4700 4710 4720 4730 5000 5010 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 GOSUB 5000 'вывод графика log (sigma) ' 'ожидание 10 с / TENMORE%= (VAL(RIGHT$(TIME$,2))+10) MOD 60 \ IF VAL( RIGHT$( TIMES, 2))=TENMORE% THEN GOTO 4640 ELSE GOTO 4620 f GOSUB 6000 'вывод отн. погрешности и rho IF MONO% GOTO 4700 ' 'ожидание 10 c TENMORE%= (VAL(RIGHT$( TIMES, 2))+10) MOD 60 IF VAL(RIGHT$(TIMES, 2))=TENMORE% THEN GOTO 4710 ELSE GOTO 4680 » GOSUB 14000 'переход в текстовый режим GOSUB 7000 'вывод числовых значений RETURN г ' ^Ис************************************************************^*^^^*^^^'^ 'Подпрограмма вывода в полулогарифм, масштабе графика подго&ши ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: CHISQ, DSIGE, ITER%, NBASIS%, NDOF%, ' NPOINTS%, QEFF, SIGE, SIGT, TARGETS ' локальные переменные: 1%, VSCALE, X%, Y1%, Y2% 1 **************************************************************^*^+.’*!1’*^*тг1*: GOSUB 13000 'переход в графический режим LOCATE 2,34 'вывод названия графика PRINT "Log sigma (mb/sr) для "+TARGETS LOCATE 3,34 PRINT USING "Итерация ** c ## синусоидами"; ITER%,NBASI 5% LOCATE 4,34: PRINT USING "Хи-квадрат = для CHISQ; LOCATE 4,62: PRINT USING "### степ, свободы"; NDOF% VSCALE=190/LOG(100001/1E-12) 'диапазон от 1e4 до 1е-12 LINE (30,0)-{630,190), 1,В 'рисование рамки FOR 1%=-11 ТО 3 'деления вертикальной сси Y%=190-LOG((10~I%)/1E-12)*VSCALE LINE (30,Y%)-(35,Y%): LINE (630,Y%)-(625,Y%) NEXT 1% LOCATE 1,2: PRINT "+4";: LOCATE 7,2: PRINT " 0"; 'оцифровка LOCATE 13,2: PRINT "-4";: LOCATE 19,2: PRINT "-8"; ' вертик. оси LOCATE 24,1: PRINT "-12"; FOR l%=1 TO 7 'деления горизонтальной оси 5250 Х%=30+600*|%/8
344 Приложение Б 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 5370 5380 5390 54UU 5410 5420 5430 5440 5450 6000 6010 6020 6030 6040 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 6U0 6170 6180 ©190 6200 LINE (X%, 190)-(X%, 187): LINE (X%,0)-(X%,3) NEXT !% LOCATE 25, 4: PRINT "0";: LOCATE 25,23: PRINT "1"; 'оцифровка LOCATE 25,42: PRINT "2";; LOCATE 25,60: PRINT "3"; ' гориз. оси LOCATE 25,79: PRINT "4"; LOCATE 25,45: PRINT "Оэфф, 1/ферми"; 'обозначение гориз. оси LOCATE 6,50: PRINT "Данные";: LINE (470,40)-(470,45) 'маркеры точек LOCATE 7,50: PRINT "Подгонка";: CIRCLE (470,52),2 ' графика FOR l%“1 ТО NPOINTS% 'рисование точек графика X%=30+150*QEFF(l%) Yt%=190-LOG( ( SIGE( l%)+DSIGE( l%))/1E-12)*VSCALE Y2%=190-LOG( ( SIGE( l%)-DSIGE( l%))/1E-12)*VSCALE LINE (X%, Y1%)-(X%, Y2%) 'эксп. данные с погрешностью Y1%=190-LOG( S8GT( l%)/1E-12)*VSCALE ir Y1%<0 THEN Y1%=0 IF Y1%>190 THEN Y1%=190 CIRCLE (X%,Y1%),2 'теоретик, данные (подгонка) NEXT 1% RETURN ’ Подпрограмма вывода графиков относительной погрешности и плотности ' входные 'выходные ' глобальные & 3 локальные переменные: нет переменные: нет переменные: CHISQ, DRHO, DSIGE, ITER%, NBASIS%, NDOF%, NPOINTS%, QEFF, RHO, RMAX, SIGE, SIGT, TARGETS переменные: 1%, J%, RAD%, X%, Y%, Y1%, Y2% CLS LINE (30,0) (630,86), 1, В LINE (30,43)-(630,43) FOR l%=1 TO 4 Y%=43*(1-l%/5) ONE (30, Y%)-(35,Y%): 'рисование рамки 'проведение нулевой линии 'деления вертикальной оси LINE (630,Y%)-(625,Y%) Y%=43*(1+l%/5) LINE (30,Y%H35,Y%): LINE (630, Y%)-(625, Y%) NEXT % LOCATE 1,2: PRINT '41";: LOCATE IL 2: PRINT "И"; FOR %^1 TO 7 X%=30+600*l%/8 LOCATE 6,3: PRINT "0"; 'оцифровка ' верт. оси 'деления горизонтальной осн
Программы для примеров 345 6210 6220 6230 6240 6250 6260 6265 6270 6280 6285 6290 6300 6310 6320 6330 6340 6350 6360 6370 6380 6390 6400 6410 6420 6430 6440 6450 6460 6470 6480 6490 6500 6510 6520 6530 6540 6550 6560 6570 6580 6590 LINE (Х%, 0)-(Х%, 3): LINE (Х%,86)-(Х%,83) NEXT 1% LOCATE 12,23: PRINT "1";: LOCATE 12,42: PRINT "2"; 'оцифровка LOCATE 12,61: PRINT "3";: LOCATE 12,79: PRINT "4"; ' гориз. оси LOCATE 12,46: PRINT "Оэфф * ферми"; 'обозначение гориз. оси LOCATE 2, 6 PRINT "Относительная погрешность подгонки"; 'название графика LOCATE 9, 6: PRINT USING "Итерация **";ITER%; LOCATE 10, 6: PRINT USING "Хи-квадрат=+#.##*~----для ";CHISQ; LOCATE 10,32: PRINT USING "** степеней свободы"; NDOF% FOR l%=1 TO NPOINTS% 'вывод точек графика X%=30+QEFF( l%)/4*600 Y1%==43*( 1- (SIGE( l%)+DSIGE( 1%)- SIGT( 1%) )/SIGE( 1%)) IF Y1%<0 THEN Y1%=0 IF Y1%>86 THEN Y1%=86 Y2%=43*(1-(SIGE(I%)-DSIGE(I%)-SIGT(I%))/SIGE(I%)) IF Y2%<0 THEN Y2%=0 IF Y2%>86 THEN Y2%=86 IF Y1%=86 AND Y2%=86 THEN Y1%=76 IF Y1%=0 AND Y2%=0 THEN Y2%=10 LINE (X%,Y1%)-(X%,Y2%) NEXT 1% 'теперь график плотности 'вертикальная ось 'деления и оцифровка верт. оси LINE (30,189)-(30,91) FOR l%=0 TO 8 STEP 2 ’дел< LINE (30,189-89*l%/8)-(34,189-89*l%/8) J%=25-3*l%/2 IF l%=0 THEN J%=24 LOCATE J%,1 PRINT USING 01*1%; NEXT 1% LOCATE 17,1: PRINT "rho"; LINE (30,189)-(630,189) 'обозначение вертикальной оси 'горизонтальная ось 'деления и оцифровка гориз. оси FOR 1%=0 ТО 9 Х%=30+1%*600/9 LINE (Х%,189)-(Х%,186) J%=4+l%*8 IF l%>=2 THEN J%=J%+1 IF l%>=5 THEN J%=J%+1 IF l%>=7 THEN J%=J%+1 LOCATE 25, J%: PRINT USING "#";!%;
346 Приложение Б 6600 6610 6620 6630 6640 6650 6660 6670 6680 6690 6700 6710 6720 6730 6740 6750 6760 6770 6780 6790 6800 7000 7010 7020 7030 7040 7045 7050 7060 7070 7080 7090 7100 7110 7120 7130 7135 7140 7150 7160 7170 NEXT 1% LOCATE 25,39: PRINT "г (фм)"; 'обозначение горизонтальной оси FOR J%=1 ТО 90 'рисование rho и ее погрешности RAD=.1*J% f с шагом 0.1 ферми IF RAD>RMAX THEN GOTO 6740 X%=30+600*RAD/9 Y%=189-89*(RHO(J%)+DRHO(J%))/. 08 IF Y%>189 THEN Y%=189 IF Y%<0 THEN Y%=0 Y1%=189-89*(RHO(J%)-DRHO(J%))/. 08 IF Y1%>189 THEN Y1%=189 IF Y1%<0 THEN Y1%=0 LINE (X%,Y%)-(X%,Y1%) NEXT J% LOCATE 14,43 PRINT "Плотность rho (♦ ферми^З) для "+TARGETS; 'название графика LOCATE 15,59: PRINT USING "Число синусоид=##"; NBASIS%; LOCATE 16,59: PRINT USING "Rmax=*#.#* ферми"; RMAX; LOCATE 17,59: PRINT USING "Qmax=#.*## 1/ферми";ОМАХ RETURN '***************+********************************************************* 'Подпрограмма вывода количественных данных о подгонке ' входные переменные: нет ' выходные переменнее: нет ' глобальные переменные: A*, CHISQ, CZERO, ITER%, NBASIS%, NDOF%, ' RHO, RMAX, TARGETS 'локальные переменные: DELT AC, J%, N% 1 ******************************************************************#****>«c^ CLS LOCATE 1,19: PRINT "Аппроксимация данных для "+TARGETS; LOCATE 1,49: PRINT USING " Итерация ##"; ITER%; LOCATE 2,18: PRINT USING "Хи-квадрат=+*.###ЛЛЛЛ для ";CHISQ; LOCATE 2,44: PRINT USING "** степеней свободы"; NDOF% LOCATE 3,12: PRINT USING "Число синусоид=##"; NBASIS%; LOCATE 3,31 PRINT USING "Rmax=##.*## ферми Qmax=#.#** 1/ферми"; RMAX, QMAX LOCATE 4,21: PRINT "Коэффициенты разложения плотности равны:" FOR N%=1 TO NBASIS% IF N% MOD 2 = 1 THEN LOCATE (N%-1)/2+5,4 ELSE LOCATE N%/2+4,44 IF A*(N%, N%)>0 THEN DELTAC=SQR( A#(N%, N%)) ELSE DELTAC=0
Программы для примеров 347 7180 7190 7200 7210 7220 7230 7240 7245 7250 7260 7270 7280 7290 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 8120 8130 8140 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 PRINT USING "С( ##)=+#.#### +- +#.#### **";N%,CZERO(N%), DELTAC NEXT N% LOCATE 14,19: PRINT "Плотность заряда в единицах фермиЛ-3 равна:"; FOR J%=1 ТО 9 LOCATE 14+J%, 1: PRINT USING "r=#.# - #.# фм ";.2+J%-1,J% FOR l%=1 TO 5 LOCATE 14+J%, 12*l%+7 PRINT USING RHO((J%-1 )*10+2*1%); NEXT 1% NEXT J% LOCATE 25,24: PRINT "Для окончания нажмите клавишу <е>"; RETURN 'де*********************************************************************** 'Подпрограмма расчета новых коэффициентов Сп ' входные переменные: нет ' выходные переменные: A#, BVECTOR, CZERO ' глобальные переменные: CCHI, CHIN, DSIGE, IMFT, JTABLE, КВЕАМ, N%, ' NB ASIS%, NLEG%, NPOINTS%, REFT, RMAX, SCH|, SIGE, SIGT, THETA ' локальные переменные: 1%, ILEG%, IMW, M%, REW, SN, W ’ ***^«******************************************************************** FOR N%=1 TO NBASIS% BVECTOR(N%)=0 FOR M%=1 TO N% A#(N%,M%)=0 NEXT M% NEXT N% 'обнуление вектора В ' и матрицы А FCM l%=1 ТО NPOINTS% 'вычисление матрицы А IF QEFF( 1%) >QMAX THEN GOTO 8340 FOR N%=1 TO NBASIS% 'вычисление вещ. и мнимой REW=0: IMW=0 ' частей вектора W FOR ILEG%=1 TO NLEG% REW=REW+JTABLE( ILEG%, 1%) *CCHI( ILEG%) »CHIN( ILEG%, N%) IMW=IMW+JTABUE( ILEG%, 1%) *SCHI( ILEG% j *CHIN| ILEG%, N%) NEXT ILEG% REW=2*REW*KBEAM*RMAXA2 IMWs2*IMW*KBEAM*RMAX~2 W( N%J =2*COS( THETAf 1%) /2] ж2*( REFT( 1%) *REW+IMFT( l%| *IMW| *10 NEXT N%
348 Приложение Б 8270 9 8280 FOR N%=1 ТО NBASIS% ’вклад в А, В от этой точки 8290 FOR М%=1 ТО N% 8300 А#( N%, М%) =А*[ N%, М%) +CDBL( W[ N%) *W( М%| /DSIGEf 1%) *2) 8310 NEXT М% 8320 BVECTORf N% j =BVECTOR( N%) +(SIGE( 1%) -SIG7J 1%) J *W( H% J ZDSIGEf 1%) ~2 8330 NEXT N% 8340 NEXT 1% 8350 9 8360 FOR N%=1 TO NBASIS% 'дополнение матрицы А 8370 SN=RMAXA2ZN%ZPI ' и ее нормирование 8380 IF N% MOD 2 =1 THEN SN=-SN 8390 A#( N%, NBASIS%+1) =SN*A#( 1,1) 8400 A«(NBASIS%+1,N%)=A*(N%,NBASIS%+1) 'матрица A симметрическая 8410 FOR M%=1 TO N% 8420 A#(M%ffN%)=A#(N%,M%J 8430 NEXT M% 8440 NEXT N% 8450 A#( NBASIS%+1, NBASIS%+1| =0 8460 9 8470 N%=NBASIS%+1 'обращение А 8480 GOSUB 11000 8490 9 8500 FOR N%=1 TO NBASIS% 'умножение А на В с 8510 SUM=0 ' получением новых Cn S520 FOR M%=1 TO NBASIS% 8530 SUM=SUM^A$q j *WECTOR( 8540 NEXT M% 8550 CZEROJ N%J sCZE^O( N%| *SUM 8560 NEXT N% 8570 RETURN 8580 * 9000 '4t4r4r4r4t4r4c4r4r4t4t4r4c4c4Ht[4r4t4c4t4r*4c4nir4c4t4[4nir4c4r4r4c*4c4r4r4[4c*4nk*************** *************** 9010 'Подпрограмма вычисления JO и Л по полиномиальной аппроксимации 9020 ' входные переменные: X, ORDER% 9030 'выходные переменные: BESSJO или BESSJ1 9040 ' глобальные переменные: нет 9050 'локальные переменные: TEMP, ТЕМР2, V, Y2 9060 *************** 9070 Y=X/3 9080 9
Программы для примеров 349 9090 IF ABS(X)>3 THEN GOTO 9240 9100 Y2sY*Y 'область X<3 9110 IF ORDER%s1 THEN GOTO 9180 9120 TEMPs-. 0039444+o 0002UY2: TEMPs. 0444479+Y2*TEMP ' JO 9130 TEMPs-. 3163866+Y2*TEMP: TEMPs1.2656208#+Y2*TEMP 9140 TEMPs-2.2499997#+Y2*TEMP 9150 BESSJ0s1+Y2*TEMP 9160 RETURN 9170 ' 9180 TEMPs-3.1761E-04+1.109E-05*Y2: TEMP=4.43319E-03+Y2*TEMP ' JI 9190 TEMPs-3.954289E-02+Y2*TEMP: TEMPs. 21093573*+Y2»TEMP 9200 TEMPs-. 56249985tt+Y2*TEMP 9210 BESSJ1sX*(. 5+Y2*TEMP) 9220 RETURN 9230 ' 9240 Ysl/Y 'область X>3 9250 IF ORDER%=1 THEN GOTO 9350 9260 TEMPs-7.2805E-04+1.4476E-04*Y: TEMPsl. 37237E- 03+TEMP*Y ' JO 9270 TEMPs-9.512E-05+TEMP*Y: TEMPs-. 0055274+TEMP*Y: 9280 TEMPs-7,7E- 07+TEMP*Y: TEMPs. 79788456tt+TEMP*Y 9290 TEMP2s-2.9333E-04+1.3558E-04*Y: TEMP2=-5.4125E-04+TEMP2*Y 9300 TEMP 2s 2.62573E-03+TEMP2*Y: TEMP2=-3.954E-05+TEMP2*Y 9310 TEMP2s-4.166397E-02+TEMP2*Y: TEMP2=X-. 78539816tt+TEMP2*Y 9320 BESSJOsTEMP*COS( TEMPI j ZSQR( X) 9330 RETURN 9340 ' 9350 TEMPsl. 13653E-03-2.0033E-04*Y: TEMPs-2.49511E-03+TEMP*Y rJI 9360 TEMPsl.7105E-04+TEMP*Y: TEMPsl.659667E-02+TEMP*Y 9370 TEMPsl. 56E-06+TEMP«Y: TEMPs.79788456tt+TEMP*Y 9380 TEMP 2s 7.9824E-04-2.9166E-04*Y: TEMP2s7.4348E~04+TEMP2«Y 9390 TEMP2s-6.37879E-03+TEMP2*Y: TEMP2s. 0000565+TEMP2«Y 9400 TEMP2s. 12499612#+TEMP2*Y: TEMP2sX-2.35619449*+TEMP2*Y 9410 BESSJ1sTEMP*COS( TEMP2] /SQR( X] 9420 RETURN 9430 ' 10000 '************************************************************************ 10010 'Подпрограмма абсцисс и весов 20-том. квадратуры Гаусса-Лежандра 10020 ' входные переменные; нет 10030 ' выходные переменные: WLEG, XLEG 10040 ' глобальные переменные: нет 10050 ' локальные переменные: ILEG%
350 Приложение Б 10060 ' ф*********************************************************^**^^^^^^^ 10070 XLEG(1)=. 993128599185094* WLEG( 1 )=. 017614007139152* 10080 XLEG(2)=. 963971927277913# WLEG(2)=. 040601429800386# 10090 XLEG(3)=. 912234428251325* WLEG(3)=. 062672048334109# 10100 XLEG(4)=. 839116971822218* WLEG(4)=. 083276741576704* 10110 XLEG( 5)=. 74633190646015* WLEG( 5)=. 10193011981724* 10120 XLEG( 6)=.636053680726515* WLEG(6)=. 118194531961518# 10130 XLEG(7)=. 510867001950827* j WLEG(7)=. 131688638449W# 10140 XLEG(8)=. 373706088715419* WLEG(8)=. 142096109318382# 10150 XLEG(9)=. 227785851141645* WLEG(9)=. 149172986472603# 10160 XLEG(10)=. 076526521133497# WLEG(10)=. 152753387130725# №170 FOR ILEG%^1 TO W 'поскольку веса и абсциссы №180 XLEG( 21- ILEG%}=-XLEG( ILEG%) ' всегда соответственно 10190 WLEG( 21- ILEG%)=WLEG( ILEG%) ' четные и нечетные функции, 10200 NEXT ILEG% ' то другая половина массива 10210 RETURN ' заполняется тривиально Ю220 У 11000 9 Al******^***********^******. 11010 9 Подпрограмма обращения симметрической матрицы A*(N%, N%) 11015 ' методом исключения । Гаусса-Жордана 11020 ' Обратная матрица А* получается на месте исходной» 11030 9 В основной программе необходимо описать размерность матрицы А* 11035 ’ и рабочие массивы R%(N%), P*(N%), Q*(N%). 11040 9 входные переменные: A*, N% 1105© 9 вышдные переменные: A* 11060 в глобальные переменные: F*,Q#, R% 11070 9 локальные переменные: BIG, 1%, г % к%, HVOT1*, TEST 11080 11090 FOR J%s1 ТО N% *R%s:O указывает на то^ 1110© ' что строка уже исключена 11110 NEXT 1% 11Н0 9 нт FOR t%=1 TO N% 'цикл но строкам 11140 K%=0: BIG=0 'ведущий ” макс, диагональный 11150 FOR J%=1 TO H% ' элемент из необнуленных строк 11160 * THEN GOTO 11200 1100 iiw® № TESf«-BiG THEN GOTO 11200 11200 NEXT J% 11210 9
Программы для примеров 331 11210 11230 11240 11250 11260 11270 11280 11290 1Ш0 11310 1Ш0 1030 1040 11350 11360 11370 11380 11390 юоо 11410 11420 11430 11440 11450 11460 1070 11480 11490 11500 11510 11520 11530 11540 11550 11560 11570 11580 11590 mod 12006 12010 IF К%=0 THEN GOTO 11580 'все диаг. элем.^0; А* вырождена IF l%=1 THEN PIVOT1#=A#(K%,К%) 'макс. диаг. элемент А* IF ABS(A#(K%,K%)/PIVOT1#)<1E-14 THEN GOTO 11580'А* плохо ' обусловлена R%(K%)=:0: О#(К%)=1/А#(К%,К%|'начало исключения этой строки Р#(К%|=1: А#(К%,К%)=0 IF К%=1 THEN GOTO 11360 FOR J%=1 TO K%-1 'элементы выше диагонального Q*u%l =А*( J%. К% j »Q#( K%| IF R%(J%)=1 THEN Q#[J%)=-Q#[J%) A»|J%,K%)=0 NEXT J% 9 IF K%=N% THEN GOTO 11440 FOR J%=K%+1 TO N% 'элементы правее диагонального P*(J%]=A#(K%,J%] Q#(J%]=-A#(K%,J%).Q#|K%| IF R%P%I=O THEN P#(J%r-P*|J%] A*(K%,J%)=0 NEXT '.% 9 FOR J%=1 TO N% 'преобразование всей A# FOR K%=J% TO N% A*| J%. K%)=A#| J%, K%| +P#| J%] *Q*|K%J NEXT K% NEXT J% NEXT 1% r FOR J%=2 TO N% 'симметризация A#"M FOR K%=1 TO J%-1 NEXT K% NEXT J% r RETURN BEEP: PRINT “ФАТАЛЬНАЯ ОШИБКА ПРИ ОБРАЩЕНИИ МАТРИЦУ"; END i ^Ьдо^чсЯ^й'ДО^еФееедедееьдеФ&Фезддоеде*********************************** 'Подпрограмма выводе экрана-заставки
352 Приложение Б 12020 ’ входные переменные: нет 12030 ' выходные переменные: GRAPHICS%, MONO% 12040 ' глобальные переменные: нет 12050 ' локальные переменные: G$, M$, ROW% 12060 12070 SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме 12080 9 12090 LOCATE 1,30: COLOR 15 'вывод на экран названия книги 12Ш PRINT "COMPUTATIONAL PHYSICS"; W10 LOCATE 2,39: COLOR 7 12120 PRINT "by”; 12130 LOCATE 3,32: PRINT "Steven E. Koonin"; 12140 LOCATE 4,15 12150 PRINT "Copyright 19&5, Addison*-Wesley Publishing Company"; 12160 * 12170 LOCATE 5r10 f рисование рамки 12180 PRINT CHR$(201)+STRING$(59,205)+CHR$(187); 12190 FOR ROW%=6 TO 19 12200 LOCATE ROW%,10: PRINT CHR$(186); 12210 LOCATE ROW%,70: PRINT CHR$(186); 12220 NEXT ROW% 12230 LOCATE 20,10 12240 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); 12250 * 12260 COLOR 15 'вывод заголовка программы и т.д. 12270 LOCATE 7,36: PRINT "ПРИМЕР 5"; 12280 COLOR 7: LOCATE 10,15 12290 PRINT "Определение плотности электрического заряда в ядре"; 12300 LOCATE 13,35: PRINT 12310 LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." 12320 LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." 12330 12340 г LOCATE 19,13: BEEP 'запрос конфигурации дисплея 12350 INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ 12360 IF LEFT$(G$, 1)="у" OR LEFT$(G$,1)="n" GOTO 12390 12370 LOCATE 19,13: PRINT SPACE$(57): BEEP 12380 LOCATE 18,35: PRINT "Повторите...": GOTO 12340 12390 IF LEFT$(G$,1)="y" GOTO 12420 12400 GRAPHICS%=0: MONO%=-1 12410 GOTO 12510 12420 GRAPHICS%=-1
Программы для примеров 353 12430 12440 12450 12460 12470 12480 12490 12500 12510 12520 12530 12540 12550 12560 12570 12580 12590 12600 12610 12620 12630 12640 12650 12660 12670 13000 13010 13020 13030 13040 13050 13060 13070 13080 13090 13100 13110 14000 14010 14020 14030 LOCATE 18,15: PRINT SPACE$(55) LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$, 1)="у" OR LEFT$(M$, 1)="n" GOTO 12490 'проверка ответа LOCATE 18,35: PRINT "Повторите...": GOTO 12440 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 f LOCATE 21,13 PRINT "В данной программе определяется плотность заряда ядра"; LOCATE 22,10 PRINT "путем анализа сечений упругого рассеяния электронов на ядре."; LOCATE 23,18 PRINT "Плотность заряда разлагается в ряд по синусам"; LOCATE 24,21 PRINT "в области, ограниченной радиусом Rmax."; LOCATE 25,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 12610 LOCATE ,,0 f IF MONO% AND GRAPHICS^ THEN GOSUB 14000'переход в текстовый ' ' режим RETURN 'Подпрограмма переключения с текстового дисплея на графический входные переменные: нет выходные переменные: нет глобальные переменные: нет локальные переменные: нет '^fc**********^********************************************************** DEF SEG=0 POKE &H410, (PEEK(£H410) AND &HCF) OR &H10 SCREEN 0: WIDTH 80: LOCATE ,,0: SCREEN 2,,0,0 RETURN f f ^slc*****^*^************************************************^**^*^*** 'Подпрограмма переключения с графического дисплея на текстовый ' входные переменные: нет ' выходные переменные: нет 23—1650
354 14С40 14050 14060 14070 14080 14090 14100 14110 15000 15010 15020 15030 >5U40 15050 15060 15070 15080 15090 15 WO 15110 ВШ 15130 15140 15150 15160 15170 15180 15190 15200 15210 15220 15230 15240 15250 15260 15280 15290 15300 ШЛО 15320 Приложение Б 1 глобальные переменные: нет ’локальные переменные: нет s ^^^^«ф^^^^Кс^^Ко»:#^*^^^******************************************* DEF SEG=0 POKE &H410, (PEEK(£H410) OR &H30) SCREEN 0: WIDTH 80: LOCATE ,,0 RETURN " ^^t***************^*********^***************************************** 'Данные для ядра 40Са при энергии пучка 400.0 Мэв. ' Каждая строка, начиная со второй, содержит данные для двух ’ экспериментальных точек: угол рассеяния в лабораторной системе s координат (в градусах), сечение и его погрешность (в мбарнах) * ф^^^ф****************************************************************** DATA 40Са, 20,40,400.00,100 DATA 15.129,0.129Е+02,0.388Е+00, DATA 17.612,0.448Е+01,0.151Е+00, DATA 20.083,0.148Е+01,0.444Е-01, DATA 22.537,0.486E+00,0.146E-01, DATA 24.925,0.150E+00,0.451E-02, DATA 27.391,0.398E-01,0.128E-02, DATA 28.543,0.176E-01,0.527E-03, DATA 29.786,0.875E-02,0.263E-03, DATA 30.962,0. 365E-02,0.110E-03, DATA 32.023,0.261E-02,0.4O3E-O3, DATA 33.285,0.146E-02,0.438E-04, DATA 34.488,0.133E-02,0.400E-04, DATA 35.615,0.141EW2,0.423E-04, DATA 36.797,0.138E-02,0.415E-04, DATA 37.794,0.134E-02,0.950E-04, DATA 39.734,0.117E-02,0.824E-04, DATA 41.347,0.935E-03,0.287E-04, DATA 42.417,0.778E-03,0.233E-04, DATA 43.516,0.609E-03,0.183E-04, DATA 44.635,0.452E-03,0.136E-04, DATA 45. 611,0.346E 03,0.310E-04, DATA 46, 803,0.257E 03,0.770E-05, DATA 47.797,0.204EW3,0.824E-05, DATA 49.078,0.127E-03,0.521E-05, DATA 49.933,0.826E-04,0.248E-05, DATA 50.974,0.562E-04,0.180E-05, 16.372,0.750E+01,0.225E+00 18.849,0.264E+01,0.846E-01 21.312,0.861E+00,0.258E-01 23.752,0.261E+00,0.783E-02 26.179,0.713E-01,0.214E-02 28.211,0.239E-01,0.309E-02 28.758,0.162E-01,0.518E-03 30.010,0.694E-02,0.225E-03 31.264,0.331E-02,0.112E-03 32.519,0.186E-02,0.627E-04 33.939,0.152E-02,0.108E-03 34.757,0.125E-02,0.527E-04 35.863,0.137E-02,0.945E-04 37.277,0.143E-02,0.544E-04 39.081,0.118E-02,0.353E-04 40.182,0.114E-02,0.342E-04 41.683,0.878E-03,0.611E-04 42.696,0.764E-03,0.268E-04 43.955,0.585E-03,0.175E-04 45.229,0.432E-03,0.161E-04 46.518,0.298E-03,0.134E-04 47.591,0.213E-03,0.213E-04 48.870,0.123E-03,0.408E-05 49.583,0.104E-03,0.105E-04 50.413,0.768E-04,0.316E-05 51.588,0.438E-04,0.625E-05
Программы для примеров 355 15330 DATA 51.986,0.353E-04,0.119E-05, 52.654,0.243E-04,0.120E-05 15340 DATA 52.976,0.214E-04,0.642E-06, 53.605,0.164E-04,0.273E-05 15350 DATA 53.933,0.123E-04,0.516E-06, 54.308,0.109E-04,0.476E-06 15360 DATA 54.936,0.643E-05,0.228E-06, 55.539,0.509E-05,0.229E-06 15370 DATA 56.902,0.233E-05,0.112E-06, 57.684,0.154E-05,0.332E-06 15380 DATA 58.061,0.128E-05,0.536E-07, 59.458,0.121E-05,0.471E-07 15390 DATA 59.747,0.120E-05,0.179E-06, 60.453,0.143E-05,0.545E-07 15400 DATA 61.826,0.191E-05,0.171E-06, 63.423,0.213E-05,0.926E-07 15410 DATA 66.041,0.226E-05,0.181E-06, 68.386,0.191E-05,0.654E-07 15420 DATA 68.734,0.172E-05,0.829E-07, 70.338,0.148E-05,0.134E-06 15430 DATA 71.067,0.123E-05,0.532E-07, 71.588,0.120E-05,0.418E-07 15440 DATA 73.768,0.848E-06,0.461E-07, 74.316,0.664E-06,0.253E-07 15450 DATA 74.729,0.601E-06,0.837E-07, 76.491,0.473E-06,0.250E-07 15460 DATA 77.067,0.394E-06,0.118E-07, 79.227,0.231E-06,0.356E-07 15470 DATA 79.845,0.175E-06,0.524E-08, 80.623,0.142E-06,0.122E-07 15480 DATA 82.650,0.711E-07,0.335E-08, 83.849,0.474E-07,0.137E-07 15490 DATA 84.817,0.309E-07,0.408E-08, 85.486,0.248E-07,0.144E-08 15500 DATA 88.355,0.721E-08,0.467E-09, 89.083,0.611E-08,0.186E-08 15510 DATA 91.011,0.214E-08,0.557E-09, 93.501,0.138E-08,0.578E-09 15520 DATA 95.671,0.668E-09,0.650E-10, 96.041,0.584E-09,0.229E-09 15530 DATA 98.689,0.638E-09,0.334E-09, 101.292,0.621E-09,0.279E-09 15540 DATA 103.398,0.828E-09,0.832E-10, 104.015,0.915E-09,0.450E-09 15550 DATA 105.550,0.882E-09,0.521E-09, 109.695,0.561E-09,0.234E-09 15560 15570 DATA r 116.507,0.836E-10,0.215 E-10, 123.719,0.511E-11,0.299E-11 16000 ************************************************************************* 16010 'данные для ядра 58Ni при энергии пучка 449.8 Мэв 16020 16030 ************************************************************************* DATA 58Ni, 28,58,449.8,82 16040 DATA 14.743,0.125E+02,0.258E+00, 16.073,0.609E+01,0.122E+00 16050 DATA 17.399,0.310E+01,0.620E-01, 18.723,0.136E+01,0.273E-01 16060 DATA 20.044,0.587E+00,0.117E-01, 21.361,0.246E+00,0.492E-02 16070 DATA 22.674,0.986E-01,0.197E-02, 23.983,0.391E-01,0.782E-03 16080 DATA 25.288,0.202E-01,0.405E-03, 26.588,0.144E-01,0.302E-03 16090 DATA 27.884,0.131E-01,0.282E-03, 29.174,0.124E-01,0.278E-03 16100 DATA 30.459,0.113E-01,0.228E-03, 31.738,0.918E-02,0.184E-03 16110 DATA 33.012,0.722E-02,0.144E-03, 34.279,0.527E-02,0.105E-03 16120 DATA 35.539,0.347E-02,0.695E-04, 36.793,0.226E-02,0.452E-04 16130 DATA 37.117,0.199E-02,0.597E-04, 38.039,0.133E-02,0.267E-04 16140 DATA 39.278,0.760E-03,0.152E-04, 40.510,0.395E-03,0.791E-05 16150 DATA 41.733,0.201E-03,0.401E-05, 42.834,0.110E-03,0.330E-05 23'
356 Приложение Б 16160 DATA 42.948,0.823E-04,0.167E-05, 44.154,0.374E-04,0.130E-05 16170 DATA 44.963,0.254E-04,0.759E-06, 45.351,0.193E-04,0.133E-05 16180 DATA 46.538,0.168E-04,0.156E-05, 47.715,0.221E-04,0.197E-05 16190 DATA 47.971,0.195E-04,0.582E-06, 48.883,0.241E- 04,0.173E-05 16200 DATA 49.870,0.251E-04,0.753E-06, 49.920,0.249E-04,0.753E-06 16210 DATA 49.950,0.249E-04,0.753E-06, 49.980,0.241E- 04,0.753E-06 16220 DATA 50.000,0.246E-04,0.753E-06, 50.020,0.253E-04,0.753E-06 16230 DATA 50.040,0.256E-04,0.154E-05, 50.120,0.242E-04,0.753E-06 16240 DATA 51.185,0.231E-04,0.146E-05, 51.969,0.231E-04,0.753E-06 16250 DATA 52.149,0.238E-04,0.753E-06, 52.320,0.232E-04,0.128E-05 16260 DATA 53.442,0.178E-04,0.117E-05, 53.918,0.192E-04,0.577E-06 16270 DATA 53.968,0.182E-04,0.544E-06, 54.118,0.190E-04,0.577E-06 16280 DATA 54.553,0.162E-04,0.101E-05, 55.967,0.129E-04,0.390E-06 16290 DATA 56.736,0.104E-04,0.489E-06, 58.166,0.786E-05,0.237E-06 16300 DATA 58.865,0.563E-05,0.367E-06, 59.965,0.425E-05,0.128E-06 16310 DATA 60.937,0.316E-05,0.178E-06, 62.004,0.197E-05,0.596E-07 16320 DATA 62.948,0.143E-05,0.197E-06, 63.973,0.856E-06,0.299E-07 16330 DATA 64.894,0.516E-06,0.538E-07, 66.013,0.274E-06,0.110E-07 16340 DATA 66.772,0.201E- 06,0.349E-07, 66.972,0.142E-06,0.645E-08 16350 DATA 67.002,0.170E-06,0.135E-07, 67.972,0.691E-07,0.449E-08 16360 DATA 68.577,0.650E-07,0.211E-07, 69.971,0.387E-07,0.290E-08 16370 DATA 70.305,0.499E-07,0.212E-07, 70.770,0.419E-07,0.272E-08 16380 DATA 71.952,0.364E-07,0.119E-07, 72.070,0.321E-07,0.321E-08 16390 DATA 72.969,0.369E-07,0.277E-08, 76.018,0.429E-07,0.343E-08 16400 DATA 78.617,0.277E-07,0.222E-08, 80.696,0.217E-07,0.196E-08 16410 DATA 82.925,0.113E-07,0.136E-08, 85.974,0.318E-08,0.474E-09 16420 DATA 89.702,0.990E-09,0.203E-09, 91.971,0.117E-09,0.698E-10 16430 DATA 96.879,0.190E-09,0.614E-10, 100.777,0.302E- 09,0.108E- 09 16440 16450 DATA r 104.485,0.362E-09,0.105E-09, 113.789,0.909E-10,0.455E-10 17000 ' ************************************************************************ 17010 'данные для ядра 208Pb при энергии пучка 502.0 МэВ 17020 17030 '************************************************************************ DATA 208Pb, 82,208,502.00,93 17040 DATA 8.368,0.165E+04,0.246E+02, 9.952,0.457E+03,0.106E+02 17050 DATA 10.436,0.284E+03,0.717E+01, 11.431,0.136E+03,0.446E+01 17060 DATA 12.496,0.573E+02,0.146E+01, 13.463,0.288E+02,0.279E+00 17070 DATA 13.984,0.200E+02,0.444E+00, 14.544,0.152E+02,0.390E+00 17080 DATA 15.040,0.113E+02,0.262E+00, 15.924,0.749E+01,0.104E+00 17090 DATA 16.579,0.565E+01,0.130E+00, 17.070,0.486E+01,0.153E+00 17100 DATA 17.503,0.392E+01,0.889E-01, 18.070,0.307E+01,0.991E-01
Программы для примеров 357 17110 17120 17130 17140 17150 17160 17170 17180 17190 17200 17210 17220 17230 17240 17250 17260 17270 17280 17290 17300 17310 17320 17330 17340 17350 17360 17370 17380 17390 17400 17410 17420 17430 17440 17450 17460 17470 17480 17490 17500 17510 DATA 18.446,0.257Е+01,0.236Е- 01, DATA 19.602,0.153Е+01,0.476Е-01, DATA 20.596,0.861 Е+00,0.196Е-01, DATA 21.590,0.508Е+00,0.157Е-01, DATA 22.579,0.245E+00,0.535E-02, DATA 23.563,0.132E+00,0.409E-02, DATA 24.439,0.686E-01,0.679E-03, DATA 25.514,0.440E-01,0.973E-03, DATA 26.461,0.331E-01,0.325E-03, DATA 27.441,0.289E-01,0.652E-03, DATA 28.934,0.242E-01,0.568E-03, DATA 30.071,0.155E-01,0.514E-03, DATA 32.071,0.654E-02,0.176E-03, DATA 33.962,0.202E-02,0.484E-04, DATA 34.862,0.115E-02,0.312E-04, DATA 36.071,0.649E-03,0.170E-04, DATA 37.071,0.509E-03,0.146E-04, DATA 37.975,0.489E-03,0.146E-04, DATA 38.961,0.476E-03,0.190E-04, DATA 40.011,0.410E-03,0.164E-04, DATA 41.721,0.288E-03,0.977E-05, DATA 42.952,0.159E-03,0.478E-05, DATA 44.062,0.878E-04,0.269E-05, DATA 45.880,0.290E-04,0.870E-06, DATA 46.930,0.172E-04,0.517E-06, DATA 48.948,0.129E-04,0.388E-06, DATA 50.628,0.138E-04,0.156E-05, DATA 52.013,0.112E-04,0.448E-06, DATA 52.956,0.905E-05,0.272E-06, DATA 54.974,0.450E-05,0.149E-06, DATA 56.963,0.165E-05,0.676E-07, DATA 58.982,0.568E-06,0.244E-07, DATA 60.971,0.357E-06,0.186E-07, DATA 62.949,0.288E-06,0.178E-07, DATA 66.017,0.118E-06,0.946E-08, DATA 68.965,0.365E-07,0.437E-08, DATA 72.933,0.615E-08,0.117E-08, DATA 76.940,0.367E-08,0.845E-09, DATA 80.928,0.495E- 09,0.223E- 09, DATA 87.015,0.115E-10,0.115E-09 19.070,0.191E+01,0.612E-01 20.070,0.116E+01,0.215E+00 21.070,0.640E+00,0.161E-01 21.918,0.370E+00,0.396E-02 23.070,0.178E+00,0.444E-02 24.070,0.875E-01,0.353E-02 25.070,0.541E-01,0.166E-02 26.070,0.371E-01,0.109E-02 27.070,0.311E-01,0.817E-03 28.071,0.264E-01,0.708E-03 29.266,0.197E-01,0.187E-03 31.071,0.106E-01,0.304E-03 33.054,0.382E-02,0.851E-04 34.415,0.149E-02,0.195E-04 35.753,0.703E-03,0.215E-04 36.635,0.537E-03,0.816E-04 37.508,0.510E-03,0.131E-04 38.371,0.480E-03,0.181E-04 39.588,0.408E-03,0.130E-04 40.899,0.331E-03,0.909E-05 42.062,0.261E-03,0.180E-04 43.330,0.130E-03,0.477E-05 44.961,0.540E-04,0.162E-05 46.407,0.227E-04,0.187E-05 48.063,0.128E-04,0.495E-06 50.013,0.133E-04,0.531E-06 50.957,0.137E-04,0.410E-06 52.063,0.115e-04,0.433e-06 54.064,0.620E-05,0.332E-06 56.064,0.273E-05,0.166E-06 58.064,0.804E-06,0.777E-07 59.961,0.409E-06,0.204E-07 62.065,0.285E-06,0.287E-07 64.918,0.201E-06,0.141E-07 66.977,0.835E-07,0.752E-08 70.914,0.987E-08,0.139E-08 74.952,0.547E-08,0.126E-08 78.939,0.233E-08,0.562E-09 83.013,0.379E-09,0.190E-09
358 Приложение Б Б. 6. ПРИМЕР 6 Данная программа решает двумерное уравнение Лапласа на равномерной прямоугольной сетке итерационным методом Гаусса—Зейдел я. Размеры разностной сетки и начальное значение потенциала на ее границе за- даются в подпрограмме 2000, а в подпрограмме 3000 задается значение параметра релаксации. После этого с клавиатуры можно ввести в любом узле сетки краевые условия Дирихле (подпрограмма 6000) и, при необ- ходимости, выделить некоторую подобласть (подпрограмма 9000), по которой будет проводиться релаксация. Далее выполняется основная часть программы— итерационный процесс (цикл 370—440), при этом уравнение (6.17) решается последовательно в каждом узле сетки (под- программа 13000). После каждого прохода по всем узлам на экран вы- водится сетка в виде массива цветных символов (подпрограмма 7000). Кроме того, выводится текущее значение энергии, вычисленной по фор- муле (6.7), и ее изменение относительно предыдущей итерации (строки 13240, 13290), а также максимальное относительное изменение потен- циала в отдельном узле сетки за текущую итерацию. Для демонстрации работы этой программы задайте сетку из 15 уз- лов по горизонтали и вертикали, потенциал Р на границе равным 1 и параметр релаксации OMEGA =1,5. Пользуясь курсором, задайте крае- вое условие для потенциала вблизи центра области равным 9 и откажи- тесь от подобласти. Последующий итерационный процесс покажет разви- тие ожидаемой картины распределения потенциала. 10 ' *************************************************************************** 20 'Пример 6: Решение двумерного уравнения Лапласа 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 30 '****************************♦********************************************** 40 GOSUB 15000 'вывод экрана-заставки 50 ' 60 FIRST%=-1 70 DIM INTERIORS 10) 80 DIM BOUNDARY%(10) 90 DIM BUFFER%(24,80) 100 DIM P(24,80) 110 OMEGA%=-1 120 LATTICE%=-1 130 LSAVE%=0 'определение констант и функций 'цвета для внутренней области 'цвета для границ 'положение в буфере экрана 'значения потенциала 'флаг ввода параметра omega 'флаг ввода размеров сетки 'флаг запоминания размеров сетки
Программы для примеров_ ЗЬ9 140 BC%=0: BCSAVE%=0 'сохранение сетки, измииен^ кр /сл. 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530 PSAVE%=0 CLR%=-1 IF IF IF IF IF IF IF FIRST% THEN GOSUB 1000 LATTICE% AND NOT BCSAVE% OMEGA% THEN GOSUB 3000 LATTICE% THEN GOSUB 4000 FIRST% THEN LATTICE% OR SUBLATTICE% GOSUB 11000 GOSUB 12000 GOSUB 5000 THEN GOSUB GOSUB 9000 BC% THEN OMEGA%=0: BC%=0: PSAVE%=0: CLR%=0: LOCATE ,,0: K$=INKEY$ IF NOT SUBL% X1%=SUBX1%: Y1%=SUBY1%: 'сохранение старых значений Phi 'флаг очистки экрана ' печать предупреждающего сообщения THEN GOSUB 2000 'ввод сетки 'ввод OMEGA 'инициализация массива Р 'вывод инструкции по вводу 6000 'ввод Р с экрана 'ввод подобласти с экрана ’начальное приближение для 'вывод на экран инструкций LSAVE%-0 'сброс всем LATTICE%=0: SUBLATTICE%=0: BCSAVE%=0 ITERATION%=0 THEN GOTO 370 X2%=SUBX2% Y2%=SUBY2% WHILE K$o"e" ITERATION%=ITERATION%+1 OLDE=ENERGY: ENERGY=0 и INIT% флагов 'счетчик итераций начинается с 0 'прием нажатия клавиши 'если имеется подобласть, то ' пределы по X и Y отличаются ' от всей области 'повторение цикла до нажатия <е> 'запоминание предыдущей энергии OLDDELP=DELTАРМАХ: DELTAPMAX=0 'предыдущее макс, изменение Р GOSUB 13000 'релаксация по области K$=INKEY$ WEND 'прием нажатия клавиши IF NOT SUBL% THEN GOTO 510 X2%=XLAST% Y2%=YLAST% PRINT SPACE$(10); GOTO 310 X1%=XFIRST%: Y1%=YFIRST%: LOCATE 25,59: SUBL%=0: GOSUB 14000 GOTO 180 'если имеется подобласть, то ' после одного нажатие клавиши <е> ' начинается цикл для всей области 'варианты продолжения работы 'возврат к началу расчета 1000
360 Приложение Б 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 'Подпрограмма печати предупреждения о применении оператора РОКЕ ' входные переменные: нет 'выходные переменные: BOUNDARY%(I%), INTERIOR%(I%), POKING% ' глобальные переменные: GRAPHICS% 'локальные переменные: ANSWERS, OPTS ************************************************************************** CLS LOCATE 1,33,0 PRINT "ВНИМАНИЕ" LOCATE 3,11 PRINT "Для ускорения вывода на экран программа использует оператор"; LOCATE 5,11 PRINT "РОКЕ, заносящий данные прямо в память. Адрес в РОКЕ задает"; LOCATE 7,11 PRINT "(синтаксис: РОКЕ адрес,данные) смещение в текущем сегменте,"; LOCATE 9,11 PRINT "указанном в операторе DEF SEG. Программа устанавливает этот"; LOCATE 11,11 PRINT "сегмент на начало буфера графического или текстового экрана"; LOCATE 13,11 PRINT "в IBM PC. Если в вашем компьютере распределение памяти"; LOCATE 15,11 PRINT "отличается от IBM, то РОКЕ может затереть важные данные в"; LOCATE 17,11 PRINT "ПЗУ. Для обеспечения нормальной работы посмотрите в своем"; LOCATE 19,11 PRINT "руководстве по Бейсику (оператор DEF SEG) адрес сегмента"; LOCATE 21,11 PRINT "буфера экрана и сравните с указанным в строках 1450 и 1540."; * LOCATE 24,1 'задание метода вывода на экран PRINT "Выберите метод вывода: РОКЕ (1) или более медленный,"; INPUT; " надежный LOCATE (2)"; OPTS IF ОРТ$="1" OR ОРТ$="2" THEN GOTO 1400 LOCATE 25,19: BEEP PRINT "Повторите еще раз, правильный ответ 1 или 2"; LOCATE 24,1: PRINT SPACE$(79); GOTO 1320 IF OPT$="1" THEN POKING%=-1 ELSE POKING%=0 IF NOT POKING% THEN RETURN
Программы для примеров 361 1420 1430 1440 1450 1460 1470 1480 1490 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590 1600 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 IF NOT GRAPHICS% THEN GOTO GOSUB 16000 DEF SEG=&HB800 RESTORE 1510 FOR l%=0 TO 9 READ INTERIOR%(I%) 1540 'переключение экранов 'определение сегмента видеопамяти 'задание массивов для цветов BOUNDARY%( l%)=I NTERIOR%( l%)+96 NEXT 1% DATA 4,5,1,3,2,12,13,9,11,10 RETURN DEF SEG=&HB000 FOR 1%=0 ТО 9 INTERIOR%(I%)=2 BOUNDARY%(I%)=11 NEXT 1% RETURN 'определение сегмента видеопамяти 'задание массивов для цветов ' (а именно повышенная ' яркость или нормальная) ' ************************************************************************* 'Подпрограмма ввода Nx, Ny, INIT% ' входные переменные: LATTICE%, LSAVE% ' выходные переменные: I NIT%, STP%, XFIRST%, XLAST%, YFIRST%, YLAST% глобальные переменные: нет окальные переменные: NX%, NY% ************************************************************************** CLS IF LSAVE% THEN GOTO 2380 LOCATE 3,12 'вывод вводной информации PRINT "Данная программа решает уравнение Лапласа на равномерной"; LOCATE 4,21 PRINT "прямоугольной сетке с единичным шагом."; » LOCATE 6,19 'ввод NX INPUT; "Введите число точек по горизонтали (<=79)";NX% IF NX%>0 AND NX%<80 GOTO 2230 LOCATE 7,29: BEEP PRINT "Повторите, 0 < Nx <= 79"; LOCATE 6,1: PRINT SPACE$(80); 2210 GOTO 2150
362 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 2430 2440 2450 2460 2470 3000 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 Приложение Б LOCATE 9,21 'ввод NY INPUT; "Введите число точек по вертикали (<=23)";NY% IF NY%>0 AND NY%<=23 THEN GOTO 2310 LOCATE 10,29: BEEP PRINT "Повторите, 0 < Ny <=24"; LOCATE 9,1: PRINT SPACE$(80); GOTO 2230 i YFIRST%=(24-NY%)/2: YLAST%=YFIRST%+NY%-1 'центрирование сетки IF NX%>39 GOTO 2350 'при возможности XFlRST%=(79-2*NX%)/2: XLAST%=XFIRST%+2*(NX%-1) ' столбцы разделя- STP%=2: GOTO 2380 ' ются пробелом XFIRST%=(81-NX%)/2: XLAST%=XFlRST%+NX%-1 STP%=1 i LOCATE 12,17 'ввод потенциала P на границе INPUT; "Задайте начальное значение Р на границе (1-35)"; INIT% IF INIT%>=1 AND INIT%<=35 THEN GOTO 2460 LOCATE 13,36: BEEP PRINT "Повторите"; LOCATE 12,1: PRINT SPACE$(79); GOTO 2380 f RETURN i * ************************************************************************* 'Подпрограмма ввода OMEGA ' входные переменные: BC%, FIRST%, LATTICE% ' выходные переменные: OMEGA ' глобальные переменные: нет ' локальные переменные: нет ************************************************************************** IF NOT LATTICE% THEN CLS 'очистка экрана i IF FIRST% GOTO 3120 'ввод OMEGA LOCATE 19,20 PRINT USING "Последнее значение Omega было равно #.##";OMEGA; LOCATE 18,18 PRINT "Параметр Omega управляет скоростью релаксации"; LOCATE 20,33
Программы для примеров 363 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 4000 4010 4020 4025 4030 4040 4050 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 PRINT "0 < OMEGA <= 2"; LOCATE 22,36 INPUT; "OMEGA = IF OMEGA>0 AND LOCATE 23,36: PRINT "Повторите' LOCATE 22,1: PRINT SPACE$(79); GOTO 3160 "; OMEGA OMEGA<=2 GOTO 3240 ВЕЕР RETURN 'Подпрограмма ввода начальных значений в массивы Р и BUFFER% ' входные переменные: 'выходные ' глобальные 'локальные переменные: переменные: переменные: BCSAVE%, INIT%, STP%, XFIRST%, XLAST% YFIRST%, YLAST% BUFFER%(I%,J%), P(I%,J%) нет COL%, ROW% IF NOT BCSAVE% THEN GOTO 4150 'при сохранении краевых FOR ROW%=YFIRST% TO YLAST% ' условий обнуляются FOR COL%=XFIRST% TO XLAST% STEP STP% ' все неграничные узлы IF P(ROW%,COL%)>=0 THEN P(ROW%,COL%)=0 NEXT COL% NEXT ROW% RETURN FOR ROW%=YFIRST% TO YLAST% FOR COL%=XFIRST% TO XLAST% STEP STP% 'адрес в буфе- BUFFER%(ROW%,COL%)=((ROW%-1)*80+(COL%-1))*2 ' ре экрана Р( ROW%, COL%)=0 ' обнуление NEXT COL% ' всех узлов NEXT ROW% FOR ROW%=YFIRST% ТО YLAST% Р( ROW%, XFIRST%)=-1N IT% P( ROW% XLAST%)=-1N IT% NEXT ROW% 'установка начального значения ' потенциала во всех узлах на ' границе сетки FOR COL%=XFIRST% ТО XLAST% P(YFIRST%,COL%)=-INIT% STEP STP% 'отрицательное значение P ' указывает, что узел
364 Приложение Б 4290 4300 4310 4320 4330 5000 5010 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 P(YLAST%,COL%)=-INIT% ' является граничным NEXT COL% 9 RETURN 9 'фффффффффффффффффффффффффффффффффф4и|г***********************************фф 'Подпрограмма вывода инструкций по изменению краевых условий входные переменные: нет 'выходные переменные: нет ' глобальные переменные: нет 'локальные переменные: нет 'ффХсфффффф**************************************************************** CLS 9 LOCATE 1,14,0 PRINT "Начальные краевые условия будут выводиться на экран и"; LOCATE 3,19 PRINT " вы сможете изменить их следующим образом:"; LOCATE 5,16: PRINT "Для перемещения курсора пользуйтесь "; PRINT "клавишами "+CHR$(24)+CHR$(25)+CHR$(26)+CHR$(27); LOCATE 7,17 PRINT "В любой узле можно ввести символы 1-9, a-z, что"; LOCATE 9,14 PRINT "соотвествует значениям краевого условия Дирихле 1-35"; LOCATE 11,15 PRINT "Ввод в любом узле отменит в нем краевые условия"; LOCATE 13,22 PRINT "По окончании нажмите клавишу <Enter>"; LOCATE 16,3 PRINT "Затем можно указать подобласть, где сначала надо "; PRINT "проводить релаксацию, что"; LOCATE 18,11 PRINT "ускоряет процесс для всей области. Для этого верхний левый"; LOCATE 20,11 PRINT "и нижний правый углы подобласти пометьте знаками '<' и LOCATE 22,11 PRINT "Ошибка удаляется вводом по окончании нажмите <Enter>."; 9 LOCATE 25,23,1 PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 5350
Программы для примеров 365 5360 5370 5380 5390 6000 6010 6020 6025 6030 6035 6040 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 6280 6290 6300 6310 6320 6330 6340 LOCATE „0 г RETURN '********>!'********************зд*******************де**«**************4'*** 'Подпрограмма ввода краевых условий с экрана 'входные переменные: PSAVE%, STP%, XFIRST%, XLAST%, YFIRST%, ' YLAST% 'выходные переменные: SUBL%, SUBLATTICE%, SUBSAVE%, X1%f X2%, Y1%, Y2% 'глобальные переменные: BOUNDARY%(I%), INTERIOR%(I%), POKING% 'локальные переменные: ASKII%, ATT%, COL%, OPTS, P%, ROW% 1 *********************************************************************+^** X1%=XFIRST%: X2%=XLAST% 'задание таких значений, Y1%=YFIRST%: Y2%=YLAST% ' чтобы выводилась вся сетка IF NOT PSAVE% THEN GOSUB 7000 ELSE GOSUB 8000 'вывод сетки LOCATE 24,13 'вывод инструкций PRINT "Введите значения 1-9, a-z; по окончании нажмите <Enter>"; COL%=XFIRST%: ROW%=YFIRST% i LOCATE ROW%, COL%, 1 COLOR 15 K$=INKEY$ IF K$="" THEN GOTO 6180 LOCATE 25,31: PRINT SPACE$(19); r IF LEN(K$)<2 THEN GOTO 6420 K$=RIGHT$(K$,1) начальный курсор в правом верхнем углу курсор - в текущую позицию атрибут для границы ожидание ввода с клавиатуры стирание старого сообщения об ошибке проверка на нажатие клавиши управления курсором IF K$oCHR$(72) THEN GOTO 6290 'стрелка вверх ROW%=ROW%-1 IF ROW%<YFIRST% THEN ROW%=YFIRST% GOTO 6160 IF K$oCHR$(80) THEN GOTO 6330 'стрелка вниз ROW%=ROW%+1 IF ROW%>YLAST% THEN ROW%=YLAST% GOTO 6160 IF K$oCHR$(77) THEN GOTO 6370 'стрелка влево COL%=COL%+STP%

Программы для примеров 367 6760 6770 6780 7000 7010 7020 7025 7030 7040 7050 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 ' только при изменении Omega RETURN I 7 ************************************************************************* 'Подпрограмма вывода сетки на экран 'входные переменные: BUFFER%(I%, J%), CLR%, P(I%,J%), STP%, ' X1%, X2%, Y1%, Y2% ' выходные переменные: нет 'глобальные переменные: BOUNDARY%(I%), INTERIOR%( 1%), POKING% ' локальные переменные: ASKII%, АП%, COL%, МР%, NEG%, Р%, ROW% ************************************************************************** IF CLR% THEN CLS LOCATE „0 IF NOT POKING% THEN GOTO 7250 f FOR ROW%=Y1% TO Y2% 'атрибут граничных и неграничных FOR COL%=X1% TO X2% STEP STP%' узлов различен, чтобы они на P%=ABS(P(ROW%,COL%)) ' экране выглядели по-разному IF Р%<10 THEN ASKII%=P%+48 ELSE ASKII%=P%+87 IF P(ROW%,COL%)=0 THEN ASKII%=46 MP%=P% MOD 10: IF P(ROW%,COL%)<0 THEN NEG%=-1 ELSE NEG%=0 IF NEG% THEN ATT%=BOUND AR Y%(MP%) ELSE ATT%=INTERIOR%(MP%) POKE BUFFER%(ROW%,COL%)+1,ATT% POKE BUFFER%( ROW%, COL%), ASKII% NEXT COL% NEXT ROW% r RETURN t FOR ROW%=Y1%’TO Y2% 'граничные и неграничные узлы FOR COL%=X1% TO X2% STEP STP%' имеют разные цвета P%=ABS( P( ROW%, COL%)) IF P%<10 THEN ASKII%=P%+48 ELSE ASKII%=P%+87 IF P( ROW%, COL%)=0 THEN ASKII%=46 IF P(ROW%,COL%)<0 THEN COLOR 15 ELSE COLOR 7 LOCATE ROW%,COL%, 0: PRINT CHR$(ASKII%); NEXT COL% NEXT ROW% f COLOR 7: RETURN
368 Приложение Б 8000 8010 8020 8030 8040 8050 §060 8070 8080 8100 8110 8120 8130 8140 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 8300 8310 8320 8330 8340 8350 9000 9010 9020 9030 9040 * 4с>|с>|м|с4с>|н|с>|п|с>|с>|с>|с***********************************************************4с* 'Подпрограмма вывода сетки на экран в случае сохранения Р 'входные переменные: BUFFER%(I%, J%), CLR%, STP%, ' XFIRST%, XLAST%, YFIRST%, YLAST% ' выходные переменные: нет 'глобальные переменные: BOUNDARY%( 1%), INTERIOR%(I%), POKING% 'локальные переменные: ASKII%, ATT%, COL%, MP%, P%, ROW% 'дододедедеФздзддедеФдедеФдоде^^ФФ*************************************** IF CLR% THEN CLS LOCATE „0 IF NOT POKING% THEN GOTO 8250 r FOR ROW%=YFIRST% TO YLAST% FOR COL%=XFIRST% TO XLAST% STEP STP% 'неграничные узлы IF P(ROW%,COL%)<0 P%=-P(ROW%,COL%)' выводятся как IF P%<10 THEN ASKII%~P%+48 ELSE ASKII%=P%+87 ' но значения P IF P(ROW%, COL%)>0 THEN ASKII%=46 ' не теряются MP%-P% MOD 10 IF ASKII%=46 THEN ATT%=INTERIOR%(0) ELSE ATT%=BOUNDARY%(MP%) POKE BUFFER%(ROW%,COL%), ASKII% POKE BUFFER%(ROW%,COL%)+1, ATT% NEXT COL% NEXT ROW% RETURN r FOR ROW%=YFIRST% TO YLAST% FOR COL%=XFIRST% TO XLAST% STEP STP% IF P(ROW%,COL%)<0 THEN P%=-P(ROW%,COL%) IF P%<10 THEN ASKII%=P%+48 ELSE ASKII%=P%+87 IF P(ROW%,COL%)>0 THEN ASKII%=46 IF ASKII%=46 THEN COLOR 7 ELSE COLOR 15 LOCATE ROW%,COL%: PRINT CHR$(ASKII%); NEXT COL% NEXT ROW% COLOR 7: RETURN r '**********************************♦************************************** 'Подпрограмма ввода параметров подобласти 'входные переменные: BUFFER%(I%,J%), P(I%,J%), STP%, XFIRST%, ' XLAST%, YFIRST%, YLAST% 'выходные переменные: SUBX1%, SUBX2%, SUBY1%, SUBY2%
Программы для примеров 369 9050 9060 9070 9080 9090 9100 9110 9120 9130 9140 9150 9160 9170 9180 9190 9200 9210 9220 9230 9240 9250 9260 9270 9280 9290 9300 9310 9320 9330 9340 9350 9360 9370 9380 9390 9400 9410 9420 9430 9440 9450 'глобальные переменные: BOUNDARY%( 1%), INTERIOR^ 1%), POKING% 'локальные переменные: ASKII%, ATTRIBUTE%, ВОТН%, COL%, CORRECT%, DELX%, DELY%, K$, ONEDIM%, P%, ROW%, SWITCHED%, SUB1%, SUB2%, TYPEOVER% SUB1%=0: SUB2%=0 'обнуление флагов LOCATE 24,1: PRINT SPACE$(79); LOCATE 25,1: PRINT SPACE$(79); LOCATE 24,2 'очистка нижней части экрана 'вывод инструкций PRINT "Подобласть вводится знаками '<' и '>' в верхнем левом и"; PRINT " нижнем правом углах."; LOCATE 25,11 PRINT "Для исправления ошибки нажмите по окончании - <Enfer>."; COL%=XFIRST%: ROW%=YFIRST% LOCATE ROW%,COL%, 1 K$=INKEY$ IF K$="" THEN GOTO 9230 'начальный курсор в правом ' верхнем углу 'курсор - в текущую позицию ' ожидание ввода с клавиатуры IF LEN(K$)<2 THEN GOTO 9460 K$=RIGHT$(K$,1) ' проверка на нажатие клавиши ' управления курсором IF K$oCHR$(72) THEN GOTO 9330 'стрелка вверх ROW%=ROW%-1 IF ROW%<YFIRST% THEN ROW%=YFIRST% GOTO 9220 IF K$oCHR$(80) THEN GOTO 9370 'стрелка вниз ROW%=ROW%+1 IF ROW%>YLAST% THEN ROW%=YLAST% GOTO 9220 IF K$oCHR$(77) THEN GOTO 9410 'стрелка влево COL%=COL%+STP% IF COL%>XLAST% THEN COL%=XLAST% GOTO 9220 IF K$oCHR$(75) THEN GOTO 6610 'стрелка вправо COL%=COL%-STP% IF COL%<XFIRST% THEN COL%=XFIRST% GOTO 9220 24- 16b0
370 Приложение Б 9460 9470 9480 9490 9500 9510 9520 9530 9540 9550 9560 9570 9580 9590 9600 9610 9620 9630 9640 9650 9660 9670 9680 9690 9700 9710 9720 9730 9740 9750 9760 9770 9780 9790 9800 9810 9820 9830 9840 9850 9860 IF K$oCHR$(13) THEN 9620 BOTH%=SUB1% AND SUB2% DELX%=SUBX2%-SUBX1% нажатие <Enter> - выход 'убеждаемся, что параметры ' подобласти имеют смысл DELY%=SUBY2%-SUBY1% ONEDIM%=BOTH% AND (DELX%=0 OR DELY%=0) SWITCHED%=BOTH% AND (DELX%<0 OR DELY%<0) AND NOT ONEDIM% CORRECT%=BOTH% AND (DELX%>0) AND (DELY%>0) IF CORRECT% THEN LOCATE „0: COLOR 7: RETURN LOCATE 25,1: PRINT SPACE$(79); LOCATE 25,29: BEEP IF NOT SUB2% THEN PRINT "Укажите нижний правый угол."; IF NOT SUB1% THEN PRINT "Укажите верхний левый угол."; IF ONEDIM% THEN PRINT "Подобласть должна быть двумерной."; IF SWITCHED% THEN PRINT "Повторите; введенные углы отменены"; GOTO 9200 IF K$oCHR$(60) THEN GOTO 9740 'верхний левый угол IF SUB1% THEN GOTO 9700 TYPEOVER%=(SUB2% AND COL%=SUBX2% AND ROW%=SUBY2%) IF TYPEOVER% THEN SUB2%=0 SUB1%=-1 'установка флагов SUBX1%=COL% 'ввод параметров подобласти SUBY1%=ROW% LOCATE ROW%,COL%: PRINT K$;: GOTO 9220 LOCATE 25,1: PRINT SPACE$(79); LOCATE 25,12: BEEP PRINT "Верхний левый угол уже есть, для исправления введите °GOTO 9220 IF K$oCHR$(62) THEN GOTO 9870 'нижний правый угол IF SUB2% THEN GOTO 9820 TYPEOVER%=(SUB1% AND COL%=SUBX1% AND ROW%=SUBY1%) IF TYPEOVER% THEN SUB1%=0 SUB2%=-1 'установка флагов SUBX2%=COL% ' ввод параметров SUBY2%=ROW% LOCATE ROW%, COL%: PRINT K$;: GOTO 9220 LOCATE 25,1: PRINT SPACE$(79); LOCATE 25,12: BEEP PRINT "Нижний правый угол уже есть, для исправления введите GOTO 9220
Программы для примеров 371 9870 9880 9890 9900 9910 9920 9930 9940 9950 9960 9970 9980 9990 10000 10010 11000 11010 11020 11030 11040 11050 11060 11070 11080 11090 11100 11110 11120 11130 11140 11150 11160 11170 11180 11190 11200 11210 11220 11230 11240 11250 IF K$oCHR$(46) THEN GOTO 9220 'ввод исправляет ошибку IF COL%=SUBX1% AND ROW%=SUBY1% THEN SUB1%=0 IF COL%=SUBX2% AND ROW%=SUBY2% THEN SUB2%=0 IF P(ROW%, COL%)<0 THEN GOTO 9930 ASKII%=46: COLOR 7: ATTRIBUTE%=INTERIOR%(0) GOTO 9970 P%=ABS( P( ROW%, COL%)) IF P%<10 THEN ASKII%=P%+48 ELSE ASKII%=P%+87 COLOR 7: ATTRIBUTE%=BOUNDARY%(P% MOD 10) IF NOT POKING% THEN LOCATE ROW%,COL%: PRINT CHR$( ASKII%); IF POKING% THEN POKE BUFFER%(ROW%, COL%), ASKII% IF POKING% THEN POKE BUFFER%(ROW%,COL%)+1f ATTRIBUTE% GOTO 9220 'Подпрограмма выбора начальных значений 'входные переменные: INIT%, P(I%,J%), STP%, XFIRST%, XLAST%, ' YFIRST%, YLAST% ' выходные переменные: P( 1%, J%) ' глобальные переменные: нет 'локальные переменные: COL%, ROW% IF PSAVE% THEN GOTO 11180 FOR ROW%=YFIRST% TO YLAST% 'установка во всех FOR COL%=XFIRST% TO XLAST% STEP STP% ' неграничных узлах IF P(ROW%, COL%)<0 THEN GOTO 11140 ' начального значения P(ROW%, COL%)=INIT% ' потенциала границы NEXT COL% NEXT ROW% RETURN FOR ROW%=YFIRST% TO YLAST% FOR COL%=XFIRST% TO XLAST% STEP STP% IF P(ROW%,COL%)<>0 THEN GOTO 11220 P(ROW%, COL%)=INIT% NEXT COL% NEXT ROW% если последний PHI сохраняется, то во всех свобдных узлах задается начальный потенциал границы RETURN 24
372 Приложение Б 11260 12000 12010 12020 12030 12040 12050 12060 12070 12080 12090 12100 12110 12120 12130 12140 12150 12160 12170 12180 12190 12200 12210 12220 12230 12240 12250 12260 12270 12280 12290 12300 12310 12320 12330 12340 12350 12360 12370 12380 12390 ************************************************************************* 'Подпрограмма подготовки вывода на экран для цикла релаксации ' входные переменные: FIRST%, SUBL% 'выходные переменные: FIRST% ' глобальные переменные: нет 'локальные переменные: нет ' ************************************************************************ CLS: COLOR 7: LOCATE ,,0 IF NOT FIRST% THEN GOTO 12320 r LOCATE 5,12 'вывод инструкций PRINT "Нажатие клавиши <e> завершает текущий процесс релаксации."; LOCATE 8,12 PRINT "Если задана подобласть, то при первом нажатии клавиши <е>"; LOCATE 11,11 PRINT "закончится релаксация в этой подобласти и начнется процесс"; LOCATE 14,12 PRINT "во всей области. Повторное нажатие клавиши <е> завершит"; LOCATE 17,25 PRINT "релаксационный процесс совсем."; LOCATE 20,17 PRINT "Значение энергии приводится на единицу площади."; LOCATE 22,4 PRINT "Delta Р есть максимальное процентное изменение Phi с "; PRINT "предыдущей итерации."; г LOCATE 25,23,1 PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 12280 LOCATE ,,0 FIRST%=0 r GOSUB 7000 'вывод сетки г LOCATE 24,1 'подготовка к выводу результатов PRINT "Итерация = 0"; LOCATE 24,25 PRINT "delta Р= 00.000000"; LOCATE 24,52 PRINT "Последнее delta P= 00.000000";
Программы для примеров 373 12391 12400 12410 12420 12430 12440 12450 12460 12470 12480 12490 13000 13010 13020 13030 13040 13050 13060 13065 13070 13080 13090 13100 13110 13120 13130 13140 13150 13160 13170 13180 13190 13200 13210 13220 13230 13240 13250 13260 13270 13280 'последнее delta Р= LOCATE 25,1 PRINT "Энергия = 000.000000"; LOCATE 25,24 PRINT "Изменение энергии = +00.000000"; IF SUBL% THEN LOCATE 25,59: PRINT "Подобласть"; LOCATE 25,73: COLOR 15 PRINT "e:конец";: COLOR 7 RETURN ’ ************************************************************************ 'Подпрограмма сеточной релаксации ' входные переменные: DELTАРМАХ, ENERGY, ITERATION^, OLDE, ' OLDDELP, P(l%, J%), X1%, X2%, Y1%, Y2% 'выходные переменные: DELTАРМАХ, ENERGY ' глобальные переменные: NX%, NY%, OMEGA, STP% 'локальные переменные: А, В, C, COL%, D, DELENERGY, DELTAP, ' PNEW, POLD, ROW% ************************************************************************* FOR ROW%=Y1% TO Y2% 'цикл по всем узлам области FOR COL%=X1% TO X2% STEP STP% ’ или подобласти IF ROW%=Y1% AND COL%=X1% THEN GOTO 13280 B=ABS| P| ROW%-1, COL%)) D=ABS(P(ROW%,COL%-STP%J) 'в гран, узлах релаксации нет IF Р| ROW%, COL%) <0 THEN PNEW=ABS( P( ROW%, COL%)): GOTO 13250 POLD=P(ROW%,COL%) 'релаксация в данной точке А= ABS( Р( ROW%+1, COL%)) С=ABS| Р( ROW%, COL%+STP% j j PNEW=( 1-OMEGA) *POLD+OMEGA*. 25*( A+B+C+D) P| ROW%, COL%) =PNEW IF PNEW<1 THEN PNEW=1: P(ROW%,COL%)=1 ' уход от отри* ' цательных ' значений DELTAP=ABS( POLD-PNEW) /POLD IF DELTAP>DELTAPMAX THEN DELTAPMAX= DELTAP 'поиск макс. ' изменения Р IF COL%=X1% THEN ENERGY=ENERGY+(PNEW-Bp2: IF ROW%=Y1% THEN ENERGY=ENERGY+( PNEW-Dp2: GOTO 13280 GOTO 13280 ENERGY=ENERGY+(PNEW-Bp2+(PNEW-Dp2 'слагаемое в энергии NEXT COL%
374 Приложение Б 13290 NEXT ROW% 13300 9 13310 9 13320 ENERGY=ENERGY/(2*NX%*NY%) 'энергия на единицу площади 13330 DELENERGY=ENERGY-OLDE 13340 13350 IF ITERATIONS THEN DELENERGYzO: OLDDELP=0 9 13360 GOSUB 7000 ’вывод новых P на экран 13370 LOCATE 24,12,0: PRINT USING "###"; ITERATION%; 13380 LOCATE 24,34,0: PRINT USING "##.######"; DELTAPMAX; 13390 LOCATE 24,71,0: PRINT USING "##.#*#*##"; OLDDELP; 13400 LOCATE 25,11,0: PRINT USING "###.#****#"; ENERGY; 13410 13420 LOCATE 25,44,0: PRINT USING "+##.######"; DELENERGY; r 13430 13440 RETURN f 14000 1 ************************************************************************ 14010 ' Подпрограмма вывода на экран вариантов продолжения работы 14020 ' входные переменные: SUBSAVE% 14030 'выходные переменные: ВС%, BCSAVE%, CLR%, LATTICE^, LSAVE%, 14040 ' OMEGA%, PSAVE%, SUBL%, SUBSAVE% 14050 ' глобальные переменные: нет 14060 'локальные переменные: А$, В$, С$, D$, Е$ 14070 ************************************************************************* 14080 14090 CLS: CLR%=-1 г 14100 LOCATE 1,23 'команда окончания расчета 14110 INPUT; "Хотите ли вы закончить расчет (у/п)";А$ 14120 IF А$="у" OR A$="n" THEN GOTO 14170 14130 LOCATE 2,36: BEEP 14140 PRINT "Повторите"; 14150 LOCATE 1,1: PRINT SPACE$(79); 14160 GOTO 14100 14170 14180 IF A$="y" THEN END r 14190 LOCATE 5,24 'команда изменения Omega 14200 INPUT; "Хотите ли вы изменить Omega (y/n)";B$ 14210 IF B$="Y" OR B$="n" THEN GOTO 14260 14220 LOCATE 6,36: BEEP 14230 PRINT "Повторите"; 14240 LOCATE 5,1: PRINT SPACE$(79);
Программы для примеров 375 14250 14260 14270 14280 14290 14300 14310 14320 14330 14340 14350 14360 14370 14380 14390 14400 14410 14420 14430 14440 14450 14460 14470 14480 14490 14500 14510 14520 14530 14540 14550 14560 14570 14580 14590 14600 14610 14620 14630 14640 14650 GOTO 14190 IF В$="у" THEN OMEGA%=-1 ELSE OMEGA%=0'установка флага Omega LOCATE 9,20 'команда изменения размеров сетки INPUT; "Хотите ли вы изменить размеры сетки (у/п)";С$ IF С$="у" OR C$="n" THEN GOTO 14350 LOCATE 10,36: BEEP PRINT "Повторите"; LOCATE 9,1: PRINT SPACE$(79); GOTO 14280 IF C$="y" THEN LATTICE%=-1 ELSE LATTICE%=0 'установка флага сетки IF LATTICE% THEN SUBSA VE%=0: RETURN ' 'команда изменения краевых условий LOCATE 13,33: PRINT "Что вы хотите:"; LOCATE 15,1 PRINT "1) сохранить краевые условия и начать сначала"; PRINT " (полезно при выборе нового OMEGA)"; LOCATE 16,18 PRINT "2) изменить краевые условия и начать сначала"; LOCATE 17,5 PRINT "3) изменить краевые условия (стартуя с данных) и"; PRINT " сохранить текущие PHI"; LOCATE 19,24 INPUT; "Какой вариант вы выбираете (1-3)";D$ IF D$="1" OR D$="2" OR D$="3" THEN GOTO 14540 LOCATE 20,36: BEEP PRINT "Повторите"; LOCATE 19,1: PRINT SPACE$(79); GOTO 14470 IF D$="1" THEN BC%=0: PSAVE%=0: IF SUBSAVE% THEN SUBL%=-1: RETURN IF D$="1" THEN RETURN IF D$="3" THEN BC%=-1: PSAVE%=-1: SUBSAVE%=0: RETURN LOCATE 23,3: PRINT "Хотите ли вы 1) начать с текущих краевых"; INPUT; " условий или 2) стартовать заново"; Е$ IF Е$="1" OR Е$="2" THEN GOTO 14640 ВЕЕР: LOCATE 23,1 PRINT SPACE$(80); GOTO 14580 IF E$="1" THEN LATTICE%=-1: BCSAVE%=-1: PSAVE%=0: SUBSAVE%=0 IF E$="2" THEN LATTICE%=-1: LSAVE%=-1: PSAVE%=0: SUBSAVE%=0
376 Приложение Б 14660 14670 15000 15010 15020 15030 15040 15050 15060 15070 15080 15090 15100 15110 15120 15130 15140 15150 15160 15170 15180 15190 15200 15210 15220 15230 15240 15250 15260 15270 15280 15290 15300 15310 15320 15330 15340 15350 15360 15370 15380 RETURN г ’ ************************************************************************ 'Подпрограмма вывода экрана-заставки ' входные переменные: нет ' выходные переменные: GRAPHICS%, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% ’ ************************************************************************ SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме 9 LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; 9 LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); I COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРИМЕР 6"; COLOR 7 LOCATE 10,27: PRINT "Двумерное уравнение Лапласа" LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." г LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$,1)="y" OR LEFT$(G$, 1)="n" GOTO 15390 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 15340
Программы для примеров 377 15390 15400 15410 15420 15430 15440 15450 15460 15470 15480 15490 15500 15510 15520 15530 15540 15550 15560 15570 15580 15590 15600 15610 15620 16000 16010 16020 16030 16040 16050 16060 16070 16080 16090 16100 16110 IF LEFT$(G$, 1)="у" GOTO 15420 GRAPHICS%=0: MONO%=-1 RETURN GRAPHICS%=-1 LOCATE 18,15: PRINT SPACE$(55) LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$,1)="y" OR LEFT$(M$, 1)="n" GOTO 15490 'проверка ответа LOCATE 18,35: PRINT "Повторите...": GOTO 15440 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 f LOCATE 21,12 PRINT "Данная программа решает эллиптическое уравнение в частных LOCATE 22,14 PRINT "производных (а именно уравнение Лапласа) итерационным"; LOCATE 23,12 PRINT "методом релаксации. Краевые условия задает пользователь."; LOCATE 25,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 15590 LOCATE ,,0 RETURN f f ************************************************************************ 'Подпрограмма переключения с текстового дисплея на графический входные переменные: нет выходные переменные: нет глобальные переменные: нет локальные переменные: нет ' ************************************************************************ DEF SEG=0 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 SCREEN 1,0,0,0: SCREEN 0: WIDTH 80: LOCATE ,,1,6,7 RETURN
378 Приложение Б Б.7. ПРИМЕР 7 В данной программе решается нестационарное уравнение Шрёдингера для одномерного движения частицы. Потенциал определяется в подпрограм- мах 1000, 3000, 4000 и 5000. Предусмотрены различные аналитические зависимости для потенциала (прямоугольная яма, гауссов барьер, сту- пенька или параболическая яма), которые определяются в подпрограмме 4000, и каждая из этих зависимостей может быть изменена с клавиату- ры в отдельных точках (подпрограмма 5000). Кроме того, можно задать полный масштаб потенциала (VZERO). После описания потенциала можно выбрать начальный волновой пакет гауссовой или лоренцевой формы (подпрограмма 7000), для которого задается ширина, средний импульс и положение. Затем рассчитывается эволюция во времени (цикл 330—390). Здесь основная задача состоит в нахождении на каждом ша- ге по времени новой волновой функции путем решения в подпрограмме 16000 уравнений (7.31), (7.33) по схеме с обращением матрицы (7.12)—(7.16). Для этого перед началом расчета по времени один раз вычисляются коэффициенты а и у (в подпрограмме 9000). На каждом ша- ге по времени волновая функция нормируется, вычисляются различные наблюдаемые величины (подпрограмма 11000) и выводятся графики вол- новой функции и потенциала (подпрограмма 14000 или 15000). В случае прерывания эволюции по времени можно изменить потенциал, начальный волновой пакет или шаг по времени и начать другой расчет. Для получения типичных результатов по этой программе выберите прямоугольный потенциальный барьер с высотой, шириной и координатой центра, равными соответственно V = 0,1, А = 10,* Х0 = 0, и задайте координату X = 0, разделяющую левую и правую части рас- счетной области. Затем выберите гауссов волновой пакет со средним волновым числом, шириной и центром, равными КО = 0,5, SIGMA = 15, Х0 = -40. Наконец, задайте шаг по времени DT = 0,5 и наблюдайте эволюцию пакета во времени.
Программы для примеров 379 10 '*************************************************************************** 20 'Пример 7: Нестационарное уравнение Шредингера 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 30 ' *************************************************************************** 40 GOSUB 18000 'вывод экрана-заставки 50 ' 60 FIRST%=-1: ONCE%=-1 'определение констант и функций 70 NPTS%=160 'размерность следующих массивов 80 DIM V(160) 'массив потенциала 90 DIM V%(160), V1%(160), V2%(160), V3%(160) 'потенциалы для графиков 100 DIM AZR(160) 'веществ, часть диагонали матрицы 110 DIM GAMR(160),GAMI(160) 'вещественные и мнимые части 120 DIM BETR(160),BETI(160) ' для обращения матрицы 130 DIM PHIR( 160), PHII( 160), PHI2( 160) 'Re, Im и квадрат волновой функции 140 PACKET%=-1: POT%=-1 ' флаги, указывающие, какие 150 TIME%=-1 ' параметры необходимо ввести 160 VSAVE%=0: GSAVE%=0 'флаги обхода повторных вычислений 170 DX=1: XMIN=-80 'шаг по пространству, минимальное х 180 TBEGIN=0 'начало отсчета времени time=0 190 ' 200 IF POT% THEN GOSUB 1000 'ввод потенциала 210 IF PACKET% THEN GOSUB 7000 'ввод волнового пакета 220 IF TIME% THEN GOSUB 8000 'ввод шага по времени 230 IF TIME% OR POT% THEN GOSUB 9000 'вычисление GAMMA(=alpha) 240 ' 250 IF FIRST% THEN GOSUB 10000 'вывод инструкций пользователю 260 IF GRAPHICS% THEN GOSUB 13000 ELSE GOSUB 12000 'подготовка вывода 270 IF GSAVE% THEN GOTO 300 'вывод не изменялся 280 GOSUB 11000 'вычисление вероятности и <х> 290 IF GRAPHICS^ THEN GOSUB 14000 ELSE GOSUB 15000 'вывод PHI, V(x) 300 GSAVE%=0: POT%=0: PACKET%=0: TIME%=0: 'сброс флагов 310 ' 320 TIME=TBEGIN 'задание начального времени 330 WHILE К$о"е" AND K$o"t" 340 TIME=TIME+DT 'приращение времени 350 GOSUB 16000 'вычисление BETA, CHI, PHI 360 GOSUB 11000 'вычисление вероятности и <x> 370 IF GRAPHICS% THEN GOSUB 14000 ELSE GOSUB 15000 'вывод на экран 380 K$=INKEY$ 'цикл по времени повторяется до 390 WEND ' нажатия клавиши <е> или <Ь
380 Приложение Б 400 410 420 430 440 450 460 470 480 490 500 510 1000 1010 1020 1025 1030 1035 1040 1050 1060 1070 1080 1090 1100 1110 1120 ИЗО 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 IF K$o"t" THEN GOTO 460 TIME%=-1 'флаг подпрограммы ввода DT TBEGIN=TIME ' сохранение того же момента времени GSAVE%=-1 'график не перерисовывается GOTO 490 IF K$o"e" THEN GOTO 490 GOSUB 17000 'вывод инструкций пользователю TBEGIN=0: TIME=0 'начало отсчета времени time=0 K$="" 'сброс К$ для входа в цикл while GOTO 200 r 'переход на начало расчета ' ************************************************************************* 'Подпрограмма ввода 1-мерного потенциала 'входные переменные: ONCE%, V(l%), VSAVE%, VZERO, VZSAVE, ' XMIDDLE 'выходные переменные: IMIDDLE%, ONCE%, V(l%), V%(l%), VSAVE%, ' VSCALE, XMIDDLE 'глобальные переменные: GRAPHICS%, NPTS% 'локальные переменные: ANSWERS, E$, F$, H$, 1%, RESPONSES ************************************************************************** GOSUB 3000 'ввод вида потенциала, Vzero и т.д. IF NOT GRAPHICS% THEN RETURN r IF NOT VSAVE% OR (VZSAVE=VZERO) THEN GOTO 1160 FOR l%=0 TO NPTS% 'масштабирование V при смене Vzero V( l%)=V( l%)*VZERO/VZSAVE NEXT 1% r IF VZEROoO THEN GOTO 1380 'рассмотрение особого случая Vzero=0 IF NOT ONCE% THEN RETURN 'след, текст выводится только 1 раз ONCE%=0 'сброс флага CLS: LOCATE 6,12 PRINT "Поскольку выбрано Vzero=0, то изменять потенциал с экрана"; LOCATE 8,12 PRINT "уже не удастся. Если вы хотите начинать менять потенциал с"; LOCATE 10,12 PRINT "нуля, то начните, например, с узкой прямоугольной ямы с"; LOCATE 12,12 PRINT "величиной Vzero, близкой к требуемому конечному значению.";
Программы для примеров 381 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 LOCATE 14,12 PRINT "Вы хотите 1) продолжить расчет с нулевым потенциалом или"; LOCATE 16,23 INPUT; "2) начать с начала с аналитической формой"; RESPONSES IF RESPONSE$="1" THEN RETURN IF RESPONSE$="2" THEN GOTO 1070 LOCATE 18,19: BEEP PRINT "Повторите еще раз, правильный ответ 1 или 2"; LOCATE 16,1: PRINT SPACE$(80); GOTO 1290 ! CLS 'указания по изменению V LOCATE 2,5,0 PRINT "Теперь вы можете с клавиатуры изменить V(x) в любом из 160"; LOCATE 2,63 PRINT " узлов сетки:"; 1430 1440 1450 1460 1470 1480 1490 1500 LOCATE 6,14: PRINT "Клавиши "+CHR$(24)+CHR$(25)+" увеличивают"; LOCATE 6,36: PRINT " и уменьшают V(x) при данном х."; LOCATE 9,10: PRINT "Клавиши PgUp и Home увеличивают и"; LOCATE 9,43: PRINT " уменьшают х, не меняя V(x)."; LOCATE 12,9 PRINT "Клавиши "+CHR$(26)+CHR$(27)+" увеличивают"; LOCATE 12,31 PRINT " и уменьшают х с заменой V(x+dx) на V(x)."; 1510 LOCATE 17,14 1520 PRINT "После этого вы снова сможете изменить этот потенциал,"; 1530 1540 LOCATE 18,21 PRINT "так что не бойтесь экспериментировать."; 1550 1560 1570 1580 * LOCATE 24,3: ВЕЕР: PRINT "Вы будете изменять потенциал (1)"; INPUT;" или возьмете аналитическую форму (2)";Н$ IF Н$="2" THEN RETURN 1590 1600 IF Н$="1" THEN GOTO 1640 LOCATE 24,1: PRINT SPACE$(79);: BEEP 1610 1620 1630 1640 1650 1660 1670 LOCATE 23,35: PRINT "Повторите..."; GOTO 1560 9 VSCALE=170/( 2*ABS(VZERO)) ' масштаб V FOR l%=0 TO NPTS% V%(I%)=170-(V(I%)+ABS(VZERO))*VSCALE NEXT l%
382 Приложение Б 1680 GOSUB 5000 'изменение V с клавиатуры 1690 VSAVE%=0 ' сброс флага 1700 1 1710 LOCATE 23,1: PRINT SPACE$(79); 1720 LOCATE 25,1: PRINT SPACE$(79); 1730 LOCATE 24,4: BEEP 1740 PRINT "Вас устраивает такой потенциал (1) или вы будете его еще"; 1750 LOCATE 24,60 1760 INPUT; " изменять (2)";Е$ 1770 IF Е$="1" THEN GOTO 1820 1780 IF Е$="2" GOTO 1950 1790 LOCATE 23,35: PRINT "Повторите..."; 1800 GOTO 1730 1810 1820 FOR l%=23 TO 25 'очистка нижней части экрана 1830 LOCATE l%,1: PRINT SPACE$(79); 1840 NEXT 1% 1850 LOCATE 23,33 'ввод нового XMIDDLE 1860 PRINT USING "Хсреднее=+##.##";XMIDDLE; 1870 LOCATE 24,20 1880 INPUT; "Хотите ли вы изменить это значение (y/n)"; ANSWERS 1890 IF ANSWER$="n" THEN RETURN 1900 LOCATE 25,29 1910 INPUT; "Введите новое значение "; XMIDDLE 1920 IMIDDLE%=( XMIDDLE- XMIN) 1930 RETURN 1940 9 1950 FOR l%=23 TO 25 'очистка нижней части экрана 1960 LOCATE l%,1: PRINT SPACE$(79); 1970 NEXT 1% 1980 LOCATE 24,13: BEEP 1990 PRINT "Желаете ли вы начать снова с аналитической формы (1) или"; 2000 LOCATE 25,13 2010 INPUT; "будете изменять потенциал, который сейчас на экране (2)";F$ 2020 IF F$="1" THEN GOTO 1070 2030 IF F$="2" THEN GOTO 1680 2040 LOCATE 23,35 'реакция на ошибку ввода 2050 PRINT "Повторите..."; 2060 GOTO 1980 2070 9 3000 9 *************************************************************************
Программы для примеров 383 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 3330 3340 3350 3360 3370 3380 3390 3400 3410 'Подпрограмма выбора аналитической зависимости для потенциала 'входные переменные: FIRST%, VSAVE% 'выходные переменные: A, lAAIDDl^E^, IMONOMID%, OPTS, VXO, ' VZERO, VZSAVE, XMIDDLE ' глобальные переменные: XMIN ' локальные переменные: нет CLS IF NOT VSAVE% THEN GOTO 3130 'если старый потенциал VZSAVE=VZERO ' сохранится, то нужно GOTO 3380 ' ввести только новое Vzero г LOCATE 1,13,0 'вывод вариантов для V(x) PRINT "Выданной программе предусмотрены одномерные потенциалы:"; LOCATE 4,11 PRINT "1) Прямоугольный барьер: V(x)=Vzero при X0-A <= X <= X0+A"; LOCATE 6,12 PRINT "2) Гауссов барьер: V(x)=Vzero*exp(-(X-X0)^2*log(20)/A^2)"; LOCATE 8,13 PRINT "3) Ступенька: V(x)=Vzero*(atn((X-X0)*6.3/A)*2/PI)+1)/2"; LOCATE 10,19 PRINT USING "4) Параболическая яма: V(x)=Vzero*(X/##p2"; ABS(XMIN); LOCATE 13,8 PRINT "Все эти потенциалы имеют бесконечные стенки при "; PRINT USING "Х=+## и Х= ##, 4to";XMIN, ABS(XMIN); LOCATE 14,8 PRINT "дает в этих точках нулевые краевые условия для"; LOCATE 14,54 PRINT " волновой функции."; г LOCATE 17,23: ВЕЕР 'ввод аналитической формы INPUT; "Введите номер требуемого потенциала"; OPTS IF (ОРТ$="1" OR ОРТ$="2" OR ОРТ$="3" OR ОРТ$="4") GOTO 3380 LOCATE 17,1: PRINT SPACE$(79);: LOCATE 16,17 PRINT "Повторите еще раз, правильный ответ 1,2,3 или 4"; GOTO 3310 г IF FIRST% GOTO 3410 'ввод Vzero LOCATE 19,18 PRINT USING "Последнее значение Vzero было равно +###.###"; VZERO; LOCATE 20,33
384 Приложение Б 3420 3430 3440 3450 3460 3470 3480 3490 3500 3510 3520 3530 3540 3550 3560 3570 3580 3590 3600 3610 3620 3630 3640 3650 3660 3670 3680 3690 3700 3710 3720 3730 3740 3750 3760 3770 3780 3790 3800 3810 3820 INPUT; "Vzero(BbicoTa)="; VZERO IF VSAVE% THEN RETURN IF OPT$="4" THEN GOTO 3580 r IF FIRST% GOTO 3490 'ввод А (полуширина) LOCATE 21,22 PRINT USING "Последнее значение А было равно ##.##"; A; LOCATE 22,17 INPUT; "A( полуширина на одной двадцатой полной высоты)=";А г IF FIRST% GOTO 3550 'ввод Х0 LOCATE 23,21 PRINT USING "Последнее значение Х0 было равно +##.##"; VX0; LOCATE 24,35 INPUT; "Х0(центр)="; VX0 f FOR l%=19 TO 24 'очистка нижней части экрана LOCATE 1%, 1,0: PRINT SPACE$(79); NEXT 1% f IF OPT$="4" THEN LOCATE 19,33: PRINT USING "Vzero=+###.###"; VZERO; IF OPT$="4" THEN GOTO 3680 r LOCATE 19,20: PRINT USING "Vzero=+###.#*# A=##.##"; VZERO, A; LOCATE 19,47: PRINT USING" A=##.##";VX0; f LOCATE 21,15 'ввод XMIDDLE PRINT "В программе будут вычисляться вероятность и <х> для"; LOCATE 22,27 PRINT "левой и правой частей сетки"; LOCATE 23,13 INPUT; "Введите значение X — границу левой и правой частей"; XMIDDLE IF XMIDDLE<=ABS(XMIN) AND XMIDDLE>=XMIN GOTO 3790 LOCATE 24,20: BEEP PRINT USING "Повторите, границы +## <= X <- ##"; XMIN, ABS(XMIN); LOCATE 23,1: PRINT SPACE$(79); GOTO 3720 IMIDDLE%=( XMIDDLE-XMIN) IMONOMID%=IMIDDLE%/2 9 GOSUB 4000 'вычисление V(x)
Программы для примеров 385 3830 3840 3850 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 4300 4310 4320 4330 4340 5000 5010 5020 RETURN г 'Подпрограмма вычисления потенциала 'входные переменные: A, OPTS, VXO, VZERO •' выходные переменные: V( 1%) ' глобальные переменные: NPTS%, XMIN ' локальные переменные: \% 1 *********************************************************************** IF ОРТ$<>"1" THEN GOTO 4140 'вычисление потенциала в узлах сетки FOR l%=0 ТО NPTS% 'прямоугольная яма X=XMIN+I% IF X>=(VX0-A| AND X<=(VX0+A| THEN V(l%) =VZERO ELSE V(l%|=0 NEXT \% RETURN r IF OPT$<>"2" THEN GOTO 4210 'гауссов барьер FOR l%=0 TO NPTS% X=XMIN+I% V ( 1% j =VZERO*EXP(-(X-VXO) A2*LOG( 20| /Аж2) NEXT 1% RETURN r IF OPT$<>"3" THEN GOTO 4280 'ступенька потенциала FOR l%=0 TO NPTS% X=XMIN+I% V ( 1%) =VZERO*( (ATN( (X-VXO) *6.313/A) *2/3.14159) 4-1) /2 NEXT 1% RETURN r IF OPT$<>"4" THEN RETURN 'параболическая яма FOR l%=0 TO NPTS% X=XMIN+I% V ( 1%) =VZERO*( X/XMIN) A2 NEXT \% RETURN i 'Подпрограмма изменения формы потенциала по графику на экране 'входные переменные: V(l%), V%(l%), VSCALE, VZERO
386 Приложение Б 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 5370 5380 5390 5400 5410 5420 5430 'выходные переменные: V(l%), V%(l%) 'глобальные переменные: MONO%, NPTS%, ХМ IN 'локальные переменные: CURSORS, 1%, IOLD%, К$, V%, VOLD% '*********де*ДО*****де**де******де*******************деде*****4'4'4'4'*4'4'4'>|'4'4'4' IF MONO% THEN GOSUB 19000 'переход в граф, режим GOSUB 6000 'рисование осей г FOR l%=0 ТО NPTS% 'график потенциала LINE (l%*4, V%(l%))-((l%»4)+2, V%(l%)) NEXT 1% Г LOCATE 24,10: ВЕЕР 'вывод инструкций PRINT "Клавиши "+CHR$(24)+CHR$(25)+CHR$(26)+CHR$(27)+" Home и LOCATE 24,30: PRINT "PgUp двигают курсор и изменяют потенциал."; LOCATE 25,19: PRINT "Когда закончите, нажмите клавишу <Enfer>."; г , V%=V%(80): 1%=80 'начинаем с дна ямы LINE (l%*4+1,V%+1)-(l%*4-1,V%-1): LINE (l%*4-1,V%+1)-(l%*4+1,V%-1) LOCATE 23,27 PRINT USING "X=+##.### V(x)=+###.###";(XMIN+DX*l%),V(l%); K$=INKEYS IF K$=CHR$(13) GOTO 5690 IF LEN(K$)<2 GOTO 5240 CURSOR$=RIGHT$(K$, 1) VOLD%=V%: IOLD%=I% 'выход из цикла-клавишей <Enfer> 'перемещения курсора порождают ' специальные двухбайтовые коды IF (CURSOR$=CHR$(72) OR CURSOR$=CHR$(80)) THEN GOTO 5410 IF (CURSOR$=CHR$(75) OR CURSOR$=CHR$(77)) THEN GOTO 5480 IF CURSOR$=CHR$(73) THEN 1%=1%+1 'курсор движется вдоль IF CURSOR$=CHR$(71) THEN l%=l%-1 ' кривой потенциала и IF l%<0 THEN l%=NPTS% ' закольцован по оси х IF l%>NPTS% THEN l%=0 V%=(170-(V(I%)+ABS(VZERO))*VSCALE) 'вычисл. новых переменных LINE (IOLD%*4, VOLD%)-(IOLD%*4+2, VOLD%) 'линия в старой позиции LINE (l%*4, V%)-(l%*4+2, V%),0 'стирание линии в новой поз. курсора GOTO 5580 IF CURSOR$=CHR$(72) THEN V%=V%-1 'курсор вверх IF CURSOR$=CHR$(80) THEN V%=V%+1 'курсор вниз IF V%>170 THEN V%=170 'границы потенциала -1<V<1
Программы для примеров 387 5440 5450 5460 5470 5480 5490 5500 5510 5520 5530 5540 5550 5560 5570 5580 5590 5600 5610 5620 5630 5640 5650 5660 5670 5680 5690 5700 5710 5720 5730 5740 6000 6010 6020 6030 6040 6050 6060 6070 6080 6090 IF V%<0 THEN V%=0 V(I%)=-ABS(VZERO)-(V%-170)/VSCALE GOTO 5580 IF CURSOR$=CHR$(77) THEN 1%=1%+1 'курсор вправо IF CURSOR$=CHR$(75) THEN 1%=1%-1 'курсор влево IF l%<0 THEN l%=NPTS% ' курсор закольцован по оси х IF l%>NPTS% THEN l%=0 V%=(170-(V(I%)+ABS(VZERO))*VSCALE) LINE (IOLD%*4, VOLD%)- (IOLD%*4+2, VOLD%) LINE (l%*4,V%)-(l%*4+2,V%),0 V%=VOLD% fV в новой позиции курсора V( l%)=V( IOLD%) ' равен V в старой позиции f LINE (IOLD%*4+1, VOLD%+1)-(IOLD%*4-1, VOLD%-1),0 'стирание старого LINE (IOLD%*4-1,VOLD%+1)-(IOLD%*4+1,VOLD%-1),0 ' курсора LINE (l%*4+1,V%+1)-(l%*4-1,V%-1) 'нанесение нового курсора LINE (l%*4-1, V%+1)-(l%*4+1, V%-1) LINE (0,0)-(0,170) 'перерисовывание осей LINE (0,85)-(640,85) LOCATE 23,27 PRINT USING "X=+##.### V(x)=+###.###";(XMIN+DX*l%),V(l%); GO'TO 5240 f FOR l%=0 TO NPTS% 'запись новых значений V%(I%)=170-(V(I%)+ABS(VZERO))*VSCALE ' потенциала в массив V% NEXT 1% f RETURN f '********M*************************************************************** 'Подпрограмма проведения и разметки осей для графика V(x) ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: XMIN ' локальные переменные: COL%, 1%, MARK%, ROW% 'Mi************************************************************************ CLS: SCREEN 2,0,0,0 'проведение и ' ' разметка осей LINE (0,0)-(0,170) 25*
388 Приложение Б 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 6280 6290 7000 7010 7020 7030 7040 7050 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 LINE (0,85)- (640,85) LOCATE 3,2: PRINT "V(x)"; LOCATE 12,78: PRINT "x" 'обозначение оси У 'обозначение оси X FOR l%=0 TO 4 MARK%=I%*( 170/4) LINE (0,MARK%)-(3,MARK%) ROW%=I%*5.5: IF l%=0 THEN ROW%=1 'деления по оси V 'оцифровка оси V LOCATE ROW%,2: PRINT USING "+###.#"; (1-l%*. 5)*ABS( VZERO); NEXT 1% FOR l%=1 TO 4 MARK%=I%*(640/4) 'деления по оси X LINE (MARK%, 83)-(MARK%, 87) COL%=l%*20-2: IF l%=4 THEN COL%=COL%-2 'оцифровка оси X LOCATE 10,COL%: PRINT USING "+##.#";(XMIN+l%*40); NEXT \% i RETURN 1 ************************************************************************* 'Подпрограмма ввода параметров волнового пакета ' входные переменные: LPROB, RPROB 'выходные переменные: КО, NORM, РАСКЕТ$, PHII(I%), PHIR(I%), ' PHISCALE, PHI2(I%), SIGMA, Х0 ' глобальные переменные: FIRST%, NPTS%, XMIN * локальные переменные: GAUSS, IX%, LORENTZ, PHI2MAX, SON ************************************************************************** CLS LOCATE 1,14 'ввод аналитической зависимости PRINT "Имеется две аналитические формы для волнового пакета:"; LOCATE 3,12 PRINT "1) гауссова: PHI=EXP(i*K0*X)*EXP(-(X-X0)~2*log(2)/SIGMA~2)"; LOCATE 4,12 PRINT "2) лоренцева: PHI=EXP(i*K0*X)*SIGMA~2/(SIGMA~2+(X-X0f2)"; LOCATE 6,17 INPUT; "Введите номер, соответствующий вашему варианту"; PACKETS IF РАСКЕТ$="1" OR РАСКЕТ$="2" GOTO 7240 LOCATE 7,19: BEEP PRINT "Повторите еще раз, правильный ответ 1 или 2";
Программы для примеров 389 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 7370 7380 7390 7400 7410 7420 7430 7440 7450 7460 7470 7480 7490 7500 7510 7520 7530 7540 7550 7560 7570 7580 7590 7600 7610 LOCATE 6,1: PRINT SPACE$(80); GOTO 7160 LOCATE 9,20 'вывод параметров сетки PRINT "(Параметры сетки: "; PRINT USING "+## <= X <= ## с DX=1)"; XMIN, ABS( XMIN); IF FIRST% GOTO 7310 'ввод КО LOCATE 11,20 PRINT USING "Последнее значение КО было равно +##.###";КО; LOCATE 12,10: PRINT "Помните, что энергия волнового пакета= "; LOCATE 12,49: PRINT USING "К0*2 и Vzero=+###.###";VZERO; LOCATE 13,38 INPUT; "K0=";K0 IF FIRST% GOTO 7390 'ввод SIGMA LOCATE 15,19 PRINT USING "Последнее значение SIGMA было равно ***.**"; SIGMA; LOCATE 16,22 INPUT; "SIGMA( полуширина на половине высоты)="; SIGMA f IF FIRST% GOTO 7450 'ввод X0 LOCATE 18,21 PRINT USING "Последнее значение X0 было равно ***.**"; X0; LOCATE 19,35 INPUT; "Х0(центр)=";Х0 i PHIR(0|=0: PHII(0|=0 'краевое условие Дирихле PHIR( NPTS%| =0: PHIRJ NPTS%| =0 r IF PACKET$="1" THEN GOTO 7620 t FOR IX%=1 TO NPTS%-1 'вычисление PHI при time=0 X=XMIN+IX% ' для лоренцева пакета LORENTZ=SIGMA*2/( SIGMA* 2+(X-X0| *2| PHIRJ IX% | =COS( K0*X) «LORENTZ PH 11( IX% I =SIN( K0«X| «LORENTZ PHI2(IX%|=LORENTZ*2 NEXT IX% GOTO 7700
390 Приложение Б 7620 7630 7640 7650 7660 7670 7680 7690 7700 7710 7720 7730 7740 7750 7760 7770 7780 7790 7800 7810 7820 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 8120 8130 8140 8150 8160 8170 8180 FOR IX%=1 ТО NPTS%-1 'вычисление PHI при time=0 X=XMIN+IX% ' для гауссова пакета GAUSS=. 9*ЕХР( - (Х-ХО) A2»LOG| 2) ZSIGMA*2) PHIR( IX%) =COS( K0*X) *GAUSS PH 11 (IX%| =SIN( K0*X) *GAUSS PHI2(IX%)=GAUSS~2 NEXT IX% GOSUB 11000 'вычисление нормировки NORM=LPROB+RPROB: SQN=SQR[ NORM) PHI2MAX=0 FOR l%=0 TO NPTS% 'нормирование PHI и поиск макс. PHI PHIR( l%) =PHIR( 1%) /SON PHII(I%)=PHII(I%)/SQN PHI2( 1%) =PHI2( 1%) /NORM IF PHI2(I%)>PHI2MAX THEN PHI2MAX=PHI2( 1%) NEXT 1% IF GRAPHICS% THEN PHISCALE=58/(2*PHI2MAX) ELSE PHISCALE=19/( 2*PHI2MAX) i RETURN i ************************************************************************** 'Подпрограмма ввода DT ' входные переменные: нет 'выходные переменные: DT, XDT, XDT4 ' глобальные переменные: FIRST% ' локальные переменные: нет ************************************************************************** LOCATE 24,1: PRINT SPACE$(79); 'очистка нижней части экрана LOCATE 25,1: PRINT SPACE$(79); IF FIRST% GOTO 8120 'ввод DT LOCATE 24,20 PRINT USING "Последний шаг по времени был равен ##.###"; DT; LOCATE 25,31; INPUT; "DT=iuar по времени="; DT I XDT=1/DT 'XDT=dx*2/dt, XDT4=4*XDT ’ где с1х=пространственный шаг=1 I RETURN
Программы для примеров 391 9000 9010 9020 9030 9040 9050 9060 9070 9080 9090 9100 9110 9120 9130 9140 9150 9160 9170 9180 9190 9200 9210 9220 9230 10000 10010 10020 10030 10040 10050 10060 10070 10080 10090 10100 10110 10120 10130 10140 10150 10160 ' Подпрограмма вычисления коэффициентов alpha и gamma 'входные переменные: V(l%), XDT 'выходные переменные: GAMI(I%), GAMR(I%) ' глобальные переменные: NPTS% 'локальные переменные: AZI, AZR(I%), DENOM, 1% '************************************************************************* FOR l%=0 ТО NPTS% 'расчет вещественной и мнимой AZR(l%)=-2-V(l%) ' частей Ахего на сетке NEXT 1% AZI=2*XDT DENOM=AZR(NPTS%-ir2+AZP2 'GAMMA в узле NPTS%-1, чтобы GAMR(NPTS%-1)=-AZR(NPTS%-1)/DENOM' начать обратную рекурсию GAMI| NPTS%-1) =AZI/DENOM t FOR l%=NPTS%-1 TO 1 STEP И 'обратная рекурсия DENOM=( GAMR| 1%) +AZR| l%-1)) ж2+| GAMI| l%| +AZI) ~2 GAMR| l%-1) =-1 GAMR| l%| + AZR| l%-1)) /DENOM GAMI| l%-11 =| GAMI| 1%) +AZI) /DENOM NEXT 1% r RETURN r 'де*********деде*де**************дедеде**дедеде***4^***4ик**************** ' Подпрограмма вывода инструкций пользователю на экран ' входные переменные: нет ' выходные переменные: FIRST% ' глобальные переменные: нет ' локальные переменные: нет ' ************************************************************************ CLS г LOCATE 1,13 PRINT "Данная программа будет рассчитывать эволюцию волнового"; LOCATE 3,17 PRINT "пакета до тех пор, пока не будет нажата клавиша"; LOCATE 6,12 PRINT '" е' - выход из цикла и выбор новых параметров или клавиша"; LOCATE 8,12 PRINT - смена шага по времени и продолжение цикла.";
10170 ' 10180 LOCATE 14,21 10190 PRINT "Графики рисуются в следующих масштабах:"; 10200 LOCATE 17,21 10210 PRINT "Шкала РНГ2 - от 0 до 2*РНГ2(Х=Х0,Т=0)"; 10220 LOCATE 19,26 10230 PRINT "Шкала V(x) - от Vmin до Vmax"; 10240 IF GRAPHICS% THEN GOTO 10290 10250 LOCATE 21,15 10260 PRINT "Для ясности на график выводятся только ненулевые V"; 10270 ' 10280 ' 10290 LOCATE 25,23,1 10300 PRINT "Для продолжения нажмите клавишу <с>"; 10310 IF INKEY$o"c" THEN GOTO 10310 10320 ' 10330 LOCATE , ,0 'выключение подсветки курсора 10340 FIRST%=0 10350 ' 10360 RETURN 10370 ' 11ООО ' ************************************************************************ 11010 'Подпрограмма вычисления нормирки и <х> 11020 'входные переменные: IMIDDLE%, РН12(1%) 11030 'выходные переменные: LPROB, LX, RPROB, RX, TPROB, ТХ 11040 'глобальные переменные: NPTS%, XMIN 11050 'локальные переменные: \% 11060 '************************************************************************ 11070 LPROB=0: LX=0 11080 FOR l%=1 ТО IMIDDLE%-1 11090 LPRO8=LPROB+PHI2( l%) 11100 X=XMIN+I% 11110 LX=LX+X*PHI2( 1%) 11J20 NEXT \% 11130 LPROB=LPROB+. 5*PHI2( IMIDDLE%) 11140 LX=LX+. 5*XMIDDLE*PHI2( IMIDDLE%) 11150 ' 11160 RPROB=.5*PHI2(IMIDDLE%) 11170 RX=. 5*XMIDDLE*PHI2(MIDDLE%) 11180 FOR l%=IMIDDLE%+1 TO NPTS%-1 11190 RPROB=RPROB+PHI2( \%] 'обнуление сумм 'применяется правило трапеций, ' первая точка была нулевая 'отдельный учет ' последнего узла сетки ' отдельный учет ' первого узла сетки
Программы для примеров 393 11200 11210 11220 11230 11240 11250 11260 11270 11280 11290 11300 12000 12010 12020 12030 12040 12050 12060 12070 12080 12090 12100 12110 12120 12130 12140 12150 12160 12170 12180 12190 12200 12210 13000 13010 13020 13030 13040 13050 13055 13060 X=XMIN+I% RX=RX+X*PHI2|I%) NEXT 1% t TPROB=LPROB+RPROB 'вычисление полной нормировки IF LPROBsO THEN LX=-8 ELSE LX=LX/LPROB 'нормирование <x> IF RPROB=0 THEN RX=8 ELSE RX=RX/RPROB TX=LPROB*LX+RPROB*RX ' полное <x> - взвешенная сумма t RETURN i r ************************************************************************ 'Подпрограмма подготовки текстового экрана для вывода результатов 'входные переменные: РОТ%, V(l%) ' выходные переменные: V%( 1%) ' глобальные переменные: NPTS% 'локальные переменные: 1%, VAAAX, VMIN, VSCALE IF NOT РОТ% THEN RETURN 'потенциал не изменился » VMAX=V(0): VMIN=V(0) 'поиск максимального V(x) FOR l%=2 ТО NPTS% STEP 2 IF V(l%)> VAAAX THEN VAAAX=V(I%) IF V(I%)<VMIN THEN VMIN=V(I%) NEXT 1% IF (VAAAX-VAAIN)=0 THEN VSCALE=0 ELSE VSCALE=19/(VAAAX-VAAIN) i FOR l%=0 TO NPTS% STEP 2 'заполнение массива для графика V(x) V%(l%)=20-(V(l%)-VAAIN)*VSCALE NEXT \% t RETURN i 1 ************************************************************************ 'Подпрограмма подготовки графического рана для вывода результатов ' входные переменные: IAAIDDLE%, GSAVE%, КО, РОТ%, VZERO, XAAIDDLE 'выходные переменные: N%, V1%(l%), V2%(l%), V3%(l%) 'глобальные переменные: MONO%, NPTS% 'локальные переменные: COL%, 1%, ROW%, V%, VAAAX, VMIN, ' VSCALE, X%, XMID% ' ************************************************************************
394 Приложение Б 13070 IF GSAVE% THEN GOTO 13350. 'график перерисовывать не надо 13080 ' 13090 N%=1 'начинаем с верхней рамки 13100 Г 13110 IF MONO% THEN GOSUB 19000 'переход в графический режим 13120 CLS: SCREEN 2,0,0,0 13130 r 13140 LINE (160,0)-(639,58), 1,B 'рисование верхней рамки 13150 FOR l%=0 TO 160 ' рисование линий, обозначающих 13160 X%=160+l%*3 ' узлы сетки 13170 LINE (X%, 58)-(X%,62) 13180 NEXT 1% 13190 LINE (160,62)-(639,120),1,B 'рисование средней рамки 13200 FOR l%=0 TO 160 ' рисование линий, обозначающих 13210 X%=160+l%*3 ' узлы сетки 13220 LINE (X%, 120)-(X%, 124) 13230 NEXT 1% 13240 LINE (160,124)-(639,182), 1, В 'рисование нижней рамки 13250 r 13260 FOR l%=0 TO 2 'вывод названий для трех рамок 13270 ROW%=1+I%*8 13280 LOCATE ROW%, 1: PRINT 11 'Время="; 13290 LOCATE ROW%+1,4: PRINT я 'Вероятность <х>"; 13300 LOCATE ROW%+2,1: PRINT ' 'Слева"; 13310 LOCATE ROW%+3,1: PRINT ' 'Справа"; 13320 LOCATE ROW%+4,1: PRINT ' 'Полная"; 13330 NEXT 1% 13340 i 13350 LOCATE 24,1: PRINT SPACE$(79); 'очистка нижней части экрана 13360 LOCATE 25,1: PRINT SPACE$(79); 13370 FOR l%=0 TO 4 'деления и оцифровка оси х 13380 COL%=20+I%*15: IF COL%=80 THEN COL%=77 13390 X%=160+l%*120 13400 LINE (X%, 180)-(X%, 184) 13410 LOCATE 24,COL%: PRINT USING "+##"; (l%*40-80); 13420 NEXT 1% 13430 XMID%=160+IMIDDLE%*3 'деление XMIDDLE 13440 LINE (XMID%,180)-(XMID%,184) 13450 r 13460 LOCATE 25,1 13470 PRINT USING "E=###.### Vzero= +###.###"; К0~2, VZERO;
Программы для примеров 395 13480 13490 LOCATE 25,29: PRINT USING "XcpeAHee=+##.##";XMIDDLE; LOCATE 25,50: PRINT "e: конец цикла t: новый шаг dt"; 13500 13510 13520 13530 13540 13550 13560 13570 13580 13590 13600 13610 13620 13630 13640 13650 13660 13670 13680 13690 14000 14010 14020 14030 14040 14050 14060 IF GSAVE% THEN RETURN r IF NOT POT% THEN RETURN r VMAX=V(0): VMIN=V(0) 'нахождение VMAX и VSCALE FOR l%=1 TO NPTS% IF V(I%)>VMAX THEN VMAX=V(I%) IF V(I%)<VMIN THEN VMIN=V(I%) NEXT 1% IF (VMAX-VMIN)=0 THEN VSCALE=0 ELSE VSCALE=58/(VMAX-VMIN) r FOR l%=0 TO NPTS% 'заполнение массивов графиков V%=(V(I%)-VMIN)*VSCALE ' V(x) во всех трех рамках V1%(l%)=58-V% V2%( l%)=120-V% V3%(l%)=182-V% NEXT 1% r RETURN r ' ************************************************************************ 'Подпрограмма вывода волновой функции и потенциала на граф, экран 'входные переменные: LPROB, LX, N%, PHI2(I%), PHISCALE, RPROB, ' RX, TIME, TPROB, ТХ, V1%( 1%), V2%( 1%), V3%( 1%) ' выходные переменные: Ы% ' глобальные переменные: NPTS% 'локальные переменные: PHI%, PHIOLD%, ROW%, ТОР%, VOLD%, 14065 ' Х%, XOLD% 14070 14080 14090 14100 14110 14120 14130 14140 1 ************************************************************************ TOP%=(N%-1)*62 'номер строки для верха текущей LINE (161,TOP%+1)-(638,TOP%+57),0,BF ' рамки; очистка области рамки г ROW%=N%*8-7 'вывод текущих значений LOCATE ROW%,7: PRINT USING "###.##";TIME; LOCATE ROW%+2,8: PRINT USING "#.### +##.###"; LPROB, LX LOCATE ROW%+3,8: PRINT USING "#.### +##.###"; RPROB, RX 14150 14160 14170 LOCATE ROW%+4,8: PRINT USING "#.### +##.###"; TPROB, TX r XOLD%=160 'график PHI
396 Приложение Б 14180 14190 14200 14210 14220 14230 14240 14250 14260 14270 14280 14290 14300 14310 14320 14330 14340 14350 14360 14370 14380 14390 14400 14410 14420 14430 14440 14450 14460 14470 14480 14490 14500 14510 15000 15010 15020 15030 15035 15040 15050 PHIOLD%=TOP%+58 FOR l%=0 ТО NPTS% PHI%=(TOP%+58)-PHI2(l%)*PHISCALE IF PHI%<TOP% THEN PHI%=TOP% 'отсечка слишком большого PHI Х%=160+1%*3 LINE (X%,PHI%HXOLD%,PHIOLD%) XOLD%=X% PHIOLD%=PHI% NEXT 1% » ON N% GOTO 14300,14360,14420 'для каждой рамки свой V% » VOLD%=V1%(0) 'верхняя рамка FOR l%=1 TO NPTS% LINE ((160+l%*3),V1%(!%))-((157+l%*3), VOLD%) VOLD%=V1%(I%) NEXT 1%: GOTO 14480 » VOLD%=V2%(0) 'средняя рамка FOR l%=1 TO NPTS% LINE ((160+l%*3), V2%(!%))-((157+l%*3), VOLD%) VOLD%=V2%(I%) NEXT 1%: GOTO 14480 I VOLD%=V3%(0) 'нижняя рамка FOR l%=1 TO NPTS% LINE ((160+l%*3), V3%(!%))-((157+l%*3),VOLD%) VOLD%=V3%(I%) NEXT 1%: GOTO 14480 t N%=(N% MOD 3)4-1 'какая рамка следующая? i RETURN i ' ************************************************************************ 'Подпрограмма вывода только на текстовый экран 'входные переменные: IMONOMID%, КО, LPROB, LX, РН12(1%), ' PHISCALE, RPROB, RX, TIME, TPROB, ТХ, ' V%(l%), V(l%), VZERO, XMIDDLE ' выходные переменные: нет ' глобальные переменные: NPTS%
Программы для примеров 397 15060 'локальные переменные: COL%, 1%, ROW% 15070 '************************************************************************ 15080 CLS 15090 ' 15100 LOCATE 20,1,0: PRINT STRING$(80,196); 'рисование осей 15110 FOR l%=0 TO 4 15120 COL%=I%*20: IF COL%=0 THEN COL%=1 15130 LOCATE 20,COL%: PRINT CHR$(197) 'деления по оси X 15140 IF COL%=80 THEN COL%=78 15150 LOCATE 21,COL%: PRINT USING "+##";(l%*40-80); 'оцифровка по X 15160 NEXT 1% 15170 LOCATE 20fIMONOMID%: PRINT CHR$(197) 'деление XMIDDLE 15190 LOCATE 22,1: PRINT USING "Время=###.##"; TIME; 'вывод тек. значений 15200 LOCATE 22f24: PRINT USING "Хсреднее=+##.##"; XMIDDLE; 15210 LOCATE 22,50: PRINT "x: волновой пакет о: потенциал"; 15220 ' 15230 LOCATE 23,27: PRINT "Слева"; 15240 LOCATE 23,47: PRINT "Справа"; 15250 LOCATE 23,67: PRINT "Полная"; 15260 LOCATE 24,1: PRINT "Вероятность/<х>"; 15270 LOCATE 24,23: PRINT USING "#.###/+##.###";LPROB, LX; 15280 LOCATE 24,43: PRINT USING ###/+##.###"; RPROB, RX; 15290 LOCATE 24,63: PRINT USING TPROB, TX; 15300 LOCATE 25,1 15310 PRINT USING "E=###.### Vzero=+###.###";K0^2, VZERO; 15320 LOCATE 25,39,0: PRINT "e: конец цикла по времени t: изменение dt"; 15330 ' ' вывод ненулевых 15340 FOR l%=2 TO NPTS% STEP 2 ' значений потенциала 15350 LOCATE V%(l%),l%/2: IF V(l%)<>0 THEN PRINT "o"; 15360 NEXT l% 15370 f 15380 FOR l%=2 TO NPTS% STEP 2 'график PHI 15390 ROW%=20-PHI2( l%)*PHISCALE 15400 IF ROW%<1 THEN ROW%=1 15410 LOCATE ROW%,l%/2: PRINT "x"; 15420 NEXT 1% 15430 ' 15440 RETURN 15450 ' 16000 ' ************************************************************************ 16010 'Подпрограмма вычисления BETA, CHI, PHI и РНГ2
398 Приложение Б 16020 'входные переменные: GAMI(I%),GAMR(I%),PHII(I%),PHIR(I%),XDT4 16030 'выходные переменные: РН12(1%) 16040 'глобальные переменные: NPTS% 16050 'локальные переменные: ВЕТ1(1%), BETR(I%), CHII, CHIR, IX%, TEMP 16060 ' ************************************************************************ 16070 BETR|NPTS%-1)=0 'нахождение начальных зи«л^ •" 16080 ВЕТ1| NPTS%-1) =0 ' ВЕТА для обратной рекурсии 16090 FOR IX%=|NPTS%-1J ТО 1 STEP -1 16100 BETR| IX%-1) =GAMR| IX%) *| BETR| IX%) +XDT4*PHII| IX%)) 16110 BETR| IX%-1) =BETR| IX%-1) -GAMI| 1Х%) *( BETI| IX%) -XDT4*PHIRf | 16120 BETI| IX%-1| =GAMR| IX%) *| BETI| IX%| -XDT4*PHIR( 1Х%)) 16130 ВЕТ1| IX%-1| =BETI| IX%-1) +GAMI| IX%| *| BETR| IX%) +XDT4*PHII| 1Х%)) 16140 NEXT 1Х% 16150 ' 16160 CHIR=0: СНП=0 'задание начального Chi для 16170 FOR IX%=1 ТО NPTS%-1 ' прямой рекурсии 16180 TEMP=CHIR 16190 CHIR=GAMR| IX%) *CHIR-GAMI| IX%) *CHII+BETR| IX%-1) 16200 CHII=GAMR| IX%) *CHII+GAMI( 1Х%) *ТЕМР+ВЕТ1| 1Х%-1) 16210 PHIR| IX%) =CHIR-PHIR| 1Х%) 16220 РНП| IX%) =СН II-PH П| 1Х%) 16230 PH I2| IX%) =PHIR| 1Х%) *2+РНП| 1Х%) *2 16240 NEXT 1Х% 16250 ' 16260 RETURN 16270 ' 17000 '************************************************************************ 17010 'Подпрограмма вывода инструкций пользователю 17020 'входные переменные: КО, NORM, PACKETS, SIGMA, Х0 17030 'выходные переменные: РАСКЕТ%, PHII(I%), PHIR(I%), РН12(1%), 17040 ' РОТ%, TIME%,VSAVE% 17050 'глобальные переменные: GRAPHICS%, NPTS%, XMIN 17060 'локальные переменные: А$, ANSS, В$, С$, D$, GAUSS, IX%, LORENTZ 17070 ' ************************************************************************ 17080 CLS 17090 ' 17100 LOCATE 3,21 'команда окончания программы 17110 INPUT; "Хотите ли вы завершиить программу (у/п)";А$ 17120 IF А$="у" THEN END 17130 ' 17140 LOCATE 8,12 'команда изменения волнового пакета
Программы для примеров 399 17150 PRINT "Вы хотите изменить волновой пакет (у/п) (если вы ответите"; 17160 LOCATE 9,17 17170 INPUT; "'п', то РН1(х) примет свое исходное состояние)"; В$ 17180 IF В$="у" OR B$="n" THEN GOTO 17230 17190 LOCATE 10,36: ВЕЕР 17200 PRINT "Повторите"; 17210 LOCATE 9,1: PRINT SPACE$(80); 17220 GOTO 17160 17230 IF B$="y" THEN PACKET%=-1 17240 r 17250 LOCATE 13,25 'команда изменения шага по времени 17260 INPUT; "Хотите ли вы изменить DT (у/п)";С$ 17270 IF С$="у" OR C$="n" THEN GOTO 17320 17280 LOCATE 14,36: ВЕЕР 17290 PRINT "Повторите"; 17300 LOCATE 13,1: PRINT SPACE$(80); 17310 GOTO 17250 17320 IF C$="y" THEN TIME%=-1 17330 r 17340 LOCATE 18,22 'команда изменения потенциала 17350 INPUT; "Хотите ли вы изменить потенциал (y/n)";D$ 17360 IF D$="y" OR D$="n" THEN GOTO 17410 17370 LOCATE 19,36: BEEP 17380 PRINT "Повторите"; 17390 LOCATE 18,1: PRINT SPACE$(80); 17400 GOTO 17340 17410 IF D$="y" THEN POT%=-1 17420 'дополнительные варианты для V 17430 IF NOT POT% OR NOT GRAPHICS% GOTO 17540 17440 LOCATE 21,16 17450 PRINT "Хотите ли вы: 1) начать с аналитической формы или"; 17460 LOCATE 22,30 17470 PRINT "2) с текущего вида потенциала"; 17480 LOCATE 23,14 17490 PRINT "(во втором варианте вы сможете, сохранив форму V(x),"; 17500 LOCATE 24,28 17510 INPUT; "изменить величину Vzero)";ANS$ 17520 IF ANS$="2" THEN VSAVE%=-1 ELSE VSAVE%=0 17530 r 17540 IF PACKET% THEN RETURN 'возврат исходного значения PHI, 17550 IF PACKET$="1" THEN GOTO 17660 ' если пакет не будет меняться
400 Приложение Б 17560 ' 17570 FOR IX%=1 ТО NPTS%-1 'нахождение PHI при time=0 17580 X=XMIN+IX% 17590 LORENTZ=SIGMA~2/(SIGMA~2+(X-XO)A2)/SQR(NORM) 17600 PH I R( IX%)=COS( KO*X)*LORENTZ 17610 PHII(IX%)=SIN(KO*X)*LORENTZ 17620 PHI2( IX%)=LORENTZ*2 17630 NEXT IX% 17640 RETURN 17653 ' 17660 FOR IX%=1 TO NPTS%-1 'нахождение PHI при time=0 17670 X=XMIN+IX% 17680 GAUSS=.9*EXP(-(X-XO)‘*2*LOG(2)/SIGMA‘*2)/SQR(NORM) 17690 PHIR( IX%)=COS(K0*X)*GAUSS 17700 PHI l( IX%)=SIN( K0*X)*GAUSS 17710 PHI2( IX%)=GAUSS~2 17720 NEXT IX% 17730 RETURN 17740 ' 18000 ' ************************************************************************ 18010 'Подпрограмма вывода экрана-заставки 18020 'входные переменные: нет 18030 'выходные переменные: GRAPHICS%, MONO% 18040 'глобальные переменные: нет 18050 'локальные переменные: G$, MS, ROW% 18060 ' ************************************************************************ 18070 SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме 18071 ' 18072 LOCATE 1,30: COLOR 15 'вывод на экран названия книги 18073 PRINT "COMPUTATIONAL PHYSICS"; 18074 LOCATE 2,39: COLOR 7 18075 PRINT "by"; 18076 LOCATE 3,32: PRINT "Steven E. Koon in"; 18077 LOCATE 4,15 18078 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; 18080 ' 18090 LOCATE 5,10 'рисование рамки 18100 PRINT CHR$(201)+STRING$(59,205)+CHR$(187); 18110 FOR ROW%=6 TO 19 18120 LOCATE ROW%,10: PRINT CHR$(186); 18130 LOCATE ROW%,70: PRINT CHR$(186);
Программы для примеров 401 18140 18150 18160 18170 18180 18190 18200 18210 18220 18230 18240 18250 18260 18270 18280 18290 18300 18310 18320 18330 18340 18350 18360 18370 18380 18390 18400 18410 18420 18430 18440 18450 18460 18470 18480 18490 18500 18510 18520 18530 18540 NEXT ROW% LOCATE 20,10 PRINT CHR$( 200)+STRING$( 59,205)+CHR$( 188); COLOR 15 'ВЫВОД ЗАГОЛОВКА ПрОГрАММЫ И Т.Д. LOCATE 7,36: PRINT "ПРИМЕР 7"; COLOR 7 LOCATE 10,23: PRINT "Нестационарное уравнение Шредингера"; LOCATE 13,35: PRINT "*♦*******♦" LOCATE 15,20: PRINT "Для прерывАния счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." Г LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на ВАшем компьютере грАфический дисплей (y/n)";G$ IF LEFT$(G$,1)="y" OR LEFTS ( G$, 1)="n" GOTO 18310 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 18260 IF LEFT$(G$,1)="y" GOTO 18340 GRAPHICS%=0: MONO%=-1 GOTO 18430 GRAPHICS%=-1 LOCATE 18,15: PRINT SPACE$(55) LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для тексте (у/п)";М$ IF LEFT$(M$,1)="y" OR LEFT$(M$, 1)="n" GOTO 18410 'проверке ответе LOCATE 18,35: PRINT "Повторите...": GOTO 18360 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 r LOCATE 21,11 PRINT "Данная программе рассчитывает временную эволюцию 1-мерного"; LOCATE 22,12 PRINT "волнового пакета, падающего на потенциальный барьер (или"; LOCATE 23,15 PRINT "яму). Область волны ограничена отрезком (-80,+80)."; LOCATE 24,13 PRINT "Сетка имеет 160 узлов; единицы измерения h/(2*pi)=2m=1."; LOCATE 25,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 18530 LOCATE ,,0 26—1650
402 Приложение Б 18550 ' 18560 IF MONO% AND GRAPHICS% THEN GOSUB 20000 ’ переход в текстовый 18580 RETURN ' режим 18590 1 19000 ' ************************************************************************ 19010 'Подпрограмма переключения с текстового дисплея на графический 19020 'входные переменные: нет 19030 'выходные переменные: нет 19040 'глобальные переменные: нет 19050 'локальные переменные: нет 19060 '************************************************************************ 19070 DEF SEG=0 19080 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 19090 SCREEN 0: WIDTH 80: LOCATE ,,0 19100 RETURN 19110 ' 20000 ************************************************************************* 20010 'Подпрограмма переключения с графического дисплея на текстовый 20020 ' входные переменные: нет 20030 ' выходные переменные: нет 20040 ' глобальные переменные: нет 20050 'локальные переменные: нет 20060 г ************************************************************************ 20070 DEF SEG=0 20080 POKE &Н410, (РЕЕК(&Н410) OR &Н30) 20090 SCREEN 0: WIDTH 80: LOCATE „0 20100 RETURN 20110 '
Программы для примеров Б.8. ПРИМЕР 8 403 В данной программе моделируется двумерная модель Изинга с помощью алгоритма Метрополиса и др. При заданном размере решетки и случай- ной начальной конфигурации спинов (подпрограмма 1000) пользователем задается константа связи и напряженность магнитного поля (строки 2090—2160), число термализационных шагов, число и размер групп для наблюдаемых величин и частота выборки (строки 2230—2380). После проведения термализационных шагов (цикл 220—300) начинается выбор- ка данных для групп (цикл 420—640). Основными являются две подпро- граммы: 3000, которая выполняет один проход по решетке по алгоритму Метрополиса, и 5000, вычисляющей энергию и намагниченность конфигу- рации через каждые FREQ% шагов. После каждого прохода (как термали- зационного, так и при выборке данных) решетка выводится на экран (подпрограмма 4000). Для этого используются специальные блочные символы ASCII с кодами 219, 220 и 223, позволяющие выводить на эк- ран одновременно два ряда спинов, при этом черный цвет соответству- ет спину Sa = -1, а белый—спину Sa = +1. При выборке данных проис- ходит накопление как групповых, так и полных сумм для энергии и на- магниченности (строки 580—610 и подпрограмма 6000), так что можно наблюдать корреляцию между отдельными проходами, используя прием, описанный в тексте перед упр. 8.6. Под решеткой после каждого про- хода выводятся оценки для энергии, намагниченности, восприимчивости и удельной теплоемкости (все величины даны на один спин). Характерный расчет по этой программе можно получить при следую- щих параметрах: решетка 20 20, константа связи и магнитное поле J = 0,3, В = 0, 20 термализационных проходов, 10 групп по 5 испытаний в каждой с Частотой выборки 5. 10 **************************************************************************** 20 'Пример 8: Расчет двумерной модели Изинга методом Монте-Карло 21 'COMPUTATIONAL PHYSICS by Sfeven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 о **************************************************************************** 40 GOSUB 7000 'вывод экрана-заставки 50 GOSUB 8000 'метод вывода (poke или print) 60 ' 70 DIM S%(44,79) 'S%(l%, J%)=+-1 содержит спины 26:
404 Приложение Б 80 DIM R(5,2) 90 ' 100 ' 110 ' 120 GOSUB 1000 130 GOSUB 2000 140 ' 150 TOP%=12-NY%/4 160 BOT%=13+NY%/4 170 ' 180 LOCATE TOP%,1 190 PRINT USING "Nx=## Ny=** J= 200 ' 'R(3+F%/2,(S%+3)/2) вероятность ' опрокидывания спина S%f при 1 сумме соседних спинов F% 'инициализация решетки 'задание параметров данного расчета 'верхняя строка дисплея 'нижняя строка дисплея 'печать заголовка . #### В=+**. ****"; NX%, NY%, J J, В; 210 IF NTHERM%<=0 THEN GOTO 320 'проведение термализационных шагов 220 FOR SWEEP%=1 TO NTHERM% 230 IF INKEY$="e" THEN GOTO 660 'проверка на прерывание 240 LOCATE TOP%, 35 'печать заголовка 250 PRINT USING "Термализационный шаг ### из ###"; SWEEP%, NTHERM%; 260 LOCATE ТОР%,68 270 PRINT USING "Принятие^**#";ACCEPT%/NSPINS; 280 GOSUB 3000 'расчет одного шага 290 GOSUB 4000 'вывод решетки на экран 300 NEXT SWEEP% 310 ' 320 MORE%=NGROUP% 'подготовка к началу расчета 330 SUMM=0: SUMM2=0: SUMSIGM=0 'обнуление полных сумм 340 SUME=0: SUME2=0: SUMSIGE=0 350 SUMCHI=0: SUMCHI2=0 360 SUMCB=0: SUMCB2=0 370 ' 380 CLS 'печать заголовка 390 LOCATE TOP%,1 400 PRINT USING "Nx=## Ny=** J=+#*.*### B=+**.****"; NX%,NY%,JJ,B; 410 ' 420 FOR IGROUP%=NGROUP%-MORE%+1 TO NGROUP%' цикл по группам 430 GROUPM=0: GROUPM2=0 'обнуление групповых сумм 440 GROUPE=0: GROUPE2=0 450 FOR SWEEP%=1 TO FREQ%*S!ZE% 'цикл по шагам в одной группе 460 IF INKEY$="e" THEN GOTO 660 'проверка на прерывание 470 GOSUB 3000 'выполнение прохода по решетке 480 LOCATE ТОР%, 35 'печать заголовка
Программы для примеров 405 490 PRINT USING "Исп. ### из #*#"; SWEEP%/FREQ%, SIZE%; 500 LOCATE ТОР%, 50 510 PRINT USING " в группе *** из ###"; IGROUP%, NGROUP%; 520 LOCATE TOP%,71 530 PRINT USING "Прин.=.###"; ACCEPT%/NSPINS; 540 GOSUB 4000 'вывод решетки на экран 550 ' вычисление наблюдаемых величин через каждые FREQ% шагов 560 IF SWEEP% MOD FREQ%<>0 THEN GOTO 620 570 GOSUB 5000 'вычисление E и M для этой решетки 580 / GROUPM=GROUPM+MAG%'добавление в групповые суммы 590 GROUPM2=GROUPM2+MAG%~2 600 GROUPE=GROUPE+ENER 610 GROUPE2=GROUPE2+ENER~2 620 NEXT SWEEP% 630 GOSUB 6000 'вывод групповых и общих значений 640 NEXT IGROUP% 650 ' 660 ВЕЕР 'приглашение с ожиданием ответа 670 LOCATE ТОР%, 62 680 COLOR 15: PRINT "Нажмите клавишу <с>";: COLOR 7 690 КВ$=INKEYS: IF КВ$="" THEN GOTO 690 700 ' 710 CLS: LOCATE 10,20: BEEP 720 INPUT "Сколько групп надо еще рассчитать (<=0 - конец)"; MORE% 730 IF MORE%>0 THEN GOTO 770 'начало нового расчета 740 LOCATE 12,20: ВЕЕР 750 INPUT "Хотите ли вы изменить размеры решетки (у/п)";КВ$ 760 IF КВ$="у" THEN GOTO 120 ELSE GOTO 130 770 NGROUP%=NGROUP%+MORE%: GOTO 380 780 ' 1ООО ' ************************************************************************* 1010 'Подпрограмма инициализации решетки 1020 'входные переменные: нет 1030 'выходные переменные: В, JJ, NSPINS, NX%, NY% 1040 'глобальные переменные: S% 1050 'локальные переменные: \%, J% 1060 ' ************************************************************************* 1070 CLS 1080 ' 1090 LOCATE 10,20: ВЕЕР 1100 INPUT "Введите размер решетки по вертикали (<=44, четное)";NY%
406 Приложение Б 1110 1120 ИЗО IF NY%>0 AND NY%<=44 AND NY% MOD 2=0 THEN GOTO 1130 ELSE GOTO1090 r LOCATE 13,20: BEEP 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 INPUT "Введите размер решетки по горизонтали (<=79)";NX% IF NX%>0 AND NX%<=79 THEN GOTO 1170 ELSE GOTO 1130 r NSPINS=CSNG( NX%*NY%) 'Полное число спинов f FOR l%=1 TO NY% 'начальное состояние: половина спинов FOR J%=1 TO NX% ' направлена вверх, половина - вниз IF RND<.5 THEN S%(I%,J%)=1 ELSE S%(I%,J%)=-1 NEXT NEXT 1% r JJ=O: B=0 'начальные связи равны 0 г LOCATE 16,20: ВЕЕР 1280 RANDOMIZE 'начальное случайное число 1290 1300 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 RETURN г '************************************************************************* 'Подпрограмма ввода параметров расчета ' входные переменные: нет 'выходные переменные: FREQ%, NGROUP%, NTHERM%, SIZE% ' глобальные переменные: В, J J, R ' локальные переменные: 1% 1 *1»>1»>-»г^а»1|г************^***11г******л1 X X X X CLS ' 'задание новых констант связи LOCATE 12,20 PRINT USING "Текущее значение J равно ##.#####"; JJ LOCATE 13,20: ВЕЕР INPUT "Введите новое значение J";JJ LOCATE 14,20 PRINT USING "Текущее значение В равно ##.#####"; В LOCATE 15,20: ВЕЕР INPUT "Введите новое значение В"; В Г FOR l%=1 ТО S 'расчет вероятностей опрокидывания R( 1%, 2)=ЕХР(-2«( JJ*( 2*1%-6)+В) J R(I%,1J=1/R(I%,2)
Программы для примеров 407 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 3000 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 NEXT l% Г LOCATE 16,20: ВЕЕР 'ввод числа термализационных шагов INPUT "Введите число термализационных шагов"; NTHERM% IF NTHERM%<0 THEN NTHERM%=0 LOCATE 17,20: BEEP 'задание количества и размера групп INPUT "Введите число групп в расчете"; NGROUP% LOCATE 18,20 PRINT USING "Текущее число испытаний в каждой группе ###";SIZE% LOCATE 19,22: ВЕЕР INPUT "Задайте новое число испытаний в каждой группе"; SIZE% г LOCATE 20,20 'задание частоты выборки PRINT USING "Текущая частота выборки равна ###";FREQ% LOCATE 21,22: ВЕЕР INPUT "Задайте новую частоту выборки"; FREQ% IF FREQ%>0 THEN GOTO 2400 ELSE GOTO 2340 CLS RETURN r 9 ************************************************************************* 'Подпрограмма расчета одного прохода (шага) по решетке ' входные переменные: нет ' выходные переменные: АССЕРТ% ' глобальные переменные: NX%, NY%, S%, R 'локальные переменные: F%, 1%, IM%, IP%, J%, JM%, JP%, SPIN% ACCEPT%=0 'счетчик принятых опрокидываний FOR l%=1 TO NY% 'цикл по вертикали IF l%<NY% THEN IP%=I%+1 ELSE IP%=1 4% индекс соседа сверху IF l%>1 THEN IM%=I%-1 ELSE IM%=NY% 'l% индекс соседа снизу FOR J%=1 TO NX% 'цикл по горизонтали IF J%<NX% THEN JP%=J%+1 ELSE JP%=1 'J% индекс соседа справа IF J%>1 THEN JM%=J%-1 ELSE JM%=NX% 'J% индекс соседа слева SPIN%=S%( 1%,J%) 'значение спина в данной ячейке ' 'сумма четырех соседних спинов F%=S%t <?% 1%1 +S%11М%, J%j+S%( 1%, JP% j +S%( 1%, JM%) ' 'испытание: опрокидывать ли спин
408 Приложение Б 3190 3200 3210 3220 3230 3240 3250 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 5000 5010 5020 5030 IF RND>R(3+F%/2, (3+SPIN%)/2) THEN GOTO 3220 $%(I%J%)=“SPIN% 'опрокидывание спина ▲CCEPT%=ACCEPT%+1 'увеличение счетчика принятых шагов NEXT J% NEXT 1% RETURN f ************************************************************************** 'Подпрограмма вывода решетки на экран ' входные переменные: S% ' выходные переменные: нет 'глобальные переменные: NX%, NY%, POKING%, ТОР% 'локальные переменные: 1%, J%, LEDGE%, PLACE%, SY% ' ************************************************************************* LEDGE%=160*TOP%+2*CINT( 40- NX%/2) 9 9 'адрес в буфере левого ' края текущих двух строк FOR l%=2 TO NY% STEP 2 PLACE%=LEDGE% FOR J%=1 TO NX% 9 'цикл по парам строк 'текущий адрес в буфере 'цикл по столбцам нахождение символа ASCII IF S%(I%J%)=1 THEN GOTO 4170 ' для этой пары ячеек IF S%(l%-U%)=1 THEN SY%=219 ELSE SY%=223 GOTO 4190 IF S%(l%-1fJ%)=1 THEN SY%=220 ELSE SY%=0 IF NOT POKING% THEN GOTO 4230 POKE PLACE%,SY% PLACE%=PLACE%+2 GOTO 4250 'запись символа в буфер 'увеличение адреса в буфере LOCATE TOP%+l%/2,39-NX%/2+J% PRINT CHR$(SY%); NEXT J% LEDGE%=LEDGE%+160 NEXT 1% RETURN 'использование метода ' LOCATE/PRINT 'адрес левого края ' следующих строк ************************************************************************* Подпрограмма расчета наблюдаемых величин: энергии и намагниченности входные переменные: S% выходные переменные: ENER, MAG%
Программы для примеров 409 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 6000 6010 6020 6030 6040 6050 6060 6070 6075 6080 6090 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 ' глобальные переменные: В, JJ, NX%, NY% 'локальные переменные: 1%, IM%, J%, JM%, SUMSS% ' ^^^^**********************************************^*******^^^^^ MAG%=0 'обнуление намагниченности решетки SUMSS%=0 'обнуление суммы взаимодействий ' ' с соседями сверху и слева FOR l%=1 ТО NY% 'цикл по вертикали IF l%>1 THEN 1М%=1%-1 ELSE IM%=NY% '1% для соседа сверху FOR J%=1 ТО NX% 'цикл по горизонтали IF J%>1 THEN JM%=J%-1 ELSE JM%=NX% 'J% для соседа слева 'сумма взаимодействий SUMSS%=SUMSS%+S%| 1%, J%) *| S%| IM%, J%) +S%[ 1%, JM%) j MAG%=MAG%+S%( 1%, J%| ' сумма намагниченности NEXT J% NEXT 1% ENER=(-JJ*SUMSS%-B*MAG%) ' полная энергия RETURN ’ ************************************************************************* 'Подпрограмма расчета и вывода на экран групповых и полных средних ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: ВОТ%, GROUPE, GROUPE2, GROUPM, GROUPM2, ' IGROUP%, NSPINS, SIZE%, SUMCB, SUMCB2, ' SUMCHI, SUMCHI2, SUME, SUME2, SUMSIGE, SUMM, SUMM, SUMSIGM ' локальные переменные: CB, CHI, E, M, SIGCB, SIGCHI, SIGE, SIGE1, SIGM, ' SIGM1 ’ ************************************************************************* GROUPM=GROUPM/SIZE%: GROUPM2=GROUPM2/SIZE% 'групповые GROUPE=GROUPE/SIZE%: GROUPE2=GROUPE2/SIZE% ' средние CHI=GROUPM2-GROUPM~2: CB=GROUPE2-GROUPE"2 SIGM=SQR( CHI/SIZE%): SIGE=SQR( CB/SIZE%) ' и погрешности LOCATE BOT%, 1 'вывод групповых величин PRINT USING "Группа ###"; IGROUP%; LOCATE BOT%, 12 PRINT USING "E=+#.###+-#.###"; GROUPE/NSPINS, SIGE/NSPINS; LOCATE BOT%, 28 PRINT USING "M=+#. ###+-#.###";GROUPM/NSPINS, SIGM/NSPINS; LOCATE BOT%, 44 PRINT USING "Chi=##.### Cb=##.###";CHI/NSPINS,CB/NSPINS;
410 Приложение Б 6220 6230 6240 6250 6260 6270 6280 6290 6300 6310 6320 6330 6340 6350 6360 6370 6380 6390 6400 6410 6420 6430 6440 6450 6460 7000 7010 7020 7030 7040 7050 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 'добавка в общие суммы SUMM=SUMM+GROUPM: SUMM2=SUMM2+GROUPM~2: SUMCB=SUMCB+CB SUME=SUME+GROUPE: SUME2=SUME2+GROUPE~2: SUMCB2=SUMCB2+CB~2 SUMSIGM=SUMSIGM+SIGM~2: SUMSIGE=SUMSIGE+SIGE~2 SUMCHI=SUMCHI+CHI: SUMCHI2=SUMCHI2+CHP2 ' 'вывод полных величин LOCATE 25,1 PRINT "Tot"; E=SUME/IGROUP%: SIGE=SQR( | SUME2/IGROUP%-E~2) /IGROUP%) SIGE1=SQR( SUMSIGE) /IGROUP% LOCATE 25,5 PRINT USING "E=+#. ###+-. ###/.###";E/NSPINS, SIGE/NSPINS, SIGE1/NSPINS; M=SUMM/IGROUP%: SIGM=SQR( | SUMM2/IGROUP%-M~2) /IGROUP%) SIGM1=SQR( SUMS I GM) /IGROUP% LOCATE 25,25 PRINT USING "M=+*.###+-.###/.###";M/NSPINS,SIGM/NSPINS,SIGM1/NSPINS CHI=SUMCHI/IGROUP% SIGCHI=SQR( | SUMCHI2/IGROUP%-CHr2) /IGROUP%): LOCATE 25,45 PRINT USING "chi=##. ###+-#.###";CHI/NSPINS, SIGCHI/NSPINS; CB=SUMCB/IGROUP%: SIGCB=SQR( [SUMCB2/IGROUP%-CB~2| /IGROUP%) LOCATE 25,63 PRINT USING "Cb=##.###+-##.###";CB/NSPINS, SIGCB/NSPINS; i RETURN r ' ************************************************************************* 'Подпрограмма вывода экрана-заставки входные переменные: нет выходные переменные: нет глобальные переменные: нет локальные переменные: КВ$ ************************************************************************** SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме г LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company";
Программы для примеров 411 7160 ' 7170 LOCATE 5,10 'рисование рамки 7180 PRINT CHR$(201)+STRING${59,205)+CHR${187); 7190 FOR ROW%=6 TO 19 7200 LOCATE ROW%,10: PRINT CHR${186); 7210 LOCATE ROW%,70: PRINT CHR${186); 7220 NEXT ROW% 7230 LOCATE 20,10 7240 PRINT CHR$(200)+STRING${59,205)+CHR${188); 7250 ' 7260 COLOR 15 7270 LOCATE 7,36: PRINT "ПРИМЕР 8"; 7280 COLOR 7: LOCATE 9,16 7290 PRINT "Расчет двумерной модели Изинга методом Монте-Карло" 7300 LOCATE 10,20: PRINT "с использованием алгоритма Метрополиса" 7310 LOCATE 13,35: PRINT "♦♦********" 7320 LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." 7330 LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." 7340 ' 7350 ВЕЕР: LOCATE 19,22 7360 PRINT "Для продолжения нажмите любую клавиш/'; 7370 KB$=INKEY$: IF КВ$="" THEN GOTO 7370 7380 RETURN 7390 ' 8000 ************************************************************************** 8010 'Подпрограмма печати предупреждения о применении оператора РОКЕ 8020 ' входные переменные: нет 8030 'выходные переменные: POKING% 8040 'глобальные переменные: нет 8050 'локальные переменные: ANSWERS, OPTS 8060 ************************************************************************** 8070 CLS 8080 ' 8090 LOCATE 1,33,0 8100 PRINT "ВНИМАНИЕ" 8110 LOCATE 3,11 8120 PRINT "Для ускорения вывода на экран программа использует оператор"; 8130 LOCATE 5,11 8140 PRINT "РОКЕ, заносящий данные прямо в память. Адрес в РОКЕ задает"; 8150 LOCATE 7,11 8160 PRINT "(синтаксис: РОКЕ адрес,данные) смещение в текущем сегменте,";
412 Приложение Б 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 8300 8310 8320 8330 8340 8350 8360 8370 8380 8390 8400 8410 8420 8430 8440 8450 8460 8470 8480 8490 8500 8510 8520 8530 8540 8550 8560 LOCATE 9,11 PRINT "указанном в операторе DEF SEG. Программа устанавливает этот"; LOCATE 11,11 PRINT "сегмент на начало буфера графического или текстового экрана"; LOCATE 13,11 PRINT "в IBM PC. Если в вашем компьютере распределение памяти"; LOCATE 15,11 PRINT "отличается от IBM, то РОКЕ может затереть важные данные в"; LOCATE 17,11 PRINT "ПЗУ. Для обеспечения нормальной работы посмотрите в своем"; LOCATE 19,11 PRINT "руководстве по Бейсику (оператор DEF SEG) адрес сегмента"; LOCATE 21,11 PRINT "буфера экрана и сравните с указанным в строке 8520."; / LOCATE 24,1 'задание метода вывода на экран PRINT "Выберите метод вывода: РОКЕ (1) или более медленный,"; INPUT; " надежный LOCATE (2)"; OPTS IF ОРТ$="1" OR ОРТ$="2" THEN GOTO 8400 LOCATE 25,19: ВЕЕР PRINT "Повторите еще раз, правильный ответ 1 или 2"; LOCATE 24,1: PRINT SPACE$(79); GOTO 8320 IF OPT$="1" THEN POKING%=-1 ELSE POKlNG%=0 IF NOT POKING% THEN RETURN 9 LOCATE 24,1: PRINT SPACE$(79); задание типа монитора LOCATE 25,1: PRINT SPACE$(79); LOCATE 24,5: PRINT "Какой у вас сейчас дисплей: графический (1)"; LOCATE 24,48: INPUT; " или только текстовый (2)"; ANSWERS IF ANSWER$="1" OR ANSWER$="2" THEN GOTO 8520 LOCATE 25,19: BEEP PRINT "Повторите еще раз, правильный ответ 1 или 2"; LOCATE 24,1: PRINT SPACE$(79); GOTO 8450 IF ANSWER$="1" THEN DEF SEG=&HB800 ELSE DEF SEG=&HB000 'задание LOCATE , ,0 ' сегмента видеопамяти 9 RETURN
Приложение В ПРОГРАММЫ ДЛЯ ПРОЕКТОВ В настоящем приложении собраны листинги текстов. программ, рассмот- ренных в каждом из проектов в соответствующих главах книги Формат этих листингов и общие свойства программ идентичны описанным в на- чале приложения Б. ВЛ. ПРОЕКТ 1 Данная программа вычисляет и строит график функции отклонения для рассеяния частицы с заданной энергией на потенциале Ленард-Джонса для NB значений прицельного параметра в интервале от BMIN до ВМАХ Основная задача заключается в проведении вычислений по формуле (1.8) для каждого требуемого значения прицельного параметра (цикл 230—330). Это осуществляется в подпрограмме 2000, в которой снача- ла шаговым поиском определяется координата точки поворота RMIN, а затем по формуле прямоугольников вычисляются интегралы, причем для исключения особенностей проводится замена переменной. Подпрограмма 4000 производит построение графика найденной функции отклонения. Типичные результаты работы этой программы можно получить при следующих исходных параметрах: Е = 1 BMIN, ВМАХ, NB = 0.1, 2.4, 20 . 10 г *************************************************************************** 20 'Проект I: Рассеяние на центральном потенциале типа 6-12 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 0 '***************************************************************************
414 Приложение В 40 GOSUB 5000 'вывод экрана-заставки 50 ' 60 Р1=3.141593 'определение констант и функций 70 NBMAX%=300 'макс, число узлов сетки по В 80 DIM ТНЕТА(ЗОО) 'массив углов рассеяния 90 'если вы увеличиваете NBMAX%, измените размерность THETA 100 RMAX=2.5 'макс. R, для которого V<>0 110 NPTS%=40 'число узлов в квадратуре 120 TOLR=.0001 'погрешность поиска точки поворота 130 DEF FNV(R)=4*(R*(-12)-R*(-6)) 'центральный потенциал 6» 12 140 DEF FNI1(R)=1/RA2/SQR(1-|B/R)А2| 'первая подынтегральная функция 150 DEF FNI2(R)=1/RA2/SQR(1-(B/R)A2-FNV(R)/E) 'вторая подынтегр. функция 160 ' 170 GOSUB 1000 'ввод параметров Е и В 180 ' 190 CLS: LOCATE 2,24 'вывод заголовка результатов 200 PRINT USING "Начальная энергия частицы=###.##"; Е: 210 PRINT "" 220 ' 230 FOR 1В%=0 ТО NB%-1 'вычисление THETA для всех В 240 B=BMIN+IB%*DB 'текущее значение В 250 IF INKEY$="e" THEN GOTO 170 'нажатие клавиши <е> - конец счета 260 GOSUB 2000 'расчет интегралов для ТНЕТА(В) 270 ' 280 THETA(IB%)=2*B*(INT1-INT2)*180/PI 'запоминание угла в градусах 290 ' 300 IF ((IB%+1) MOD 18)=0 THEN GOSUB 3000 'очистка заполненного экрана 310 LOCATE ,21: PRINT USING "В=#.### ";В; 320 PRINT USING "Rmhh=#.### Theta=####.##"; RMIN,THETA(IB%) 330 NEXT IB% 340 ' 350 IF GRAPHICS^ THEN GOSUB 4000 'вывод графика функции отклонения 360 GOTO 170 'запрос новых параметров 370 ' ' и повторение расчета 1000 ' ************************************************************************* 1010 'Подпрограмма ввода параметров Е и В 1020 'входные переменные: нет 1030 'выходные переменные: Е, ВМАХ, BMIN, DB, NB% 1040 'глобальные переменные: GRAPHICS%, MONO% 1050 'локальные переменные: нет 1060 '*************************************************************************
Программы для проектов 415 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 2000 2010 LOCATE 22,5,1: ВЕЕР 'приглашение к вводу Е PRINT "Введите начальную энергию частицы Е в единицах Vzero "; INPUT "или 0 для выхода"; Е IF Е=>0 GOTO 1150 LOCATE 23,23: ВЕЕР PRINT "Величина Е должна быть больше нуля"; LOCATE 22,5: PRINT SPACE$(75) GOTO 1070 'повторение ввода Е IF Е=0 THEN END LOCATE 22,1: PRINT SPACE$(80); 'приглашение к вводу LOCATE 23,1: PRINT SPACE$(80); ' параметров В LOCATE 22,2: PRINT "В обозначает прицельный параметр, a NB - "; PRINT "число точек для вычисления ТНЕТА(В)."; LOCATE 23,24 ВЕЕР: INPUT; "Введите значения BMIN, ВМАХ и NB"; BMIN, ВМАХ, NB% DB=(BMAX-BMIN)/(NB%-1) 'шаг по В IF BMAX<=0 OR BMIN<=0 OR NB%<=0 THEN GOTO 1320 'проверка IF BMAX<=BMIN OR BMAX>=RMAX THEN GOTO 1350 ' параметров В IF NB%>NBMAX% THEN GOTO 1390 IF GRAPHICS% AND MONO% THEN GOSUB 7000'переход на текстовый LOCATE ,,0 ' экран RETURN LOCATE 22,1: PRINT SPACE$(80): BEEP 'обработка ошибок LOCATE 22,20: PRINT "Все величины должны быть положительными."; GOTO 1430 LOCATE 22,1: PRINT SPACE$(80): BEEP LOCATE 22,20 PRINT USING "Область значений ВМАХ: BMIN<BMAX<RMAX=#.##"; RMAX GOTO 1430 LOCATE 22,1: PRINT SPACE$(80): BEEP LOCATE 22,6 PRINT "Число значений В, равное (BMAX-BMIN)ZDB, не должно"; PRINT USING" превышать NBMAX=###";NBMAX% LOCATE 23,20: PRINT SPACE$(59) 'повторение ввода GOTO 1210 ' параметров В '************************************************************************* 'Подпрограмма расчета функции ТНЕТА(В)
416 Приложение В 2020 ' входные переменные: Bf FNI1(R), FNI2(R), FNV(R) INT1, INT2 2030 ' выходные переменные: 2040 ' глобальные переменные: Е, NPTS%, RMAX 2050 ' локальные переменные: DR, H, 1%, R, RMIN, SUM, U, UMAX 2060 '************************************************************************* 2070 RMIN=RMAX: DR=.2: 'поиск точки возврата влево по оси 2080 WHILE DR>TOLR 2090 RMIN=RMIN-DR 2100 IF {1-(B/RMIN) ~2-FNV( RMIN)/Е) >0 GOTO 2120 2110 RMIN=RMIN+DR: DR=DR/2 2120 WEND 2130 r 2140 SUM=0 '1-й интеграл методом прямоугольников 2150 UMAX=SQR|RMAX-B) 'замена переменной на U=SQR(R-B] 2160 H=UMAX/NPTS% ' для исключения особенности 2170 FOR l%=1 TO NPTS% 2180 U=H*(l%-.5) 2190 R=U*2+B 2200 SUM=SUM+U*FNI1( R) 2210 NEXT \% 2220 INT1=2*H*SUM 2230 9 2240 SUM=0 '2-й интеграл методом прямоугольников 2250 UMAX=SQR( RMAX-RMIN) 'замена переменной на U=SQR(R-RMIN) 2260 H=UMAX/NPTS% ' для исключения особенности 2270 FOR l%=1 TO NPTS% 2280 U=H*(l%-.5) 2290 R=U*2+RMIN 2300 SUM=SUM+U*FNI2( R] 2310 NEXT 1% 2320 INT2=2*H*SUM 2330 r 2340 RETURN 2350 9 3000 '************************************************************************* ЗОЮ 'Подпрограмма очистки экрана при его заполнении 3020 ' входные переменные: нет 3030 ' выходные переменные: нет 3040 ' глобальные переменные: Е 3050 'локальные переменные: нет 3060 ' *************************************************************************
Программы для проектов 417 3070 3080 3090 3100 3110 3120 3130 4000 4010 4020 4030 4040 4050 4055 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 4300 4310 4320 LOCATE 24,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 3090 CLS: LOCATE 2,24,0 PRINT USING "Начальная энергия частицы=###.##"; E: PRINT "" RETURN r************************************************************************* 'Подпрограмма построения графика функции отклонения ТНЕТА(В) 'входные переменные: В, THETA ' выходные переменные: нет ' глобальные переменные: BMIN, ВМАХ, DB, Е, MONO%, NB%, RMAX 'локальные переменные: 1%, MARK%, Х%, XOLD%, XSCALE, Y%, ' YOLD%, YSCALE ' ************************************************************************* LOCATE 24,21,1: BEEP 'запрос команды с ожиданием PRINT "Для вывода графика нажмите клавишу <д> IF INKEY$o"g" GOTO 4090 LOCATE ,,0 IF MONO% THEN GOSUB 6000 SCREEN 2,0,0,0 CLS: KEY OFF 'переход на графический дисплей 'режим графики высокого разрешения LINE (60,1)-(60,199) 'ось THETA LINE (60,100)-(640,100) 'ось В г FOR MARK%=1 ТО 5 'деления оси В X%=60+MARK%*579/5 LINE (Х%,98)-(Х%,102) NEXT MARK% FOR l%=1 TO 5 'оцифровка оси В LOCATE 14, (6+l%*14) PRINT USING "#.###"; BMIN+(l%*(BMAX-BMIN)/5) NEXT 1% LOCATE 14,9: PRINT USING "#.###"; BMIN LOCATE 12,79: PRINT "b" 'обозначение оси В FOR MARK%=0 TO 8 'деления оси THETA
418 Приложение В 4330 4340 4350 4360 4370 4380 4390 4400 4410 4420 4430 4440 4450 4460 4470 4480 4490 4500 4510 4520 4530 4540 4550 4560 4570 4580 4590 4600 4610 4620 4630 4640 4650 4660 4670 4680 4690 4700 4710 5000 5010 Y%=MARK%*199/8 LINE (58,У%)-(62Л%) NEXT MARK% FOR l%=4 TO -3 STEP -1 'оцифровка оси THETA LOCATE (22-(l%+3)*3), 4 PRINT USING "+###"; l%*45; NEXT 1% 9 LOCATE 11,1: PRINT "T"; 'обозначение оси THETA LOCATE 12,1: PRINT "H" LOCATE 13,1: PRINT "E" LOCATE 14,1: PRINT "T" LOCATE 15,1: PRINT "A" 9 LOCATE 1,61: PRINT "Функция отклонения" 'вывод названия грвфика LOCATE 2,62: PRINT USING "Энергия=###.###"; E XSCALE=580/(BMAX-BMIN): YSCALE=199/360 'масштабы для экрана FOR 1В%=0 ТО NB%-1 X%=60+XSCALE*IB%*DB Y%=199-YSCALE*(THETA(IB%)+180) IF Y%>199 THEN Y%=199 LINE (X%-2,Y%)-(X%+2,Y%) LINE (X%, Y%-2)-(X%, Y%+2) IF IB%=0 GOTO 4610 LINE (XOLD%,YOLD%)-(X%,Y%) XOLD%=X%: YOLD%=Y% NEXT IB% 'нанесение точек THETA для всех В 'координаты текущей точки 'удержание в границах экрана 'маркировка точки знаком '+' 'для первой точки 'соединение предыдущей нет с предыдущей точкой 'переход к следующей точке LOCATE 24,23: ВЕЕР 'запрос команды с ожиданием PRINT "Для продолжения с новыми параметрами нажмите клавишу <с>"; IF INKEY$o"c" GOTO 4660 IF MONO% THEN GOSUB 7000 'возврат на текстовый дисплей SCREEN 0: WIDTH 80: LOCATE ,,1,12,13 'возврат в текстовый режим RETURN '************************************************************************* 'Подпрограмма вывода экрана*заставки
Программы, для проектов 419 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 5370 5380 5390 5400 5410 5420 1 входные переменные: нет 'выходные переменные: GRAPHICS%, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% * фффффффффффффффф]|с9|сффффф********фф************************фффф************ SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме Г LOCATE 1r30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; r LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); r COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРОЕКТ 1"; COLOR 7: LOCATE 10,18 PRINT "Рассеяние на центральном потенциале типа 6-12" LOCATE 13,35: PRINT "*##*******" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." Г LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$, 1)="у" OR LEFT$(G$, 1)="n" GOTO 5390 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 5340 IF LEFT$(G$,1)="y" GOTO 5420 GRAPHICS%=0: MONO%=-1 RETURN GRAPHICS%=-1
420 Приложение В 5430 LOCATE 18,15: PRINT SPACE$(55) 5440 LOCATE 19,13: PRINT SPACE$(57) 5450 LOCATE 19,13: BEEP 5460 INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ 5470 IF LEFT$(M$,1)="y" OR LEFT$(M$, 1)="n" GOTO 5490 'проверка ответа 5480 LOCATE 18,35: PRINT "Повторите...": GOTO 5440 5490 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 5500 RETURN 5510 ' 6000 'иг************************************************************************ 6010 'Подпрограмма переключения с текстового дисплея на графический 6020 ' входные переменные: нет 6030 ' выходные переменные: нет 6040 ' глобальные переменные: нет 6050 'локальные переменные: нет 6060 ' ************************************************************************* 6070 DEF SEG=0 6080 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 6090 SCREEN 0: WIDTH 40: LOCATE ,,1,6,7 6100 RETURN 6110 ' 7000 ' ************************************************************************* 7010 'Подпрограмма переключения с графического дисплея на текстовый 7020 'входные переменные: нет 7030 'выходные переменные: нет 7040 'глобальные переменные: нет 7050 'локальные переменные: нет 7060 '+*******w^ 7070 DEF SEG=0 7080 POKE &Н410, (РЕЕК(&Н410) OR &Н30) 7090 SCREEN 0: WIDTH 80: LOCATE ,,1,12,13 7100 RETURN > 7110 '
Программы для проектов 42J_ В. 2. ПРОЕКТ II Данная программа строит серию моделей белого карлика для указанной величины относительного содержания электронов YE, в которых значе- ние плотности в центре звезды изменяется в заданном диапазоне зна- чений от RHO1 до RHO2 с постоянным шагом в логарифмическом масшта- бе. Для каждой модели (цикл 190—290) методом Рунге —Кутты четвер- того порядка интегрируются безразмерные уравнения движения (11.18) для массы и плотности. В каждой модели используется своя эмпиричес- ки подобранная величина шага по радиусу (строка 230), а начальные условия интегрирования определяются из разложения дифференциальных уравнений в ряд Тейлора в точке г = 0 (строки 240—270). Интегриро- вание ведется до тех пор, пока плотность не упадет до величины 103г/см3 (цикл 2100—2150, подпрограммы 3000 и 4000), после чего вычисляются внутренняя и гравитационная энергии звезды (строки 5080—5160) и результаты расчета выводятся на экран. Типичный вариант расчета можно получить, задавая Ye = 1, начальную и конечную плотность в центре соответственно равными 1Е5 и 1Е11 и заказывая 4 модели. 10 '*************************************************************************** 20 'Проект 2: Структура белых карликов 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 0 '*************************************************************************** 40 GOSUB 7000 'вывод экрана-заставки 50 ' 'определение констант и функций 60 MEOVERMP=1/1836 'отношение масс электрона и нуклона 70 DEF FNGAMMA(X) =X*X/3/SQR(X*X+1) 'функц. зависимость для давления 80 DEF FNPARH(X) =Х*( 1+2*Х*2) *SQR( 1+Х*2) ' функиональные зависимости 90 DEF FNPART2(X)=LOG(X+SQR(1+X~2)) ' для энергии электронов 100 DEF FNEPSRHO(X)=.375*(FNPART1(X)-FNPART2(X)) 110 ' 120 JMAX%=300 130 DIM RHOSTOR(300) 140 DIM MSTOR(300) 150 ' 160 GOSUB 1000 'макс, число шагов по радиусу 'массив безразмернных rho 'массив безразмеренных масс 'ввод расчетных моделей
422 Приложение В 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 RHOCUT=1000!/RHQ0 ' безразмерная миним. плотность FOR MODEL%=1 ТО NMODELS% IF INKEY$="e" THEN GOTO 350 'цикл по моделям ТЕМР=( RHO2/RHO1) (MODEL%-1) /(NMODELS%-1)) ' плотность в RHOCENT=( RHOI/RHOO) *ТЕМР DR=( 3*. 001/RHOCENT) 33333/3 RSTART=DR/10 MSTOR( 0) zRSTARF 3*RHOCENT/3 ' центре звезды для текущей модели 'шаг по радиусу 'первый узел в точке dr/10 'начальная масса TEMP=RSTARF2/6/FNGAMMA(RHOCENr. 333333) 'начальная плотность RHOSTOR( 0) =RHOCENT*( 1-TEMP*RHOCENT) GOSUB 2000 'интегрирование уравнений модели GOSUB 5000 NEXT MODEL% 'вывод результатов IF GRAPHICS% THEN LOCATE 16,46 ELSE LOCATE ,23 PRINT "Для продолжения нажмите клавишу <с>";: ВЕЕР IF INKEY$="c" THEN GOTO 160 ELSE GOTO 330 9 IF GRAPHICS% THEN LOCATE 16,46 ELSE LOCATE ,22 BEEP: INPUT "Вы действительно хотите закончить работу (у/п)";КВ$ IF КВ$="у" THEN STOP ELSE GOTO 160 9 9 ************************************************************************* 'Подпрограмма ввода параметров рассчитываемых моделей ' входные переменные: нет 'выходные переменные: МО, NMODELS%, RHOO, RHO1, RHO2, YE ' глобальные переменные: нет 'локальные переменные: нет ************************************************************************** CLS LOCATE 9,13,1: ВЕЕР INPUT "Введите относительное содержание электронов Ye (>0,<=1)";YE IF YE>0 AND YE<=1 THEN GOTO 1120 ELSE GOTO 1080 9 LOCATE 11,16 PRINT "Рассчитывается ряд моделей, в которых плотность в" LOCATE 12,14 PRINT "центре возрастает от начального значения до конечного" LOCATE 13,17 PRINT "с постоянным шагом в логарифмическом масштабе."
Программы для проектов 423 1190 LOCATE 15,13: ВЕЕР 1200 INPUT "Введите начальную плотность в центре (>=1е5,<=1е15)"; RHO1 1210 IF RH01>=100000! AND RHO1<=1E+15 THEN GOTO 1220 ELSE GOTO 1190 1220 LOCATE 16,13: BEEP 1230 INPUT "Введите конечную плотность в центре (>=1е5,<=1е15)"; RHO2 1240 IF RH02>=100000! AND RHO2<=1E+15 THEN GOTO 1250 ELSE GOTO 1220 1250 LOCATE 17,13: BEEP 1260 INPUT "Введите число рассчитываемых моделей (>=2)"; NMODELS% 1270 1280 IF NMODELS%>=2 THEN GOTO 1290 ELSE GOTO 1250 1290 R0=7.72E+08*YE 'масштабирование радиуса 1300 MO-5.67E+33*YE~2 'масштабирование массы 1310 1320 RHO0=979000!/YE 'масштабирование плотности 1330 CLS 1340 1350 RETURN Г 2000 9 ************************************************************************* 2010 'Подпрограмма интегрирования модели для данной плотности в центре 2020 ' входные переменные: нет 2030 ' выходные переменные: RHOSTOR, MSTOR 2040 'глобальные переменные: J%, JMAX%, М, R, RHO, RHOCUT 2050 'локальные переменные: нет 2060 '************************************************************************* 2070 RzRSTART: J%=0 'начальные условия 2080 2090 RHO=RHOSTOR( 0): M=MSTOR( 0) 2100 WHILE RHO>RHOCUT AND J%<JMAX% 'интегрирование от центра 2110 2120 GOSUB 3000 'шаг методом Рунге-Кутты 2130 IF RHO<=RHOCUT THEN RHOzRHOCUT 'ограничение плотности снизу 2140 RHOSTOR)J%)=RHO: MSTOR(J%)=M 'запоминание новых значений 2150 2160 WEND Г 2170 2180 RETURN Г 3000 9 ************************************************************************* ЗОЮ 'Подпрограмма интегрирования дифференциальных уравнений на один 3015 ' шаг DR методом Рунге-Кутты 4-го порядка 3020 ' входные переменные: нет 3030 'выходные переменные: нет
424 Приложение В 3040 3050 3055 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 4110 ' глобальные переменные: DMDR, DR, DRHODR, М, R, RHO 'локальные переменные: KIM, K1RHO, К2М, K2RHO, КЗМ, K3RHO, ’ К4М, K4RHO '************************************************************************* GOSUB 4000 K1M=DR«DMDR: K1RHO=DR*DRHODR 'расчет k1 R=R+DR/2 M=M+. 5*K1M RHO=RHO+. 5*K1RHO GOSUB 4000 K2M=DR*DMDR: K2RHO=DR*DRHODR 'расчет k2 M=M+. 5*(K2M-K1M) RHO=RHO+. 5*( K2RHO-K1RHO) GOSUB 4000 K3M=DR*DMDR: K3RHO=DR*DRHODR 'расчет k3 R=R+DR/2 M=M+K3M-.5*K2M RHO=RHO+K3RHO-. 5*K2RHO GOSUB 4000 K4M=DR*DMDR: K4RHO=DR*DRHODR 'расчет k4 M=M-K3M+( K1M+2*K2M+2*K3M+K4M) /6 'новые значения M и RHO RHO=RHO-K3RHO+( K1RHO+2*K2RHO+2»K3RHO+K4RHO) /6 RETURN 9 9************************************************************************* 'Подпрограмма вычисления производных от массы и плотности ' входные переменные: М, R, RHO 'выходные переменные: DMDR, DRHODR ' глобальные переменные: FNGAMMA 'локальные переменные: нет '*******:* jfc**************************************************************** IF RHO<=0 THEN RETURN г DRHODR=-M*RHO/R"2/FNGAMMA( RHO*. 333333) DMDR=R*2*RHO RETURN
Программы для проектов 425 4120 5000 5010 5020 5030 5040 5050 5060 5065 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 5370 5380 1 ************************************************************************* 'Подпрограмма вывода результатов расчета модели ' входные переменные: MSTOR, RHOSTOR ' выходные переменные: нет ' глобальные переменные: DR, FNEPSRHO, GRAPHICS%, J%, MEOVERMP, ' ЛАМАХ, MODEL%, МО, RHOCENT, RHOMIN, RHOSCALE, RHOO, RMAX, R0, YE ' локальные переменные: EGRAV, EINT, E0,1%, MOLD%, R, ROLD%, X%, ' Y%, XOLD%, YOLD% 1 ************************************************************************* EGRAV=0: EINT=O 'вычисление энергий FOR l%=1 TO J%-1 R=I%*DR EGRAV=EGRAV+MSTOR( 1%) *RHOSTOR( \%] *R EINT=EINT+R~2*FNEPSRHO( RHOSTORJ l%) *. 333333] NEXT \% E0=YE*MEOVERMP*9*( M0/1E+31 ] EGRAV=- EGRAV*DR*E0 EINT=EINT*DR*EO 9 IF GRAPHICS% THEN GOTO 5370 ' 'вывод в текстовом режиме IF MODEL%>1 THEN GOTO 5240 LOCATE 25,28 PRINT USING "Белые карлики c Ye=#.###";YE LOCATE 1,1 LOCATE , 1: PRINT USING "Модель ##";MODEL%;: LOCATE ,12 PRINT USING "Плотность центра=+#.####Л™"; RHOCENT*RHOO; LOCATE ,41: PRINT USING "Macca=+#.#### ~";MSTOR(J%)*M0; LOCATE ,59: PRINT USING "Радиус=+#.####~~ 4~";J%*DR*RO LOCATE , 3: PRINT "Энергии в 10^51 эрг:"; LOCATE ,24: PRINT USING "Еграв=+#.####~~ "; EGRAV; LOCATE ,42: PRINT USING "Евнутр=+#.####’*”"; EINT; LOCATE ,61: PRINT USING "Еполн=+#.####™ EGRAV+EINT LOCATE ,16: PRINT USING "Шаг по радиусу=+#.####>ч>ч>ч>ч"; DR*R0; LOCATE ,49: PRINT USING "Число шагов=###"; i% PRINT RETURN ' 'вывод в графическом режиме IF MODEL%=1 THEN GOSUB 6000 'подготовка экрана для графиков
426 Приложение В 5390 5400 5410 5420 5430 5435 5440 5445 5450 5460 5470 5480 5490 5500 5510 5520 5530 5540 5550 5560 5570 5580 5590 5600 5610 5620 5630 5640 5650 5660 5670 5680 5690 6000 6010 6020 6030 6040 6050 6055 6060 LOCATE 5,55: PRINT USING "Модель ##";MODEL%; LOCATE 5,69: PRINT USING "Ye=#.####"; YE; LOCATE 6,53: PRINT USING "Шаг по радиусу +#.#### Л ";DR*R0 LOCATE 7, 53: PRINT USING "Число шагов LOCATE 9,53 PRINT USING "Плотность центра +#. ####ЛЛЛЛ"; RHOCENT*RHOO; LOCATE 10,53 PRINT USING "Масса +#.####^~";MSTOR(J%)*MO; LOCATE 11,53: PRINT USING "Радиус "";J%*DR*R0; LOCATE 12,53: PRINT USING "Еграв (10~51) +#.####*-* ~";EGRAV; LOCATE 13,53: PRINT USING "Евнутр (10~51) +#.####*-* ~";EINT; LOCATE 14,53: PRINT USING "Еполн (10~51) +#.####"" EGRAV+EINT; XOLD%=30 'график плотности YOLD%=183-LOG(RHOSTOR(0)/RHOMIN)*RHOSCALE FOR l%=1 TO J% R=DR*l%*R0/1E+08 X%=30+R*300/RMAX Y%=183-LOG(RHOSTOR(I%)/RHOMIN)*RHOSCALE LINE (XOLD%,YOLD%)-(X%,Y%) XOLD%=X%: YOLD%=Y% NEXT 1% r X%=30+300*DR*J%*R0/1E+08/RMAX 'нанесение точки на график Y%=85-85*MSTOR(J%)*MO/1E+33/MMAX ' зависимости массы от радиуса IF MODEL%>1 THEN GOTO 5640 ROLD%=X%: MOLD%=Y% LINE (ROLD%, MOLD%)-(X%, Y%) LINE (X%,Y%-2)-(X%,Y%+2) ROLD%=X%: MOLD%=Y% r RETURN ************************************************************************** ' Подпрограмма подготовки вывода графиков на экран ' входные переменные: J% 'выходные переменные: ЛАМАХ, RHOMIN, RHOSCALE, RMAX 'глобальные переменные: DR, RHOCUT, RHOO, RHO2, R0, YE 'локальные переменные: LABEL, LRHOMAX%, LRHOMIN%, MARK%, ' RHOMAX, X%, Y% '*************************************************************************
Программы для проектов 427 6070 RMAX=J%*DR*R0/1 Е+08 'макс, радиус на графике (10^8 см) 6080 ЛЛМАХ=15*УЕ>'2 'макс, масса на графике (10^33 г) 6090 Г 6100 FOR MARK%=0 ТО 5 6110 X%=3+MARK%*7 'оцифровка оси радиуса 6120 IF MARK%>=3 THEN X%=X%+1 6130 LABEL=RMAX*MARK%/5 6140 LOCATE 24, X% 6150 PRINT USING LABEL; 6160 LOCATE 12, X% 6170 PRINT USING LABEL; 6180 r 6190 Y%=11-MARK%*2 'оцифровка оси массы 6200 LOCATE Y%,1 6210 LABEL=MARK%*MMAX/5 6220 IF LABEL <10 THEN PRINT USING LABEL; 6230 IF LABEL>=10 THEN PRINT USING LABEL; 6240 r 6250 Y%=85-85*MARK%/5 'деления оси массы 6260 LINE (30,Y%)-(33,Y%) 6270 / 6280 X%=30+MARK%*60 'деления оси радиуса 6290 LINE (X%, 183)-(X%, 180) 6300 LINE (X%,85)-(X%,82) 6310 NEXT MARK% 6320 r 6330 LOCATE 12,23: PRINT "R"; 'обозначение оси радиуса 6340 LOCATE 24,23: PRINT "r"; 6350 LOCATE 12,43: PRINT "x10~8 см"; 6360 LOCATE 24,43: PRINT "x10~8 см"; 6370 r 6380 LOCATE 17,1: PRINT "log"; 'обозначение плотности 6390 LOCATE 18,1: PRINT "rho"; 6400 r 6410 LOCATE 1,6: PRINT "M (10^33 г)"; ’обозначение оси массы 6420 r 6430 LINE (30,183)-(330,183) 'проведение < осей 6440 LINE (30,183)-(30,98) 6450 LINE (30,85)-(330,85) 6460 LINE (30,85)-(30,0) 6470 r
428 Приложение В 6480 6490 6500 6510 6520 6530 6540 6550 6560 6570 6580 6590 6600 6610 6620 6630 6640 6650 6660 6670 7000 7010 7020 7030 7040 7050 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 LRHOMAX%=CINT(LOG(RHO2)/LOG(10) +1) 'плотность в лог. масштабе RHOMAX=10^LRHOMAX% LRHOMIN%=CINT( LOG( RHOO*RHOCUT)/LOG( 10)) RHOMIN=104RHOMIN% RHOSCALE=85/LOG( RHOMAX/RHOMIN) t LOCATE 23,2 'оцифровка оси rho PRINT USING LRHOMIN%; LOCATE 13,2 PRINT USING LRHOMAX%; t FOR MARK%=LRHOMIN%+1 TO LRHOMAX% 'деления оси rho Y%=183-(MARK%-LRHOMIN%)*85/(LRHOMAX%-LRHOMIN%) LINE (30,Y%)-(33,Y%) NEXT MARK% f RHOMIN=RHOMIN/RHOO 'обезразмеривание RHOMIN t RETURN t ' «««ilc^Jlc^Jlc^Jlolc************************************************************** 'Подпрограмма вывода экрана-заставки ' входные переменные: нет 'выходные переменные: GRAPHICS^, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% 1фффффффффффффффффффжфффффффффффффффжфффффффффффффффжжфжффффжжжффффффффффф SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме г LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; t LOCATE 5,10 'рисование рамки PRINT CHR$( 201)+STRING$( 59,205)+CHR$( 187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186);
Программы для проектов 429 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 7370 7380 7390 7400 7410 7420 7430 7440 7450 7460 7470 7480 7490 7500 7510 7520 7530 7540 7550 7560 7570 7580 7590 7600 7610 LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$( 200)+STRING$(59,205)+CHR$( 188); r COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРОЕКТ 2"; COLOR 7 LOCATE 10,28: PRINT "Структура белых карликов"; LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." 9 LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$,1)="y" OR LEFTS (G$, 1)="n" GOTO 7400 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 7350 IF LEFT$(G$,1)="y" GOTO 7430 GRAPHICS%=0: MONO%=-1 GOTO 7520 GRAPHICS%=-1 LOCATE 18,15: PRINT SPACE$(55) LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$,1)="y" OR LEFT$(M$, 1)="n" GOTO 7500 'проверка ответа LOCATE 18,35: PRINT "Повторите...": GOTO 7450 IF LEFT$(M$, 1)="y" THEN MONO%=-1 ELSE MONO%=0 9 LOCATE 21,11 PRINT "Данная программа рассчитывает серию моделей белых карликов"; LOCATE 22,14 PRINT "с фиксированным Ye и возрастущей плотностью в центре."; LOCATE 23,12 PRINT "Все входные и выходные величины выражены в единицах СГС."; LOCATE 24,23 PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 7600 LOCATE ,,0
430 7620 7630 7640 7650 7660 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 Приложение В г IF GRAPHICS% THEN GOSUB 8000 'переход в графический режим г RETURN г '************************************************************************* ' Подпрограмма переключения с текстового дисплея на графический входные переменные: нет 'выходные ' глобальные переменные: нет переменные: нет 'локальные переменные: нет DEF SEG=0 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 SCREEN 2,0,0,0: WIDTH 80: LOCATE ff0 RETURN
Программы для проектов 431 В.З. ПРОЕКТ III Данная программа решает уравнения Хартри—Фока в приближении «на- полнения» оболочек для атомных систем, имеющих электроны в оболоч- ках Is, 2s и 2р. В подпрограмме 1000 задаются заряд ядра, заполнен- ность оболочек и параметры разностной сетки. Ядро программы состав- ляют подпрограммы 4000, 5000, 6000 и 9000, в которых для заданного набора радиальных волновых функций рассчитывается полная энергия системы (III.26, III.27) и одночастичные энергии (III.30). Отметим, что в качестве плотности при этом используется взвешеное среднее текущего и предыдующего значений этой величины (строки 5080—5100 и 5140—5170). Необходимые интегралы вычисляются по правилу трапеций Эти же подпрограммы используются и в подпрограмме 2000 для отыска- ния оптимальных нормированных водородных волновых функций, предназ- наченных для начала итераций. Одночастичные уравнения на собствен- ные значения (III.28) решаются как неоднородные краевые задачи (подпрограмма 7000) с использованием одночастичных энергий, вычис- ленных на предыдущей итерации. Отдельно обеспечивается ортогональ- ность орбиталей 1s и 2s (строки 7540—7620). На каждой итерации на экран выводятся значения различных энергий, а также графики парци- альной и полной электронной плотностей. В качестве типичного расчета можно задать ядро с зарядом Z = 6, заполненностью каждой из орбиталей Is, 2s, 2р —два электрона, шагом сетки по радиусу—0,01 А и радиусом расчетной области—2 А. Данный вариант дает неплохое описание нейтрального атома углерода. 10 '*************************************************************************** 20 'Проект III: Решение уравнений Хартри-Фока для малых атомных систем 30 ' в приближении "наполнения" оболочек 31 'COMPUTATIONAL PHYSICS by Steven E. Koonin 32 'Copyright 1985, Addison-Wesley Publishing Company 40 **************************************************************************** 50 GOSUB 10000 'вывод экрана-заставки 60 IF GRAPHICS^ THEN GOSUB 11000 'переход на графический дисплей 70 ' 'определение массивов и констант 80 NRMAX%=700 'максимальное число узлов сетки 90 NSTATE%=3 'максимальное число состояний 100 DIM PSTOR(700,3) 'массив для радиальных волн, функций
432 Приложение В 110 DIM PSIIN(700),PSIOUT(700) 'массивы для однородных решений 120 DIM FOCK(700,3) 'массив для значений фоковского члена 130 DIM PHI(700),RHO(700) 'прямой потенциал и плотность 140 DIM NOCC(3) 'числа заполнения состояний 150 DIM EXH(3) 'энергии одночастичных (оч) состояний 160 DIM L%(3),ID$(3) 'угл. моменты и обозначения состояний 170 DIM FACTORIAL(IO) 'массив для факториалов 180 HBM=7.6359 '(h/2pi)~2/m для электрона 190 E2=14.409 'квадрат заряда электрона 200 ABOHR=HBM/E2 'боровский радиус 210 9 220 GOSUB 1000 'ввод параметров системы 230 GOSUB 2000 ' расчет оптимальной водородной функции 240 MIX=.5 'смешивание старой и новой плотностей 250 9 260 FOR NIT%=1 TO 40 'основной итерационный цикл 270 FOR STATE%=1 TO NSTATE% 'цикл по состояниям для новых ф-ций 280 IF INKEY$="e" THEN GOTO 420 'проверка на конец работы 290 IF NOCC( STATE%) =0 THEN GOTO 330 'пустые орбитали обходятся 300 E=EXH( STATE%) 'оч энергия из предыд. волн, функции 310 IF E>0 THEN E=-10 'энергия должна быть отрицательной 320 GOSUB 7000 'решение оч волнового уравнения 330 NEXT STATE% 340 GOSUB 4000 'вычисление и вывод новых энергий 350 NEXT NIT% 360 i 370 LOCATE 10,20: BEEP 'ожидание ввода команды 380 PRINT "Для продолжения нажмите любую клавишу" 390 IF INKEY$="" THEN GOTO 390 400 GOTO 220 'на расчет новой системы 410 » 420 LOCATE 10,20: BEEP: 'ожидание ввода команды 430 INPUT "Вы действительно хотите закончить работу (у/п)";КВ$ 440 IF KB$="y" THEN END 450 IF KB$<>"n" THEN GOTO 420 ELSE GOTO 220 'на расчет новой системы 10ОО ************************************************************************** 1010 ' Подпрограмма ввода параметров рассматриваемого иона 1020 'входные переменные: нет 1030 'выходные переменные: DR, IDS, L%, NE, NOCC, NR%, RMAX, Z, ZE2 1040 'глобальные переменные: NRMAX% 1050 'локальные переменные: нет
Программы для проектов 433 1060 1070 1080 1090 1100 1110 1120 1130 1131 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 ' ************************************************************************* CLS 9 LOCATE 8,15 INPUT "Введите заряд ядра Z";Z 'задание заряда ядра ZE2=Z*E2 9 L%(1)=0: ID$(1)="1s" 'значения L и обозначения ' орбиталей L%(2)=0: ID$(2)="2s" L%(3)=1: ID$(3)="2p" ' 'задание заполнения состояний LOCATE 9,15 INPUT "Введите число электронов в состоянии 1$ (>=0,<=2)"; NOCC(1) IF NOCC(1)>=0 AND NOCC{1)<=2 THEN GOTO 1210 BEEP: GOTO 1170 LOCATE 10,15 INPUT "Введите число электронов в состоянии 2s (>=0,<=2)";NOCC(2) IF NOCC(2)>=0 AND NOCC(2)<=2 THEN GOTO 1250 BEEP: GOTO 1210 LOCATE 11,15 INPUT "Введите число электронов в состоянии 2р (>=0,<=6)"; NOCC(3) IF NOCC(3)>=0 AND NOCC(3)<=6 THEN GOTO 1300 BEEP: GOTO 1250 ' 'ввод параметров сетки LOCATE 12,15 INPUT "Введите размер шага по радиусу (в ангстремах)"; DR LOCATE 13,15 INPUT "Введите радиус расчетной области (в ангстремах)";RMAX NR%=CINT(RMAX/DR) 'число узлов сетки; должно быть IF NR%<=NRMAX% THEN GOTO 1430 'меньше максимально допустимого ВЕЕР: LOCATE 14,15 PRINT USING "Получающаяся сетка содержит ##### узлов. ";NR% LOCATE 15,15 PRINT USING "Максимально допустимое число узлов = ####."; NRMAX% LOCATE 16,15: PRINT "Повторите ввод или выйдите и измените"; LOCATE 16,52: PRINT " размер массивов в программе" GOTO 1300 NE=0 'подсчет числа электронов FOR STATE%=1 ТО NSTATE% NE=NE+NOCC( STATE%) 28—1650
434 Приложение В 1460 NEXT STATE% 1470 ' 1480 LOCATE 19,29 1490 PRINT "ПОТЕРПИТЕ! ИДЕТ СЧЕТ!" 'сообщение для нетерпеливых 1500 1510 2000 RETURN г 1 Л,Л.^Л.Л.ЛяЛ.Л.Л.Л,Л.ЛЛ. 2010 ' Подпрограмма нахождения оптимальной водородной вариационной 2015 1 волновой функции 2020 ' входные переменные: нет 2030 'выходные переменные: нет 2040 ' глобальные переменные: DR, ELAST, ЕТОТ, КТОТ, MIX, NE, NIT%, PFLAG%, 2050 Г VEETOT, VENTOT, VEXTOT, Z, ZSTAR 2060 'локальные переменные: нет 2070 ' ************************************************************************* 2080 ZSTAR=Z 'Z*=Z 2090 GOSUB 3000 'построение волновых функций 2100 MIX=1 'не усреднять со старой плотностью 2110 PFLAG%=0 'отключение печати энергии 2120 GOSUB 4000 'вычисление энергии 2130 ZSTAR=-Z*(VENTOT+VEETOT+VEXTOT)/(2*KTOT) 'оптимальное Z* из вириала 2140 GOSUB 3000 'построение наилучших волновых функций 2150 Г 2160 CLS 'вывод строк заголовка 2170 LOCATE 1, 2: PRINT USING "Z=##.##"; Z; 2180 LOCATE 1,10: PRINT USING "Число электронов=##. ##"; NE; 2190 LOCATE 1,33: PRINT USING "Шаг по радиусу=#.###";ОР; 2200 LOCATE 1,54: PRINT USING "Максимальный радиус=*. ###"; DR*NR% 2210 LOCATE 2,11 2220 PRINT USING "Водородные орбитали дают Z*=##.###"; ZSTAR; 2230 f 2240 PFLAG%=-1 'включение печати энергии 2250 NIT%=0: ELAST=0 'нулевая итерация 2260 GOSUB 4000 'вычисление энергии и вывод 2270 LOCATE 2,45 'печать энергии в заголовке 2280 PRINT USING ", Полная энергия=+####.##";ЕТОТ 2290 RETURN 3000 ' ************************************************************************* ЗОЮ ' Подпрограмма построения нормированных водородных волновых функций 3020 ' входные переменные: ZSTAR 3030 'выходные переменные: PSTOR
Программы для проектов 435 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 4000 4010 4020 4030 4040 4050 4055 4060 4065 4070 4080 4090 4100 4110 28 'глобальные переменные: DR, NOCC, NR%, NSTATE% 'локальные переменные: ERSTAR2, J%, NORM, RSTAR, STATE% '************************************************************************* FOR J%=0 TO NR% RSTAR=J%*DR*ZSTAR/ABOHR ERSTAR2=EXP[ - RSTAR/2] IF NOCC(1)=0 THEN GOTO 3120 PSTOR( J%, 1| =RSTAR*ERSTAR2A2 IF NOCC(2)=0 THEN GOTO 3140 PSTORf J%, 2] =( 2-RSTAR) *RSTAR*ERSTAR2 IF NOCC[3)=0 THEN GOTO 3160 PSTOR( J%, 3) =RSTAR~2*ERSTAR2 NEXT J% r FOR STATE%=1 TO NSTATE% IF NOCC[STATE%)=0 GOTO 3280 NORM=0 FOR J%=1 TO NR% NORM=NORM+PSTOR( J%, STATE%) 'цикл no узлам сетки 'пересчет радиуса 'полезная экспонента 'волновая функция 1s 'волновая функция 2s 'волновая функция 2р 'нормировка орбиталей 'учет только заполненных ' орбиталей 'расчет интеграла от р$Р2 NEXT J% NORM=1/SQR[ NORM*DR) FOR J%=1 TO NR% 'нормировка на единицу PSTORf J%, STATE%) =PSTOR( J%, STATE%) «NORM NEXT J% NEXT STATE% RETURN ' ************************************************************************* ' Подпрограмма расчета и вывода на экран энергий нормированного ' набора одночастичных волновых функций 'входные переменные: PFLAG%, PSTOR * выходные переменные: ETOT, EXH, КТОТ, VEETOT, VENTOT, VEXTOT 'глобальные переменные: DR, ELAST, GRAPHICS^, IDS, НВМ, L%, NOCC, ' NR%, NSTATE%, PHI, ZE2 'локальные переменные: KEN, J%, LL1, PM, PZ, PZ2, R, STATE%, VCENT, ' VEE, VEN, VEX ' ************************************************************************* GOSUB 5000 GOSUB 6000 КТОТ=0 'вычисление плотности и фоковских членов 'расчет прямого взаимодействия 'обнуление полной кинетической энергии
436 Приложение В 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 4300 4310 4320 4330 4340 4350 4360 4370 4380 4390 4400 4410 4420 4430 4440 4450 4460 4470 4480 4490 4500 4510 4520 VENTOT=0 VEETOT=0 VEXTOT=0 'обнуление полной энергии притяжения е-ядро 'обнуление полной энергия отталкивания е-е 'обнуление полной обменной энергии IF NOT PFLAG% THEN GOTO 4230 'нет вывода, если флаг опущен LOCATE 3,27: PRINT USING "--------- Итерация ## ......";NIT% LOCATE 4, 2: PRINT "Состояние L Naan"; LOCATE 4,20: PRINT "Энергии: Кин. Ven"; LOCATE 4, 46: PRINT "Vee Vo6m"; LOCATE 4, 66: PRINT "V e" FOR STATE%=1 TO NSTATE% IF NOCC(STATE%)=0 THEN GOTO 4620 KEN=0: VEN=0: VEE=0: VEX=0 VCENT=0 LL1=L%( STATE%) *( L%( STATE%) +1) PM=0 FOR J%=1 TO NR% R=J%*DR PZ=PSTOR(J%,STATE%) PZ2=PZ*2 KEN=KEN+(PZ-PM) ~2 VCENT=VCENT+PZ2*LL1/R~2 VEN=VEN-PZ2/R VEE=VEE+PHI( J%] *PZ2 VEX=VEX+FOCK( J%, STATE%) *PZ PM=PZ NEXT J% VCENT=VCENT*DR*HBM/2 KEN=KEN*HBM/(2*DR) VEE=VEE*DR VEN=VEN*ZE2*DR VEX=VEX*DR KEN=KEN+VCENT EXH( STATE%) =KEN+VEN+VEE+VEX KTOT=KTOT+KEN*NOCC( STATE%) VENTOT=VENTOT+VEN*NOCC( STATE%) VEETOT=VEETOT+VEE*NOCC( STATE%) VEXTOT=VEXTOT+VEX*NOCC( STATE%) IF NOT PFLAG% GOTO 4620 LOCATE ,6 цикл по состояниям учет только занятых состояний обнуление энергий этого сост. обнуление центробежн. энергии полезная константа цикл по узлам сетки радиус текущего узла волновая ф-ция в этом узле квадрат волновой функции вклад в кинетическую энергию вклад в центробежную энергию вклад в энергию е-ядро вклад в е-е отталкивание вклад в обменную энергию пересылка волновой функции умножение интегралов на константы 'нет вывода, если флаг опущен 'в кин.энергии есть центробежная 'запоминание оч энергии 'добавки в полную энергию
Программы для проектов 437 4530 4540 4550 4560 4570 4580 4590 4600 4610 4620 4630 4640 4650 4660 4670 4680 4690 4700 4710 4720 4730 4740 4750 4760 4770 4780 4790 4800 4810 5000 5010 5020 5030 5040 5050 5060 5065 5070 5080 5090 5100 PRINT ID$(STATE%); LOCATE ,12 PRINT USING "# #.##";L%(STATE%),NOCC(STATE%); LOCATE ,27 PRINT USING " ####.## +####.## ####.##"; KEN, VEN, VEE; LOCATE ,52 PRINT USING " +####.##"; VEX; LOCATE ,61 PRINT USING " +####.## +####.##"; VEN+VEE+VEX, EXH( STATE%) NEXT STATE% VEETOT=VEETOT/2 'исключение двойного счета VEXTOT=VEXTOT/2 ETOT=KTOT+VENTOT+VEETOT+VEXTOT ' полная энергия 9 IF NOT PFLAG% THEN GOTO 4800 'нет вывода, если флаг опущен LOCATE, 1: PRINT "ВСЯ СИСТЕМА:"; LOCATE,13: PRINT USING "##.##"; NE; LOCATE,28: PRINT USING "####. ##";KTOT; LOCATE, 36: PRINT USING "+####.##"; VENTOT; LOCATE,45: PRINT USING "####.##"; VEETOT; LOCATE, 53: PRINT USING "+####.##"; VEXTOT; LOCATE, 62: PRINT USING "+####.##"; VENTOT+VEETOT+VEXTOT LOCATE ,11: PRINT USING "Полная энергия=+####.##";ЕТОТ; LOCATE ,36: PRINT USING "Предыдущая полная энергия=+####.##"; ELAST ELAST=ETOT 'текущее E => след. последнее E IF GRAPHICS% THEN GOSUB 9000 'вывод графика плотности RETURN ' ************************************************************************* 'Подпрограмма вычисления плотности и фоковских членов ' входные переменные: MIX, PSTOR ' выходные переменные: FOCK, RHO 'глобальные переменные: DR, Е2, L%, LAM%, LAMSTART%, LAMSTOP%, ' L1%, L2%, NR%, NSTATE%, THREEJ 'локальные переменные: DF, FAC, 1%, J%, R, RLAM, RLAM1, STATE%, ' STATE2%, SUM, TERM FOR J%=1 TO NR% RHO( J%) =( 1-MIX) *RHO( J%) NEXT J% 'доля старой плотности
438 Приложение В 5110 5120 5130 5140 5150 5160 5170 5180 5190 5200 5210 5220 5230 5240 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 5370 5380 5390 5400 5410 5420 5430 5440 5450 5460 5470 5480 5490 6000 6010 FOR STATE%=1 ТО NSTATE% 'цикл по состояниям IF NOCC|STATE%] =0 GOTO 5470 'учет только занятых состояний FOR J%=1 ТО NR% 'вклад в плотность RHO| J%) =RHO( J%) +MIX*NOCC( STATE%) *PSTOR( J%, STATE%) ~2 FOCK(J%,STATE%)=0 NEXT J% FOR STATE2%=1 TO NSTATE% 'цикл по вторым состояниям IF NOCC|STATE2%)=0 GOTO 5460 ' учет только занятых состояний L1%=L%(STATE%) L2%=L%(STATE2%| LAMSTART%=ABS(L1%-L2%) 'пределы суммы по лямбда LAMSTOP%=L1%+L2% 'цикл суммы FOR LAM%=LAMSTART% ТО LAMSTOP% STEP 2 ' по лямбда GOSUB 8000 'вычисление квадрата |3j)-символа FAC=-E2/2*NOCC| STATE2%) «THREEJ ' множитель в фоковском SUM=0 ' члене FOR l%=1 ТО NR% 'внешний интеграл для фоковского R=I%*DR: RLAM=R~LAM% ' члена TERM=PSTOR( STATE2%) *PSTOR( STATE%) «RLAM/2 SUM=SUM+TERM DF=PSTOR( \%, STATE2%) *FAC*SUM*DR/( RLAM*R] FOCK( l%, STATE%) =FOCK( l%, STATE%) +DF SUM=SUM+TERM NEXT l% SUM=0 FOR l%=NR% TO 1 STEP -1 'внутренний интеграл R=I%*DR: RLAM1=R~( LAM%+1) ' для фоковского члена TERM=PSTOR( l%, STATE2%) *PSTOR( l%, STATE%) /RLAM1/2 SUM=SUM+TERM DF=PSTOR| \%, STATE2%) *FAC*SUM*DR*RLAM1/R FOCK( l%, STATE%) =FOCK( l%, STATE%] +DF SUM=SUM+TERM NEXT l% NEXT LAM% NEXT STATE2% NEXT STATE% RETURN f f************************************************************************* 'Подпрограмма решения уравнения Пуассона для прямого взаимодействия
Программы для проектов 439 6020 6030 6040 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 7000 7010 7020 7030 7040 7050 7060 7070 7080 7090 7100 7110 7120 7130 7140 1 входные переменные: RHO ' выходные переменные: PHI ' глобальные переменные: DR, Е2, NR% 'локальные переменные: CON, J%, М, R, SM, SP, SUM, SZ * ************************************************************************* SUM=0 FOR J%=1 ТО NR% SUM=SUM+RHO(J%)/CSNG(J%) NEXT J% 'квадратура для значения г=0 CON=DR~2/12 SM=0: SZ=-E2*RHO( 1)/DR PHI(0)=0: PHI( 1) =SUM*E2*DR FOR J%=1 TO NR%-1 SP=-E2*RHO( J%+1) /((J%+1) *DR) РНЦ J%+1 J =2*PHI( J%) -РНЦ J%-1 J +CON*( 10*SZ+SP+SM) SM=SZ: SZ=SP интегрирование от центра полезная константа 1-е переопределение значений 5 начальные условия для PHI интеграл от центра по Нумерову NEXT J% ' 'вычитание линейного нарастания M=( РНЦ NR%) -РНЦ NR%-10)) /(10*DRJ FOR J%=1 TO NR% R=J%*DR РНЦJ%)=PHI(J%)ZR-M 'множитель 1/r для правильного NEXT J% ' вида потенциала RETURN '************************************************************************* 'Подпрограмма вычисления одночастичной волновой функции как ' решения неоднородной краевой задачи 'входные переменные: Е, FOCK, PHI, STATE% ' выходные переменные: PSTOR ' глобальные переменные: DR, НВМ, NR%, ZE2 'локальные переменные: DRHBM, \%, )%, К2М, К2Р, K2Z, LL1, NORM, ' NR2%, PSIIN, PSIOUT, R, SUM, TERM, WRON ************************************************************************** DRHBM=DR^2/HBM/6 ' полезная константа LL1=L%( STATE%) *( L%( STATE%) +1) *HBM/2 ' константа для центров, потен. ' 'решение однородной задачи К2М=0 ' интегрированием от центра K2Z=DRHBM*( Е- РНЦ 1) +(ZE2-LL1/DR) /DR) PSIOUT(0)=0: PSIOUT(1)=1E-10
440 Приложение В 7150 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 7370 7380 7390 7400 7410 7420 7430 7440 7450 7460 7470 7480 7490 7500 7510 7520 7530 7540 7550 FOR J%=2 ТО NR% R=DR*J% K2P=DRHEM*( E-PHI( J%) +(ZE2-LL1/R) /R) PSIOUT( J%) =( PSIOUTf J%-1) *( 2-10*K2Z) -PSIOUTJ J%-2)»(1+K2MJ) /(1+K2P) K2M=K2Z: K2Z=K2P NEXT J% ' 'решение однородной задачи K2P=0 ' интегрированием к центру R=(NR%-1)*DR K2Z=DRHBM*( Е-РНЦ NR%-1) +(ZE2-LL1/RJ /R) PSIIN(NR%)=0 PSIIN(NR%-1)=1E-10 FOR J%=NR%-2 TO 1 STEP -1 R=DR*J% K2M=DRHBM*( Е-РНЦ J%) +(ZE2-LL1/R) /R) PSI IN( J%) =( PSI IN( J%+1) *( 2-10*K2Z] -PSIIN( J%+2) *( 1+K2P)) /(1+K2M) K2P=K2Z: K2Z=K2M NEXT J% ' 'Вронскиан в середине сетки NR2%=NR%/2 WRON=( PSIIN( NR2%+1) -PSIIN( NR2%-1)) /(2*DR) *PSIOUT( NR2%) WRON=WRON-( PSIOUT( NR2%+1) -PSIOUTf NR2%-1)) /(2*DR| *PSIIN( NR2%) ' 'решение методом Грина SUM=0: ' интегрированием от центра FOR l%=1 ТО NR% TERM=-PSIOUT( l%) *FOCK( l%, STATE%) /2 SUM=SUM+TERM PSTORJ l%, STATE%) = PSI IN( l%) *SUM*DR SUM=SUM+TERM NEXT l% ' 'решение методом Грина SUM=0 ' интегрированием к центру FOR l%=NR% ТО 1 STEP -1 TERM=-PSIIN( l%) *FOCK( l%, STATE%| /2 SUM=SUM+TERM PSTORf l%, STATE%) =( PSTOR( l%, STATE%) +PSIOUT( l%) »SUM*DR) /WRON SUM=SUM+TERM NEXT l% r IF STATE%<>2 THEN GOTO 7640 'обеспечение ортогональности SUM=0 ' состояния 2s к 1s
Программы, для проектов 441 7560 FOR l%=1 ТО NR% 7570 SUM=SUM+P$TOR( 1%, 1) *P$TOR( 1%, 2) 7580 NEXT \% 7590 5UM=5UM*DR 7600 FOR l%=1 TO NR% 7610 P$TOR( 1%, 2) =PSTOR( 1%, 2) -$UM*PSTOR( 1%, 1) 7620 NEXT \% 7630 ' 'нормировка решения 7640 SUM=0 7650 FOR l%=1 TO NR% 7660 $UM=SUM+PSTOR( 1%, STATE%) ~2 7670 NEXT 1% 7680 NORM=1/SQR(SUM*DR] 7690 FOR l%=1 TO NR% 7700 PSTOR( 1%, STATE%) =P$TOR( 1%, $TATE%) «NORM 7710 NEXT l% 7720 RETURN 7730 ' 8000 '************************************************************************* 8010 'Подпрограмма расчета квадрата (3])-символа, фигурирующего 8020 ' в выражении для обменной энергии 8030 'входные переменные: LAM%, L1%, L2% 8040 ' выходные переменные: THREEJ 8050 ' глобальные переменные: нет 8060 'локальные переменные: DELTA, FACTORIAL, 1МАХ%, Р% 8070 '♦***********************♦*******************♦*******************♦***♦**** 8080 IMAX%=L1%+L2%+LAM%+1 'вычисление массива факториалов 8090 FACTORIAL! 0) =1 8100 FOR l%=1 ТО 1МАХ% 8110 FACTORIAL! \%] =I%*FACTORIAL( l%-1) 8120 NEXT l% 8130 ' 'вычисление (3j)*2 8140 DELTA=FACTORIAL( L1%+L2%-LAM%) «FACTORIAL! -L1%+L2%+LAM%) 8150 DELTA=DELTA*FACTORIAL(L1%-L2%+LAM%)/FACTORIAL!IMAX%) 8160 P%=IL1%+L2%+LAM%)/2 8170 THREEJ=DELTA*FACTORIAL( P%) ~2 8180 THREEJ=THREEJ/FACTORIAL( P%-L1%) ~2 8190 THREEJ=THREEJ/FACTORIAL( P%-L2%) ~2 8200 THREEJ=THREEJ/FACTORIAL(P%-LAM%p2 8210 RETURN 8220 '
442 Приложение В 9000 '************************************************************************* 9010 'Подпрограмма построения графиков плотности 9020 'входные переменные: PSTOR, RHO 9030 ' выходные переменные: нет 9040 ' глобальные переменные: DR, NR%, NSTATE% 9050 'локальные переменные: HSCALE, 1%, IMAX%, MARK%, RHOMAX, 9060 ' STATE%, VSCALE, Х%, XOLD%, Y%, YOLD% 9070 ************************************************************************** 9080 LINE (0,80)-(639,199),0,BF 'очистка нижней половины экрана 9090 » 9100 RHOMAX=0 'нахождение максимума плотности 9110 FOR l%=1 ТО NR% 9120 IF RHO(I%)>RHOMAX THEN RHOMAX=RHO(I%) 9130 NEXT l% 9140 r 9150 VSCALE=98/RHOMAX 'масштабные множители 9160 HSCALE=600/( NR%*DR) 9170 LINE (39,180)-(639,180) 'ось r 9180 LINE (39,180)-(39,80) 'ось rho 9190 LOCATE 12,52 9200 PRINT "График 4*pi*H2*rho (в АЛ-1)" 'название графика 9210 FOR MARK%=0 TO 5 'разметка оси г 9220 X%=MARK%*120+39 9230 LINE (X%, 180)-(X%, 177) 9240 X%=4+MARK%*15 9250 IF MARK%=5 THEN X%=76 9260 LOCATE 24, X%: PRINT USING MARK%*RMAX/5; 9270 NEXT MARK% 9280 LOCATE 24,42: PRINT "г (А)"; 'обозначение оси г 9290 FOR MARK%=0 TO 5 'разметка оси rho 9300 Y%=180-MARK%*20 9310 LINE (39, Y%)-(36, Y%) 9320 Y%=23-MARK%*2 9330 IF MARK%>=2 THEN Y%=Y%-1 9340 IF MARK%>=4 THEN Y%=Y%-1 9350 LOCATE Y%, 1: PRINT USING MARK%*RHOMAX/. 9799999/5; 9360 NEXT MARK% 9370 r 9380 XOLD%=39: YOLD%=180 'рисование полной плотности 9390 FOR l%=1 TO NR% 9400 X%=39+I%*DR*HSCALE
Программы для проектов 443 9410 9420 9430 9440 9450 9460 9470 9480 9490 9500 9510 9520 9530 9540 9550 9560 9570 9580 9590 9600 9610 9620 9630 9640 9650 9660 9670 9680 9690 9700 9710 9720 9730 9740 9750 9760 9770 9780 9790 9800 9810 Y%=180-VSCALE*RHO(I%) LINE (XOLD%, YOLD%)-(X%, Y%) XOLD%=X%: YOLD%=Y% NEXT 1% LINE (480,100)-{520,100) LOCATE 13,67: PRINT "Полная" 'обозначение полной плотности FOR STATE%=1 TO NSTATE% 'рисование плотностей состояний IF NOCC(STATE%)=0 THEN GOTO 9810 FOR l%=1 TO NR% 'цикл по узлам сетки X%=39+I%*DR*HSCALE Y%=180- VSCALE*PSTOR( 1%, STATE%)^2*NOCC( STATE%) IF STATE%<> 1 THEN GOTO 9550 PSET(X%,Y%): GOTO 9600 'маркер состояния 1s IF STATE%<>2 THEN GOTO 9590 LINE (X%-2,Y%)-(X%,Y%) 'маркер состояния 2s LINE (X%-1,Y%-1)-(X%-1,Y%+1) GOTO 9600 LINE (X%-2,Y%-1)-(X%,Y%+1),,B 'маркер состояния 2p NEXT 1% IMAX%=40/( DR*HSCALE) IF STATE%<>1 THEN GOTO 9680 FOR l%=0 TO IMAX% 'обозначение состояния Is PSET (480+40*|%/IMAX%, 108) NEXT 1% LOCATE 14,67: PRINT "1s" GOTO 9810 IF STATE%<>2 THEN GOTO 9760 FOR l%=0 TO IMAX% 'обозначение состояния 2s X%=480+40*l%/IMAX%: Y%=116 LINE (X%-2,Y%)-(X%,Y%) LINE (X%-1,Y%-1)-(X%-1,Y%+1) NEXT 1% LOCATE 15,67: PRINT "2s" GOTO 9810 FOR l%=0 TO IMAX% 'обозначение состояния 2p X%=480+40*l%/IMAX%: Y%=124 LINE (X%-2,Y%-1)-(X%,Y%+1),,B NEXT 1% LOCATE 16,67: PRINT "2p" NEXT STATE%
444 Приложение В 9820 9830 10000 10010 10020 10030 10040 10050 10060 10070 10080 10090 10100 10110 10120 10130 10140 10150 10160 10170 10180 10190 10200 10210 10220 10230 10240 10250 10260 10270 10280 10290 10300 10310 10320 10330 10340 10350 10360 10370 10380 RETURN / 9 ************************************************************************ 'Подпрограмма вывода экрана-заставки ' входные переменные: нет ' выходные переменные: GRAPHICS%, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме / LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; / LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%, 70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); / COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРОЕКТ 3"; COLOR 7: LOCATE 9,13 PRINT "Решение уравнений Хартри-Фока для малых атомных систем" LOCATE 10,23: PRINT "в приближении ’наполнения’ оболочек" LOCATE 13,35: PRINT "*****♦*♦**" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." LOCATE 22,19: PRINT "Все энергии даются в электрон-вольтах (эВ)" LOCATE 23,18: PRINT "Расстояния даются в ангстремах (А, 10Л-8 см)" LOCATE 19,13: BEEP 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$
Программы для проектов 445 10390 IF LEFT$(G$, 1)="у" OR LEFT$(G$, 1)="n" GOTO 10420 10400 LOCATE 19,13: PRINT SPACE$(57): BEEP 10410 LOCATE 18,35: PRINT "Повторите...": GOTO 10370 10420 IF LEFT$(G$,1)="y" GOTO 10450 10430 GRAPHICS%=0: MONO%=-1 10440 RETURN 10450 GRAPHICS%=-1 10460 LOCATE 18,15: PRINT SPACE$(55) 10470 LOCATE 19,13: PRINT SPACE$(57) 10480 LOCATE 19,13: BEEP 10490 INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ 10500 IF LEFT$(M$,1)="y" OR LEFT$(M$,1)="n" GOTO 10520 'проверка ответа 10510 LOCATE 18,35: PRINT "Повторите...": GOTO 10470 10520 IF LEFT$(M$,1)="y" THEN MONO%=-1 else mono%=o 10530 10540 RETURN r 11000 ' ************************************************************************ 11010 'Подпрограмма переключения с текстового дисплея на графический 11020 ' входные переменные: нет 11030 ' выходные переменные: нет 11040 ' глобальные переменные: нет 11050 'локальные переменные: нет 11060 ' ХсЦсЖ**********************************^********************************* 11070 DEF SEG=0 11080 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 11090 SCREEN 2,0,0,0: LOCATE ,,1,6,7 ( 11100 11110 RETURN r
446 Приложение В В.4. ПРОЕКТ IV В данной программе методом парциальных волн решается задача рассея- ния электронов на потенциале в виде прямоугольной ямы, гауссовой ямы или потенциала Ленца —Йенсена, описанных соответственно в стро- ках 3280—3330, 3220—3250 и 3360—3410. Расчет амплитуды рассеяния ведется по формуле (IV.4), при этом полиномы Лежандра вычисляются в подпрограмме 11000 по прямым рекуррентным формулам. Для каждой пар- циальной волны в заданном диапазоне от LSTART% до LFINISH% (цикл 7130—7620) проводится численное интегрирование в направлении от центра уравнения Шрёдингера для радиальных волновых функций падаю- щего и рассеянного потоков (строки 7230—7440), после чего в стро- ках 7460—7520 с использованием уравнения (IV.8) находятся фазовые сдвиги для парциальных волн. Необходимые значения сферических функ- ций Бесселя вычисляются в подпрограмме 4000. Отметим, что во избе- жание вычислительных проблем, связанных с особенностью потенциала в окрестности г = 0, радиальная волновая функция полагается равной нулю в первых четырех узлах сетки (внутри сферы с радиусом 0,02 А). Такое краевое условие эквивалентно предположению о наличии твердой сферы с таким радиусом. Для энергий, при которых интегрирование уравнений является достаточно точным, влияние этой сферы на величи- ну фазовых сдвигов оказывается пренебрежимо мало. В подпрограмме 8000 снимается неоднозначность фазовых сдвигов из-за множителей, связанных с углами, кратными п. По мере выполнения вычислений для каждой парциальной волны подпрограммой 9000 на экран выводятся гра- фики волновых функций, фазовые сдвиги и парциальные сечения, а пос- ле завершения расчетов для всех учитываемых волн в подпрограмме 10000 вычисляется дифференциальное сечение и его график подпрограм- мой 12000 выводится на экран. Типичные результаты можно получить по этой программе, задавая прямоугольную яму глубиной Vzero = 50, энергию электронов Е = 20 и учитывая парциальные волны в диапазоне Ьнач. = 0, Lkoh. = 8.
Программы для проектов 447 10 ' ********^******m******************************^*****^******^*^ 20 'Проект IV: Метод парциальных волн в задаче квантового рассеяния 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 30 ' MOMC^*****^^ 40 GOSUB 13000 'вывод экрана-заставки 50 ' 60 Pl=3.14159 'определение констант и функций 70 HBARM=7.6359 '(h/2pi)*2/(масса электрона) 80 Е2=14.409 'квадрат заряда электрона 90 RMAX=2: REXT=.3 'г в ангстремах 100 DR=.005 'шаг интегрирования 110 NR%=RMAX/DR: NREXT%=(RMAX+REXT)/DR 'число узлов интегрирования 120 FIRST%=-1 130 NANG%=36 'размерность PL и DSIGMA равна 140 DIM PL(100,36): DIM DSIGMA(36) ' NANG% - количеству углов 150 DIM JL(201): DIM NL(201) 'максимальное L=100 160 DIM DELTA(100): DIM SIG(100): DIM DELDEG(100) 170 DIM V(500): DIM VEFF(500) 'размерность V и PSI равна NREXT 180 DIM PSI(500): DIM R%(500) 190 DIM VFREE(500): DIM PSIF(500) 200 ' 210 GOSUB 1000 'ввод V, E и т.д. 220 ' 230 IF FIRST% THEN GOSUB 2000 'расчет и запоминание P0 and P1 240 ' 250 GOSUB 3000 'расчет переменных, зависящих 260 ' ' от энергии 270 GOSUB 5000 'подготовка экрана к выводу 280 ' 290 GOSUB 7000 ' решение уравнения Шредингера 300 ' ' и нахождение DELTA(L%) 310 GOSUB 10000 'вычисление парциального сечения 320 ' 330 GOTO 210 'переход к следующему варианту 340 ' 1000 ' *********^ 1010 'Подпрограмма ввода Z, энергии, числа парциальных волн 1020 'входные переменные: FIRST% 1030 'выходные переменные: Ef FIRST%, К, К2, LFINISH%, LMAX%, 1040 ' LSTART%, OPTS, VZERO, Z
448 Приложение В 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 ' глобальные переменные: нет 'локальные переменные: ESAVE, VZSAVE, ZSAVE ' ************************************************************************* CLS 9 LOCATE 1,23 'ввод потенциала PRINT "Предусмотрены следующие потенциалы:"; LOCATE 2,10 PRINT "1) Потенциал Ленца-Йенсена для электрона и нейтрального атома"; LOCATE 3,18 PRINT "2) Прямоугольная яма 3) Гауссова яма"; LOCATE 4,14 INPUT; "Введите номер выбранного потенциала или 0 для выхода"; ОРТ$ IF ОРТ$="0" OR ОРТ$="1" OR ОРТ$="2" OR ОРТ$="3" THEN GOTO 1230 LOCATE 5,19: ВЕЕР PRINT "Повторите. Правильные ответы 0, 1, 2 или 3"; LOCATE 4,1: PRINT SPACE$(79); GOTO 1160 IF OPT$="0" THEN END IF OPT$="1" GOTO 1360 9 IF FIRST% GOTO 1290 'ввод глубины ямы LOCATE 8,19 PRINT USING "Последнее значение Vzero было +###.##";VZSAVE LOCATE 9,24 INPUT; "Vzero=rny6nHa потенциальной ямы="; VZERO VZSAVE=VZERO IF OPT$="2" THEN V$="nPflMoyronbHafl яма" ELSE V$='Tayccoea яма" IF OPT$="2" THEN V%=17 ELSE V%=12 GOTO 1490 9 IF FIRST% THEN GOTO 1390 'ввод заряда ядра LOCATE 8,19 PRINT USING "Последнее значение заряда Z было равно ###"; ZSAVE; LOCATE 9,29 INPUT; "2=заряд атомного ядра=";2 IF Z>0 THEN GOTO 1460 LOCATE 10,17: BEEP PRINT "Повторите еще раз. Z должно быть положительным"; LOCATE 9,1: PRINT SPACE$(79); GOTO 1390
Программы для проектов 449 1460 ZSAVE=Z 1470 1480 У$="Ленц-Йенсен": V%=11 9 1490 IF FIRST% GOTO 1520 'ввод энергии электронов 1500 LOCATE 13,20 1510 PRINT USING "Последняя энергия пучка была #####.### эВ";Е5АУЕ; 1520 LOCATE 14,22 1530 INPUT; "Е=энергия налетающего электрона в эВ=";Е 1540 IF Е>0 AND Е<351861 THEN GOTO 1590 1550 LOCATE 15,13: ВЕЕР 1560 PRINT "Для рассеяния в состоянии с LMAX < 100 — 0 < Е < 35186"; 1570 LOCATE 14,1: PRINT SPACE$(79) 1580 GOTO 1520 1590 1600 ESAVE=E r 1610 K2=2*E/HBARM 'квадрат волнового числа 1620 K=SQR(K2) 'волновое число 1630 1640 LMAX%=K*RMAX/2+4 'расчет макс, значения L Г 1650 LOCATE 18,36 'ввод диапазона значений L 1660 PRINT USING "Lmax=###";LMAX%; 1670 LOCATE 19,8 1680 PRINT "Введите Енач. и Lkoh. Данная программа будет вычислять "; 1690 PRINT "сечения для"; 1700 LOCATE 20,14 1710 PRINT "всех значений L из этого диапазона (они могут быть"; 1720 LOCATE 21,22 1730 INPUT; "одинаковыми и могут превышать LMAX%)"; LSTART%, LFINISH% 1740 IF LSTART%>=0 AND LFINISH%>=0 GOTO 1790 1750 LOCATE 22,13: BEEP 1760 PRINT "Повторите ввод, эти величины должны быть положительными' 1770 LOCATE 21,1: PRINT SPACE$(80); 1780 GOTO 1700 1790 IF LSTART%<=LFINISH% AND LFINISH%<=100 THEN RETURN 1800 LOCATE 22,14: BEEP 1810 PRINT "Повторите еще раз, должно быть Енач. <= Lkoh. <= 100"; 1820 LOCATE 21,1: PRINT SPACE$(80); 1830 GOTO 1700 1840 » 2000 'Me************************************************************************ 2010 'Подпрограмма вычисления и запоминания значений Р0 и Р1 29—165(1
450 Приложение В ' входные переменные: нет 'выходные переменные: FIRST%, LTABLE%, PL(0,1%), PL(1,I%) ' глобальные переменные: GRAPHICS^, NANG% 'локальные переменные: l%, THETA, X FOR l%=0 ТО NANG% ' расчет полиномов Лежандра для NANG% углов THETA=I%*PI/NANG% X=COS( THETA) PL(O,I%)=1 'РО PL(1,I%)=X 'Р1 NEXT 1% г LTABLE%=1 'признак завершения расчета полиномов ' ' степени до L=1 IF NOT GRAPHICS% THEN FIRST%=0 'сброс флага при текстовом дисплее Г RETURN 'Подпрограмма вычисления зависящих от энергии величин и V(r) ' входные переменные: нет ' выходные переменные: EMAX, EMIN, ESCALE, OFFSET%, RSCALE, V( l%), X ' глобальные переменные: DR, К, LMAX%, NR%, NREXT%, REXT, RMAX, ' VZERO, Z 'локальные переменные: \%, R, U, Z6 1 ************************************************************************* 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 3000 3010 3020 3030 3040 3050 3050 3060 3070 X=K*RMAX 3080 OFFSET%=0 3090 GOSUB 4000 3100 ' 3110 X=K*( RMAX+REXT) 3120 OFFSET%=101 3130 GOSUB 4000 3140 ' 3150 FOR l%=NR%+1 TO NREXT% 3160 V(l%)=0 3170 NEXT 1% 3180 ' 3190 IF OPT$="1" THEN GOTO 3360 3200 IF OPT$="2" THEN GOTO 3280 3210 ' 'аргумент J И и Nil 'диапазон счетчика 0-LMAX% 'вычисление JI и Nl 'аргумент J12 и NI2 'начальное значение счетчика 101 'вычисление Л и NI 'V близко к нулю для R>RMAX 'расчет V(l%) в каждом узле сетки
Программы для проектов 451 3220 FOR l%=1 ТО NR% 'гауссова яма 3230 R=I%»DR 3240 V( 1%) =- VZERO*EXP[-R*R) 3250 NEXT 1% 3260 GOTO 3430 3270 r 3280 FOR l%=1 TO NR%*3/4 'прямоугольная яма 3290 V(l%)=-VZERO 3300 NEXT 1% 3310 FOR l%=NR%»3/4 TO NR% 'стенка при 3/4 от максимума 3320 V(l%)=0 3330 NEXT 1% 3340 GOTO 3430 3350 r 3360 Z6=ZA. 1666667 3370 FOR l%=1 TO NR% 'потенциал Ленца-Йенсена 3380 R=I%*DR 3390 U=4.5397*Z6*SQR(R] 3400 V( 1%) =-( (Z*E2) /RJ *EXP[ - U| *( 1+U+U*U*(. 3344+U*(. 0485+. 002647«U] ]) 3410 NEXT 1% 3420 f 3430 EMAX=4*E: EMIN=-2*E 'расчет величин для построения 3440 ESCALE=172/(6*E) ' графика 3450 i 3460 RSCALE=600/( RMAX+REXT) 3470 f 3480 RETURN 3490 r 4000 '************************************************************************* 4010 ' Подпрограмма вычисления сферических функций Бесселя 4020 ' входные переменные: OFFSET%, X 4030 ' выходные переменные: JL(I%), NL(I%) 4040 ' глобальные переменные: LMAX% 4050 ' локальные переменные: J, JM1, JP1, L%, LTRUE%, LUPPER%, NORM 4060 4070 NL( 0+OFFSET%) =-COS( X] /X 'аналит. формула для NO 4080 NL( 1+OFFSET%j=-(COS(Xj/(X*X)j-SIN(X)/X 'аналит. формула для N1 4090 г 4100 FOR L%=( 1+OFFSET%j TO (LFINISH%-1+OFFSET%J 'прямая рекурсия 4110 LTRUE%=L%-OFFSET% 4120 NL( L%+1 J =( 2*LTRUE%+1 J »NL( L% j /X- NL( L%-1J 29*
.452 Приложение В 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 4300 4310 4320 5000 5010 5020 5030 5040 5041 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 5190 NEXT L% F LUPPER%=X+10 JP1=0 J=9.999999E-21 'значение L, при котором ' JI пренебрежимо мало FOR L%=(LUPPER%+OFFSET%) TO (1+OFFSET%) STEP -1 'обратная рекурсия LTRUE%=L%-OFFSET% JM1=( 2*LTRUE%+1) *J/X-JP1 IF (L%-1|<=(LFINISH%+OFFSET%| THEN JL(L%-1)=JM1 'сохранение JP1=J: J=JM1 ' значения, если L% в NEXT L% ' требуемом интервале F NORM=SIN(X)/X/JL(0+OFFSET%) 'нормировка JI на основе FOR L%=(0+OFFSET%) TO (LFINISH%+OFFSET%| ' аналит. формулы для JO JL|L%J=NORM*JL(L%J NEXT L% r RETURN r ' ************************************************************************* 'Подпрограмма подготовки экрана для вывода результатов ' входные переменные: нет ' выходные переменные: нет 'глобальные переменные: Е, GRAPHICS%, LMAX%, MONO%, ОРТ$, ' V$, V%, VZERO, Z ' локальные переменные: COL% ' ************************************************************************* IF GRAPHICS% GOTO 5230 t CLS COL%=(80-V%)/2 'вывод названия потенциала LOCATE 1,COL% PRINT V$; t IF OPT$="1" GOTO 5180 'вывод E и т.д. LOCATE 2,17: PRINT USING "Vzero=+#*#.*#"; VZERO; PRINT USING " Энергия=#####.## Lmax=##"; E, LMAX%; GOTO 5200 LOCATE 2,21 PRINT USING "Z=### Энергия=#####.## Lmax=##"; Z, E, LMAX%
Программы для проектов 453 5200 LOCATE 3,1: PRINT "" 5210 RETURN 'сдвиг текста на экране 5220 ' 5230 IF FIRST% THEN GOSUB 6000 'вывод пояснений к графикам 5240 IF MONO% THEN GOSUB 14000 'переход в графический режим 5250 CLS: SCREEN 2,0,0,0 5260 * 5270 LOCATE 24,15 'вывод значений V, Е, и др. 5280 PRINT V$+SPACE$(3); 5290 IF ОРТ$="1" GOTO 5320 5300 PRINT USING "Vzero=+###.## E=#####.## Lmax=##"; VZERO, E, LMAX%; 5310 GOTO 5340 5320 PRINT USING" Z=### E=#####.## Lmax=##"; Z, E, LMAX%; 5330 ' 5340 RETURN 5350 ' 6000 '********>^^ 6010 'Подпрограмма вывода информации о графиках 6020 ' входные переменные: нет 6030 ' выходные переменные: FIRST% 6040 ' глобальные переменные: нет 6050 ' локальные переменные: нет 6060 '************************************************************************* 6070 CLS 6080 ' 6090 LOCATE 5,15,0 6100 PRINT "На одном графике строятся зависимости эффективного" 6110 LOCATE 7,16 6120 PRINT "потенциала, волновой функции рассеянной частицы и" 6130 LOCATE 9,18 6140 PRINT "волновой функции свободно движущейся частицы. 6150 LOCATE 13,12 6160 PRINT "Шкала энергии в единицах Е - энергии налетающей частицы." 6170 LOCATE 17,12 6180 PRINT "Волновые функции центрированы относительно оси энергии=1." 6190 LOCATE 24,23,1: ВЕЕР 6200 PRINT "Для продолжения нажмите клавишу <с>"; 6210 IF INKEY$o"c" THEN GOTO 6210 6220 LOCATE ,,0 6230 ' 6240 FIRST%=0
454 Приложение В 6250 6260 6270 7000 7010 7020 7030 7040 7050 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 7370 RETURN 'ХсЦсМс********************************************************************** 'Подпрограмма интегрирования уравнения Шредингера методом Нумерова ' входные переменные: нет 'выходные переменные: DELDEG(I%), DELTA(I%), L%, PSI(I%), PSIF(I%), ' SIG(I%), SIGTOT, VEFF(I%) 'глобальные переменные: DR, GRAPHICS^, HBARM, LFINISH%, LMAX%, ' LSTART%, NR%, NREXT%, PI, REXT, RMAX 'локальные переменные: CONST, DENOM, G, l%, J%, KI, KIF, KIMI, ' KIM1F, KIP1, KIP1F, LL, NUMER, VFREE(I%) '************************************************************************* SIGTOT=0 'обнуление полного сечения CONST=DR*DR/| HBARM*6) FOR L%=LSTART% TO LFINISH% 'цикл по диапазону L IF INKEY$="e" THEN RETURN 210 LL=L%*( L%+1) *HBARM/2 FOR J%=1 TO NREXT% R=J%*DR VFREEJ J%)=LL/( R*R) VEFF( J% j = V( J%) +VFREE( J% J NEXT 'расчет эффективных ' потециалов с учетом ' центробежного барьера Р51|4)=0: Р51|5)=1Е-25 'краевые условия KIM1=CONST*|E-VEFF(4)): KI=CONST*(Е-VEFF(5)) 'К из метода PSIF(4)=0: PSIF( 5) =1Е-25 ' Нумерова; те же величины KIM1F=CONST*(E-VFREE(4)): KIF=CONST*(E-VFREE(5) J ' для функции ' падающей волны FOR l%=5 ТО NREXT%-1 KIP1=CONST*( E-VEFFJ|%+1)) 'интегрирование с V(r) PSI( 1%+1) =( (2-10*KI) *PSI( 1%Н 1+KIM1) *PSI( 1%-1) j /(1+KIP1) IF PSI(l%+1)<=1Е+15 GOTO 7350 'страховка от переполнения FOR М%=1 ТО 1%+1 PS 1| М%) = PS || М%) *. 00001 NEXT М% К1М1=К1: К1=К1Р1 KIP1 F=CONST*(Е-VFREEJ 1%+1)) 'интегрирование без V[r)
Программы для проектов 455 7380 7390 7400 7410 7420 7430 7440 7450 7460 7470 7480 7490 7500 7510 7520 7530 7540 7550 7560 7570 7580 7590 7600 7610 7620 7630 7640 7650 7660 7670 7680 7690 7700 7710 7720 7730 7740 7750 7760 7770 7780 PSIF( 1%+1) =( (2-10*KIF) *PSIF( 1%) -(1+KIM1F) *PSIF( l%-1)) /(1+KIP1F) IF PSIF(l%+1 ]<=1E+15 GOTO 7430 'страховка от переполнения FOR M%=1 TO l%+1 PS IF (M%) = PS I F( M%) *. 00001 NEXT M% KIM1F=KIF: KIF=KIP1F NEXT 1% G=RMAX*PSI( NREXT%) /((RMAX+REXT) *PSI(NR%) ] ' вычисление DELTA NUMER=G*JL( L%) - JL( L%+101 j DENOM=G*NL( L%) -NL( L%+101 j DELTA( L%) =ATN( NUMER/DENOM] GOSUB 8000 'устранение неоднозначнее?^ DELDEG(L%)=180*DELTA(L%)/PI ' в выборе значения DELTA SIG(L%)=4*PI/K2*(2*L%+1)*SIN(DELTA(L%))*2 'парциальное сечение SIGTOT=SIGTOT+SIG( L%} ' полное сечение IF GRAPHICS% THEN GOSUB 9000: GOTO 7620 ' вывод на граф, экран LOCATE ,13 'вывод на текстовый экран PRINT USING "L=## Delta(L)=+###. ##"; L%, DELDEGfL%); PRINT USING " Sigma(L)=#.###~---";SIG(L%) NEXT L% i IF GRAPHICS% THEN GOTO 7740 'вывод полного сечения PRINT LOCATE ,15 PRINT USING "Полное сечение=+#.***Л---";SIGTOT; PRINT USING " L меняется от ## до ###"; LSTART%, LFINISH%; PRINT PRINT"" LOCATE ,23: BEEP: PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 7700 LOCATE ,1: PRINT SPACE$(80) RETURN LOCATE 23,1: PRINT SPACE$(80); LOCATE 23,15 PRINT USING "Полное сечение=+#.###Л---";SIGTOT; PRINT USING " L меняется от ## до ###"; LSTART%, LFINISH%, LOCATE 1,33,1: BEEP: PRINT "Для продолжения нажмите клавишу <с>";
456 Приложение В 7790 7800 7810 7820 8000 8010 8011 8020 8030 8040 8050 8055 8060 8070 8080 8090 8100 8110 812!? 8130 8140 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 8300 8310 8320 IF INKEY$o"c" THEN GOTO 7790 LOCATE „0 RETURN 9 Эк*^******************************************************#####*###^***** 'Подпрограмма разрешения неоднозначности DELTA(L) и отыскания ' PSIMAX, PSIFMAX 'входные переменные: DELTA(L%), PSI(I%), PSIF(I%) 'выходные переменные: DELTA(L%), PSIMAX, PSIFMAX ' глобальные переменные: NR%, NREXT%, PI 'локальные переменные: BF%, BUMP%, DPOS%, F%, N%, NODES%, ' NODESF% IF DELTA(L%)>0 THEN DPOS%=-1 ELSE DPOS%=0 'положительное delta ' * означает потенциал притяжения г NODES%=0: PSIMAX=0: BUMP%=0 'счетчики узлов и пучностей ' рассеянной волны FOR l%=5 TO NREXT%-1 IFSGN(PSI(l%))oSGN(PSI(l%-1)) THEN NODES%=NODES%+1: INODE%=I% IF ABS(PSI(I%))>PSIMAX THEN PSIMAX=ABS( PSI( 1%)) IF SGN(PSI(l%+1)-PSI(l%))<>SGN|PSI| 1%)-PSI|l%-1)) THEN BUMP%=BUMP%+1 NEXT 1% NODESF%=0: PSIFMAX=0: BF%=0 'счетчики узлов и пучностей ' ' падающей волны FOR l%=5 ТО NREXT%-1 IFSGN(PSIF(I%))<>SGN(PSIF(I%-1)) THEN NODESF%=NODESF%+1: IFNODE%=I% IF ABS(PSIF(I%))> PSIFMAX THEN PSIFMAX=ABS( PSIF| 1%)) IF SGN(PSIF(l%+1)-PSIF(l%))<>SGN(PSIF(l%)-PSIF(l%-1j) THEN BF%=BF%+1 NEXT 1% r IF NODES%=NODESF% GOTO 8350 9 N%=BUMP%-BF% IF ABS(NODES%-NODESF%)>ABS(N%) THEN N%=NODES%-NODESF% IF N%>0 AND NOT DPOS% THEN DELTA(L%)=DELTA(L%)+PI 'установка IF N%<0 AND DPOS% THEN DELTA(L%|=DELTA(L%)-PI ' нужного знака DELTA( L%) =DELTA( L%) +(ABS( N%) -1| *PI*SGN( N%)
Программы для проектов 457 8330 RETURN 8340 ' 8350 IF NODES%=0 GOTO 8400 8360 IF INODE%>IFNODE% AND DPOS% THEN DELTA(L%)=DELTA(L%)-PI 8370 IF INODE%<IFNODE% AND NOT DPOS% THEN DELTA(L%)=DELTA(L%)+PI 8380 RETURN 8390 ' 8400 IF ABS( PSI( NR%/2) /Р51МАХ) >ABS( PSIF( NR%/2) /PSIFMAX) THEN F%=-1 ELSE F%=0 8410 IF F% AND NOT DPOS% THEN DELTA(L%)=DELTA(L%)+PI 8420 IF NOT F% AND DPOS% THEN DELTA) L%)=DELTA(L%J-PI 8430 ' 8440 RETURN 8450 ' 9000 9010 'Подпрограмма построения графиков волновой функции и Уэфф(г) 9020 ' входные переменные: DELDEG(I%), PSI(I%), PSIF(I%), PSIMAX, 9030 ' PSIFMAX, SIG(I%), VEFF(I%) 9040 ' выходные переменные: нет 9050 'глобальные переменные: DR, EMAX, EMIN, ESCALE, NREXT%, REXT, 9051 ' RMAX, RSCALE 9060 'локальные переменные: COL%, E%, 1%, MARK%, PSI%, PSIOLD%, 9070 ' PSISCALE, PSIFSCALE, R%, ROW%, VEFF% 9080 '**************************** 9090 LINE (0,0)-( 640,174), 0,BF 9100 ' до*4с**********де*****#9|иде******************** 'очистка верхней части экрана 9110 LOCATE 25,11 'вывод результатов вычислений 9120 PRINT USING "L=## Delta(L)=+###.###"; L%, DELDEG(L%); 9130 PRINT USING " Sigma(L)=#.*##* ";SIG(L%); 9140 ' 9150 PSISCALE=172/(2*PSIMAX) 9160 PSIFSCALE=172/(2*PSIFMAX) 9170 ' 'масштаб для PSI 9180 LINE (40,0)-(40,172) 'ось Е 9190 LINE (40,115)-(640,115) 'ось R 9200 FOR l%=0 TO 636 STEP 8 'пунктиром указана энергия 9210 LINE (40+1%,86)-(44+1%,86) 'падающей частицы (= E) 9220 NEXT 1% 9230 ' 9240 FOR MARK%=0 TO 6 9250 E%=MARK%*172/6 'деления оси Е
458 9260 9270 9280 9290 9300 9310 9320 9330 9340 9350 9360 9370 9380 9390 9400 9410 9420 9430 9440 9450 9460 9470 9480 9490 9500 9510 9520 9530 9540 9550 9560 9570 9580 9590 9600 9610 9620 9630 9640 9650 9660 Приложение В LINE (38, Е%)-(42, Е%) ROW%=MARK%*21.5/6: IF ROW%=0 THEN ROW%=1 IF MARK%=2 OR MARK%=4 THEN ROW%=ROW%+1 LOCATE ROW%,2 PRINT USING "+#E";(4-MARK%); 'оцифровка оси E NEXT MARK% r FOR MARK%=1 TO 4 'деления оси R R%=40+MARK%*( RMAX/4)*RSCALE LINE (R%, 113)-(R%, 117) COL%=5+16.3*MARK% LOCATE 16,COL% PRINT USING RMAX*MARK%/4; 'оцифровка оси R NEXT MARK% LINE (638,113)-(638,117) LOCATE 16,78 PRINT USING (RMAX+REXT); LOCATE 14,76: PRINT "R"; 'обозначение оси R LOCATE 13,1: PRINT "Уэфф"; 'обозначение оси V FOR l%=1 TO NREXT% STEP 2 'график Уэфф(г) IF VEFF(I%)>EMAX THEN VEFF=EMAX: GOTO 9490 IF VEFF(I%)<EMIN THEN VEFF=EMIN ELSE VEFF=VEFF(I%) VEFF%=172-(VEFF-EMIN)*ESCALE R%( ’% )=40+( l%*DR)*RSCALE IF l%=1 GOTO 9530 LINE (R%(l%-2), VOLD%)-(R%(I%), VEFF%) VOLD%=VEFF% NEXT 1% ' 'вывод маркеров для PSI LOCATE 23,10: PRINT "Волновые функции: рассеянной частицы"; LINE (216,179)-(236,179) FOR l%=1 ТО 16 STEP 4 CIRCLE (408+1%, 179), 2 NEXT 1% LOCATE 23,55: PRINT "свободной частицы"; LOCATE 6,1: PRINT "PSI"; 'обозначение оси PSI FOR l%=1 TO NREXT% STEP 2 'график PSI рассеянной частицы PSI%=172- (PSI (l%)+PSIMAX)*PSISCALE IF 1%<>1 THEN LINE (R%(l%-2),PSIOLD%)-(R%(I%),PSI%)
Программы для проектов 459 9670 PSIOLD%=PSI% 9680 NEXT 1% 9690 ' 9700 FOR l%=1 ТО NREXT% STEP 2 'график PSI свободной частицы 9710 PSI%=172-(PSIF(I%)+PSIFMAX)*PSIFSCALE 9720 CIRCLE ( R%( 1%), PSI%), 2 9730 IF l%<>1 THEN LINE (R%(I%-2),PSIOLD%)-(R%(I%),PSI%) 9740 PSIOLD%=PSI% 9750 NEXT l% 9760 ' 9770 RETURN 9780 ' 10000 ' ************************************************************************ 10010 'Подпрограмма вычисления dsigma/domega 10020 'входные переменные: DELTA(L%) 10030 'выходные переменные: DSIGMA(L%) 10040 'глобальные переменные: GRAPHICS%, LFINISH%, LMAX%, LSTART%, 10045 ' NANG% 10050 'локальные переменные: CD, FREAL, FIMAG, 1%, L%, PL(L%,I%), SD, 10055 ’ THETA, X 10060 ' ************************************************************************ 10070 IF LFINISH%>LTABLE% THEN GOSUB 11000 'расчет полиномов Лежандра 10080 ' 10090 FOR l%=0 TO NANG% 'расчет dsigma/domega для 10100 FREAL=0: FIMAG=0 ' каждого из 36 углов 10110 FOR L%=LSTART% TO LFINISH% 'суммирование по всем L 10120 SD=SIN(DELTA(L%)) 10130 CD=COS( DELTA( L%)) 10140 FREAL=FREAL+(2*L%+1)*SD*CD*PL(L%J%) 'Re и Im части 10150 FIAAAG=FIMAG+(2*L%+1)*SD*SD*PL(L%J%) 'амплитуды рассеяния 10160 NEXT L% 10170 FREAL=FREAL/K 10180 FIMAG=FIMAG/K 10190 DSIGMA( l%)=FREAL*FREAL+FIMAG*FIMAG 10200 ' 10210 IF GRAPHICS^ GOTO 10260 'вывод результатов 10220 LOCATE J; PRINT USING "Theta=###";(l%*180/NANG%); 10230 PRINT USING " Re ампл. =+#.###~~"; FREAL; 10240 PRINT USING " Im ампл.=+#.###~~"; FIMAG; 10250 PRINT USING " dSigma/dOmega=+#.###~------------";DSIGMA(I%) 10260 NEXT l%
460 Приложение В 10270 IF GRAPHICS% THEN GOTO 10320 10280 LOCATE ,23 10290 BEEP: PRINT "Для продолжения нажмите клавишу <о"; 10300 IF INKEY$="c" THEN GOTO 10340 ELSE GOTO 10300 10310 * 10320 GOSUB 12000 'график dsigma/domega 10330 * 10340 RETURN 10350 11000 11010 * » X XXX X X X X X X X X X X X X X X X X X X X X X X X X A X X X X X X X X X X X X X X X X X X X X X X 1U.X1 x x x x X I I I 1 ХЛХХХХ 'Подпрограмма вычисления полиномов Лежандра 11020 ' входные переменные: LFINISH%, LTABLE% 11030 'выходные переменные: LTABLE%, PL(I%,J%) 11040 ' глобальные переменные: NANG%, PI 11050 'локальные переменные: 1%, L%, THETA, X 11060 f4nic*M4^>IM***4^*****4c*****4c******************************************>k4> 11070 FOR l%=0 TO NANG% 'вычисление полиномов Лежандра 11080 ТНЕТА= l%*PI/NANG% ' для NANG% углов 11090 X=COS( THETA) 11100 FOR L%=LTABLE% TO LFINISH%-1 'прямая рекурсия 11110 PL(L%+1J%)=n2*L%+1)*X*PL(L%,l%|-L%*PL(L%-1,l%||/|L%+1) 11120 NEXT L% 11130 NEXT 1% 11140 f 11150 LTABLE%=LFINISH% 'признак наличия полиномов 11160 ' степени до L=LFINISH% 11170 RETURN 11180 12000 12010 * 'Подпрограмма вывода графика дифф, сечения как функции угла theta 12020 'входные переменные: DSIGMA(L%), SIGTOT 12030 ' выходные переменные: нет 12040 'глобальные переменные: Е, MONO%, OPTS, VS, V%, VZERO, Z 12050 'локальные переменные: COL%, ЕХРМАХ%, EXPMIN%, 1%, LSIG, 12060 ' MARK%, NORD%, ROW%, S%, SIGMAX, SIGMIN, SIGSCALE, T%, TSCALE 12070 '**>Мде**************’Мде*************’ДО^де***************************** 12080 CLS: SCREEN 2,0,0,0 12090 * 12100 SIGMAX=0 'отыскание наибольшего sigma 12110 FOR l%=0 TO NANG% 12120 IF DSIGMA(I%)>SIGMAX THEN SIGMAX=DSIGMA( 1%)
Программы для проектов 461 12130 NEXT 1% 12140 ' 12150 SIGMIN=SIGMAX 'отыскание наименьшего sigma 12160 FOR l%=0 ТО NANG% 12170 IF DSIGMA( l%)<SIGMIN THEN SIGMIN=DSIGMA(I%) 12180 NEXT 1% 12190 12200 EXPMAX%=INT(LOG(SIGMAX)/LOG(10)+1) 'определение макс, и мин. 12210 EXPMIN%= I NT( LOG{ SIGMIN)/LOG( 10)) ' порядков для sigma 12220 NORD%=EXPMAX%-EXPMIN% 'размах в логарифм, шкале 12230 * 12240 TSCALE=584/NANG% 'масштаб по оси theta 12250 SIGSCALE=175/NORD% 'масштаб по оси sigma 12260 * 12270 LINE (56,0)-(56,175) 'ось sigma 12280 LINE (56,175)-(640,175) 'ось theta 12290 LOCATE 3,1: PRINT "Sigma"; 'обозначение оси sigma 12300 LOCATE 23,68: PRINT "Theta"; 'обозначение оси theta 12310 * 12320 LOCATE 1,(80-V%) 'вывод названия потенциала 12330 PRINT V$; 12340 f 12350 IF OPT$="1" THEN GOTO 12390 'вывод Е, Z, Vzero 12360 LOCATE 2,54 12370 PRINT USING "Vzero=+***.** E= ;#####. ##"; VZERO, Е; 12380 GOTO 12420 12390 LOCATE 2,62 12400 PRINT USING "Z=### E=#####.##" ;Z, Е; 12410 12420 LOCATE 24,15 'вывод полного сечения 12430 PRINT USING "Полное сечение=+#. ###"""; SIGTOT; 12440 PRINT USING " L меняется^ ## j цо ###"; LSTART%, LFINISH%; 12450 r 12460 FOR MARK%=0 TO 4 'деления оси theta 12470 T%=56+MARK%*584/4 12480 LINE (T%, 173)-(T%, 177) 12490 COL%=6+MARK%»18 12500 IF MARK%=4 THEN COL%=77 'оцифровка оси theta 12510 LOCATE 23,COL% 12520 PRINT USING "***"; MARK%»45; 12530 NEXT MARK%
462 Приложение В 12540 12550 12560 г FOR MARK%=0 ТО NORD% 'деления оси sigma S%=MARK%*175/NORD% 12570 12580 LINE (54, S%)-(58, S%) ROW%=MARK%*22/NORD%: IF ROW%=0 THEN ROW%=1 'оцифровка 12590 12600 12610 12620 12630 12640 12650 12660 12670 12680 12690 12700 12710 12720 12730 12740 12750 12760 LOCATE ROW%,1 ' оси PRINT USING "1E+##";(EXPMAX%-MARK%) NEXT MARK% r r FOR l%=0 TO NANG% 'график парциального сечения T%=56+I%*TSCALE ' в полулогарифмич. масштабе LSIG=LOG( DSIGMA( l%))/LOG( 10) S%=175-(LSIG-EXPMIN%)*SIGSCALE LINE (T%+2,S%+2)-(T%-2,S%-2) 'маркировка точек графика LINE (T%+2,S%-2)-(T%-2,S%+2) ' крестиками IF l%=0 GOTO 12720 LINE (TOLD%,SOLD%)-(T%,S%) TOLD%=T% SOLD%=S% NEXT 1% г LOCATE 25,23,1: BEEP: PRINT "Для продолжения нажмите клавишу <с>"; 12770 IF INKEY$o"c" THEN GOTO 12770 12780 12790 LOCATE ,,0 r 12800 12810 12820 12830 12840 IF MONO% THEN GOSUB 15000 'возврат в текстовый режим CLS Г RETURN 9 13000 г#>к********4к4к**********э|к4к4сффффффф4кффф4кфф4кффф4кффзк**********4к4к************* 13010 'Подпрограмма вывода экрана-заставки 13020 ' входные переменные: нет 13030 ' выходные переменные: GRAPHICS^, MONO% 13040 13050 13060 13070 13080 13090 ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% г**»с********************************************************************* SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме г LOCATE 1,30: COLOR 15 'вывод на экран названия книги
Программы для проектов 463 13100 PRINT "COMPUTATIONAL PHYSICS"; 13110 LOCATE 2,39: COLOR 7 13120 PRINT "by"; 13130 LOCATE 3,32: PRINT "Steven E. Koonin"; 13140 LOCATE 4,15 13150 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; 13160 ' 13170 LOCATE 5,10 'рисование рамки 13180 PRINT CHR$(201)+STRING$(59,205)+CHR$(187); 13190 FOR ROW%=6 TO 19 13200 LOCATE ROW%,10: PRINT CHR$(186); 13210 LOCATE ROW%,70: PRINT CHR$(186); 13220 NEXT ROW% 13230 LOCATE 20,10 13240 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); 13250 ' 13260 COLOR 15 'вывод заголовка программы и т.д. 13270 LOCATE 7,36: PRINT "ПРОЕКТ 4"; 13280 COLOR 7 13290 LOCATE 10,17: PRINT "Парциальные волны в задаче квантового рассеяния"; 13300 LOCATE 13,35: PRINT 'Ч********#" 13310 LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." 13320 LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." 12330 ' 13340 LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея 13350 INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ 13360 IF LEFT$(G$,1)="y" OR LEFT$(G$,1)="n" GOTO 13390' 13370 LOCATE 19,13: PRINT SPACE$(57): BEEP 13380 LOCATE 18,35: PRINT "Повторите...": GOTO 13340 13390 IF LEFT$(G$,1)="y" GOTO 13420 13400 GRAPHlCS%=0: MONO%=-1 13410 GOTO 13510 13420 GRAPHICS%=-1 13430 LOCATE 18,15: PRINT SPACE$(55) 13440 LOCATE 19,13: PRINT SPACE$(57) 13450 LOCATE 19,13: BEEP 13460 INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ 13470 IF LEFT$(M$, 1)="у" OR LEFTS (M$,1)="n" GOTO 13490 'проверка ответа 13480 LOCATE 18,35: PRINT "Повторите...": GOTO 13440 13490 IF LEFTS ( MS, 1)="y" THEN MONO%=-1 ELSE MONO%=0 13500 '
464 Приложение В 13510 13520 LOCATE 21,12 PRINT "Эта программа вычисляет методом парциальных волн полное и"; 13530 LOCATE 22,11 13540 PRINT "дифференциальное сечения, а также фазовые сдвиги рассеяния"; 13550 LOCATE 23,14 13560 PRINT "электрона на сферически*-симметричном потенциале. Все"; 13570 LOCATE 24,10 13580 PRINT "энергии даны в эВ, углы - в градусах, а длины - в ангстремах. 13590 LOCATE 25,23,1: ВЕЕР 13600 PRINT "Для продолжения нажмите клавишу <с>"; 13610 IF INKEY$o"c" GOTO 13610 13620 LOCATE ,,0 13630 * 13640 IF MONO% AND GRAPHICS% THEN GOSUB 15000 'переход на 13650 ’ ' текстовый дисплей 13660 RETURN 13670 Г 14000 9 фф;*****4с****************************з|с***************з|с******************* 14010 'Подпрограмма переключения с текстового дисплея на графический 14020 ' входные переменные: нет 14030 ' выходные переменные: нет 14040 ' глобальные переменные: нет 14050 'локальные переменные: нет 14060 ' ************************************************************************ 14070 DEF SEG=0 14080 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 14090 SCREEN 0: WIDTH 80: LOCATE ,,0 14100 RETURN 14110 i 15000 ************************************************************************* 15010 'Подпрограмма переключения с графического дисплея на текстовый 15020 ' входные переменные: нет 15030 ' выходные переменные: нет 15040 ' глобальные переменные: нет 15050 'локальные переменные: нет 15060 ************************************************************************* 15070 DEF SEG=0 15080 POKE &Н410, (РЕЕК(&Н410) OR &Н30) 15090 SCREEN 0: WIDTH 80: LOCATE ,,0 15100 RETURN 15110 r
Программы для проектов 465 В.5. ПРОЕКТ V Данная программа рассчитывает описанную в тексте схематическую обо- лочечную модель для заданного числа частиц и величины константы связи. Базисы состояний с четными и нечетными m рассматриваются от- дельно. Для набора введенных параметров (подпрограмма 1000) строит- ся трехдиагональная матрица гамильтониана (V.9) (циклы 2070—2160 и 2320—2400) и находятся все ее отрицательные собственные значения (цикл 4240—4430). Для этого ищутся нули определителя |Н-Л1|, вы- числяемого по рекуррентной формуле (5.10) в подпрограмме 5000. Об- ласть поиска определяется границами Гершгорина (5.11) для собствен- ных чисел (строки 4070—4220). После определения, каждого собствен- ного значения находится, при необходимости, соответствующий собст- венный вектор посредством двух шагов метода обратной итерации (под- программы 3000 и 7000). После вычисления всех отрицательных собст- венных значений они выводятся на экран (подпрограмма 6000) вместе с математическим ожиданием Jz (если вычислялись собственные векторы). Для демонстрационного прогона этой программы можно задать 14 частиц, константу связи chi = 1 и указать вычисление собственных векторов. Ю ’*************************************************************************** 20 'Проект 5: Решение схематической оболочечной модели 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 о '*************************************************************************** 40 DIM DIAG(30) 'диагональные элементы гамильтониана 50 DIM LDIAG(30) 'недиагональные элементы гамильтониана 60 DIM EVAL(30) 'временный массив для собств. значений 70 DIM A#(30,30) 'массив для обратной к (Е-Н) матрицы 80 DIM P#(30),Q#(30),R%(30) 'рабочие массивы для обращения 90 DIM EVEVEN(30),EVODD(30) 'четные и нечетные собств. значения 100 DIM CEVEN(30,30),CODD(30,30) 'четные и нечетные собств. векторы 110 DIM TVECTOR(30), NVECTOR(30) 'времен, массивы для собств. векторов 120 130 GOSUB 8000 140 Г 150 GOSUB 1000 160 GOSUB 2000 170 GOSUB 6000 30—1650 'вывод экрана-заставки 'ввод параметров задачи 'нахождение собств. значений и векторов 'вывод результатов
466 Приложение В 180 GOTO 150 'переход к следующему варианту 190 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 ИЗО 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 2000 2010 2020 2030 2040 2045 2050 2060 'Подпрограмма ввода параметров варианта входные переменные: нет ' выходные переменные: CHI, JJ%, JJ1%, NPART%, V, VECTORS% ' глобальные переменные: нет 'локальные переменные: KB$ CLS: KEY OFF ' 'задание числа частиц LOCATE 5,10: ВЕЕР INPUT "Введите число частиц (четное, <=58; <=0 - выход)";NPART% IF NPART%<=0 THEN END IF NPART% MOD 2 <>0 OR NPART%>58 THEN GOTO 1090 ' 'задание константы связи chi LOCATE 7,10: BEEP . INPUT "Задайте константу связи chi"; CHI 9 JJ%=NPART%/2: JJ1%=JJ%*( JJ%+1) 'значения j и j(j+1) V=CHI/NPART% 'сила взаимодействия 9 LOCATE 9,20 'вывод параметров PRINT USING "Для этих параметров квазиспин равен ## и"; JJ% LOCATE 10,20 PRINT USING "сила взаимодействия V составляет ##.####";V 9 LOCATE 14,10: ВЕЕР 'нужно ли вычислять векторы? INPUT "Нужно ли вычислять собственные векторы и <Jz> (у/п)";КВ$ IF КВ$="у" THEN VECTORS%=-1 ELSE VECTORS%=0 RETURN 9 ' ************************************************************************* 'Подпрограмма формирования и диагонализации матрицы гамильтониана 'входные переменные: нет ' выходные переменные: CEVEN, CODD, DIAG, EVEEVEN, EVODD, LDIAG 'глобальные переменные: EVAL, JJ%, JJ1%, LAMBDA, N%, NFIND%, ' NVECTOR, V, VECTORS% 'локальные переменные: 1%, ILAM%, M%, TEMP 2070 N%=JJ%+1 число состояний с четным m
Программы для проектов 467 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 2430 2440 2450 2460 2470 2480 30' FOR l%=1 ТО N% M%=-JJ%+2*(I%-1) DIAG(I%)=M% IF l%=1 THEN GOTO 2160 TEMP=JJ1%-M%*(M%-1) TEMP=TEMP*( J J1 %- (M%-1) *( M%- 2)) LDIAG( 1%) =-V/2*SQR( ABS( TEMP)) NEXT 1% заполнение матрицы для четного m 'цикл по состояниям с четным m 'm для данного состояния 'диагональная часть Н 'недиагональная часть Н ' 'число искомых собственных значений IF JJ% MOD 2 =0 THEN NFIND%=1+JJ%/2 ELSE NFIND%=( JJ%+1)/2 GOSUB 4000 'нахождение собственных значений FOR ILAM%=1 TO NFIND% 'каждое полученное собственное EVEVEN(ILAM%)=EVAL(ILAM%) ' значение запоминается и, если IF NOT VECTORS% THEN GOTO 2300' надо, находится собств. вектор LAMBDA=EVAL( ILAM%) GOSUB 3000 'получение собственного вектора FOR l%=1 ТО N% ' и его запоминание CEVEN( 1%, ILAM%) =TVECTOR( 1%) NEXT 1% NEXT ILAM% FOR l%=1 TO N% M%=-JJ%-1+2*1% DIAG(I%)=M% IF l%=1 THEN GOTO 2400 TEMP=JJ1%-M%*(M%-1) TEMP=TEMP*( JJ1%- (M%-1) *( M%- 2)) LDI AG( 1%) =-V/2*SQR( ABS( TEMP)) NEXT 1% 'теперь состояния с нечетными m 'число состояний с нечетным m 'цикл по состояниям с нечетными m 'm для данного состояния 'диагональная часть Н 'недиагональная часть Н ' 'число искомых собственных значений IF JJ% MOD 2 =0 THEN NFIND%=JJ%/2 ELSE NFIND%=(JJ%+1)/2 GOSUB 4000 'нахождение собственных значений FOR ILAM%=1 TO NFIND% 'каждое полученное собственное EVODD(ILAM%)=EVAL(ILAM%) ' значение запоминается и, если IF NOT VECTORS% THEN GOTO 2540' надо, находится собств. вектор
468 Приложение В 2490 2500 2510 2520 2530 2540 2550 2560 3000 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 LAMBDA=EVAL( ILAM%) GOSUB 3000 'получение собственного вектора FOR l%=1 ТО N% ' и его запоминание CODD) l%, ILAM%) =TVECTOR) l%) NEXT l% NEXT ILAM% RETURN '************************************************************************* 'Подпрограмма находит собственный вектор трехдиагональной матрицы 'входные переменные: DIAG, LAMBDA, LDIAG, N%, NFIND% ' выходные переменные: TVECTOR ' глобальные переменные: A# 'локальные переменные: l%, J%, NORM, SUM FOR l%=1 TO N% 'загрузка (E-H) в A# FOR J%=1 TO N% 'большинство элементов A# нулевые NEXT J% A#( l%, 1%) =CDBL( LAMBDA-DI AG) l%J) ' диагональные элементы IF !%<"% THEN A#(I%J%+1)=-CDBL) LDIAG) l%+1)) 'недиагональные IF l%>1 THEN A#(l%, l%-1)=-CDBL) LDIAG) l%|) ' элементы TVECTOR) l%) =RND 'начальный вектор случайный NEXT l% 'обращение матрицы (Е-Н) 'первая обратная итерация 'применение обратной итерации к ' вектору TVECTOR с получением ' вектора NVECTOR GOSUB 7000 FOR l%=1 ТО N% SUM=0 FOR J%=1 TO N% SUM=SUM+A#( \%, J%) *TVECTOR( J%) NEXT J% NVECTOR) l%)=SUM NEXT l% 'вторая обратная итерация NORM=0 FOR l%=1 TO N% SUM=0 FOR J%=1 TO N% S UM=SUM+A# (l%,J%|*N VECTOR) J%) NEXT J% 'применение обратной итерации ' к вектору NVECTOR с получением ' вектора TVECTOR
Программы для проектов 469 3330 3340 3350 3360 3370 3380 3390 3400 3410 3420 4000 4010 4015 4020 4030 4040 4050 4055 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 TVECTOR(I%)=SUM NORM=NORM+SUM~2 NEXT l% NORM=1/SQR(NORM) 'нормировка окончательного FOR l%=1 ТО N% ' собственного вектора TVECTORJ1%) =TVECTOR( 1%) *NORM NEXT 1% RETURN '************************************************************************* 'Подпрограмма вычисления собственных значений симметрической ' трехдиагональной матрицы 'входные переменные: DIAG, LDIAG, Ы%, NFIND% ' выходные переменные: EVAL 'глобальные переменные: COUNT%, LAMBDA 'локальные переменные: DLAM, GER, \%, L%, LBOUND, RAD, ' SPASING, UBOUND '************************************************************************* LBOUND=DIAG(1)-ABS(LDIAG(2)) 'вычисление границ Гершгорина UBOUND=DIAG(1)+ABS(LDIAG(2)) ' для собственных чисел FOR l%=2 ТО N%-1 RAD=ABS( LDIAGf l%+1)) +ABS( LDIAG( \%]) GER=DIAG(I%)-RAD IF GER<LBOUND THEN LBOUND=GER GER=DIAG(I%)+RAD IF GER>UBOUND THEN UBOUND=GER NEXT l% GER=DIAG( N%) - ABS( LDIAG( N%)) IF GER<LBOUND THEN LBOUND=GER GER=DIAG( N%) +ABS( LDIAGf N%)) IF GER> UBOUND THEN UBOUND=GER ' 'первое приближение для наименьшего LAMBDA=LBOUND ' собственного значения SPACING=(UBOUND-LBOUND)/N% 'оценка интервала между значениями FOR L%=1 ТО NFIND% DLAM=SPACING COUNT%=L%-1 WHILE COUNT%<L% LAMBDA=LAMBDA+DLAM 'цикл отыскания собственных значений 'оценка величины шага 'грубый поиск точки LAMBDA между ' L%-m и (L%-1)-m собств. значениями
470 Приложение В 4290 4300 4310 4320 4330 4340 4350 4360 4370 4380 4390 4400 4410 4420 4430 4440 4450 5000 5010 5020 5030 5040 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5150 5160 5170 5180 6000 6010 6020 6030 6040 GOSUB 5000 WEND LAMBDA= LAMBDA- DLAM WHILE DLAM>. 00001 GOSUB 5000 DLAM=DLAM/2 IF COUNT%>L%-1 THEN LAMB DA= LAMB DA+D LAM GOTO 4400 LAMBDA=LAMBDAADLAM WEND 'подсчет числа собств. знач. <LAMBDA 'теперь поиск с точностью 1е-5 'подсчет числа собств. знач. <LAMBDA 'следующий шаг в два раза меньше GOTO 4390'если все еще меньше собств. ' знач., то делается шаг 'шаг был слишком велик, возврат ' на полшага назад EVAL(L%)= LAMBDA NEXT L% RETURN 'запоминание найденного значения ’ ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ 'Подпрограмма подсчета числа собственных значений меньших LAMBDA ' входные переменные: DI AG, LAMBDA, LDI AG, N% ' выходные переменные: COUNT%, DET ' глобальные переменные: нет 'локальные переменные: 1% ’ ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ ТЕМР1=1 '1-й член рекуррентной формулы и DET=DIAG(1J- LAMBDA '2-й член для расчета определителя IF DET<0 THEN COUNT%=1 ELSE COUNT%=0 'счетчик соб. знач. < LAMBDA FOR l%=:2 TO N% 'рекурсия для расчета определителя ТЕМР=( DIAGf 1%) -LAMBDA] *DET-LDIAG( 1%) A2*TEMP1 TEMP1=DET: DET=TEMP 'переопределение членов; при смене IF DET*TEMP1<0 THEN COUNT%=COUNT%+1 ' знака +1 в счетчик IF ABS( DET) <100000! GOTO 5160 'перенормировка определителя, DET=DET/100000!: TEMP1=TEMP1/100000! 'если он слишком велик NEXT 1% RETURN rжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 'Подпрограмма вывода результатов ' входные переменные: нет ъвыходные переменные: нет 'глобальные переменные: CEVEN, CHI, CODD, EVEVEN, JJ%, NPART%,
Программы для проектов 471 6045 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 6280 6290 6300 6310 6320 6330 6340 6350 6360 6370 6380 6390 6400 6410 6420 6430 6440 1 VECTORS% 'локальные переменные: COL%, Е, 1%, ILAM%, JZ, К%, М%, ROW% 1 ************************************************************************* CLS LOCATE 1,17 'вывод информационной шапки PRINT USING "Число частиц=##"; NPART% LOCATE 1,36 PRINT USING "Константа связи chi=+###.###";CHI LOCATE 2,22 PRINT "Имеются следующие состояния с Е<=0:"; 9 FOR ILAM%=1 ТО JJ%+1 ' цикл по найденным состояниям IF ILAM% MOD 2 =0 THEN GOTO 6270 ' четные и нечетные состояния K%=(ILAM%+1)/2 'номер четного состояния E=EVEVEN(K%) 'энергия этого состояния IF NOT VECTORS% THEN GOTO 6360'если надо, вычисление <Jz> JZ=0 FOR l%=1 TO JJ%+1 'цикл по четному базису M%=-JJ%+2*(I%-1| ' M этого базисного состояния JZ=JZ+CEVEN(l%,K%p2*M% 'вклад в <Jz> NEXT l% GOTO 6360 » K%=ILAM%/2 'номер нечетного состояния E=EVODD(K%) 'энергия этого состояния IF NOT VECTORS% THEN GOTO 6360 'если надо, вычисление <Jz> JZ=0 FOR l%=1 TO JJ% 'цикл по нечетному базису M%=-JJ%-1+2*1% ' M этого базисного состояния JZ=JZ+CODD(l%,K%p2*M% 'вклад в <Jz> NEXT 1% 9 IF ILAM%>22 THEN COL%=42 ELSE COL%=1 'столбец и строка вывода IF ILAM%>22 THEN ROW%=ILAM%-19 ELSE ROW%=ILAM%+2 LOCATE ROW%, COL% PRINT USING "Состояние=## E=+###. ####"; ILAM%, E; 'вывод энергии IF NOT VECTORS% THEN GOTO 6430 'если надо, вывод <Jz> LOCATE ROW%, COL%+25 PRINT USING "<Jz>=+##. ####"; JZ; NEXT ILAM% ' 'приглашение с ожиданием
472 Приложение В 6450 6460 LOCATE 25f 22: PRINT "Для продолжения нажмите любую клавишу";: ВЕЕР IF INKEY$<> "" THEN GOTO 6470 ELSE GOTO 6460 6470 6480 7000 RETURN / 9 ************************************************************************* 7010 'Подпрограмма обращения симметрической матрицы A#(N%,N%) 7015 7020 7030 ' методом исключения Гаусса-Жордана ' Обратная матрица А* получается на месте исходной. ' В основной программе необходимо описать размерность матрицы А* 7035 7040 7050 7060 ' и рабочие массивы R%(N%), P*(N%), Q#(N%). 'входные переменные: А*, Ы% ' выходные переменные: А* 'глобальные переменные: Р#, Q#, R% 7070 'локальные переменные: BIG, l%, J%, К%, PIVOT1#, TEST 7080 7090 FOR l%=1 ТО N% 'R%=0 указывает на то, 7100 7110 7120 7130 7140 7150 7160 7170 R%(l%)=1 ' что строка уже исключена NEXT l% Г FOR l%=1 ТО N% 'цикл по строкам К%=0: BIG=0 'ведущий - макс, диагональный FOR J%=1 ТО N% ' элемент из необнуленных строк IF R%(J%]=0 THEN GOTO 7200 TEST=ABS( A#(J%, J%) j 7180 IF TEST<=BIG THEN GOTO 7200 7190 BIG=TEST: K%=J% 7200 NEXT J% 7210 r 7220 7230 IF K%=0 THEN GOTO 7580 'все диаг. элем.=0; A# вырождена IF l%=1 THEN PIVOT1#=A#(K%,K%) 'макс. диаг. элемент A# 7240 IF ABS(A#(K%,K%)/PIVOT1#)<1E-14 THEN GOTO 7580 'А* плохо 7250 ' ' обусловлена 7260 R%(K%)=0: Q#(K%|=1/A#(K%,K%|'начало исключения этой строки 7270 Р#|К%)=1: А*(К%, К%)=0 7280 IF К%=1 THEN GOTO 7360 7290 7300 7310 FOR J%=1 TO K%-1 'элементы выше диагонального P*(J%)=A#(J%,K%) Q*( J%) =A*( J%, K%) *Q#( K%] 7320 7330 IF R%(J%)=1 THEN A#(J%,K%)=0 7340 NEXT J%
Программы для проектов 473 7350 9 7360 IF K%=N% THEN GOTO 7440 7370 FOR J%=K%+1 TO N% 'элементы правее диагонального 7380 P#(J%)=A#(K%J%) 7390 7400 IF R%(J%]=0 THEN 7410 A#(K%,J%)=0 7420 7430 NEXT r 7440 FOR J%=1 TO N% 'преобразование всей A* 7450 FOR K%=J% TO N% 7460 A#( J%, K%) =A#( J%, K%) +P#( J%) *Q#( K%) 7470 NEXT K% 7480 NEXT J% 7490 NEXT l% 7500 9 7510 FOR J%=2 TO N% 'симметризация A#"-1 7520 FOR K%=1 TO J%-1 7530 7540 A#(J%,K%)=A#(K%,J%) NEXT K% 7550 7560 NEXT J% r 7570 RETURN 7580 BEEP: PRINT "ФАТАЛЬНАЯ ОШИБКА ПРИ ОБРАЩЕНИИ МАТРИЦЫ"; 7590 7600 END г 8000 '************************************************************************* 8010 'Подпрограмма вывода экрана-заставки 8020 ' входные переменные: нет 8030 ' выходные переменные: нет 8040 ' глобальные переменные: нет 8050 'локальные переменные: ROW% 8060 ************************************************************************** 8070 8080 SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме г 8090 LOCATE 1,30: COLOR 15 'вывод на экран названия книги 8100 PRINT "COMPUTATIONAL PHYSICS"; 8110 LOCATE 2,39: COLOR 7 8120 PRINT "by"; 8130 LOCATE 3,32: PRINT "Steven E. Koonin"; 8140 LOCATE 4,15
474 Приложение В 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 8300 8310 8320 8330 8340 8350 8360 8370 8380 8390 8400 8410 8420 8430 8440 8450 8460 8470 8480 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$( 200)+STRING$( 59,205)+CHR$( 188); COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРОЕКТ 5"; COLOR 7 LOCATE 10,20: PRINT "Решение схематической оболочечной модели"; LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." Г LOCATE 21,14 PRINT "Данная программа находит все отрицательные собственные"; LOCATE 22,14 PRINT "числа схематической оболочечной модели Липкина и др."; LOCATE 23,14 PRINT "При необходимости для каждого состояния вычисляются"; LOCATE 24,14 PRINT "также собственный вектор и математическое ожидание Jz."; LOCATE 25,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 8440 LOCATE ,,0 RETURN
Программы для проектов В. 6. ПРОЕКТ VI 475 В данной программе рассчитывается стационарная двумерная картина обтекания прямоугольной пластины вязкой несжимаемой жидкостью. Гео- метрия расчетной области описана в тексте. Размеры сетки, положение и размеры пластины, сеточное число Рейнольдса и параметры релакса- ции задаются в подпрограмме 1000; при желании можно также указать подобласть, по которой должна проводиться релаксация. В подпрограм- ме 2000 задаются начальные значения для завихренности и функции то- ка, в качестве которых берутся либо результаты предыдущего расчета, записанные в файле (строки 2230—2360), либо соответствующие значе- ния для свободного течения жидкости (цикл 2380—2430). Далее выпол- няется основной релаксационный цикл (210—270). В подпрограммах 3000 и 4000 методом релаксации решаются уравнения (VI.9) и (VI. 10) для функции тока и завихренности соответственно. За исключением специальных точек на границах сеточной области или пластины шаги релаксации в этих подпрограммах осуществляются в строках 3220—3230 и 4270—4300. После каждого прохода по подобласти путем интегриро- вания соответствующих величин вдоль границ пластины вычисляются безразмерная силы давления и вязкого трения (подпрограмма 6000), и полученное решение выводится на экран как графического, так и тек- стового дисплея в виде массива символов (подпрограмма 5000). Когда процесс релаксации прерывается пользователем, подпрограмма 7000 вы- водит на экран меню вариантов продолжения расчета. Для получения характерных результатов задайте сетку с размерами по горизонтали и вертикали равными соответственно Nx = 40, Ny = 20, и пластину с полушириной 6 и толщиной 6, передняя кромка которой имеет координату 16. Затем задайте сеточное число Рейнольдса равным 1,0 и одинаковые параметры релаксации для функции тока и завихрен- ности равные 0,3. Наконец, укажите в качестве подобласти релаксации всю сеточную область, задавая значения Nxmax = 40, Nymax = 20, и откажитесь от чтения начальных условий из файла. При указанных параметрах итерации будут сходиться к вполне ламинарному решению.
476 Приложение В 10 ’ *************************************************************************** 20 'Проект 6: Двумерное обтекание пластины вязкой несжимаемой жидкостью 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 3 0 ' *************************************************************************** 40 DIM P(24,79) 'массив для функции тока 50 DIM XSI(24,79) 'массив для завихренности 60 DIM PLACE%(24,79) 'адрес каждой точки в буфере дисплея 70 DIM IS%(24,79) 'IS%=1 указывает на граничную точку 80 ' ' IS%=0 для всех остальных точек 90 DIM ASKII%(35) 'массив для преобразования Р и XSI 100 DIM NEGASKII%(26) ' в символы ASCII 110 DIM INTERIOR%(10) 'массив цветов для внутренних точек 120 DIM BORDER%(10) 'массив цветов для граничных точек 130 FIRST%=-1 'флаг однократной печати информации 140 ' 150 GOSUB 8000 'вывод экрана-заставки 160 GOSUB 9000 'вывод предупреждающего сообщения 170 GOSUB 1000 'ввод параметров расчета 180 GOSUB 2000 'инициализация сетки 190 IF FIRST% THEN GOSUB 10000 'печать информации о выводе на дисплей 200 1Т%=0 'обнуление счетчика итераций 210 WHILE INKEY$o"e" 'нажатие клавиши <е> завершает итерации 220 GOSUB 5000 'вывод функций на экран 230 GOSUB 6000 'вычисление и вывод на экран сил 240 IT%=IT%+1 'приращение счетчика итераций 250 GOSUB 3000 'релаксация Р 260 GOSUB 4000 'релаксация XSI 270 WEND 280 ' 290 LOCATE 25,52,1: BEEP 300 COLOR 7: PRINT "Продолжение - любой клавишей"; 310 IF INKEY$="" GOTO 310 320 GOSUB 7000 'вывод вариантов продолжения счета 330 IF AGAIN% THEN GOTO 170 ELSE GOTO 200 340 ' 1ООО ' ************************************************************************* 1010 'Подпрограмма ввода параметров расчета 1020 'входные переменные: нет 1030 'выходные переменные: JL%, JR%, NX%, NXMAX%, NY%, NYMAX%, 1040 ' RE, RE4, WID%, WP, WP1, WX, WX1
Программы для проектов 477 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 2000 2010 2020 2030 2040 2050 2055 2060 'глобальные переменные: GRAPHICS%, MONO% 'локальные переменные: ТН1СК% 9 ААААМсЫсЫсЫсМс4сАА4с4с4с*4с4с*4с4с4сЖ4с4с****4с**4с4с4с4с4с4с4с4сА4сА4сзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзкзк IF MONO% THEN GOSUB 12000: CLS 'очистка экранов IF GRAPHICS% THEN GOSUB 11000: CLS r LOCATE 10,15,0 'ввод параметров INPUT "Задайте размер сетки по горизонтали, Nx(>0,<=79)"; NX% IF NX%>0 AND NX%<=79 THEN GOTO 1150 BEEP: GOTO 1110 LOCATE 11,15,0 INPUT "Задайте размер сетки по вертикали, Ny(>0, <?24)"; NY% IF NY%>0 AND NY%<=24 THEN GOTO 1190 BEEP: GOTO 1150 LOCATE 12,15,0 INPUT "Введите полуширину пластины (в шагах сетки)";WID% LOCATE 13,15,0 INPUT "Введите толщину пластины (в шагах сетки)"; ТН1СК% LOCATE 14,15,0 INPUT "Задайте номер узла сетки для передней кромки"; JL% JR%=JL%+THICK%-1 LOCATE 15,15 INPUT "Задайте сеточное число Рейнольдса"; RE RE4=RE/4 LOCATE 16,15 INPUT "Введите параметры релаксации для PSI, XSI";WP,WX WP1=1-WP: WX1=1-WX LOCATE 17,15 INPUT "Задайте подобласть релаксации: Nxmax, Nymex"; NXMAX%, NYMAX% CLS r RETURN '************************************************************************* 'Подпрограмма инициализации расчета ' входные 'выходные ' глобальные переменные: нет переменные: I S( l%, J%), Р( l%, J%), PLACE%( l%, J%), XS I (l%, J%) переменные: NX%, NY%, WID% 'локальные Г переменные: BOTTOM%, l%, IC%, IR%, J%, LEDGE%, NXOLD%, NYOLD%, S$ *************************************************************************
478 Приложение В 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 2430 2440 2450 2460 2470 ' 'центрирование сетки на экране LEDGE%=39-NX%/2: IF NX% MOD 2=1 THEN LEDGE%=LEDGE%+2 BOTTOM%=12+NY%/2: IF NY% MOD 2=1 THEN BOTTOM%=BOTTOM%-1 FOR l%=1 TO NY% 'заполнение массива положений IR%=BOTTOM%-I%+1 ' в буфере FOR J%=1 TO NX% IC%=LEDGE%+J%-1 PLACE%( J%)=16 0* (IR%-1 )+2*( IC%-1) is%(i%J%)=o NEXT J% NEXT 1% f CLS 'считывание данных из файла ВЕЕР: LOCATE 10,15,0 INPUT "Считывать начальные условия из файла (y/n)";S$ IF S$o"Y" THEN GOTO 2380 BEEP: LOCATE 11,15 INPUT "Введите имя вводимого файла"; S$ OPEN S$ FOR INPUT AS #1 INPUT #1, NXOLD%, NYOLD% IF NXOLD%=NX% AND NYOLD%=NY% THEN GOTO 2300 PRINT "Несовпадение размеров сетки, входной файл не использован" CLOSE #1: GOTO 2380 FOR l%=1 ТО NY% FOR J%=1 TO NX% INPUT *1,P(I%J%),XSI(I%,J%) NEXT J% NEXT 1% CLOSE #1 GOTO 2450 f FOR l%=1 TO NY% FOR J%=1 TO NX% PU%J%|=I%-1 NEXT J% NEXT l% r 'нулевая начальная завихреннность 'начальная функция тока FOR J%=JL% TO JR% 'задание нулевых значений Р FOR l%=1 TO WID% ' на пластине
I%f ‘%l IlSX- 11+%Г'%1 )d+ 1>-%Г'%1 ld+ (%r 4+%l )d+1%( 4-%l )d=dW31 OZZE lautA awHHsdxAHa, , О HE OWE 0109 OOZE (%f ‘%l ld= (%XN *%l Id 06И l%f ‘%l )d«ldM+dW31«EEEEEE '*dM= (/of '%l Id OSH l%t ‘%l IlSX- U-%r '%l )d+ (%r 4+%l ld+ (%r 4-%l ld=dW31 OZIE ratiMHedj ианИее иеьАиэ, OZZE 0109 N3H1 И%ХМ<>%Г dl 09И OWE 0109 OSH lz‘%1 )d=ll'%l Id one IZ '%l )d*HM+£/dW31«dM= Iz '%l Id OEK l%f '%l IlSX-1£ ‘%l ld+ IZ 4+%l ld+ IZ 4-%l )d=dW31 OZIE hMHedj waHtfadau и , Q9IE 0109 N3H1 Z<>%f dl OWE MaHxdaa ивьАиэ И1чн1эек, 09ZE 0109 N3H1 1-%AN=%I dl OOH asiKtfoxgo wireA -Hedj, о HE 0109 N3H1 1= l%f'%! I%SI dl 060E %XVWXN O1 1=%Г dOd 080E ишээ weutA ou ияиЬ, %XVWAN O1 i=%\ dOd OZOE 090E dW31 f%f l%\ :энннэюэс1эи аннятои, OSOE IdM 'dM ‘%XVWAN SVOE ‘%AN ‘%XVWXN ‘%XN ‘(%r‘%l)%SI :9HHHawadau эннчиедош, OfrOE (%f'%l)d :anHHavyadau апнУохна, OEOE (%r‘%l)lSX '(%r'%l)d :ai4HHawadau aRHtfoxa, OZOE емо± ии^мнАф ииУ1еэмеиэс1 ewwed.iodutfo|j, OWE ****^^^^^^^^*^^^^**^*^^^^^^^********^***^^^^^*** t OOOE 0Ш Naniaa 0E9Z $1Э 0Z9Z 0193 %t 1X3N 0093 l=l%f'%ANl%SI 06SZ l=l%f4l%SI 08S3 iqViHHedj эжох ихэеидо еин и xdaa, %XN О1 ^=%Г UOd 0ZS3 t 09S3 HwetiHHedj кэхоишак t %\ 1X3N OSSI ихэеидо uedw энааи и aiaaedu, l=(%XN'%l)%SI om %Sl мэьох XHHhHHedj t (j-J%SI 0ES3 aoHBHEHdu еаиээете аинаниоиее, %KH O1 l~%l UOd ozsz 0ИЗ %r 1X3N oosz %l 1X3N 06П HaViHHedx аэхэаиаа енихэеии, 08П 6LV ooixdodu kvq iqwwvd2Od[]
480 Приложение В 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 3330 3340 3350 3360 3370 3380 3390 3400 3410 3420 3430 3440 4000 4010 4020 4030 4040 4045 4050 4060 4070 4071 4080 4090 4100 4110 4120 4130 4140 4150 4160 Р( %) =WP*. 25*TEMP+WP1*P( 1%, J%) GOTO 3410 'узлы у верхней границы IF J%<>2 THEN GOTO 3310 'случай левого угла ТЕМР=Р( 1%-1,2) +Р( 1%, 3) -Х5Ц1%, 2) +1 Р( 1%, 2] =WP*. 5*TEMP+WP1*P( 1%, 2) PI % г 1J =Р( %. *1 = PI NY%, 1| =Р( 1%, 1| +1 GOTO 3390 IF J%oNX%-1 THEN GOTO 3360 'случай правого угла ТЕМР=Р( l%-1, J%) +Р( 1%, J%-1) - XSI( 1%, J%) +1 P( J%) = WP*. 5*TEMP+WP1*P( 1%, J%) P( %, NX%) =P( 1%, J%): P( NY%, NX%) =P( 1%, NX%) +1 GOTO 3390 TEMP=P( l%-1, J%) +P( 1%, J%-1) +P( l%, J%+1 J -XSI( J%) +1 P| %, =WP*TEMP/3+WP1*P( 1%, J%) 'верхняя граница = строка P|NY%,J%)=P(I%,J%)+1 ' под ней + 1 NEXT J% NEXT 1% RETURN 'Подпрограмма релаксации завихренности 'входные переменные: P(l%J%)r XSI(I%,J%) 'выходные переменные: XSI(I%,J%) 'глобальные переменные: JL%, JR%, NX%, NXMAX%, NY%, NYMAX%, ' RE4, WID%, WX, WX1 'локальные переменные: 1%, J%, TEMP '************************************************************************* 'вычисление краевых условий для XSI; передняя и задняя кромка ' пластины, затем верх FOR l%=1 ТО WID% XSI(I%,JL%)=2*P(I%,JL%-1) XSI( 1%, JR%) =2*P( 1%, JR%+1) 'условия для XSI на передней кромке 'условия для XSI на задней кромке NEXT 1% FOR J%=JL%+1 TO JR%-1 'условия для XSI на верхней кромке XS l( WID%, J%) =2*Р( WID%+1, J%) NEXT J% r FOR l%=1 TO NYMAX% 'релаксационный цикл по узлам
Программы для проектов 481 4170 FOR J%=1 ТО NXMAX% 4180 IF IS%(l%,J%j=1 THEN GOTO 4310 'граничные узлы обходятся 4190 IF J%oNX%-1 THEN GOTO 4270 'случай правой границы 4200 TEMP=XSI( l%+1, J%) +XSI( l%-1, J%) +XS l( l%, J%-1) 4210 TEMP=TEMP+RE4*XSI( l%, J%-1) *( P( l%+1, J%) -P( l%-1, J%)) 4220 TEMP=TEMP+RE4*( XSI( l%+1, J%) - XSI( l%-1, J%)) *( P( l%, J%+1) 4230 XSl( l%, J%) =WX*TEMP/(3+RE4*( P( l%+1, J%) -P( l%-1, J%))) +WX1 *xsi(i%J%) 4240 XS l( l%, NX%) =XSI( l%, J%) 4250 GOTO 4310 4260 ' 4270 TEMP=XSI( l%+1, J%) +XSI (l%-1, J%) +XSI (l%, J%+1) +XSI (l%, J%-1) 4280 TEMP=TEMP-RE4*( P( l%+1, J%) -P( l%-1, J%)) *( XS l( l%, J%+1) -XSI( l%, J%-1)) 4290 TEMP=TEMP+RE4*( P( l%, J%+1) -P( l%, J%-1 ] ] *( XSI (l%+1, J%) -XSI(I%-1, J%)) 4300 XS I (l%, J%) =WX*. 25*TEMP+WX1*XSI( l%, J%) 4310 NEXT J% 4320 NEXT \% 4330 RETURN 4340 ' 5000 '************************************************************************* 5010 ' Подпрограмма вывода на экран функции тока и завихренности 5020 'входные переменные: P(l%J%), VORT%, XSI(I%,J%) 5030 ' выходные переменные: нет 5040 'глобальные переменные: ASKII%(I%), BORDER%(I%), GRAPHICS%, 5050 ' INTERIOR%( l%, J%), MONO%, NEGASKII%( l%), NX%, NY%, PLACE%( l%, J%) 5060 'локальные переменные: BUF%, l%, J%, M%, TINT%, Z% 5070 '************************************************************************* 5080 IF VORT% THEN GOTO 5340 'вывод только XSI 5090 ' 5100 COLOR 7: LOCATE 25,1,0 5110 PRINT USING "Итерация ### R=##.#"; IT%, RE; 5120 LOCATE 25,52,0 5130 PRINT "Конец итераций - клавиша <e>"; 5140 ' 5150 IF GRAPHICS% THEN DEF SEG=&HB800 ELSE DEF SEG=&HB000 'вывод P 5160 FOR l%=1 TO NY% 5170 FOR J%=1 TO NX% 5180 Z%=CINT(P(I%,J%)) 'перевод P в символ ASCII 31 — 1650
CQ 3 £ И С сх
Программы для проектов 483 6020 6030 6040 6050 6060 6070 6080 6090 6100 6110 6120 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 6280 6290 6300 6310 6320 6330 6340 6350 7000 7010 7020 7030 7040 7050 ' входные переменные: XSI(I%, J%) ' выходные переменные: ' глобальные переменные: нет JL%, JR%, RE, WID% 'локальные переменные: FP, PV, l%, J%, P FV=XSI(WID%, JL%)/2 FOR J%=JL%+1 TO JR% FV=FV+XSI(WID%, J%) NEXT J% FV=FV- XS I (WID%, J R%) /2 FV=FV/RE/jWID%-1) 9 'вычисление силы вязкого трения 'интеграл по верхней поверхности P=0: FP=O FOR l%=2 TO WID% 'вычисление силы давления 'интеграл вверх по передней кромке P=P-(XSI(l%rJL%)-XSI(l%,JL%-1)+XSI(l%-1,JL%)-XSI(l%-1rJL%-1)]/2/RE FP=FP+P NEXT l% FP=FP-P/2 F FOR J%=JL%+1 TO JR% 'интеграл вдоль верхней поверхности Р=Р+( X SI (WID%+1, J%) - XS I (WID%, J%) +XSI( WID%+1, J%-1) -XSI(WID%, J%-1) J/2/RE NEXT J% FP=FP-P/2 F FOR l%=WID%-1 TO 1 STEP -1 'интеграл вниз по задней кромке Р=Р+( XSI (l%, JR%+1) - XSI( l%, JR% J +XSI( l%+1, JR%+1) - XSI (l%+1, JR%) j /2/RE FP=FP-P NEXT 1% FP=FP/(WID%-1| 'нормировка силы давления COLOR 7,0: LOCATE 25,21,0 'печать результатов PRINT USING ”Fv=+##.###' RETURN ™ Fp=+##.###"""; FV,FP; ************************************************************************* Подпрограмма вывода вариантов продолжения расчета ' входные переменные: ' выходные переменные: г P(I%J%). XSI(I%,J%) AGAIN%, NX%, NXMAX%, NY%, NYMAX%, RE, RE4, VORT%,WP, WP1, WX, WX1 ' глобальные переменные: NX%, NXMAX%, NY%, NYMAX%, RE, WP, WX
484 Приложение В 7060 7070 7080 7090 7100 7110 7120 7130 7140 7150 7160 7170 7180 7190 7200 7210 7220 7230 7240 7250 7260 7270 7280 7290 7300 7310 7320 7330 7340 7350 7360 7370 7380 7390 7400 7410 7420 7430 7440 7450 7460 'локальные переменные: С%, 5$ ************************************************************************** AGAIN%=0 CLS: COLOR 7,0 'сброс флага LOCATE 1,26 PRINT "Варианты продолжения работы" LOCATE 3,10: PRINT "1) Возобновление итераций" LOCATE 5,10: PRINT "2) Повторный вывод функцию тока" LOCATE 7,10: PRINT "3) Изменение подобласти обхода" LOCATE 9,10: PRINT "4) Изменение параметров релаксации" LOCATE 11,10: PRINT "5) Изменение числа Рейнольдса" LOCATE 13,10: PRINT "6) Сохранение текущего решения на диске" LOCATE 15,10: PRINT "7) Вывод на данный экран завихренности" LOCATE 17,10: PRINT "8) Повторение расчета с самого начала" LOCATE 19,10: PRINT "9) Выход из программы" LOCATE 21,25: PRINT SPACE$(50) LOCATE 21,25: BEEP: INPUT "Введите номер выбранного варианта"; С% IF C%>=1 AND С%<=9 THEN GOTO 7260 ELSE GOTO 7220 IF С%<>1 THEN GOTO 7280 'возобновление итераций CLS: RETURN IF С%<>2 THEN GOTO 7340 'вывод функцию тока CLS GOSUB 5000: GOSUB 6000 LOCATE 25,52: ВЕЕР: PRINT "Продолжение - любой клавишей"; IF INKEY$="" THEN GOTO 7320 GOTO 7080 IF C%<>3 THEN GOTO 7440 'изменение подобласти LOCATE 22,15 PRINT USING "Текущие размеры сетки: Nx=##, Ny=##"; NX%, NY% LOCATE 23,15: PRINT "Текущая подобласть: "; PRINT USING "Nxmax=##, Nymax=##"; NXMAX%, NYMAX% LOCATE 24,15: BEEP INPUT; "Введите новые значения Nxmax, Nymax"; NXMAX%, NYMAX% IF NXMAX%<0 OR NXMAX%>NX% THEN NXMAX%=NX% IF NYMAX%<0 OR NYMAX%>NY% THEN NYMAX%=NY% GOTO 7080 IF C%<>4 THEN GOTO 7530 'изменение параметров релаксации LOCATE 22,15 PRINT USING "Текущий параметр релаксации для PSI равен #.###";WP
Программы для проектов 485 7470 7480 7490 7500 7510 7520 7530 7540 7550 7560 7570 7580 7590 7600 7610 7620 7630 7640 7650 7660 7670 7680 7690 7700 7710 7720 7730 7740 7750 7760 7770 7780 7790 7800 7810 7820 7830 8000 8010 8020 8030 LOCATE 23,15: ВЕЕР: INPUT; "Введите новый параметр для PSI";WP LOCATE 24,15 PRINT USING "Текущий параметр релаксации для XSI равен #.###"; WX; LOCATE 25,15: ВЕЕР: INPUT; "Введите новый параметр для XSI";WX WX1=1-WX: WP1=1-WP GOTO 7080 IF C%<>5 THEN GOTO 7610 'изменение числа Рейнольдса LOCATE 22,15 PRINT USING "Текущее сеточное число Рейнольдса равно ##.###"; RE LOCATE 23,15: ВЕЕР INPUT "Введите новое число Рейнольдса"; RE IF RE<0 THEN RE=1 RE4=RE/4 GOTO 7080 IF C%<>6 THEN GOTO 7720 'запись данных на диск LOCATE 22,15: ВЕЕР INPUT "Введите имя файла, в котором сохранить решение"; S$ OPEN S$ FOR OUTPUT AS #1 WRITE #1,NX%, NY% FOR l%=1 TO NY% FOR J%=1 TO NX% WRITE *1,P(I%J%),XSI(I%,J%) NEXT J% NEXT 1% CLOSE #1: GOTO 7080 IF C%<>7 THEN GOTO 7790 'вывод XSI CLS VORT%=-1 'установка флага IF GRAPHICS% THEN DEF SEG=&HB800 ELSE DEF SEG=&HB000 GOSUB 5000 VORT%=0 GOTO 7080 IF C%<>8 THEN END 'завершение программы AGAIN%=-1 ' или повторение сначала CLS RETURN 'Подпрограмма вывода экрана-заставки ' входные переменные: нет ' выходные переменные: GRAPHICS%, MONO%
486 8040 8050 8060 8070 8080 8090 8100 8110 8120 8130 8140 8150 8160 8170 8180 8190 8200 8210 8220 8230 8240 8250 8260 8270 8280 8290 8300 8310 8320 8330 8340 8350 8360 8370 8380 8390 8400 8410 8420 8430 8440 Приложение В 'глобальные переменные: нет 'локальные переменные: G$, М$, ROW% '************************************************************************* SCREEN 0: CLS: KEY OFF ' программа стартует в текстовом режиме г LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; i LOCATE 5,10 'рисование рамки PRINT CHR$(201)+STRING$(59,205)+CHR$(187); FOR ROW%=6 TO 19 LOCATE ROW%,10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$( 200)+STRING$( 59,205)+CHR$( 188); i COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРОЕКТ 6"; COLOR 7 LOCATE 10,20: PRINT "Двумерное обтекание прямоугольной пластины" LOCATE 11,26: PRINT "вязкой несжимаемой жидкостью" LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." t LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$,1)="y" OR LEFT$(G$, 1)="n" GOTO 8400 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 8350 IF LEFT$(G$, 1)="y" GOTO 8430 GRAPHICS%=0: MONO%=-1 RETURN GRAPHICS%=-1 LOCATE 18,15: PRINT SPACE$(55)
Программы для проектов 487 8450 8460 8470 8480 8490 8500 8510 8520 9000 9010 9015 9020 9030 9035 9040 9050 9060 9070 9080 9090 9100 9110 9120 9130 9140 9150 9160 9170 9180 9190 9200 9210 9220 9230 9240 9250 9260 9270 9280 9290 9300 LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$, 1)="у" OR LEFT$(M$, 1)="n" GOTO 8500 'проверка ответа LOCATE 18,35: PRINT "Повторите...": GOTO 8450 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 RETURN r '************************************************************************* 'Подпрограмма печати сообщения о применении оператора РОКЕ, ' формирование массивов для работы с РОКЕ ' входные переменные: нет 'выходные переменные: ASKII%(I%), BORDER%(I%), INTERIOR%( 1%), ' NEGASKII%(I%) ' глобальные переменные: нет 'локальные переменные: \% CLS г LOCATE 1,33,0 PRINT "ВНИМАНИЕ" LOCATE 3,11 PRINT "Для ускорения вывода на экран программа использует оператор"; LOCATE 5,13 PRINT "РОКЕ, заносящий данные непосредственно в буферы экрана."; LOCATE 7,13 PRINT "Предполагается, что буфер текстового дисплея начинается"; LOCATE 9,16 PRINT "с адреса &HB000, а графический буфер - с &НВ800. "; LOCATE 11,12 PRINT "Эти адреса соответствуют аппаратным средствам фирмы IBM."; LOCATE 13,12 PRINT "Если у вас аппаратура не фирмы IBM, то посмотрите в своих"; LOCATE 15,12 PRINT "руководствах адреса буферов дисплея и внесите необходимые"; LOCATE 17,13 PRINT "изменения в подпрограммы 5000 и 7000."; LOCATE 21,22 PRINT "Для продолжения нажмите любую клавишу";: ВЕЕР IF INKEY$="" THEN GOTO 9290 LOCATE ,,0
488 Приложение В 9310 CLS 9320 f 9330 FOR l%=0 TO 9 'задание массивов для перевода 9340 ASKII%(l%)=l%+48 ' Р и XSI в символы ASCII 9350 NEXT 1% 'числа 0-9 9360 FOR 1%=10 ТО 35 9370 ASKII%(l%)=l%+55 'буквы A-Z 9380 NEGASKII%(l%-9)=l%+87 'буквы a-z 9390 NEXT 1% 9400 f 9410 IF NOT GRAPHICS% THEN GOTO 9500 9420 RESTORE 9470 'задание массивов для цветов 9430 FOR 1%=0 ТО 9 ' внутренних и граничных точек 9440 READ INTERIOR%( 1%) 9450 BORDER%( l%)=INTERIOR%( 1% )+9 6 9460 NEXT 1% 9470 DATA 4,5,1,3,2,12,13,9,11,10 9480 RETURN 9490 ' 9500 FOR l%=0 TO 9 'на текстовом дисплее только 9510 INTERIOR%(I%)=2: BORDER%(I%)=10 ' обычная и повышенная яркость 9520 NEXT 1% 9530 RETURN 9540 ' 10000 ' ************************************************************************ 10010 10020 10030 10040 'Подпрограмма вывода информации об использовании дисплея ' входные переменные: ' выходные переменные: ' глобальные переменные: нет нет FIRST% 10050 10060 'локальные переменные: нет '************************************************************************ 10070 10080 10090 10100 CLS t LOCATE 1,15,0 PRINT "Данная программа будет выводить на экран линии тока" 10110 10120 LOCATE 3,13,0 PRINT "(и завихренность, если у вас два дисплея). При выводе" 10130 10140 LOCATE 5,11,0 PRINT "завихренности она изображается только на текстовом экране.1 10150 10160 LOCATE 8,12,0 PRINT "Линии постоянной завихренности и линии тока обозначаются"
Программы для проектов 489 10170 10180 10190 10200 10210 10220 10230 10240 10250 10260 10270 10280 10290 10300 10310 10320 10330 10340 10350 10360 10370 10380 10390 10400 10410 11000 11010 11020 11030 11040 11050 11060 11070 11080 11090 11100 11110 12000 12010 12020 12030 LOCATE 10,17,0 PRINT "буквами и цифрами следующим образом:" LOCATE 12,22,0 PRINT "0-9,А-Z соответствуют значениям 0-35" LOCATE 13,19,0 PRINT "и a-z соответствуют значениям -1 до -26" LOCATE 15,5,0 PRINT "(Выводимые значения завихренности в десять раз больше " LOCATE 15,59,0 PRINT "истинных значений)" LOCATE 18,14,0 PRINT "Цвет используется для разрешения соседних линий тока." LOCATE 20,11,0 PRINT "Все границы и пластина выделены желтым цветом (графический" LOCATE 22,11,0 PRINT "дисплей) или повышенной яркостью (только текстовый дисплей)." f LOCATE 25,22,0 PRINT "Для продолжения нажмите любую клавишу"; IF INKEY$-"" GOTO 10360 f CLS FIRST%=0 RETURN r '************************************************************************ 'Подпрограмма переключения с текстового дисплея на графический входные переменные: нет 'выходные переменные: нет ' глобальные переменные: нет 'локальные переменные: нет 1 ************************************************************************ DEF SEG=0 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 SCREEN 1,0,0,0: SCREEN 0: WIDTH 80: LOCATE ,,1,6,7 RETURN r '************************************************************************ 'Подпрограмма переключения с графического дисплея на текстовый ' входные переменные: нет ' выходные переменные: нет
490_______________________________________________Приложение В 12040 ’ глобальные переменные: нет 12050 'локальные переменные: нет 12060 '*****************************************************************♦****** 12070 DEF SEG=0 12080 POKE &Н410, (РЕЕК(&Н410) OR &Н30) 12090 SCREEN 0: WIDTH 80: LOCATE „1,12,13 12100 12110 RETURN r
Программы для проектов 491 В.7. ПРОЕКТ VII Данная программа решает нелинейные уравнения химических реакций с диффузией, описывающие поведение брюсселятора (уравнения (VII.3)), в двумерной области с краевыми условиями нулевых потоков. В подпро- грамме 1000 задаются концентрации веществ А и В, коэффициенты диф- фузии, размеры сетки, а также шаг по времени. В качестве начальных условий для концентраций X и Y берутся их равновесные значения со случайными флуктуациями (строки 1280 — 1370). После этого методом переменных направлений, реализованным в подпрограмме 4000, рассчи- тывается эволюция системы во времени (цикл 160—210). Отметим, что некоторые коэффициенты, необходимые для обращения трехдиагональных матриц, вычисляются только один раз в начале расчета и запоминаются (подпрограмма 2000, вызываемая в строке 1260). На каждом шаге по времени на экраны выводятся концентрации X и Y в виде массивов сим- волов (подпрограмма 3000). Типичные результаты расчета по этой программе можно получить, задавая концентрации веществ А и В равными соответственно 2 и 5, коэффициенты диффузии Dx = Dy = 0,001, размеры сетки Nx = Ny = 20, шаг по времени 0,07 и величину начальных флуктуаций 0,1. 10 '*************************************************************************** 20 'Проект 7: Двумерный брюсселятор 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985 by Addison-Wesley Publishing Company 30 '*************************************************************************** 40 DIM X(24,79), Y(24,79) 'массивы для концентраций X и Y 50 DIM ALPHAXX(24),BETAXX(24),GAMMAXX(24) 'коэфф-ты прогонки по x для X 60 DIM ALPHAYX(24),BETAYX(24),GAMMAYX(24) 'коэфф-ты прогонки по x для Y 70 DIM ALPHAXY(79), BETAXY(79),GAMMAXY(79) ' коэфф-ты прогонки по у для X 80 DIM ALPHAYY(79), BETAYY(79),GAMMAYY(79) ' коэфф-ты прогонки по у для Y 90 DIM PLACE%(24,79),ASKI%(62) 'массив адресов буфера, коды ASCII 100 ' 110 GOSUB 6000 120 GOSUB 1000 130 Т1МЕ=0 140 WHILE INKEY$o"e" 150 TIME=TIME+DT 160 GOSUB 4000 170 GOSUB 3000 'вывод экрана-заставки 'инициализация расчета 'приращение времени 'расчет одного шага по времени 'вывод на экран концентраций X и Y
492 Приложение В 180 190 200 210 220 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 ИЗО 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 IF OVRFLOW% THEN OVRFLOW%=0: GOTO 120 WEND f GOSUB 5000 'вывод вариантов продолжения счета 4*******>i**************************************************************** 'Подпрограмма инициализации расчета ' входные переменные: нет 'выходные переменные: ADT, BDT, BP1DT, СХР, CXZ, CYP, CYZ, DT, NX%, NY%, X(I%,J%), Y(I%,J%) ' глобальные переменные: нет 'локальные переменные: А, В, DI, D2, FLUCT, Н, \%, J% '************************************************************************* IF MONO% THEN GOSUB 8000: CLS 'очистка текстового и IF GRAPHICS% THEN GOSUB 7000: CLS ' графического экранов LOCATE 10,10 INPUT; "Введите концентрации веществ A LOCATE 12,10 INPUT; "Введите коэффициенты диффузии LOCATE 14,10 INPUT;"Задайте размеры сетки Nx(<=24), IF NX%>24 THEN NX%=24 IF NY%>79 THEN NY%=79 LOCATE 16,10 INPUT; "Задайте шаг по времени"; DT H=1/(NX%-1) BDT=B*DT: ADT=A*DT: BP1DT=1-(B+1) *DT CXP=-D1*DT/H~2: CXZ=1+2*D1*DT/H~2 CYP=-D2*DT/H~2: CYZ=1+2*D2*DT/H~2 GOSUB 2000 'ввод параметров и В"; А, В Dx и Dy";D1,D2 NY(<=79)"; NX%, NY% 'ограничение размеров сетки полезные константы расчет коэфф-тов прогонам и адресов в буфере начальные условия LOCATE 18,10 INPUT;"Задайте величину начальных флуктуаций (>0,<1)"; FLUCT IF FLUCT<0 THEN FLUCT=0 IF FLUCT>1 THEN FLUCT=1 FOR l%=1 TO NX% 'цикл по всем узлам FOR J%=1 TO NY% X( \%, J%) = A*( 1- FLUCT+FLUCT*RND) Y( 1%, J%) =B/A*( 1- FLUCT+FLUCT*RND)
Программы для проектов 493 1360 1370 1380 1390 1400 1410 1420 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280 2290 2300 2310 2320 2330 NEXT J% NEXT 1% 9 CLS GOSUB 3000 'вывод на экран X и У RETURN 9 9 ************************************************************************* 'Подпрограмма вычисления коэффициентов ALPHA и GAMMA ' входные переменные: нет 'выходные переменные: ALPHAXX, ALPHAXY, ALPHAYX, ALPHAYY, ' GAMMAXX, GAMMAXY, GAMMAYX, GAMMA YYr PLACE%(I%, J%) ' глобальные переменные: СХР, CXZ, CYP, CYZ, NX%, NY% 'локальные переменные: ВОТТОМ%, 1%, IC%, IR%, J%, LEDGE% ' ************************************************************************* ' ' х-направление ALPHAXX, NX%)=1: ALPHAYX,NX%,=1 'краевые условия с нулевыми FOR l%=NX% ТО 1 STEP -1 ' потоками GAMMAXX, l%j =1/, CXZ+CXP*ALPHAXX( l%)) ALPHAXX, l%-1) =-CXP*GAMMAXX( l%, GAMMAYX, l%) =1/, CYZ+CYP*ALPHAYX( l%,, ALPHAYX, l%-1) =-CYP* GAMMAYX, l%) NEXT l% ' 'у- направление ALPHAXY,NY%,=1: ALPHAYY,NY%,=1 'краевые условия с нулевыми FOR J%=NY% TO 1 STEP -1 ' потоками GAMMAXY, J%) =1/, CXZ+CXP*ALPHAXY( J%)) ALPHAXY, J%-1 ] =- CXP* GAMMAXY, J%j GAMMA YY( J%, =1/, CYZ+CYP*ALPHAYY, J%,, ALPHAYY, J%-1, =- C YP*GAMMAYY( J%, NEXT J% ' 'центрирование сетки на экране LEDGE%=39-NY%/2: IF NY% MOD 2=1 THEN LEDGE%=LEDGE%+2 BOTTOM%=12+NX%/2 FOR l%=1 TO NX% 'заполнение массива IR%=BOTTOM%-I%+1 ' адресов в буфере экрана FOR J%=1 ТО NY% IC%=LEDGE%+J%-1 PLACE%( 1%, J%)=160*( IR%-1 )+2*( IC%-1) NEXT J% NEXT 1%
494 Приложение В 2340 2350 3000 ЗОЮ 3020 3025 3030 3040 3045 3050 3060 RETURN г 9эк************************************************************************ 'Подпрограмма вывода на экран концентраций X и Y 'входные переменные: OVRFLOW%, TIME, UNDRFLOW%, X(I%,J%), Y(I%,J%) ' выходные переменные: OVRFLOW%, UNDRFLOV/% 'глобальные переменные: ASKI%(I%), GRAPHICS^, MONO%, NX%, NY%, PLACE%(I%, J%) ’локальные переменные: BUF%, CH%, 1%, J%, TINT% 9 3k3k3k3k3k3kMc3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k*3k3k3k3kMc3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3fc>fc3k^ 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 3330 3340 3350 3360 3370 IF NOT (OVRFLOW% OR UNDRFLOW%) THEN GOTO 3160 ' вывод сообщения LOCATE 12+NX%/2+1,9: PRINT SPACE$(64); ' об ошибке LOCATE, 9: IF UNDRFLOW% THEN PRINT "Концентрация отрицательна,"; IF OVRFLOW% THEN PRINT "Переполнение в концентрации,"; LOCATE, 38: PRINT "для продолжения нажмите клавишу <с>"; IF INKEY$o"c" THEN GOTO 3120 UNDRFLOW%=0: OVRFLOW%=-1 RETURN r LOCATE 12+NX%/2+1,1 PRINT USING "Время=###.## ";TIME; LOCATE ,18,0 PRINT "На этом экране показана концентрация X. Выход - клавиша <е>"; IF GRAPHICS% THEN DEF SEG=&HB800 ELSE DEF SEG=&HB000 'вывод X FOR l%=1 TO NX% FOR J%=1 TO NY% CH%=5*X(I%, J%): IF CH%>61 THEN CH%=61 IF CH%<0 THEN CH%=0 IF GRAPHICS% THEN GOTO 3280 TINT%=7: GOTO 3290 TINT%=((CH%+15)MOD 15) + 1 : IF TINT%=8 THEN TINT%=1 BUF%=PLACE%( 1%, J%): CH%=ASKI%(CH%) POKE BUF%,CH% : POKE BUF%+1,TINT% NEXT J% NEXT 1% IF NOT (GRAPHICS% AND MONO%) THEN RETURN r DEF SEG=&HB000 'вывод Y FOR l%=1 TO NX% FOR J%=1 TO NY%
Программы для проектов 495 3380 3390 3400 3410 3420 3430 3440 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 4240 4250 4260 4270 4280 4290 4300 4310 4320 4330 CH%=5*Y(I%,J%): IF СН%>61 THEN СН%=61 IF CH%<0 THEN CH%=0 BUF%=PLACE%( l%, J%): СН%=ASKI%(СН%) POKE BUF%,CH% : POKE BUF%+1,7 NEXT J% NEXT 1% '************************************************************************* ' Подпрограмма расчета одного шага по времени ' входные переменные: Х( 1%, J%) ' выходные переменные: OVRFLOW%, UNDRFLOW%, Х( 1%, J%), Y( 1%, J%) 'глобальные переменные: массивы ALPHA и GAMMA, ADT, BDT, BP1DT, • CXP, CYP, DT, NX%, NY% 'локальные переменные: массивы BETA, 1%, J%, SX, SY, X2Y FOR J%=1 TO NY% 'для каждого у выполняется цикл по х ' 'обратный проход для коэфф-тов ВЕТА BETAXX(NX%]=0: BETAYXfNX%)=0 'краевые условия с FOR l%=NX% ТО 1 STEP -1 ' нулевыми потоками X2Y=X(I%, J%p2*Y(l%, J%l*DT SX=X( 1%, J%] *BP1DT+ADT+X2Y $Y=Y( i%, J%) +BDT*X( 1%, J%) -X2Y BETAXX( l%-1 ] =( SX-CXP*BETAXX( 1%) ] *GAMMAXX( 1%) BETAYXf l%-1 ] =( SY-CYP*BETAYX( ) *GAMMAYX( l%) NEXT ' 'прямой проход no X X(1,J%)=BETAXX(0)/(1-ALPHAXX(0|) 'нач. знач. для кр. усл. Y(1,J%)=BETAYX(0)/(1-ALPHAYX(0)) ' с нулевыми потоками FOR l%=1 ТО NX%-1 Х( 1%+Ъ = ALPHAXX( l%] *Х( 1%, J%J +ВЕТАХХ( 1% j Y( = ALPHAYXJ l%] *Y[ 1%, J%) +BETAYX[ l%] NEXT 1% NEXT J% FOR l%=1 TO NX% 'для каждого x выполняется цикл по у ' 'обратный проход для коэфф-тов ВЕТА BETAXY(NY%)=0: BETAYY(NY%) =0 'краевые условия с FOR J%=NY% ТО 1 STEP -1 ' нулевыми потоками BETAXY( J%-1] =( Х( 1%, J%J-CXP*BETAXY( ) *GAMMAXY( J%] BETAYY( J%-1) =( Y( 1%, J%] -CYP*BETAYY( J%)) *GAMMAYY( J%] NEXT J%
496 Приложение В 4340 4350 4360 4370 4380 4390 4400 4410 4420 4430 4440 4450 4460 4470 5000 5010 5020 5030 5040 5045 5050 5060 5070 5080 5090 5100 5110 5120 5130 5140 5160 5170 5180 5190 5200 5210 5220 5230 5240 1 'прямой проход по у X(l%, 1)=BETAXY(0|/( 1-ALPHAXY) 0)) 'нач. знач. для кр. усл. Y(l%,1)=BETAYY(0)/(1-ALPHAYY(0|| ' с нулевыми потоками FOR J%=1TO NY%-1 Х( l%, J%+1| = ALPHAXY! J%) *X( l%, J%) +BETAXY( J%) Y( ) = ALPHAYY! J%) *Y( l%, J%) +BETAYY( J%) ' 'проверка диапазона значений IF Y!l%,J%+1)>20 OR X(l%,J%+1)>20 THEN OVRFLOW%=-1 ELSE OVRFLOW%=0 IF Y(l%rJ%+1)<-1 OR X(I%,J%+1)<-1 THEN UNDRFLOW%=-1 ELSE UNDRFLOW%=0 IF (UNDRFLOW% OR OVRFLOW%) THEN RETURN NEXT J% NEXT l% RETURN '************************************************************************* 'Подпрограмма вывода вариантов продолжения расчета 'входные переменные: DT, Y(I%,J%) 'выходные переменные: ADT, BDT, BP1DT, CXP, CYZ, CYP, CYZ, DT 'глобальные переменные: A, ASKI(I%), В, Н, GRAPHICS^, NX%, NY%, PLACE%(I%, J%) 'локальные переменные: A%, BUF%, CH%, 1%, J%, TINT% ’ ************************************************************************* CLS LOCATE 1,26 PRINT "Варианты продолжения работы"; LOCATE 3,10: PRINT "1) Возобновление итераций"; LOCATE 5,10: PRINT "2) Вывод на данный экран концентрации Y"; LOCATE 7,10: PRINT "3) Изменение шага по времени"; LOCATE 9,10: PRINT "4) Повторение расчета с новыми параметрами"; LOCATE 11,10: PRINT "5) Выход из программы"; LOCATE 13,25: PRINT SPACE$(50) LOCATE 13,25: BEEP: INPUT "Введите номер выбранного варианта"; A% IF A%>=1 AND A%<=5 THEN GOTO 5200 ELSE GOTO 5160 IF A%<>1 THEN GOTO 5230 CLS: GOSUB 3000 RETURN 140 IF A%<>2 THEN GOTO 5410 CLS
Программы для проектов 497 5250 5260 5270 5280 5290 5300 5310 5320 5330 5340 5350 5360 5370 5380 5390 5400 5410 5420 5430 5440 5450 5460 5470 5480 5490 5500 5510 5520 6000 6010 6020 6030 6040 6050 6060 6070 6080 6090 6100 6110 6120 IF GRAPHICS% THEN DEF SEG=&HB800 ELSE DEF SEG=&HB000 'вывод Y FOR l%=1 TO NX% FOR J%=1 TO NY% CH%=5*Y(I%,J%): IF CH%>61 THEN CH%=61 IF CH%<0 THEN CH%=0 IF GRAPHICS% THEN GOTO 5320 TINT%=7: GOTO 5330 TINT%=((CH%+15)MOD 15) + 1 : IF TINT%=8 THEN _TINT%=1 BUF%=PLACE%( 1%, J%): CH%=ASKI%( CH%) POKE BUF%,CH% : POKE BUF%+1,TINT% NEXT J% NEXT 1% LOCATE 12+NX%/2+1,14 PRINT "Концентрация Y. Продолжение - клавиша <c>";. IF INKEY$o"c" THEN GOTO 5390 GOTO 5070 IF A%<>3 THEN GOTO 5500 LOCATE 17,10 PRINT USING "Текущий шаг по времени равен #.###"; DT LOCATE 18,10: INPUT "Задайте новое значение DT";DT: BDT=B*DT: ADT=A*DT: BP1DT=1-(B+1)*DT . CXP=-D1*DT/H~2: CXZ=1+2*D1*DT/H~2 CYP=-D2*DT/H~2: CYZ=1+2*D2*DT/H~2 GOSUB 2000 'вычисление коэффициентов прогонки CLS: GOSUB 3000: RETURN 140 IF A%<>4 THEN END RETURN 120 i ************************************************************************** 'Подпрограмма вывода экрана-заставки ' входные переменные: нет 'выходные переменные: ASKI%(I%), GRAPHICS%, MONO% ' глобальные переменные: нет 'локальные переменные: G$, М$, ROW% ' ************************************************************************* SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме Г LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; 7232—1650
498 Приложение В 6130 6140 6150 6160 6170 6180 6190 6200 6210 6220 6230 6240 6250 6260 6270 6280 6290 6300 6310 6320 6330 6340 6350 6360 6370 6380 6390 6400 6410 6420 6430 6440 6450 6460 6470 6480 6490 6500 6510 6520 6530 LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; LOCATE 5,10 'рисование рамки PRINT CHR$( 201)+STRING$( 59,205)+CHR$( 187); FOR ROW%=6 TO 19 LOCATE ROW%, 10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$(200)+STRING$(59,205)+CHR$(188); COLOR 15 'вывод заголовка программы и т.д. LOCATE 7,36: PRINT "ПРОЕКТ 7"; COLOR 7 LOCATE 10,30: PRINT "Двумерный брюсселятор" LOCATE 13,35: PRINT %*********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." LOCATE 19,13: ВЕЕР 'запрос конфигурации дисплея INPUT "Есть ли на вашем компьютере графический дисплей (y/n)";G$ IF LEFT$(G$,1)="y" OR LEFT$(G$, 1)="n" GOTO 6390 LOCATE 19,13: PRINT SPACE$(57): BEEP LOCATE 18,35: PRINT "Повторите...": GOTO 6340 IF LEFT$(G$,1)="y" GOTO 6420 GRAPHICS%=0: MONO%=-1 GOTO 6510 GRAPHICS%=-1 LOCATE 18,15: PRINT SPACE$(55) LOCATE 19,13: PRINT SPACE$(57) LOCATE 19,13: BEEP INPUT "Есть ли у вас еще отдельный дисплей для текста (у/п)";М$ IF LEFT$(M$,1)="y" OR LEFT$(M$,1)="n" GOTO 6490 'проверка ответа LOCATE 18,35: PRINT "Повторите...": GOTO 6440 IF LEFT$(M$,1)="y" THEN MONO%=-1 ELSE MONO%=0 ' 'заполнение массива кодами ASCII FOR l%=0 TO 9 'цифры 0-9 ASKI%(l%)=l%+48 NEXT 1%
Программы для проектов 499 6540 6550 6560 6570 6580 6590 6600 6610 6620 7000 7010 7020 7030 7040 7050 7060 7070 7080 7090 7100 7110 8000 8010 8020 8030 8040 8050 8060 8070 8080 8090 8100 8110 FOR 1%=10 ТО 35 'буквы A-Z А5К1%(1%)=1%+55 NEXT 1% FOR 1%=36 ТО 61 'буквы a-z ASKI%(I%)=I%+61 NEXT \% t RETURN г ************************************************************************* 'Подпрограмма переключения с текстового дисплея на графический ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: нет ' локальные переменные: нет '************************************************************************ DEF SEG=0 POKE &Н410, (РЕЕК(&Н410) AND &HCF) OR &Н10 SCREEN 1,0,0,0: SCREEN 0: WIDTH 80: LOCATE ,,1,6,7 RETURN ************************************************************************ Подпрограмма переключения с графического дисплея на текстовый входные переменные: нет выходные переменные: нет глобальные переменные: нет локальные переменные: нет ************************************************************************ DEF SEG=0 POKE &H410, (PEEK(&H410) OR &H30) SCREEN 0: WIDTH 80: LOCATE ,,1,12,13 RETURN 7232*
500 Приложение В В.8. ПРОЕКТ VIII В данной программе решается задача о двух электронах в поле двух центров, отвечающих молекуле Н2, вариационным методом Монте-Карло или методом интегрирования траекторий (PIMC) с пробной волновой функцией, определенной в (VIII.6), (VIII.8). В подпрограмме 1000 задаются расстояние между протонами, параметр р волновой функции и используемый метод расчета; здесь же решается уравнение (VIII.8) для определения параметра а волновой функции (строки 1220—1250). Основные вычисления проводятся в подпрограмме 3000: термализацион- ные шаги в цикле 3410—3440 и выборка данных в цикле 3660—4120. Шаги алгоритма Метрополиса для вариационного расчета выполняются в подпрограмме 5000, а шаги по времени в методе PIMC —в подпрограмме '9000. Оба этих метода используют подпрограммы 6000 (для нахождения локальной энергии (VIII.5) данной конфигурации), 7000 (для вычисле- ния волновой функции и различных расстояний) и 14000 (для генерации начальной конфигурации). В расчетах методом PIMC используются также подпрограммы 10000 (для вычисления вектора дрейфа (VIII. 14)) и 12000 (для генерации начального ансамбля). В обоих методах наблюда- емые величины, выбираемые через каждые FREQ% шагов (строка 3720), разбиваются на группы для оценки корреляции в энергии между отдель- ными проходами. В процессе расчета выводятся оценки для электронной собственной энергии и межмолекулярного потенциала (VIII. 1). (Отме- тим, .что последний потенциал измеряется относительно энергии двух бесконечно1 удаленных атомов водорода.) По желанию пользователя в подпрограмме 8000 вычисляется' й выводится на дисплей автокорреляци- онная функция энергии для 200 шагов. Типичный расчет по этой программе можно провести, задавая рас- стояние между протонами равным 0 (что отвечает описанию нейтрально- го атома гелия), параметр волновой функции ВЕТА=0,25 А-1, вариаци- онный метод расчета (а не метод PIMC), шаг в методе Метрополиса 0,40 А, 20 термализационных шагов и выбирая вычисление энергии (а не корреляционной функции) с использованием 10 групп по 5 испытаний в каждой с частотой выборки 6. Для проведения такого же расчета ме- тодом PIMC берутся все те же параметры и дополнительно задается размер ансамбля равный .10 и шаг по времени 0,01. Точность результа- тов, получаемых в подобных расчетах, можно повысить путем накопле- ния большего числа наблюдаемых величин для лучшей статистики и экс- траполяции на нулевой шаг по времени.
Программы для проектов 501 10 20 'Проект 8: Расчет молекулы Н2 методом Монте-Карло 21 'COMPUTATIONAL PHYSICS by Steven E. Koonin 22 'Copyright 1985, Addison-Wesley Publishing Company 30 '*********************************** 40 DIM ENSEMBLE(6,50) 50 DIM WEIGHT(50) 60 DIM CONFIG(6),CSAVE(6) 70 DIM DRIFT(6) 80 DIM ECORR(200) 90 HBM=7.6359: E2=14.409 100 ABOHR=HBM/E2 110 ' 120 GOSUB 15000 130 GOSUB 1000 140 GOSUB 2000 150 IF VARY%<>0 THEN GOSUB 3000 160 ' 170 GOTO 130 'память для ансамбля 'веса каждого члена ансамбля 'память для отдельных конфигураций 'вектор дрейфовой скорости 'энергии для корреляционной функции 'физические константы 'вывод экрана-заставки 'ввод физических параметров 'определение необходимых функций 'проведение вычислений 'переход к началу нового расчета 180 1ООО ' *****************************************”•**** !"*****************>******* 1010 'Подпрограмма ввод& Физических параметров 1020 'входные переменные: нет 1030 'выходные переменные: A, ALPHA, BETA, S, S2, VARY% 1040 'глобальные переменные: ABOHR 1050 'локальные переменные: AOLD 1060 ' ************************************************************************* 1070 CLS 1080 ' 1090 LOCATE 9,20 1100 PRINT USING "Текущее расстояние между протонами равно #♦.####"; S 1110 LOCATE 10,22: ВЕЕР 1120 INPUT "Задайте новре расстояние между протонами (<0 - выход)";$ ИЗО IF S<0 THEN STOP 1140 S2=S/2 'половина расстояния между протонами 1150 ' 1160 LOCATE 11,20 1170 PRINT USING "Текущий параметр beta волновой функции^*. ****"; BETA 1180 LOCATE 12,22: ВЕЕР 1190 INPUT "Задайте новый параметр beta волновой функции"; ВЕТА 1200 '
502 Приложение В 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2150 2160 2170 2180 2190 2200 2210 3000 ЗОЮ 3020 3030 3040 3050 3060 3070 3080 ALPHA=2*ABOHR 'параметр alpha AsABOHR: AOLD=0 'итерация для параметра А WHILE ABS(A-AOLD)>. 000001 AOLD=A: A=ABOHR/( 1+EXP(-S/AOLD)) WEND LOCATE 14,6: BEEP: PRINT "Введите 0 (новый расчет), INPUT "1 (вариационный метод) или 2 (метод PIMC)";VARY% RETURN * Ис***************************************************^*****************»»^* ' Подпрограмма определения необходимых функций ' входные переменные: нет 'выходные переменные: FNCHI, FNCHIP, FNCHIPP, FND2CHI, FNDIST, ' FNF, FNFP, FNFPP, FND2F 'глобальные переменные: A, ALPHA, ВЕТА ' локальные переменные: нет * ************************************************************************* DEF FNCHI(R)=EXP(-R/A) DEF FNCHIPf R) =- FNCHI( R) /А DEF FNCHIPP(R)=FNCHI(R)/AA2 DEF FND2CHI( R) =FNCHIPP( R) +2*FNCHIP[ R) /R t ' функция "электрон-ядро" 'ее первая производная 'ее вторая производная 'ее лапласиан DEF FNF( R) =EXP[ R/( ALPHA*! 1+BETA*R|)) 'функция "е-е" DEF FNFP( R) =FNF( R) /(ALPHA*! 1+BETA*R) *2) 'ее 1-я и 2-я производные DEF FNFPP( R) =FNFP[ R] ‘2/FNF( R)-2*BETA»FNF[ R)/ALPHA/J 1+BETAsR) ‘3 DEF t FND2F[ R) =FNFPP[ R| +2*FNFP( R) /R 'ее лапласиан DEF FNDIST( X, Y, Z) =SQR( X*2+Y*2+Z*2) 'длина вектора RETURN ************************************************************************** 'Подпрограмма' вычислений вариационным методом или методрм PIMC ' входные переменные: нет 'выходные переменные: DELTA, DT, HBMDT, NENSEM%, SQDT 'глобальные переменные: A, ABOHR, АССЕРТ%, BETA, CORR%, ECORR, ' EPSILON, Е2, FREQ%, НВМ, NGROUP%, S, SIZE%, VARY% 'локальные переменные: AVGE, GROUPE, GROUPE2, IGROUP%, ISTEP%, ' MORE%, NTHERM%, SIGE, SIGE1, SIGE2, SUMA, SUME, SUME2, SUMSIG, U
Программы для проектов 503 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 3330 3340 3350 3360 3370 3380 3390 3400 3410 3420 3430 3440 3450 3460 3470 3480 3490 CLS t IF VARY%=1 THEN GOTO 3290 LOCATE 8,10 PRINT USING "Текущий размер ансамбля равен ##";NENSEM% LOCATE ,12: BEEP INPUT "Задайте новый размер ансамбля (<=50, <=0 - выход)"; NENSEM% IF NENSEM%<=0 THEN RETURN IF NENSEM%>50 THEN NENSEM%=50 GOSUB 12000 'генерация начального ансамбля LOCATE ,10 PRINT USING "Текущий шаг по времени равен #.#####"; DT LOCATE ,12: ВЕЕР INPUT "Задайте новый шаг по времени (<=0 - начало подпрограммы)"; DT IF DT<=0 THEN GOTO 3090 HBMDT=HBM*DT: SQDT=SQR(HBMDT) 'полезные константы GOTO 3350 o t LOCATE 8,10: PRINT "Текущий шаг выборки PHI в алгоритме"; PRINT USING " Метрополиса равен #.####"; DELTA LOCATE ,12: BEEP INPUT "Задайте новый шаг алгоритма Метрополиса (<=0 - выход)"; DELTA IF DELTA<=0 THEN RETURN t LOCATE ,10 'термализация PRINT USING "Текущее число шагов термализации равно ###";NTHERM% LOCATE ,12: ВЕЕР INPUT "Задайте число термализационных шагов"; NTHERM% IF NTHERM%<=0 THEN GOTO 3460 IF VARY%=1 THEN GOSUB 14000 'генерация начальной конфигурации FOR ISTEP%=1 TO NTHERM% ' термалнзацнонные шаги IF VARY%=1 THEN GOSUB 5000 'один шаг по Метрополису IF VARY%=2 THEN GOSUB 9000 'один шаг по времени NEXT ISTEP% г GOSUB 13000 'задание параметров выборки I MORE%=NGROUP% 'число групп в расчете SUME=0: SUME2=0: SUMSIG=0 'обнуление сумм
504 Приложение В 3500 3510 3520 3530 3540 3550 3560 3570 3580 3590 3600 3610 3620 3630 3640 3650 3660 3670 3680 3690 3700 3710 3720 3730 3740 3750 3760 3770 3780 3790 3800 3810 3820 3830 3840 3850 3860 3870 3880 3890 3900 CLS ' печать заголовка LOCATE 9,10 IF VARY%=1 THEN GOTO 3570 PRINT USING "Расчет методом PIMC, шаг по времени=**. **##"; DT; PRINT USING " Размер ансамбля=##"; NENSEM% GOTO 3580 PRINT USING "Вариационный расчет, шаг Метрополиса^**. ***#"; DELTA LOCATE 11,10: PRINT USING "Расстояние между протонами=**. ****"; S LOCATE 12,10 PRINT USING "Параметры волновой функции: beta=**. ****"; BETA LOCATE 13,41: PRINT USING "a=**. ####"; A LOCATE 14,10: PRINT USING "Частота выборки=*#**"; FREQ% r IF VARY%=1 THEN SUMA=0 'обнуление счетчика принятых шагов FOR IGROUP%zNGROUP%-MORE%+1 TO NGROUP% 'цикл по группам GROUPEzO: GROUPEZzO: ACCEPT%z0 обнуление групповых сумм FOR ISTEP%z1 TO FREQ%»SIZE% цикл по шагам IF INKEY$z"e" THEN GOTO 3090 проверка на прерывание IF VARY%z1 THEN GOSUB 5000 один шаг по Метрополису IF VARY%z2 THEN GOSUB 9000 один шаг по времени IF ISTEP% MOD FREQ%<>0 THEN GOTO 3820 ' иногда замеряется IF VARY%=1 THEN GOSUB 6000 ' энергия; расчет epsilon GROUPEzGROUPE+EPSILON 'добавление в групповые суммы GROUPE2zGROUPE2+EPSILONA2 LOCATE 15,1 'вывод данного испытания PRINT USING "Испытание ** из ## "; ISTEP%/FREQ%, SIZE% LOCATE 15,20 PRINT USING "в группе *** E=+***. ****"; IGROUP%, EPSILON NEXT ISTEP% SUMEzSUME+GROUPE 'добавление в полные суммы SUME2zSUME2+GROUPE2 IF VARY%=1 THEN SUMA=SUMA+ACCEPT% GROUPE=GROUPE/SIZE% ' групповое среднее GROUPE2=GROl)PE2/SIZE%-GROUPE*2 IF GROUPE2<0 THEN GROUPE2=0 SIGE=SQR(GROUPE2/SIZE%) 'групповое станд. отклонение
Программы для проектов 505 3910 3920 3930 3940 3950 3960 3970 3980 3990 4000 4010 4020 4030 4040 4050 4060 4070 4080 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230 5000 5010 5020 5030 5040 5050 5060 5070 SUMSIG=SUMSIG+GROUPE2/SIZE% 'добавление в суммы дисперсий г LOCATE 16,1 'вывод текущих суммарных величин PRINT USING "Группа ### из ###"; IGROUP%, NGROUP% Г LOCATE 16,19: PRINT "Собственное значение="; PRINT USING "+###.#### +- ##.####"; GROUPE, SIGE г AVGE=SUME/[ IGROUP%*SIZE%) SIGE1=SQR( (SUME2/J IGROUP%*SIZE%) - AVGE~2) /IGROUP%/SIZE%) SIGE2=SQR( SUMSIG/IGROUP%~2) IF $>.01 THEN U=AVGE+E2/S+E2/ABOHR ELSE U=0 'полный потен- ' ' циал молекулы LOCATE 17,1 PRINT USING "Общее среднее E=+###.#### +- ##.####"; AVGE, SIGE1; PRINT USING " +- ##.#### U=+##. ###*"; SIGE2,U i IF VARY%<>1 THEN GOTO 4110 LOCATE 17,65 PRINT USING "Принятие=#. ####"; SUMA/(IGROUP%*SIZE%*FREQ%) IF CORR% THEN ECORR(IGROUP%)=EPSILON 'если корреляции, NEXT IGROUP% ' то запоминание E r IF NOT CORR% THEN GOTO 4180 GOSUB 8000 'расчет корреляционной функции GOTO 3090 'возврат на начало подпрограммы LOCATE ,10: ВЕЕР 'запрос о дополнительных группах INPUT; "Сколько еще добавить групп (0 - начало подпрограммы)"; MORE% LOCATE ,10: PRINT SPACE$(65) NGROUP%=NGROUP%+MORE% IF MORE%=0 THEN GOTO 3090 ELSE GOTO 3660 'новый расчет или ' ' продолжение 'Подпрограмма расчета шага методом Метрополиса ' входные переменные: CONFIG ' выходные переменные: CONFIG 'глобальные переменные: АССЕРТ%, DELTA, PHI, W 'локальные переменные: CSAVE, 1%, WTRY FOR 1%=1 ТО 6 1 о5()
506 Приложение В 5080 CSAVE(I%)=CONFIG(I%) 'сохранение текущей конфигурации 5090 CONFIG! 1%) =CONFIG( 1%) + DELTA*! RND-. 5) ' генерация пробной 5100 NEXT \% ' конфигурации 5110 r 5120 GOSUB 7000 'вычисление пробной PHI 5130 WTRY=PHP2 5140 ' 'при слишком малых пробных PHI 5150 IF WTRY<W*RND THEN GOTO 5200' шаг не принимается 5160 W=WTRY ' изменение веса 5170 АССЕРТ%=АССЕРТ%+1 'увеличение счетчика принятых шагов 5180 GOTO 5240 5190 г 5200 FOR 1%=1 ТО 6 ' восстанавление старой конфигурации 5210 CONFIG! I%)=CSAVE(I%) 5220 NEXT 1% 5230 г 5240 RETURN 5250 9 6000 6010 'Подпрограмма вычисления энергии для заданной конфигурации 6020 ' входные переменные: CONFIG 6030 ' выходные переменные: EPSILON 6040 'глобальные переменные: CHI1L,CHI1RrCHI2LrCHI2R,E2rF, HBMrR1Lr 6050 ' R1Rr R12, R2L, R2R, S, XI, X2, Y1, Y2, Z1, Z2 6060 'локальные переменные: CROSS, R1LDOTR12, R1RDOTR12, R2LDOTR12, 6070 ' R2RDOTR12, SR12Z, TEMP, TPOP, VPOP 6080 1 ************************************************************************* 6090 GOSUB 7000 'вычисление PHI и расстояний 6100 R1DOTR12=X1*(X1-X2)+Y1*(Y1-Y2)+Z1*(Z1-Z2) 'вычисление полезных 6110 SR12Z=S*(Z1-Z2) ' произведений 6120 R1LDOTR12=R1DOTR12+SR12Z/2 6130 R1RDOTR12=R1DOTR12-SR12Z/2 6140 R2LDOTR12=R1LDOTR12-R12^2 6150 R2RDOTR12=R1RDOTR12-R12^2 6160 ' 'кинетическая энергия 6170 TPOP=2*FND2F(R12)/F 'вклад от корреляции электронов 6180 TEMP=FND2CHI(R1R)+FND2CHI(R1L) 'вклады от отдельных электронов 6190 ТРОР=ТРОР+ТЕМР/( CHI1R+CHI1L) 6200 TEMP=FND2CHI( R2R) +FND2CHI( R2L) 6210 ТРОР=ТРОР+ТЕМР/( CHI2R+CHI2L) 6220 TEMP=FNCHIP(R1L)*R1LDOTR12/R1L 'перекрестные члены
Программы для проектов 507 6230 CROSS=(TEMP+FNCHIP| R1R| «R1RDOTR12/R1RJ /(CHHL+CHHR) 6240 TEMP=-FNCHIP( R2R] *R2RDOTR12/R2R 6250 TEMP=TEMP-FNCHIP( R2L] *R2LDOTR12/R2L 6260 CROSS=CROSS+TEMP/( CHI2L+CHI2R] 6270 TPOP=TPOP+2*FNFP( R12] /F*CROSS/R12 6280 TPOP=-.5*HBM*TPOP 'окончательные множители 6290 f 6300 VPOP=-E2*(1/R1L+1/R1R+1/R2L+1/R2R-1/R12] 'потенциальная энергия 6310 9 6320 6330 6340 7000 EPSILON=TPOP+VPOP ' полная энергия RETURN 9 9 4с4с4с4с4с4с4с4с4с4с4с4сзк4с4с4с4с4с4с4с4с4с4с4с4с4с4с4сзк4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4с4сфз|сфф4с4с4с 7010 ' Подпрограмма вычисления PHI и расстояний для данной конфигурации 7020 ' входные переменные: CONFIG 7030 'выходные переменные: CHI1L, CHUR, CHI2L, CHI2R, F, PHI, R1L, R1R, 7040 ' R12, R2L, R2R, XI, Х2, Y1, Y2, Z1, Z2 7050 ' глобальные переменные: S2 7060 'локальные переменные: нет 7070 'фЯсффф******************************************************************** 7080 X1=CONFIG( 1): Y1=CONFIG(2|: Z1=CONFIG(3] 'координаты электронов 7090 X2=CONFIG( 4): Y2=CONFIG( 5): Z2=CONFIG(6] 7100 R1L=FNDIST(X1,Y1,Z1+S2] 'расстояния между электронами 7110 R1R=FNDIST(X1, Y1,Z1-S2) ' и ядрами 7120 R2L=FNDIST( Х2, Y2, Z2+S2) 7130 R2R=FNDIST( Х2, Y2, Z2-S2] 7140 R12=FNDIST(X1-X2,Y1-Y2,Z1-Z2) 'межэлектронное расстояние 7150 F=FNF(R12) 'функция "электрон-электрон" 7160 CHI1R=FNCHI(R1R|: CHI1L=FNCHI(R1L] 'функции "электрон-ядро" 7170 CHI2R=FNCHI( R2R): CHI2L=FNCHI( R2L] 7180 PHl=(CHHR+CHHL] *( CHI2R+CHI2L) *F ' полная волновая функция 7190 RETURN 7200 i 8000 8010 ' Подпрограмма расчета и печати автокорреляционной функции энергии 8020 ' входные переменные: ECORR 8030 ' выходные переменные: нет 8040 ' глобальные переменные: нет 8050 'локальные переменные: CORR, \%, К%, SUMEI, SUMEIK, SUME2I, 8055 ' SUME2IK, SUMEIEK 8060 'яс************************************************************************ 33
508 Приложение В 8070 8080 8090 8100 CLS 'печать заголовка LOCATE 1,23: PRINT "Автокорреляционная функция энергии"; Г FOR К%=0 ТО 40 'цикл по интервалу 8110 8120 8130 8140 8150 8160 8170 SUMEI=0: SUMEIK=0 'обнуление сумм SUME2l=0: SUME2IK=0: SUMEIEK=0 FOR 1%=1 ТО 200-К% 'вычисление сумм SUMEI=SUMEI+ECORR( l%) SUMEIK=SUMEIK+ECORR( 1%+К%) SUME2I=SUME2I+ECORR( l%) ж2 SUME2IK=SUME2IK+ECORR| 1%+К%) *2 8180 8190 8200 SUMEIEK=SUMEIEK+ECORR( \%] *ECORR( 1%+К%) NEXT l% CORR=(200-K%)*SUMEIEK-SUMEI*SUMEIK 'вычисление корреляции 8210 CORR=CORR/SQR( (200-К%) *SUME2I-SUMEP 2) 8220 8230 CORR=CORR/SQR((200-K%)*SUME2IK-SUMEI»C2) г 8240 IF К%<20 THEN LOCATE К%+2,1 ELSE LOCATE К%-18,40 'вывод 8250 8260 8270 PRINT USING "k=## корреляция=+##. ####"; K%, CORR ' результатов NEXT К% Г 8280 LOCATE 23,22: ВЕЕР 'приглашение с ожиданием 8290 8300 8310 8320 9000 9010 9020 9030 PRINT "Для продолжения нажмите любую клавишу"; IF INKEY$="" THEN GOTO 8300 RETURN t 9 ************************************************************************* 'Подпрограмма передвижения ансамбля на один шаг по времени 'входные переменные: ENSEMBLE, WEIGHT ' выходные переменные: EPSILON 9040 9050 9060 9070 'глобальные переменные: CONFIG, DRIFT, DT, ETA, SQDT 'локальные переменные: EBAR, IENSEM%, K%, NORM, WBAR ************************************************************************** EBAR=0: WBAR=0 'обнуление E и весовой суммы 9080 9090 FOR IENSEM%=1 TO NENSEM% 'цикл по ансамблю FOR K%=1 TO 6 'задание конфигурации 9100 9110 9120 CONFIG( K%) =ENSEMBLE( K%, IENSEM%) NEXT K% GOSUB 10000 'вычисление дрейфа 9130 FOR K%=1 TO 6 'перемещение каждой координаты 9140 GOSUB 11000 'получение гауссова случайн. числа
Программы для проектов 509 9150 CONFIG! К%) =CONFIG( К%) +DRIFT( К%) +ETA*SQDT 9160 NEXT К% 9170 9 9180 GOSUB 6000 'вычисление новой энергии 9190 ' ' изменение 9200 WEIGHT! IENSEM%) =WEIGHT( IENSEM%) »EXP( -EPSILON*DT) ' веса 9210 EBAR=EBAR+WEIGHT!IENSEM%)*EPSILON 'вклад в энергию 9220 WBAR=WBAR+WEIGHT! IENSEM%) 9230 t 9240 FOR K%=1 TO 6 'запоминание новой конфигурации 9250 ENSEMBLE! K%, IENSEM%) =CONFIG( K%) 9260 NEXT K% 9270 NEXT IENSEM% 9280 t 9290 EPSILON=EBAR/WBAR 'взвешенная средняя энергия 9300 9310 NORM=NENSEM%/WBAR ' перенормировка весов 9320 FOR IENSEM%=1 TO NENSEM% 9330 WEIGHT! IENSEM%) =NORM*WEIGHT( IENSEM%) 9340 NEXT IENSEM% 9350 RETURN 9360 9 10000 '^♦♦♦♦^♦♦♦♦♦♦♦******************************************4c*************** 10010 'Подпрограмма вычисления вектора дрейфа 10020 ' входные переменные: CONFIG 10030 ' выходные переменные: DRIFT 10040 'глобальные переменные: CHI1L, CHUR, CHI2L, CHI2R, F, HBMDT, R1L, 10050 ' R1R, R12, R2L, R2R, XI, Х2, Y1, Y2, Z1, Z2 10060 'локальные переменные: FACTA, FACTB, FACTE 10070 '************************************************************************ 10080 GOSUB 7000 'вычисление пробной функции 10090 ' ' полезные множители 10100 FACTA=HBMDT»( FNCHIP( R1L) /R1L+FNCHIP( R1R) /R1R) /(CHI1L+CH11R) 10110 FACTB=HBMDT*( FNCHIPf R1L) /R1L-FNCHIP( R1R) /R1R) /(CHI1L+CHI1R) 10120 FACTE=HBMDT*FNFP( R12) /F/R12 10130 9 10140 DRIFT( 1)=FACTA*X1+FACTE*(X1-X2) 'дрейф электрона 1 10150 DRIFT( 2) =FACTA*Y1+FACTE*( Y1-Y2) 10160 DRIFT( 3) =FACTA*Z1+FACTB*S2+FACTE*( Z1-Z2) 10170 ' ' полезные множители 10180 FACTA=HBMDT»( FNCHIPf R2L) /R2L+FNCHIP( R2R) /R2R) /(CHI2L+CHI2R)
510 Приложение В 10190 10200 10210 10220 10230 10240 10250 10260 11000 11010 11020 11030 11040 11050 11060 11070 11080 11090 11100 11110 11120 11130 12000 12010 12020 12030 12040 12050 12060 12070 12080 12090 12100 12110 12120 12130 12140 12150 12160 12170 12180 FACTB=HBMDT*( FNCHIP( R2L] /R2L-FNCHIP( R2R] /R2R] /(CHI2L+CHI2R] г DRIFT(4|=FACTA*X2-FACTE*(X1-X2| 'дрейф электрона 2 DRIFT! 5) = F ACT A*Y2-FACTE*| Y1-Y2) DRIFT! 6) =FACTA*Z2+FACTB*S2-FACTE*(Z1-Z2] r RETURN r '************************************************************************ 'Подпрограмма генерации гауссова случайного числа ' входные переменные: нет ' выходные переменные: ' глобальные переменные: 'локальные переменные: ETA нет IG% ЕТА=0 'сумма 12 равномерно распределенных FOR IG%=1 ТО 12 ETA=ETA+RND ' случайных чисел NEXT IG% ETA=ETA-6 RETURN 'вычитание 6 ************************************************************************ Подпрограмма генерации ансамбля в момент времени 1=0 входные переменные: нет выходные переменные: глобальные переменные: ENSEMBLE, WEIGHT A, CONFIG, NENSEM%, локальные переменные: DELTA, IENSEM%, ISTEP%, K% ************************************************************************ DELTA=1.5*A GOSUB 14000 9 'шаг по Метрополису для РНГ2 'генерация начальной конфигурации FOR ISTEP%=1 TO 20 GOSUB 5000 NEXT ISTEP% 'проведение 20 шагов термализации 'шаг по Метрополису FOR ISTEP%=1 TO 10*NEN$EM% 'теперь генерируется ансамбль GOSUB 5000 'шаг по Метрополису IF ISTEP% MOD ЮоО IENSEM%=ISTEP%/10 FOR К%=1 ТО 6 THEN GOTO 12210 'через 10 конфигураций ' запоминание конфигурации
Программы для проектов 511 12190 12200 12210 12220 12230 12240 ENSEMBLE( К%, IENSEM%] =CONFIG( К%] NEXT К% NEXT ISTEP% Г FOR IENSEM%=1 TO NENSEM% 'задание всех весов равными 1 WEIGHT! IENSEM%)=1 12250 12260 12270 13000 13010 13020 13030 13040 NEXT IENSEM% RETURN F ************************************************************************* 'Подпрограмма ввода параметров выборки ' входные переменные: нет 'выходные переменные: CORR%, FREQ%, NGROUP%, SIZE% ' глобальные переменные: нет 13050 13060 13070 13080 13090 13100 13110 13120 13130 ' локальные переменные: нет 'Хе*********************************************************************** LOCATE ,10: ВЕЕР INPUT "Для вычисления энергии введите 0, корреляции - 1";CORR% IF CORR%=0 THEN GOTO 13140 CORR%=-1 'установка флага корреляции=ТИиЕ FREQ%=1: NGROUP%=200: SIZE%=1 'параметры выборки для GOTO 13270 ' корреляции i 13140 LOCATE ,10 13150 13160 13170 13180 13190 13200 13210 13220 13230 13240 13250 13260 13270 13280 14000 14010 14020 PRINT USING "Текущее число групп равно ###";NGROUP% LOCATE ,12: BEEP 'ввод параметров выборки варианта INPUT "Задайте новое число групп"; NGROUP% LOCATE ,10 PRINT USING "Текущее число испытаний в каждой группе ###";SIZE% LOCATE ,12: ВЕЕР INPUT "Задайте новое число испытаний в каждой группе"; SIZE% LOCATE ,10 PRINT USING "Текущая частота выборки равна ###";FREQ% LOCATE ,12: ВЕЕР INPUT "Введите новую частоту выборки"; FREQ% 1 RETURN F ************************************************************************* 'Подпрограмма генерации начальной конфигурации ' входные переменные: нет
512 Приложение В 14030 14040 14050 14060 14070 14080 14090 14100 14110 14120 14130 14140 14150 14160 15000 15010 15020 15030 15040 15050 15060 15070 15080 15090 15100 15110 15120 15130 15140 15150 15160 15170 15180 15190 15200 15210 15220 15230 15240 15250 15260 ’ выходные переменные: CONFIG, W 'глобальные переменные: A, S2, PHI 'локальные переменные: 1% '************************************************************************ FOR 1%=1 ТО 6 CONFIG) 1%| =( RND-. 5) *А NEXT l% CONFIG) 3) =CONFIG( 3) +S2 CONFIG) 6) =CONFIG( 6| -S2 г 'помещение электронов вблизи ' начала координат 'сдвиг электрона 1 вправо 'сдвиг электрона 2 влево GOSUB 7000 'вычисление PHI W=PHI»PHI RETURN 'инициализация веса г************************************************************************ 'Подпрограмма вывода экрана-заставки ' входные переменные: нет ' выходные переменные: нет ' глобальные переменные: нет ' локальные переменные: ROW% ************************************************************************* SCREEN 0: CLS: KEY OFF 'программа стартует в текстовом режиме I LOCATE 1,30: COLOR 15 'вывод на экран названия книги PRINT "COMPUTATIONAL PHYSICS"; LOCATE 2,39: COLOR 7 PRINT "by"; LOCATE 3,32: PRINT "Steven E. Koonin"; LOCATE 4,15 PRINT "Copyright 1985, Addison-Wesley Publishing Company"; LOCATE 5,10 'рисование рамки PRINT CHR$( 201)+STRING$( 59,205)+CHR$( 187); FOR ROW%=6 TO 19 LOCATE ROW%,10: PRINT CHR$(186); LOCATE ROW%,70: PRINT CHR$(186); NEXT ROW% LOCATE 20,10 PRINT CHR$( 200)+STRING$( 59,205)+CHR$( 188); i COLOR 15 'вывод заголовка программы и т.д.
Программы для проектов 513 15270 15280 15290 15300 15310 15320 15330 15340 15350 15360 15370 15380 15390 15400 15410 15420 15430 15440 15450 15460 15470 15480 LOCATE 7,36: PRINT "ПРОЕКТ 8"; COLOR 7 LOCATE 10,21: PRINT "Расчет молекулы H2 методом Монте-Карло"; LOCATE 13,35: PRINT "**********" LOCATE 15,20: PRINT "Для прерывания счета нажмите клавишу <е>." LOCATE 16,20: PRINT "Выход при ожидании ввода - <ctrl-break>." LOCATE 21,12 PRINT "Данная программа находит потенциал Борна-Оппенгеймера для"; LOCATE 22,12 PRINT "молекулы Н2. Задача о двух электронах в поле двух центров"; LOCATE 23,12 PRINT "решается методами Монте-Карло: вариационным и интеграла по"; LOCATE 24,12 PRINT "траекториям. Все длины даны в ангстремах, а энергии в эВ."; LOCATE 25,23,1: ВЕЕР PRINT "Для продолжения нажмите клавишу <с>"; IF INKEY$o"c" GOTO 15440 LOCATE ,,0 RETURN
ЛИТЕРАТУРА [АЬ64] Handbook of Mathematical Functions, eds. M. Abramowitz, I.A. Stegun, Dover: New York, 1964. [Ab78] Abraham R., Marsden J.E., Foundations of Mechanics, Second Edition, Benjamin-Cummings Publishing Corp.: Reading, 1978, chap. 8. [Ac70] Acton F.S., Numerical Methods that Work, Harper and Row: New York, 1970. [Ad84] Adler S.L., Piran T., Rev. Mod. Phys., 56, 1 (1984). [Ar68] Arnold V.I., Avez A., Ergodic Problems in Classical Mechanics, Benjamin Publishing Corp.: New York, 1968. [Ba64] Baker A, Phys. Rev., 134, B240 (1964). [Be68] Bethe H.A., Jackiw R.W., Intermediate Quantum Mechanics, Benjamin Publishing Corp.: New York, 1968. [Be69] Bevington P.R., Data Reduction and Error Analysis for the Physical Sciences, McGraw-Hill: New York, 1969. [Bo74] Bonham R.A., Fink M., Hign Energy Electron Scattering, Van Nostrand-Reinhold: New York, 1974. [Bo76] Boa J. A., Cohen D.S., SIAM J. AppL Math., 30, 123 (1976). [Bu81] Burden R.L., Faires J.D., Reynolds A.C., Numerical Analysis, Second Edition, Prindle, Weber and Schmidt: Boston, 1981. [Br68] Brink D.M., Satchler G.R., Angular Momentum, Second edition, Clarendon Press: Oxford, 1968. [Ca80] Cavedon J.M., Thesis, University Paris-Sud, 1980. [Ce79] Ceperley D.M., Kalos M.H. In: Monte Carlo Methods in Sta- tistical Physics, ed. K- Binder, Springer-Verlag: New York, Berlin, 1979. [Ce80] Ceperley D.M., Alder B.J., Phys. Rev. Lett., 45, 566 (1980). [Ch57] Chandrasekhar S., An Introduction to the Study of Stellar Structure, Dover: New York, 1957. [Ch84] Chandrasekhar S., Rev. Mod. Phys., 56, 137 (1984). [Ch84a] Chin S.A., Negele J.W., Koonin S.E., Ann. Phys., 157, 140 (1984). [F178] Flocard H., Koonin S.E., Weiss M.S., Phys. Rev. C, 17, 1682 (1978). [Fo63] Fosdick L.D. In: Methods in Computational Physics, vol. 1, ed. B. Alder et al., Academic Press: New York, 1963, p. 245. [Fo66] DeForest T., Jr., Walecka J.D., Adv. Phys., 15, 1 (1966). [Fr73] Friar J.L., Negele J.W., Nucl. Phys., A212, 93 (1973). [Fr75] Friar J.L., Negele J.W., Adv. Nucl. Phys., 8, 219 (1975). [Fr77] Frois B. et al., Phys. Rev. Lett., 38, 152 (1977).
Литература 515 [Go49] Gombas P., Die Statische Theorie des Atoms, Springer- Vienna, 1949. [Go67] Goldberg A., Schey H.M., Schwartz J.L., Am. J. Phys., 35, 177 (1967). [Go80] Goldstein H., Classical Mechanics, Second Edition, Addison-Wes- ley Publishing Company: Reading, 1980. [Ha64] Hammersley J.M., Handscomb D.C., The Monte Carlo Method, Methuen: London, 1964. [He50] Herzberg G., Spectra of Diatomic Molecules, D. Van Nostrand Company, Inc.: New York, 1950. [He64] Henon M., Heiles C., Astron. J., 69, 73 (1964). [He80] Helleman R.H.G. In: Fundamental Problems in Statistical Mechanics, vol. 5, ed. E.G.D. Cohen, North Holland Publishing: Amsterdam, 1980, pp. 165—233. [He82] Henon M., Physica, 5D, 412 (1982). [Ho57] Hofstadter R., Ann. Rev. Nuc. Sci., 7, 231 (1957). [Hu63] Huang K., Statistical Mechanics, John Wiley and Sons: New York, 1963. [Ka79] Кап K.K., Griffin J. J., Lichtner P.C., Dworzecka M., Nucl. Phys., A332, 109 (1979). [Ka81] Kalos M.H., Lee M.A., Whitlock P.A., Chester G. V., Phys. Rev., B, 24, 115 (1981). [Ka85] Kalos M.H., Whitlock P.A., The Basics of Monte C^rlo Methods, J. Wiley and Sons: New York, в печати. [Ke78] Kernighan B.W., Plauger P.J., The Elements of Programming Style, Second Edition, McGraw-Hill Book Company: New York, 1978. [Ki71] Keffer L.J., At. Data, 2, 293 (1971). [Kn69] Knuth D., The Art of Computer Programming, vol. 2: Seminu- merical Algorithms, Addison-Wesley Publishing Company: Reading, 1969. [La59] Landau L.D., Lifshitz E.M., Course of Theoretical Physics, vol. 6, Fluid Mechanics, Pergamon Press: Oxford, 1959. [Li65] Lipkin H., Meshkov M., Glick A. J., Nucl. Phys., 62, 188 (1965). [Mc73] McCoy B., Wu T.T., The Two-Dimensional Ising Model, Harvard University Press: Cambridge, 1973. [Mc80] McGrory J.B., Wildenthal B.H., Ann. Rev. Nuc. Sci., 30, 383 (1980). [Me53] Metropolis N., Rosenbluth A., Rosenbluth M., Teller A., Teller E., J. Chem. Phys., 21, 1087 (1953). [Me68] Messiah A., Quantum Mechanics, J. Wiley & Sons, Inc.: New York, 1968.
516 Л итератора [Ne66] Newton R.G., Scattering Theory of Waves and Particles, McGraw-Hill Book Co.: New York, 1966. [Ni77] Nicolis G., Prigogine I., Self-organization in Nonequilibrium Systems, J. Wiley and Sons: New York, 1977. [Re82] Reynolds P.J., Ceperley D.M., Alder B.J., Lester W.A., Jr., J. Chem. Phys., 77, 5593 (1982). [Ri67] Richtmeyer R.D., Morton K.W., Difference Methods for Initial- value Problems, Second Edition, Interscience: New York, 1967. [Ri80] Rice S.A. In: Quantum Dynamics of Molecules, ed. R.G. Wolley, Plenum Publishing Corp.: New York, 1980, pp. 257—356. [Ro76] Roache P.J., Computational Fluid Dynamics, Hermosa: Albu- querque, 1976. [Ru63] Rutishauser H., Comm, of the ACM, 6, 67, Algorithm 150 (February, 1963). [Sh80] Shankar R., Phys. Rev. Lett., 45, 1088 (1980). [Sh83] Shapiro S.L., Teukolsky S.A., Black Holes, White Dwarfs, and Neutron Stars, J. Wiley & Sons, Inc.: New York, 1983, chap. 3. [Sh84] Shoup T.E., Applied Numerical Methods for the Microcomputer, Prentice-Hall, Inc.: Englewood Cliffs, 1984. [Si74] Sick I., Nucl. Phys., A218, 509 (1974). [Va62] Varga R., Matrix Iterative Analysis, Prentice-Hall: Englewood Cliffs, 1962. [Wa66] Wachspress E.L., Iterative Solution of Elliptic Systems and Applications to the Neutron Diffusion Equations of Reactor Physics, Prentice-Hall: Englewood Cliffs, 1966. [Wa67] Waech T.G., Bernstein R.B., J. Chem. Phys., 46, 4905 (1967). [Wa73] Wallace S.J., Ann. Phys., 78, 190 (1973); Phys. Rev., D8, 1846 (1973); Phys. Rev., D9, 406 (1974). [We71] Weast R.C., Handbook of Chemistry and Physics, 52nd edition, The Chemical Rubber Company: Cleveland, 1971. [We80] Weissbluth M., Atoms and Molecules, Academic Press: New York, 1980. [Wh77] Whitehead R.R., Watt A., Cole B.J., Morrison I., Adv. Nucl. Phys., 9, 123 (1977). [Wi74] Winfree A.T., Sci. Amer., 220, 82 (June, 1974). [Wu62] Wu T.-Y., Ohmura T., Quantum Theory of Scattering, Prentice- Hall: Englewood Cliffs, 1962. [Ye54] Yennie D.R., Ravenhall D.G., Wilson D.N., Phys. Rev., 95, 500 (1954).
ОГЛАВЛЕНИЕ ПРЕДИСЛОВИЕ 5 КАК ПОЛЬЗОВАТЬСЯ ЭТОЙ КНИГОЙ 8 ГЛАВА 1. Основные математические операции 10 1.1. Численное дифференцирование И 1.2. Численное интегрирование 15 1.3. Нахождение корней 21 1.4. Квазиклассическое квантование колебаний в молекуле 24 ПРОЕКТ I: Рассеяние частиц в центральном поле 31 ГЛАВА 2. Обыкновенные дифференциальные уравнения 37 2.1. Простые методы 38 2.2. Многошаговые и неявные методы 41 2.3. Методы Рунге —Кутты 44 2.4. Устойчивость 47 2.5. Порядок и хаос в двумерном движении 49 ПРОЕКТ II: Структура белых карликов 59 ГЛАВА 3. Краевые задачи и задачи на собственные значения 68 3.1. Алгоритм Нумерова 69 3.2. Прямое интегрирование краевых задач 70 3.3. Решение краевых задач методом функции Грина 75 3.4. Собственные значения волнового уравнения 78 3.5. Стандартные решения одномерного уравнения Шрёдингера 81 ПРОЕКТ III: Стуктура атома в приближении Хартри—Фока 87 ГЛАВА 4. Специальные функции и квадратурная формула Гаусса 102 4.1. Специальные функции 102 4.2. Квадратурная формула Гаусса 109 4.3. Приближение Борна и приближение эйконала в квантовой теории рассеяния 114 ПРОЕКТ IV: Решение задачи квантового рассеяния в виде парциальных волн 121 ГЛАВА 5. Действия с матрицами 127 5.1. Обращение матрицы 127 5.2. Собственные значения трехдиагональной матрицы 131 5.3. Приведение матрицы к трехдиагональному виду 134 5.4. Распределение плотности электрического заряда в атомном ядре 140 ПРОЕКТ V: Схематическая оболочечная модель 154
518 Оглавление ГЛАВА 6. Эллиптические уравнения 167 6.1. Дискретизация уравнений и вариационный принцип 170 6.2. Итерационные методы решения краевых задач 173 6.3. Еще раз о дискретизации 178 6-4. Двумерные эллиптические уравнения 180 ПРОЕКТ VI: Двумерная стационарная гидродинамика 182 ГЛАВА 7. Параболические уравнения !94 7.1. Простейший способ дискретизации и численная неустойчивость 195 7.2. Неявные схемы и обращения трехдиагональных матриц 200 7.3. Уравнения диффузии и двумерные краевые задачи 205 7.4. Итерационные методы решения задач на собственные значения 207 7.5. Нестационарное уравнение Шрёдингера 213 ПРОЕКТ VII: Самоорганизация в химических реакциях 216 ГЛАВА 8. Методы Монте-Карло 224 8.1. Основы метода Монте-Карло 225 8.2. Генерация случайных величин с заданным распределением 231 8.3. Алгоритм Метрополиса и др. 237 8.4. Двумерная модель Изинга 242 ПРОЕКТ VIII: Квантовый метод Монте-Карло для молекулы Н2 249 ПРИЛОЖЕНИЕ А. Краткий обзор языка программирования Бейсик 261 ПРИЛОЖЕНИЕ Б. Программы для примеров 271 Б.1. Пример 1 273 Б.2. Пример 2 281 Б.З. Пример 3 298 Б.4. Пример 4 318 Б.5. Пример 5 336 Б. 6. Пример 6 358 Б.7. Пример 7 378 Б.8. Пример 8 403 ПРИЛОЖЕНИЕ В. Программы для проектов 413 В.1. Проект I 413 В.2. Проект II 421 В.З. Проект III 431 В.4. Проект IV 446 В.5. Проект V 465 В.6. Проект VI 475 В.7. Проект VII 491 В.8. Проект VIII 500 ЛИТЕРАТУРА 513
Издательство «Мир» готовит к выпуску в 1993 г. книгу Рамм А. Многомерные обратные задачи рассеяния. Пер. с англ., 23 л., 40 р. Книга известного американского специалиста посвящена изложению методов решения многомерных обратных задач математической физики. Она может служить также введением в теорию обратных задач, в ней сформулирован широкий спектр обратных задач для дифференциальных уравнений и проведено их замкнутое исследование. Книга удачно до- полняет вышедшие в нашей стране монографии по этому предмету, пере- секаясь с ними лишь незначительно. В ней проводится новый метод ис- следования многомерных обратных задач, развитый автором и основан- ный на новом понятии: полноте множества произведений решений диф- ференциальных уравнений с частными производными. Излагаются также связанные с ними проблемы обработки сигналов. Дана оценка устойчи- вости трехмерной обратной задачи рассеяния на потенциале по данным при фиксированной энергии. Для математиков, физиков, инженеров, а также аспирантов и сту- дентов старших курсов, интересующихся теорией обратных задач и их приложениями.
УВАЖАЕМЫЙ ЧИТАТЕЛЬ! Ваши замечания о содержании книги, ее оформлении, качестве перевода и другие просим присылать по адресу: 129820, ГСП, Москва, 1-й Рижс- кий пер., д. 2, изд-во «Мир». Учебное издание Стивен Е. Кунин ВЫЧИСЛИТЕЛЬНАЯ ФИЗИКА Заведующий редакцией проф. А.Н. Матвеев Зам. зав редакцией В. В. Герасимовский Ведущий редактор Л. И. Третьякова Редактор И. В. Терешкина Художественный редактор О.Н. Адаскина Художник И. И. Каледин ИБ № 7681 Оригинал-макет подготовлен на персональном компьютере и распечатан на лазерном принтере в издательстве «Мир» Подписано к печати 13.03.92. Формат 60x90/16. Бумага книжно-журнальная. Гарнитура литературная. Объем 16,25 бум.л. Усл. печ. л. 32,5. Усл. кр.-отт. 32,5. Уч.-изд. л. 28,71. Изд. № 2/7885. Тираж 4250 экз. Зак. 1650 С 086. Издательство «Мир» 129820, ГСП, Москва, 1-й Рижский пер., 2 Московская типография № 7. Министерство печати и информации Российской Федерации. 121019, г. Москва, пер. Аксакова, 13.