Текст
                    А.И,Плис,
Н.А,Сливина
Лабораторный
практикум
по высшей
математике
Издание второе,
переработанное и дополненное
Рекомендовано
Государственным комитетом
Российской Федерации
по высшему образованию
в качестве учебного пособия
для студентов высших технических
учебных заведений
МОСКВА «ВЫСШАЯ ШКОЛА» 1994


ББК 22.11 П 39 УДК 51 Федеральная программа книгоиздания России Рецензент—чл.-кор. РАН, д-р физ.-мат. наук проф. Н. Н. Калиткин Плис А. И., Сливива Н. А. П39 Лабораторный практикум по высшей математике: Учеб. пособие для втузов.— 2-е изд., перераб. и доп.— М.: Высш. шк., 1994.—416 с: ил. ISBN 5-06-002314-1 Пособие представляет собой руководство к выполнению лабораторных работ, охватывающих практически все разделы общего и специальных курсов высшей математики. Второе издание (1-е—1983 г.) дополнено новыми работами. В каждой работе имеются • краткое описание метода и алгоритма, тексты стандартных подпрограмм, снабженные необходимыми комментариями, математическое задание, порядок выполнения лабораторной работы, образец выполнения одного варианта и варианты индивидуальных заданий для группы из 30 человек. 1602010000 — 087 П 82 — 94 ББК 22.11 001(01) — 94 517 ISBN 5-06-002314-1 © А. И. Плис, Н. А. Сливина, 1994
ОГЛАВЛЕНИЕ Предисловие 5 Лабораторная работа 1. Приближенное решение уравнения /(jc) = 0 методом деления пополам (метод бисекций) 7 Лабораторная работа 2. Метод простых итераций решения уравнения /(*)=0 12 Лабораторная работа 3. Приближенное решение уравнения /(jc)=0 методом Ньютона 18 Лабораторная работа 4. Вычисление корней многочлена 23 Лабораторная работа 5. Решение нелинейной системы методом простых итераций 31 Лабораторная работа 6. Решение системы нелинейных уравнений методом Ньютона 36 Лабораторная работа 7. Решение системы линейных уравнений методом Гаусса 42 Лабораторная работа 8. Решение систем линейных уравнений методом простых итераций 49 Лабораторная работа 9. Обращение симметричной положительно определенной матрицы методом квадратного корня 57 Лабораторная работа 10. Решение систем линейных уравнений методом исключения Гаусса с оценкой числа обусловленности 65 Лабораторная работа 11. Сингулярное разложение прямоугольной матрицы 82 Лабораторная работа 12. Исследование произвольной системы линейных уравнений 98 Лабораторная работа 13. Вычисление собственных значений и собственных векторов симметричной положительно определенной матрицы 106 Лабораторная работа 14. Численное интегрирование 113 Лабораторная работа 15. Приближенное вычисление интеграла по квадратурной формуле Гаусса 120 Лабораторная работа 16. Вычисление несобственного интеграла на полупрямой 124 Лабораторная работа 17. Вычисление несобственного интеграла с бесконечными пределами 127 Лабораторная работа 18. Вычисление несобственного интеграла от неограниченной функции 131 Лабораторная работа 19. Вычисление двойного интеграла по прямоугольной области 134 Лабораторная работа 20. Вычисление двойного интеграла по кругу 139 Лабораторная работа 21. Вычисление тройного интеграла по прямоугольной области 142 Лабораторная работа 22. Вычисление тройного интеграла по шаровой области 146 Лабораторная работа 23. Вычисление поверхностного интеграла по сфере 150 3
Лабораторная работа 24. Приближенное решение задачи Коши методом Эйлера 154 Лабораторная работа 25. Приближенное решение задачи Коши методом Рунге — Кутта 159 Лабораторная работа 26. Приближенное решение задачи Коши методом прогноза и коррекции 165 Лабораторная работа 27. Приближенное решение задачи Коши методом Адамса — Башфорта 170 Лабораторная работа 28. Приближенное решение задачи Коши методом Адамса — Мултона 176 Лабораторная работа 29. Решение дифференциальных уравнений методом матричной экспоненты 182 Лабораторная работа 30. Решение краевой задачи для линейного дифференциального уравнения второго порядка методом прогонки 192 Лабораторная работа 31. Решение краевой задачи для линейного дифференциального уравнения методом конечных элементов 200 Лабораторная работа 32. Аппроксимация функции с помощью кубического сплайна 208 Лабораторная работа 33. Численное дифференцирование 215 Лабораторная работа 34. Гармонический анализ 221 Лабораторная работа 35. Тригонометрическая интерполяция 226 Лабораторная работа 36. Приближенное вычисление преобразования Фурье 232 Лабораторная работа 37. Одномерная минимизация функции методом золотого сечения 240 Лабораторная работа 38. Метод градиентного спуска 244 Лабораторная работа 39. Решение задачи минимизации функции без ограничений методом сопряженных градиентов 249 Лабораторная работа 40. Минимизация функции методом Нелде- ра—Мида 256 Лабораторная работа 41. Решение задачи линейного программирования симплекс-методом 263 Лабораторная работа 42. Решение задачи Дирихле для уравнения Лапласа методом сеток 278 Лабораторная работа 43. Решение смешанной задачи для уравнения гиперболического типа методом сеток 284 Лабораторная работа 44. Решение смешанной задачи для уравнения параболического типа методом сеток 292 Лабораторная работа 45. Решение смешанной задачи для уравнения упругих колебаний методом сеток 298 Лабораторная работа 46. Решение интегрального уравнения Фредгольма II рода 307 Лабораторная работа 47. Решение интегрального уравнения Фредгольма I рода 318 Лабораторная работа 48. Интервальное оценивание параметров нормально распределенной случайной величины 335 Лабораторная работа 49. Линейная регрессия 343 Лабораторная работа 50. Аппроксимация функции по методу наименьших квадратов 350 Лабораторная работа 51. Определение параметров случайных величин методом Монте-Карло 357 Лабораторная работа 52. Вычисление интегралов методом Монте- Карло 367 Дополнение. Краткое описание языка Фортран 373 Приложение 400 Литература 415
ПРЕДИСЛОВИЕ Современное развитие науки и техники тесно связано с использованием электронных вычислительных машин (ЭВМ), ставших рабочим инструментом ученого, инженера, конструктора. Это позволяет строить математические модели сложных устройств и процессов и тем самым резко сократить время и стоимость инженерных разработок. Сложные вычислительные задачи, возникающие при моделировании технических устройств и процессов, можно разбить на ряд элементарных: вычисление интегралов, решение дифференциальных уравнений, определение экстремума функции и т. д. Для таких задач уже разработаны методы решения, созданы стандартные программы их решения на ЭВМ, доступные для изучения студентам младших курсов втузов. Настоящий практикум составлен в соответствии с программами курсов «Высшая математика» и «Математическое моделирование» для высших технических учебных заведений. Практикум содержит 52 лабораторные работы, охватывающие следующие разделы: решение уравнений и систем, интегрирование, обыкновенные дифференциальные уравнения, методы оптимизации, уравнения в частных производных, интегральные уравнения, элементы математической статистики. Лабораторные работы практикума можно выполнять на любой ЭВМ, снабженной компилятором языка программирования ФОРТРАН. В каждой работе содержатся математическая постановка типовой задачи, описания метода ее решения и используемого алгоритма, варианты индивидуальных заданий для группы из 30 человек и подробное описание порядка выполнения работы на ЭВМ. Цель практикума — научить пользоваться простейшими методами вычислений, изучаемыми в общем курсе математики. Нам представляется, что наиболее подходящим для этой цели языком программирования является ФОРТРАН. Краткие сведения о языке ФОРТРАН приведены в Дополнении. При проведении лабораторных работ в больших студенческих потоках рекомендуется предварительно организовать специальную библиотеку объектных модулей на устройстве прямого доступа, 5
содержащую стандартные подпрограммы практикума. Это позволит резко сократить трудоемкость подготовительных работ и затраты машинного времени. При написании практикума использован опыт проведения лабораторных занятий кафедрами высшей математики и специальных курсов высшей математики Московского энергетического института. Множество имеющихся операционных систем и диалектов языка Фортран побудило авторов использовать только минимальные изобразительные средства ФОРТРАНа в программах, включенных в пособие. Большинство программ носит учебный характер. Пользоваться ими при решении практических задач следует с известной осторожностью. Вычислительная математика— это не только наука, но и искусство. Поэтому мы хотели бы предостеречь читателя от слепого и бездумного применения представленного здесь материала. Авторы приносят глубокую благодарность рецензенту книги проф. Н. Н. Калиткину за доброжелательную критику, которая помогла устранить некоторые неточности и улучшить стиль изложения. Они также признательны И. В. Гвоздовскому и Д. Л. Кобякову за большую помощь при работе над рукописью. Авторы
Лабораторная работа 1 ПРИБЛИЖЕННОЕ РЕШЕНИЕ УРАВНЕНИЯ f(x) = О МЕТОДОМ ДЕЛЕНИЯ ПОПОЛАМ (МЕТОД БИСЕКЦИЙ) Пусть задана непрерывная функция f(x) и требуется найти корень уравнения f(x) = 0. Предположим, что найден отрезок Гя, £], такой, что f(a)f(b)<0. Тогда согласно теореме Больцано — коши внутри отрезка [я, 6] существует точка с, в которой значение функции равно нулю, т. е. /(с) = 0, се(а, Ь). Итерационный метод бисекций состоит в построении последовательности вложенных отрезков {[ял, Ь„] \ [аП9 Ь„] <= [ап-и Ьп-^\ <= [а, 6]}, на концах которых функция принимает значения разных знаков. Каждый последующий отрезок получают делением пополам предыдущего. Процесс построения последовательности отрезков позволяет найти нуль функции f(x) (корень уравнения /(х) = 0) с любой заданной точностью. Опишем один шаг итераций. Пусть на (п— 1)-м шаге найден отрезок [я„_1, *„-i]d[p, b], такой, что f(an-1)f(bn-1)<0. Делим его пополам точкой Х = (ап-1 + Ьп-1)/2 и вычисляем /(£). Если /(£) = 0, то £>=(ап-1 + Ьп-1)/2 — корень уравнения. Если /(£)#0, то из двух половин отрезка выберем ту, на концах которой функция имеет противоположные знаки, так как один из корней лежит на этой половине. Таким образом, ап = ап-и Ьп = £>, если /(^)/(ли_1)<0, ял = £, bn = bn-u если /(^)/(лл_1)>0. Если требуется найти корень с точностью 6, то деление пополам продолжаем до тех пор, пока длина отрезка не станет меньше 2е. Тогда координата середины отрезка и есть значение корня с требуемой точностью е. Метод бисекций—простой и надежный метод поиска простого корня*0 уравнения /(х) = 0. Он сходится для любых непрерывных *} Корень х=с называют простым корнем дифференцируемой функции f(x), если /(с) = 0 и f'(c)^0. 1
(ВХОДНЫЕ ПАРАМЕТРЫ\ в—А, Ь-^В, в—EPS у —^— 0—К I L-*A1 I I ^[1Г+В)/2.— Х0 i К+1— К F(X0)—Y SIGN(R)*A1—R И ВЫХОДНЫЕ ПАРАМЕТРЫ Х0— КОРЕНЬ, К-КОЛИЧ. ИТЕРАЦИЙ, [Ц*-ПОГРЕШНОСТЬ KOPHflj Рис. 1 функций f(x), в том числе недифферен- цируемых. Скорость сходимости невелика. Для достижения точности г необходимо совершить N итераций, где iV^log2^f. е Это означает, что для получения каждых трех верных десятичных знаков необходимо совершить около 10 итераций. Если на отрезке [а, Ь~\ находится несколько корней уравнения /(х) = 0, то процесс сходится к одному из них. Метод неприменим для отыскания кратных корней четного порядка. В случае кратных корней нечетного порядка он менее точен. На рис. 1 изображена блок-схема описанного алгоритма. С ее помощью можно без труда написать следующий текст подпрограммы, которую назовем BISECT: subroutine BISECT(a,b,eps,f,xO,k) 1 хО - (a+b)/2. У - f(x) iffy) 2,5,2 2 iff(b-a).le.eps) go to 5 k - k+1 г - f 0) , If(r'y) 3,3,4 3 b - xO go to 1 4 a - xO goto 1 5 return end Это, по-видимому, самое легкое решение поставленной задачи не является самым эффективным. Эффективность программы можно повысить, усовершенствуя алгоритм. Отметим очевидные недостатки приведенной программы. Во-первых, при вычислении произведения г*у может произойти «исчезновение порядка», что приведет к программному прерыванию. 8
Во-вторых, на каждой итерации приходится лишний раз вычислять функцию f(x). В самом деле, если выполняется оператор Ь = хО, то заново вычисляется f(a), если же выполняется оператор а = хО, то повторно вычисляется f(b). В-третьих, оператор хО = (а + Ь)/2 выполняется в 4—5 раз медленнее оператора хО = (а + Ь)*0.5 (в4данном случае это замечание носит чисто иллюстративный характер). В больших программах широкое применение таких очевидных усовершенствований может дать ощутимые результаты. В библиотеке ФОРТРАНа есть встроенная функция sign (x, у). Результат ее действия равен |x|sign>\ Используя эту функцию и учитывая сделанные замечания, составим окончательный вариант программы BISECT: п««********************************************************* subroutine BISECT (a,b,eps,f,xO,k) с* " с Программа BISECT предназначена для решения уравне- с ния f(x)=0 методом бисекций с с а - левый конец интервала [а,Ь] с b - правый конец интервала [а,6] с eps - погрешность с f - имя подпрограммы-функции, вычисляющей f(x) с хО - результат с к - количество итераций с, к - 0 ! счетчик числа итераций ************************************************************ s - 1. an = а ! текущие значения концов bn = b ! отрезка, содержащего корень г - f(a) ! вычисление значения f(a) с 1 хО - 0.5*{an + bn) ! деление отрезка пополам у = f(xO) ! значение f(x) в середине с с если середина отрезка является корнем или с достигнута точность, вычисления заканчиваются с if((y.eq.0).or.((bn-an).le.(2.*eps))) go to 4 с к = к + 1 ! вычисление числа итераций s - sign(s,y)*sign(s,r)! знак величины f(a)*f(xO) 1f(s) 2,4,3 2 bn - хО ! если f(an)*f(bn), то Ьп-хО до to 1 ! переход к следующей итерации 3 an = хО ! если f(an)*f(bn)0, то ап-хО г - у go to 1 ! переход к следующей итерации с 4 return end Входные параметры: а—левый конец отрезка \_а, Ь~\; Ь — правый конец отрезка [a, b~\; eps—погрешность определения
корня; /—имя внешней подпрограммы—функции (function) f(x), вычисляющей значения/(х). Выходные параметры: хО—приближенное значение корня; к — количество итераций. Перед обращением к подпрограмме необходимо: 1) составить подпрограмму-функцию f(x), вычисляющую значение f(x). Имя функции / должно быть переменной вещественного типа; 2) описать имя / в головной программе оператором external; 3) присвоить значения входным параметрам a, b, eps; 4) проверить, согласуются ли фактические параметры подпрограммы BISECT по типу и порядку с ее формальными параметрами. Задание. Используя программу BISECT, найти корень уравнения /(х) = 0 с точностью е. Порядок выполнения лабораторной работы 1. Графически или аналитически отделить корень уравнения f(x) = 0 (т. е. найти отрезок [я, Ь\ на котором функция f{x) удовлетворяет условиям теоремы Больцано — Коши). 2. Составить подпрограмму-функцию вычисления f(x). 3. Составить головную программу, содержащую обращение к подпрограмме BISECT и печать результатов. 4. Провести вычисления по программе. Пример. Найти отличный от нуля корень уравнения х2 — 5 sin л: = 0 с четырьмя верными знаками после запятой. А Искомый корень легко отделяется графически. Он лежит на отрезке [1.57; 3.14] (рис. 2). Для того чтобы найти корень с тремя верными знаками после запятой, полагаем 6 = 0.0005. В этом случае головная программа и подпрограмма-функция просты и не требуют комментариев: y = 5sln х Рис. 2 external f а - 1.57 b - 3.14 eps - 5.е-3 обращение к программе BISECT call BISECT (a, b, 5.e-03, f, x, k) ! описание параметров ! подпрограммы BISECT 10
print l,x,k ! печать результатов 1 format(2x,'корень ',el3.5,' количество итераций',i3) stop end function f(x) f - x*x - 5.*s1n(x) return end Вычисления по программе привели к следующим результатам: корень .20882Е+01 количество итераций 8 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 /м arccosjc2 —х ых—L- Ых 1+jc2 lnlnjc-e~* arctg(l/jc)—x2 1 tgx— JC jc4-13jc2 + 36-i 2jc2-jc4-l-huc V2— V3——— X X A J 4+jc2 jc3-3jc-2e_x ^ 1 2 — X 1+COSJC 3 — sin x sinjc2 — 6jc+1 1 cos*2-10* Номер варианта 1 16 17 18 19 20 21 22 23 24 25 26 27 28 /w ex—arccos^/jc l e*2-lnjc ln2jc-- X e~x—jc3 1 arctgjc— X 1 l+X 2 In cosjit 1—JC shjc—jc+l arctgjc—hue 4jc3 ch*~TT^ _J ,з 3 + 2cosjc , 1+JC 1 In- +- 1—л: a* ex—3—cosjc e"x—arctgx 11
Продолжение таблицы Номер варианта 14 15 /м 1-х2 \+х2 2х 2 arcsin г—е \+х2 Номер варианта 29 30 т 2е* + х arccosx2 —х3 Лабораторная работа 2 МЕТОД ПРОСТЫХ ИТЕРАЦИЙ РЕШЕНИЯ УРАВНЕНИЯ f{x) = 0 Метод простых итераций (метод последовательных приближений) решения уравнения f(x) = 0 состоит в замене исходного уравнения эквивалентным ему уравнением х = (р(х) и построении последовательности хи + 1 = (р(л;и), сходящейся при «->оо к точному решению. Сформулируем достаточные условия сходимости метода простых итераций. Теорема. Пусть функция ц>(х) определена и дифференцируема на [я, b~\, причем все ее значения <р(х)е[а, Ь\ Тогда, если существует число q, такое, что \<p'(x)\^q< 1 на отрезке [а, Ь~\, то последовательность хп + 1 = (р(хп), я = 0, 1, 2, ..., сходится к единственному на [а, ЬЛ решению уравнения х = ср(х) при любом начальном значении х0е[а, Ь\ т.е. lim хп = lim ф (хп) = £, /(£) = 0, £ е [а, Ь]. л—юо и—►оо При этом если на отрезке [а, 6] производная (р'(х) положительна, то \Ъ>-Хн\<т2-\хн-Хя-1\, \-q если (р'(х) отрицательна, то |^-ли|<|ли-ли-1|. Опишем один шаг итераций. Исходя из найденного, на предыдущем шаге значения хп-ъ вычисляем. у = ср(хп-1). Если 12
У\ 0 / ли \ 5 *j Ч У**у/ h I x0 x <*; =fro,i* Рис. 3 \y-xn-1\>E, полагают хп=у и выполняют очередную итерацию. Если же \у — хп-1\<е, то вычисления заканчивают и за приближенное значение корня принимают величину хп=у. Погрешность полученного результата зависит от знака производной (р'(х). При (р'(х)>0 корень найден с погрешностью -^-, если ф'(х)<0, то погрешность не превышает е. Метод допускает простую геометрическую интерпретацию. Построим графики функций у = х и у = (р{х). Корнем £ уравнения х = (р(х) является абсцисса точки пересечения кривой у = <р{х) с прямой у = х (рис. 3). Взяв в качестве начальной произвольную точку х0е[а, Ь~\, строим ломаную линию (рис. 3,я,б). Абсциссы вершин этой ломаной представляют собой последовательные приближения корня £. Из рисунков видно, что если ф'Ы<0 на отрезке [а, Ь], то последовательные приближения хп = (р{хп-1) колеблются около корня £, если же производная ф'(х) положительна, то последовательные приближения сходятся к корню монотонно. При использовании метода простых итераций основным моментом является выбор функции ф(х) в уравнении х = (р(х), эквивалентном исходному. Для метода итераций следует подбирать функцию (р(х) так, чтобы I ф' {х) I ^ q < 1 • При этом следует помнить, что скорость сходимости последовательности (хп) к корню £ тем выше, чем меньше число q. Пример. Найти корни уравнения ех—10* = 0 с точностью 8 = 0.0001. Корни уравнения £ь ^2 легко отделяются графически. Они являются абсциссами точек пересечения графика у = ех Рис.4 13
ВХОДНЫЕ ПАРАМЕТРЫ X0,EPS с прямой у=10х. Из приведенного (рис. 4) графика видно, что первый корень лежит на отрезке [0, 1], а второй— на отрезке [2, 6]. Для определения первого корня заменим исходное уравнение эквивалентным х = 0.1 е х; здесь у(х) = 0Лех, ф'(х) = 0.1е*. На отрезке [0, 1] 0<ф'(х)<1, т.е. 4 = 0.1. В качестве начального приближения выбираем х0 = 1. Вычисления прекращаем, когда \хп — ф(хп)|<е. Последовательные приближения в этом случае таковы: 0.271828Е 00 0.131236Е 00 0.114024Е 00 0.112078Е 00 0.111860Е 00 0.111835Е 00 Так как К-*б1< 0.1 1-0.1 . .^,0.00004 1*6 ~*5 К Г" < ^0.000005, Y—-X0 ВЫХОДНЫЕ ПАРАМЕТРЫ^ Х0 -КОРЕНЬ, К-КОЛИЧЕСТВО ИТЕРАЦИЙ Рис. 5 то принимаем £ = 0.11183. В этом результате все знаки верные. Для определения второго корня представляем исходное уравнение в виде х = 1п10х. Здесь ф(х) = 1п10х, <р'(х) = = 1/х и при х^2 производная ф'(х) оценивается сверху: |ф'(х)| = 11 /х|<0,5, т. е. q = 0.5. Если в качестве начального приближения взять х0 = 2, то получаем следующие последовательные приближения: 0.299573Е 01 0.339977Е 01 0.352629Е 01 0.356283Е 01 0.357314Е 01 0.357603Е 01 0.357684Е 01 0.357706Е 01 0.357713Е 01 Принимаем £ = 3.5771 с погрешностью 0.0001, так как |$-*91<7^1*9-*8|<1*9-*81<0Ю001. \-q 14
На рис. 5 изображена блок-схема алгоритма. Также просто записывается и сама подпрограмма, которая здесь названа SITER (хО, eps, k, f)« subroutine SITER (xO,eps,k,f) с Программа SITER решает уравнение f(x) - 0 методом с простых итераций с с хО - нулевое приближение с eps - погрешность с к - число итераций с f - имя подпрограммы, вычисляющей f(x) с с Результат: с хО - корень уравнения ~****** TV************************************************** с к = 0 ! инициализация счетчика итераций х = хО ! присвоение нулевого приближения 1 У - f(x) к = к + 1 ! подсчет количества итераций с с если точность достигнута, вычисления прекращаются с if(abs(y-x).le.eps) go to 2 с x - У go to 1 ! переход к очередной итерации 2 хО = у ! пересылка результата в хО return end с Подпрограмма SITER позволяет вычислять корни уравнения х = ср(х) для любой функции, удовлетворяющей достаточным условиям сходимости метода простых итераций. Входные параметры: хО — начальное приближение корня; eps — параметр, используемый для окончания итерационного процесса. Если необходимо вычислить корень с точностью 6, то eps полагают равным г при ф'(х)<0 и eps = —-е, если 0<ф'(х)^ ч ^.q; f—имя внешней подпрограммы функции, вычисляющей значения (р (х). Выходные параметры: хО — приближенное значение корня; к — количество произведенных итераций. Перед обращением к программе SITER необходимо: 1) составить подпрограмму-фукцию f(x), вычисляющую значения ф(х). Имя функции f должно быть переменной действительного типа; 15
2) описать имя f в головной программе оператором external; 3) присвоить в головной программе значения переменным хО и eps; 4) проверить, согласуются ли фактические параметры подпрограммы SITER по типу и порядку с ее формальными параметрами. Замечание. Поскольку формальный параметр хО получает внутри подпрограммы новое значение, соответствующий ему фактический параметр может быть только переменной, но не константой. Задание. Используя подпрограмму SITER, найти корень уравнения f(x) = 0 с заданной точностью е. Порядок выполнения лабораторной работы 1. Графически или аналитически отделить корень уравнения /(*)=о. 2) Преобразовать уравнение f(x) = 0 к виду х = ц>(х) так, чтобы в некоторой окрестности [а, 6] корня 2; производная ф' (х) удовлетворяла условию | ф' (х) | ^q < 1. При этом следует помнить, что чем меньше q, тем быстрее последовательные приближения сходятся к корню. 3. Выбрать начальное приближение, лежащее на отрезке [a, b\ 4. Составить подпрограмму-функцию для вычисления значении ф(4 Составить головную программу, содержащую обращение к SITER и печать результатов вычислений. 6. Провести вычисления по программе. Пример. Найти корень уравнения х — е~01* = 0 с точностью 8 = 0.0001. А Отделяем корень графически. Легко видеть, что ^>0. Преобразуем уравнение к виду х = е~0Лх. Здесь ф(х) = е~01*, ф'Ы=-0.1е-бЧ ф'(х)<0 для всех х^О и |ф'(;с)| = |0Ле"ОЛдс|< ^0.1 <1. Значит, # = 0.1. В качестве нулевого приближения естественно выбрать х0 = 0. Так как ф'(х)<0, то для корня справедлива оценка \£> — xn\^\xn — xn-i\<£- Следовательно, в качестве параметра eps подпрограммы SITER следует взять величину е. Итак, программа, решающая данную задачу, имеет вид external fi хО - 0. ! начальное приближение с' обращение к подрограмме call SITER (хО, O.le-03, k, fi) с print 1,х0,к ! печать результатов 1 format(2x,'корень-',е13.5, * ' количество итераций',i4) 16
stop end function fi(x) f1 - ехр(-О.Гх) return end Вычисления привели к следующему результату: корень .91277Е+00 количество итераций 5 Таким образом, корень уравнения можно принять равным 0.9128 ±0,0001. Л Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 /W arccosx2 —х ' * ШХ — г \+х2 lnlnx —е~х arctg (1/х) — х2 1 х—е ^х х4-Ш2 + 36— л: 2jc2-;c4-l-ln;c 1 X 1 arctg x jc3-3jc-2e_x х—arctg (1/jc) jc-lnfjc-l+^jc-l^+l sin л:2 — 6jc+1 cosjc2 —10jc * jn ~г- I E и б л -и о Номер варианта I 16 17 18 19 20 21 22 23 24 25 26 27 "2Г >тек /м ех—arccos^/x -1+JC 1 1 —х х In2*-- X 1 lglnx—— j 1 arctg*— 1 1+* 2 In cosx^ 1-х е~х -^/х arctg jc—In x 1 *"jc4-13x2 + 36 _J ,з 3 + 2 cos jc jc-e2x _x _1 ex—3—cosjc ~"~ i ex+arctg jc & t 17
Продолжение таблицы Номер варианта 14 15 /м arccos(ex — 3)—х 2х _2 1+JC2 Номер варианта 29 30 /м 1-х arccosjc2— jc3 Лабораторная работа 3 ПРИБЛИЖЕННОЕ РЕШЕНИЕ УРАВНЕНИЯ f{x)=0 МЕТОДОМ НЬЮТОНА Если известно хорошее начальное приближение решения уравнения /(*) = 0, то эффективным методом повышения точности является метод Ньютона (метод касательных). Метод состоит в построении итерационной последовательности хп+1=хп—f(xn)/ //'(*„), сходящейся к корню уравнения f(x) = 0. Сформулируем достаточные условия сходимости метода. Теорема. Пусть f(x) определена и дважды дифференцируема на [я, Ъ\ причем f(a)f(b)<0, а производные /'(*), /"(*)■ С0~ храняют знак на отрезке [я, Ь~\. Тогда, исходя из начального приближения х0е[а, 6], удовлетворяющего неравенству f(xo)f"(xo)>0, можно построить последовательность xn + i = xn-f(xn)/f,(xn), n = 0,l,2, ..., сходящуюся к единственному на [я, 6] решению ^ уравнения f{x) = 0. Метод Ньютона допускает простую геометрическую интерпретацию. Если через точку с координатами (xn;f(xn)) (рис. 6) провести касательную, то абсцисса точки пересечения этой касательной с осью Ох и есть очередное приближение хп + 1 корня уравнения Д*)=о. Для оценки погрешности п-го приближения корня можно воспользоваться неравенством \£>-Хн\^Т±\хн-Хн-1\2, 2тх где М2 — наибольшее значение модуля второй производной |/"(x)| на отрезке Рис.6 [а, Ь~\; тх—наименьшее значение моду- y*f(*)j 18
ля первой производной |/'(х)| на отрезке [а, Ь\. Таким образом, если l*„-*„-il<e, то \^-хп\^М2е2/(2т1). Последнее соотношение означает, что при хорошем начальном приближении корня после каждой итерации число верных десятичных знаков в очередном приближении удваивается, т. е. процесс сходится очень быстро. Значит, если необходимо найти корень с точностью 8, то итерационный процесс можно прекращать, когда \хп-хп-1\<г0 = у/2т1е/М2. Опишем один шаг итераций. Если на (п— 1)-м шаге очередное приближение *„_! не удовлетворяет условию окончания процесса, то вычисляем величины /(*n-i)> f'(xn-i) и следующее приближение корня xn = xn-1-f(xn.1)/f,(xn-1). При выполнении условия ВХОДНЫЕ х0 НЫЕ ПАРАМЕТРЫ\ -^X0,£—HEPS J J X0-—XS \хп-хп-.1\<у/2т1е/М2 величину хп принимаем за приближенное значение корня ^, вычисленное с точностью е. Блок-схема этого алгоритма изображена на рис. 7. Метод Ньютона эффективен, если известно хорошее начальное приближение для корня и в окрестности корня график функции имеет большую крутизну. В этом случае процесс быстро, сходится. Если же численное значение производной f'{x) вблизи корня мало, то процесс вычисления корня может оказаться очень долгим. Для приближенного вычисления корней уравнения /(лс)=0 методом Ньютона предназначена подпрограмма NEWTON: subroutine NEWTON (xO,n,eps,ih,i, с Программа NEUTON вычисляет корень с методом Ньютона с с хО - нулевое приближение решения 'ВХОДНЫЕ ПАРАМЕТРЫ) Х0-КОРЕНЬ, 1-КОЛИЧ. ИТЕРАЦИЙ, max F"(X) 2_ 2min F'(X) EPS ПОГРЕШНОСТЬ КОРНЯ Рис. 7 f,fl) уравнения f(x)=0* 2* 19
с eps - погрешность вычислений * с п - максимальное количество итераций * с f(x) - подпрограмма-функция, вычисляет f(x) * с П(х) - подпрограмма-функция, вычисляет f*(x) * с с Результат: * с хО - корень уравнения * с i - количество выполненных итераций * с ih - признак выхода: * с in=0 - получен правильный результат, * с ih=l - нарушены условия сходимости * с ih=2 - слишком много итераций * delO - 1.е12 xs = хО i - 1 ! инициализация счетчика итераций 1 у fl(xs) ! вычисление Г(х(п)) xn - xs - f(xs)/y ! вычисление х(п+1) del - abs(xn-xs) ! вычисление |x(n)-x(n+l)| с с если достигнута точность, вычисления заканчиваются с if(del.It.eps) go to 6 с с если нарушено условие сходимости, с вычисления заканчиваются с if(del.le.delO) go to 3 ih = 1 go to 7 с с если число итераций слишком велико, с вычисления заканчиваются с 3 if(i.gt.n) go to 4 i * i + 1 ! подсчет числа итераций xs = xn delO = del go to 1 ! переход к следующей итерации с с 4 in = 2 go to 7 6 хО = xn ! приближенное решение в хО ih = О return end Входные параметры: хО — начальное приближение корня; п — максимально допустимое число итераций; eps — значение 8 в условии окончания итерационного процесса; f—имя внешней подпрограммы-функции (function) f(x), вычисляющей значения /(*); П—имя внешней подпрограммы-функции (function) fl(x), вычисляющей значения производной f'(x). 20
Выходные параметры: хО — приближенное значение корня; i — число выполненных итераций; ih — указатель причины окончания вычислений: если ih = 0, то корень уравнения найден с заданной точностью; если ih = 1, то итерации не сходятся к корню уравнения (это означает, что на отрезке [а, 6] не выполнены условия теоремы); если 11^=2, то число совершенных итераций превзошло максимально допустимое число п (что свидетельствует либо о плохом начальном приближении, либо о том, что величина |/'(х)| мала в окрестности корня). Перед обращением к программе NEWTON необходимо: 1) составить подпрограммы-функции: f(x) для вычисления значений f{x) и fl(x) для вычисления значений f (х). Имена функций должны быть переменными действительного типа; 2) описать имена f и И в головной программе оператором external; 3) присвоить значение входным параметрам хО, eps, n; 4) проверить, соответствуют ли фактические параметры по типу, количеству и порядку следования формальным параметрам подпрограммы NEWTON. Задание. Используя подпрограмму NEWTON, составить программу приближенного вычисления корня уравнения f(x) = 0 для заданной дважды дифференцируемой функции f(x) с точностью е0 и произвести вычисление на ЭВМ. Порядок выполнения лабораторной работы 1. Графически или аналитически отделить корень уравнения f(x) = 0. Убедиться, что на найденном отрезке [а, 6] функция f\x) удовлетворяет условиям сходимости метода Ньютона. 2. Выбрать начальное приближение корня х0е\_а, ЬЛ так, чтобы f{xo)f"{xo)>0. 3. Оценить снизу величину m1 = min |/'(х)|, оценить сверху [а, Ь) величину М2 = max | / " (х) |. [а, Ь] 4. По заданному е0 выбрать значение 8 для условия окончания итерационного процесса 8 = yjlm 1z0J M2 • 5. Составить головную программу, содержащую обращение к подпрограмме NEWTON и печать результатов (обязательно предусмотреть печать признака ih). 6. Провести вычисления по программе. Пример. Найти корни уравнения 10х — е* = 0. А В лабораторной работе 2 было показано, что это уравнение имеет два корня, один из которых лежит на отрезке [0, 1], а второй — на отрезке [2,6]. В данном случае f(x)= Юх — е*, 21
/'(*)= 10 — e*,/"(x) = — e*. Очевидно, первая и вторая производные сохраняют знак на отрезке [0, 1]. При этом m1 = miil |/'(x)|=min (10-е*)>7, [О. 1] [О. 1] M2 = tnax |/"(jc)| = max е*=е. [О. 1] [О. 1] Если требуемая точность 80 = 0.0001, то в условии окончания процесса e = v/2m1e0/Af2 = v/2-7- 10"4/e. В качестве начального приближения выбираем х0 = 0, поскольку /(0)/"(0)>0. Подпрограмма, реализующая вычисления, имеет вид external f,fl ! описание программ, с ! вычисляющих f(x) и Г(х) хО - 0. ! нулевое приближение eps - sqrt(14.е-4/2.71828)! вычисление погрешности с с обращение к подпрограмме NEWTON с call NEWTON (xO, 5f eps, ih, i, f, fl) с if(ih.eq.O) print 2,x0,i ! печать результата 2 format(2x,'корень -',613.6,' количество итераций ',i4) с stop end function f(x) f - 10.*x - exp(x) return end function fl(x) fl = 10. - exp(x) return end В результате вычислений получаем корень = 0.111833Е+00 количество итераций 2 За приближенное значение корня, вычисленное за две итерации, принимаем х = 0.1118±0.0001. л Для получения этого результата методом простых итераций потребовалось пять итераций. Аналогично можно найти второй корень этого уравнения. Оценивая параметры т1 и М2 на отрезке [3, 4] и принимая в качестве начального приближения х0 = 3, за четыре итерации получаем ^ = 3.577. В лабораторной работе 2 этот результат был получен за девять итераций. 22
Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /м arccosjc2 —х 1 1n v ill л—- г 1+JC2 lnhuc—e~x arctg(l/jc) —x2 i х—е ^ jc4-13jc2 + 36— JC 2jc2-jc4-l-huc jc—(arctgjc)-1 jc3-3jc-2e_x x—arctg(l/jc) JC-ln^-l+^JC-1)2+1 sinjc2 — 6jc+1 cosjc2 —IOjc arccos(ex—3)—x 2x 1+JC2 1 Номер варианта 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /w ex—arccos^/jc 1+JC 1 1 — x x In2*-- X 1 lghlJC — — - 1+JC^ 1 arctgjc— X 1 1+* 2 In cosjit 1 — x e~x2-J~x arctgjc —In jc 1 *"jc4-13jc2 + 3-6 _J ,з 3 + 2cosjc JC_e2x -x -1 ex—3— cosjc ex—arctgjc 1-х arccosjc2—jc3 Лабораторная работа 4 ВЫЧИСЛЕНИЕ КОРНЕЙ МНОГОЧЛЕНА Отыскание всех корней многочлена Рп(х) = а0 + а1х + ... + апхп (1) является важной для практики задачей. Покажем, что поиск корней многочлена может оказаться нетривиальной задачей. Для этого рассмотрим классический пример. 23
Пусть дан многочлен 20-й степени /7(x) = (x_1)(jc-2)...(x-20) = jc2O-210jc19 + .... Его корни *i = l, х2 = 2, ..., х20 = 20—действительные числа. Рассмотрим теперь многочлен 20-й степени q{x), все коэффициенты которого совпадают с соответствующими коэффициентами многочлена р(х) и только один, а именно коэффициент при х19, равен не -210, а -(210 + 2"23). Так как 2"23<10"6, то отличие действительно невелико и, значит, q(x) незначительно отличается от р(х). Но корни многочлена q(x) уже существенно отличаются от корней многочлена р(х). Приведем их значения: *! = 1.00000 jc6 = 6.00001 jc12 13 = 11.79363+ 1.65232/ х2 = 2.00000 jc7 = 6.99970 x14 15 = 11.79363 + 2.51883/ jc3 = 3.00000 jc8 = 8.0727 jc16'17 = 16.73074 + 2.81262/ jc4=4.00000 jc9 = 8.91725 jc18'19 = 19.502444+1.94033/ jc5 = 5.00000 x10, u = 10.09527 + 0.64350/ i20 = 20.84691 Этот пример наглядно показывает, что небольшое возмущение коэффициентов полинома привело к существенному изменению части корней, а некоторые из них стали комплексными. Многочлены, обладающие такими свойствами, называются плохо обусловленными. Важно понять, что если многочлен плохо обусловлен, то независимо от метода вычисления корней погрешности округления обязательно приведут к значительным погрешностям численных значений корней. В дальнейшем мы будем рассматривать только хорошо обусловленные многочлены. В предлагаемой лабораторной работе корни хорошо обусловленного полинома вычисляются методом Ньютона — Рафсона (см. лабораторную работу 3): Xk+i=Xk~kwy (2) Если один действительный корень хх найден, то многочлен Рп{х) можно разделить (без остатка!) на (л*— xi): Эта процедура называется удалением вычисленного корня. Таким образом, задача свелась к отысканию корней многочлена, степень которого на единицу меньше степени многочлена Рп(х). Корни многочлена Рп-1(х) можно также искать с помощью метода Ньютона. Замечательным свойством метода (2) является то, что он позволяет находить комплексные корни. Если на очередном шаге найден комплексный корень ос + р/, то а — р/ также является 24
корнем рассматриваемого многочлена. Значит, многочлен будет делиться без остатка на х2 — 2ои; + а2 + р2, т. е. после определения одного комплексного корня степень многочлена можно понизить сразу на две единицы. Таким образом, можно последовательно определить все корни многочлена. Здесь полезно обратить внимание на экономичный способ вычисления входящих в формулу (2) значений многочлена Рп(х) и его производной Р'п{х). Вычислим Рп(х). Для этого воспользуемся схемой Горнера. Запишем многочлен в виде Так как самые внутренние скобки должны быть вычислены в первую очередь, то вычисления можно проводить по следующим рекуррентным формулам: bj = aj + xkbj, j=n-l, n-2, ..., 0. Найденная в результате этих вычислений величина Ь0 как раз и дает искомое значение многочлена, т. е. Рп{хк) = Ь0. Результаты промежуточных вычислений (числа bu b2, ..., Ьп) можно использовать для определения величины Р'п{х^). В самом деле, по теореме Безу Рп{х) = {х-хк)Рп-1(х) + Ь0, (4) где Рп_1(х) = хп-1 + Ьпхп-2 + ... + £>!. Дифференцируя обе части (4) по х Р'я(х) = {х-хк)Р'^1(х) + Ря.1{х) (5) и подставляя в обе части (5) точку хк9 получаем Pn{xk) = Pn-i{xk). Но значение многочлена Pn-i(x^ (коэффициенты которого bu b2, ..., Ьп) можно вычислить по схеме Горнера и таким образом найти значение Р'п{хк). Воспользовавшись рекуррентными формулами Сп = Ь" (6) Cj = bj + xkCj+l9 j=n-l,n-2, ..., 1, получаем P;(xk) = P„_1(xk) = c1. Таким образом, расчетная формула метода Ньютона (2) принимает следующий вид: хк+1 —хк~Ьо/с1- 25
В этой формуле Ь0 и сг вычисляют по формулам (3), (6). Выбор начального приближения для каждого корня — самостоятельная проблема. За начальное приближение обычно берут х = 0: тогда итерации обычно сходятся к наименьшему по модулю корню. Дело в том, что удаление очередного вычисленного корня вносит погрешности в значения коэффициентов и влияет на точность вычисления следующих корней. На практике отмечено, что, если сначала удалять меньшие по модулю корни, точность изменяется незначительно, а если начать процесс удаления с больших корней, то точность может упасть катастрофически. С другими методами выбора начального приближения можно познакомиться в специальной литературе. Один из этих методов реализован в программе PLNM: i subroutine PLNM (cof,w,m,rootr,rooti,ier) с Программа PLNM предназначена для вычисления всех с корней многочлена степени не выше 36 с с cof - массив размерности пн-1, содержит коэффициенты с многочлена в порядке убывания степеней с w - рабочий массив размерности пн-1 с m - степень многочлена с rootr с rooti - массивы размерности т+1, содержат соответственно с действительные и мнимые части корней многочлена с ier - признак выхода: с ier=0 - все корни найдены верно с ier=l - степень многочлена- отрицательное число с ier=2 - степень многочлена больше 36 с ier=3 - не найдено нулевое приближение очередного с корня с 1ег=4 - старший коэффициент равен нулю dimension cof(1),w(1),rootr(1),rooti(1) ifit * 0 n - m ier - 0 с с если старший коэффициент равен нулю, с вычисления прекращаются с if (cof(n+l)) 10,25,10 с с если степень многочлена неположительна, с вычисления прекращаются с 10 if (n) 15,15,32 15 ier - 1 20 return с 25 ier = 4 go to 20 26
30 ier = 2 go to 20 с с если степень многочлена выше 36, с вычисления прекращаются с 32 if(n-36) 35,35,30 35 пх = п пхх = п+1 п2 = 1 kji = п+1 do 4Q 1 = l.lcji mt = kji - 1 + 1 40 w(mt) = cof(l) с 45 xo - 0.00500101 yo - 0.01000101 in * 0 50 x - xo xo - -10.0*yo yo - -10.0'x x - xo У - yo in - in+1 go to 59 с 55 ifit - 1 xpr - x ypr - у с 59 ict = 0 60 ux * 0. uy - 0. v - 0. yt - 0. xt - 1. u - w(n+l) if(u) 65,130,65 65 do 70 i-1,n 1 - n-i+1 temp - w(l) xt2 - x*xt - y*yt yt2 - x*yt + y*xt u - u + temp*xt2 v - v + temp*yt2 fi - i ux - ux + f1*xt*temp uy - uy - fi*yt*temp xt - xt2 70 yt - yt2 с sumsq - ux*ux+uy*uy if(sumsq) 75,110,75 75 dx - (v*uy - u*ux)/sumsq x - x + dx 27
dy --(u*uy + v*ux)/sumsq у - у + dy с 78 if(dabs(dy)+dabs(dx) -1.0e-7) 100,80,80 80 ict - ict+1 с if(ict-500) 60,85,85 85 if(ifit) 100,90,100 90 if(in - 5) 50,95,95 с 95 ier - 3 go to 20 100 do 105 l«l,nxx mt - кji-1+1 temp - cof(mt) cof(mt) - w(l) 105 w(l) - temp с itemp - n n - nx nx - Itemp if(ifit) 120,55,120 110 if(ifit) 115,50,115 115 x - xpr У - УРГ 120 ifit - 0 122 if(dabs(y)-l.e-5*dabs(x)) 135,125,125 с 125 alpha - x + x sumsq - x*x + y*y n - n-2 go to 140 130 x - 0.0 nx - nx-1 nxx - nxx-1 135 у = 0.0 sumsq > 0.0 alpha - x n * n-1 140 w(2) = w(2)+alpha'w(l) 145 do 150 1=2,n 150 w(l+l) = w(l+l)+alpha*w(l)-sumsq*w(l-l) с 155 rooti(n2) - у rootr(n2) = x n2 * n2+l if(sumsq) 160,165,160 160 у = -у sumsq - 0.0 go to 155 165 if(n) 20,20,45 с end 28
Входные параметры: cof—массив размерности т+1, содержит коэффициенты многочлена в порядке возрастания степеней; w — рабочий массив размерности m+1; m — степень многочлена. Выходные параметры: rootr, rooti — массивы размерности т, содержат действительные и мнимые части корней многочлена соответственно; ier — признак выхода из программы: ier = 0 — найдены все корни, ier=l—степень многочлена ^0, ier = 2 — степень многочлена ^36, ier = 3 — не удалось найти нулевое приближение очередного корня, ier = 4—старший коэффициент многочлена равен нулю. Перед обращением к программе PLNM необходимо описать размерности массивов и присвоить фактические значения формальным параметрам. Задание. Вычислить все корни многочлена. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую описание массивов, присвоение фактических значений параметрам cof и т, обращение к PLNM, печать результатов. 2. Провести вычисления на ЭВМ. Пример. Найти все корни многочлена А Программа вычисления корней многочлена может иметь следующий вид: dimension cof(20),w(20)frootr(10)frooti(10) data cof / 1., 0., 5., 0., 7., 0., 1., 13*0. / m = 6 с с обращение к подпрограмме PLNM с call PLNM (cof, w, m, rootr, rooti, ier) с с печать результатов - признак выхода и корни с write(3,*) ' признак выхода \ier write(3,*) ^ write(3,*) 'действительная и мнимая части корня ' write(3,*) с do 1 j=lfm write(3,*) rootr(j),rooti(j) 1 continue с stop ^ end Вычисления по программе привели к следующим результатам: 29
признак выхода О действительная и мнимая части корня 753011Е-02 753011Е-02 753011Е-02 753011Е-02 О0000ОЕ+00 000000Ё+00 -6.283945Е-01 6.283945Е-01 6.283945Е-01 -6.283945Е-01 -2.494446 2.494446 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ЛМ jc6 + 27jc5-0,3jc4+12jc3-0,7jc2+10jc + 0,34 jc6+ 12jc5-34jc4 + 0,7jc3-3jc2 + 4jc+0,67 jc6 + 0,6jc5-23jc4-12x3 + 0,9jc2 + 3jc+0,04 jc6 + 6x5-7jc4 + 0,9jc3-0,5x2 + 0,7jc-0,06 x6-12jc5-8jc4 + 6x3-3;c2 + 2jc + 0,07 jc6 + 1,2jc5-3jc4 + 2jc3-4jc2 + 7jc+0,84 x6 + 5jc5-7;c4 + 3jc3-6jc2 + jc+12 jc6 + 0,5jc5-0,7x4 + 0,3jc3-0,6jc2 + 0,U+1,2 x6-13jc5 + 34jc4 + 7jc3-2jc2 + 13jc+45 jc6-0,3jc5-0,4jc4 + 0,7jc3-0,2jc2 + 0,3jc+4,5 jc6 + 4jc5-0,4x4-5jc3-0,5jc2 + 7jc+1,79 x6 + 0,4x5-4jc4+0,5jc3-5jc2-0,7.x+17,9 x6 + 6jc5-0,7jc4 + 0,4jc3-0,5jc2 + 3jc+13 jc6 + 0,6jc5-7jc4+4jc3-0,3jc2 + 8jc + 4 x6 + 0,8x5-4x4+12x3-65jc2+11jc-7,1 x6 + 8jc5 + 0,4jc4 + 0,2jc3 + 0,6jc2 + 0,1x + 71 jc6 + 3jc5-2jc4 + 9jc3-8jc2 + 7;c + 1,2 jc6 + 0,3jc5-0,2jc4 + 0,9jc3-0,8jc2 + 0,7jc+12 jc6-0,3jc40,2jc4-0,9jc3 + 0,8jc2-0,7jc-12 jc6 + 3jc5-0,3jc4 + 9jc3-0,3jc2 + 7jc + 0,5 x6-0,3x5 + 3^4-0,9jc3 + 3jc2-0,7x-5 jc6-3x5 + 0,3x4 + 0,9jc3 + 0,3x2 + 0,7jc+12 x6 + 5jc5-0,6jc4 + 8x3-0,1jc2-0,1jc+0,18 jc6 + 2jc5-3jc4 + 4jc3-5jc2 + 6jc+7 x6 + 7jc5-8jc4 + 9jc3-0,1jc2 + 0,2jc + 0,3 x6 + 9x5-8x4 + 7x3-6jc2 + 5jc+4 jc6 + 3jc5-2jc4 + 0,1jc3-0,2jc2 + 0,3jc + 0,4 jc6 + 0,3jc5-0,2jc4+10jc3-20jc2 + 3jc+40 30
Продолжение таблицы Номер варианта ЛМ 29 30 jc6 + 0,7jc5-0,8jc4-0,9jc3 + 0,1*2-0,3* + 4,5 Лабораторная работа 5 РЕШЕНИЕ НЕЛИНЕЙНОЙ СИСТЕМЫ МЕТОДОМ ПРОСТЫХ ИТЕРАЦИЙ Рассмотрим произвольную нелинейную систему уравнений в Rn. /2(x1? х2, ..., хп) = 0, fn(Xl> Х2-> •••? Хп) — 0, или в более краткой векторной форме .f(x) = 0, (1) здесь х = (хи х2, ..., хп), f=(/i,/2, ...,/„)• Метод простых итераций (метод последовательных приближений) решения системы (1) состоит в замене исходной системы эквивалентной ей системой х = Ф(х) и построении последовательности х<* + 1) = Ф(х<*>), (2) сходящейся при к^юо к исходному решению х* системы. Таким образом, данный метод является естественным обобщением метода простых итераций для одного уравненця. Близость последовательных приближений (итераций) х(к) к точному решению х определяется по-разному для разных норм вектора (см. лабораторную работу 8). Нетрудно показать [1 ], что где £ — точка, лежащая между точками я-мерного пространства x(fc + i> и х на прямой, соединяющей эти точки. Из этого равенства видно, что сходимость итераций определяет- II дФ« II ся свойствами матрицы производных — и имеет место, если ка- 31
Mij = max кая-либо ее норма, согласованная с нормой вектора, меньше единицы. На практике рассматривают матрицу ГдФ\ Kdxj) Норма этой матрицы мажорирует соответствующие нормы матрицы производных. Поэтому достаточным условием сходимости является условие || Mtj \\ < 1. Для различных норм матрицы (см. лабораторную работу 8) это условие принимает разные формы: £м£,<1, t ми<1 или I Mfj<\. i=l j=l i,j=l Поскольку в конечномерном пространстве все нормы матриц эквивалентны, из сходимости итераций в одной норме следует сходимость во всех остальных. Нулевое приближение в случае п = 2 можно выбрать графически, изобразив в плоскости (х1? х2) кривые fi(xl9 x2) = 0 и f2(xl9 х2) = 0 и определив приближенно точки их пересечения. Описанный алгоритм реализован программой SITERS(n, x, xO, f, epsk, ier). В программе SITERS итерации заканчиваются**, когда It Ик)-*|*+1))2<е- v i=1 За приближенное значение решения принимаем х* = х(к). Если нарушается условие монотонного убывания величины £ (х<*>-*<'+1>)2, i = l программа считает нарушенным условие сходимости: subroutine SITERS (nrxrxOrfrepsrkrier) с Программа SITERS решает нелинейную.систему x=f(x) * с методом простых итераций * с с хО - массив размерности пг содержащий начальное * с приближение * с f - имя подпрограммы, вычисляющей правые части * с п - количество уравнений * с eps - погрешность вычислений * с к - количество итераций * с ier - код завершения * с ier=0 нормальное завершение * с ier=l отображение не является сжимающим * *] При медленной сходимости использование этого критерия может привести к завершению итерационного процесса задолго до достижения корня. С другими критериями окончания итераций можно познакомиться в специальной литературе (см., например, [14]). 32
с * с Результат: * с х - йассив, содержащий решение системы * dimension x(l)rxO(l) del = l.e+10 ier = О к = О 1 к = к+1 do 2 i=l,n x(i) = xO(i) 2 continue с с вычисление правых частей уравнений системы с call f(x,xO) s = 0. do 3 i=l,n s = s + (x(i) - x0(i))"2 3 continue с с проверка условий сходимости с if(s/del.gt.l.) go to 4 del = s s = sqrt(s) с с проверка достижения точности с if(s.gt-.eps) go to 1 с return 4 ier = 1 ! нарушены условия сходимости с return end Задание. Найти решение системы f(x) = О с помощью программы SITERS методом простых итераций. Порядок выполнения лабораторной работы 1. Найти нулевое приближение решения. 2. Преобразовать систему f(x) = 0 к виду х = Ф(х). / 3. Проверить условие сходимости метода. 4. Составить головную программу, содержащую обращение к SITERS. J'5. Провести вычисление на ЭВМ. Пример. Решить методом простых итераций систему (\n(y/z)+l-x = 0, i 10z2-10j>-20jc2 + 4 = 0, [jcy-20z + 40 = 0. 2-187 33
В качестве нулевого приближения выберем точку х=19 у = 2.2, 2. Преобразуем систему к виду x = ln(y/z)+l, y = 0A + z2-2x2, z = 2 + 0.05xy. Программа решения задачи может иметь следующий вид: external f ! описание внешней п/п dimension х(3), х0(3) ! описание массивов data xl /1., 2.2, 2./ ! нулевое приближение с с обращение к программе SITERS call SITERS (I, x, xO, f, 0.001, k, ier) с if(ier.ne.O) print */отобр.не явл.сжимающим' с с печать результатов ; с do 1 1-1,3 write(3,2) i,x(i) 2 format (lx, ,x(,,i2,,)=,,f7.2) 1 continue write(3,*) 'количество итераций ' ,k stop end subroutine f(x.xl) с Подпрограмма вычисления правых частей системы с x-f(x) с х - массив, содеожащий значения аргумента с xl - массив, содержащий значения правых частей dimension x(3),xl(3) xl(l) - alog(x(2)/x(3)) + 1. xl 2 * 0.4 + х(3)"2 - 2.'х(1)"2 х1(3) - 2. + х(1)*х(2)/20. return end В результате вычисления на ЭВМ получим х( 1)- 1.1132 х( 2)= 2.3718 х( 3)= 2.1365 количество итераций
f sin(jc+l)-.y=l,2, 1 2x + cos.y = 2. Г sin x+2y = 2, 3. < Uos(^-1) + jc = 0,7. sin(jc+0,5)-.y=l, cos(j>-2) + ;t = 0. sinA'(x— 1)= 1,3—j>, jc-sin(v+l) = 0,8. cos(jc+0,5)-.y = 2, s\ny — 2x = 1. Варианты заданий cos(x-\)+y = 0,5, sin(j>+l) — x=\,2, 2y+cos x = 2. -{ {sin v + 2jc = 2, cos(jc-l)+.y = 0,7. sin(.y + 0,5)-jc=l, cos (л:—2)+y = 0: f sin(.y-l) + x=l,3, 17. < t^-sin(jc+l) = 0,8. 19. 21. 23. 25. cos(.y+0,5)-;t = 2, sinjc—2y — l. sin(x+l)-j>=l, 2jc+cosj> = 2. sin x+2y=l,6, cos(j>— 1)4-jc= 1. sin (jc+0,5) -_y=l,2, cos(.y-2) + jc=0. {cos x- 6. cosj> = 3. cosx+y = 1,5, 2jc-sin(j>-0,5)=l. cos(jc+0,5)+.y = 0,8 smy—2x= 1,6. 2y-cos(jc+l) = 0, (.* + sinj> = —0,4. 10, 12. 14. 16. sin(jc+2)-.y=l,5, {sin l cos(.y-2)=0,5. cos(j>-1)+jc=0,5, y — cosjc = 3. cosj> + x=l,5, 2y-sin(jc-0,5)=l. f cos(.y+0,5)+jc=0,8 I sin x—2y=l,6. 2jc-cos(^+1) = 0, 20 22. 24. sin;c= —0,4. sin(.y + 2)-jc=l,5, j> + cos(jc-2) = 0,5. cos(jc-l)+.y = 0,8, {cos x- cosj> = 2. cos ;*:+>> = 1,2, 2jc-sin(j>-0,5) = 2. cos(jc+0,5)+.y=l, [cos(jc+0,5)+. 26. < I sinj> —2jc = 2. 35
27. {cos sin(jc—1)+>>=1,5, x—sin(j>+l)=l. cos(.y-l) + jc=0,8, cosjc=2. 28. < 30. < sm(y+\)-x=\, 2y + cosjc = 2. cos(jc— 1)+j>=1, sinj> + 2jc=l,6. Лабораторная работа 6 РЕШЕНИЕ СИСТЕМЫ НЕЛИНЕЙНЫХ УРАВНЕЩ1Й МЕТОДОМ НЬЮТОНА Рассмотрим систему п нелинейных уравнений с п неизвестными fi{xu •••> хн) = 0, fn{xu ..., хп) = 0 или в векторной форме f(x) = 0, (Г) где f= Основная идея метода Ньютона состоит в выделении из уравнений системы линейных частей, которые являются главными при малых приращениях аргументов. Это позволяет свести исходную задачу к решению последовательности линейных систем. Пусть известно некоторое приближение х(к) корня х*. Тогда поправку Дх = х* — х{к) можно найти, решая систему f(x(fc) + Ax) = 0. Для определения Ах разложим векторную функцию f в ряд по Ах. Сохранив только линейные по Ах части, получим "Л" L/-J , х = ~*1~ -*■_ [£] Ах = 36
Здесь через Если det df_ обозначена матрица производных |_dxj dxj ^0, то Дх=- — f, где — —матрица, df_ обратная матрице производных. Таким образом, последовательные приближения корня можно вычислять по формуле Х(* + 1) = Х(*) + Дх«0 Отсюда видно, что метод Ньютона решения системы (1) состоит в построении итерационной последовательности: Х(* + 1) = Х(*)_Г|Л Т цх(к)у (2) Если det — \ф0, то в достаточно малой окрестности корня х* итерационный процесс (2) сходится, причем с квадратичной скоростью, т.е. если || х(к + 1) — х(к) || <е, то || х{к + 1) — х* \\ »е2«:е. Поэтому в качестве критерия окончания итерационного процесса можно использовать условие || х(к_1) — х(к) ||2<е. Если начальное приближение выбрано удачно, то метод Ньютона сходится очень быстро. Для решения системы нелинейных уравнений методом Ньютона предназначена подпрограмма NEWTS (n, x, f, g, eps, k): subroutine NEWTS (n,x,ffgfepsfk) с Программа NEWTS решает нелинейную систему уравне- с ний т(х)«0 методом Ньютона с с п - количество уравнений с х - массив размерности п, содержит начальное приближе- с ние с f - имя подпрограммы, вычисляющей функции f(x) с g - имя подпрограммы, вычисляющей матрицу производных с eps - погрешность с с Результат: с х - массив содержащий решение системы с к - количество выполненных итераций с* real хШ ,y(10),a(100),xl(10) dimension 1(10),m(10) k = 0 ! инициализация счетчика итераций 1 do 2 j=l,n ! пересылка нулевого приближения xl(j) = x(j) 37
2 continue call f(n,xl,y) с с вычисление матрицы DF/DX и обратной к ней с call g(n,xl,a) call nrinv(a,n,d,1,m) с с вычисление очередного приближения с do 3 j-=l,n x(j) = xl(j) do 3 1-l,n nk = j+n*(i-l) x(j) - x(j) - a(nk)*y(i) 3 continue с с вычисление погрешности с s = 0. do 4 j=l,n s - s+ (x(j) - xl(j))"2 4 continue с k = k + 1 ! подсчет числа итераций с с проверка условия достижения точности с if(s.gt.eps) go to 1 с return end Программу можно использовать для решения систем не выше десятого порядка. Входные параметры: п — число уравнений системы (совпадает с числом неизвестных), n<lG; х — массив из п действительных чисел, содержанщй перед обращением к NEWTS начальное приближение решения; f—имя внешней подпрограммы (subroutine) f (n, x, у), вычисляющей по заданным значениям х, расположенным в элементах массива х, текущие значения функции f и размещающей их в элементах массива у; g—имя внешней подпрограммы (subroutine) g(n, x, d), вычисляющей по заданным И- значениям х из массива х элементы матрицы — , которая 1дхА размещается в массиве d размерности nxn; eps — значение 8 из условия окончания итерационного процесса. Выходные параметры: х — массив из п действительных чисел (он же входной) содержит при выходе из NEWTS приближенное значение решения; к—количество итераций. 38
Подпрограмма NEWTS содержит обращение к подпрограмме (subroutine) MINV, обращающей матрицу — . Численное обращение матрицы — это важная и трудная проблема вычислительной математики. Разработано большое число алгоритмов численного обращения матриц. В лабораторной работе 9 будет рассмотрен один из них. Здесь же для обращения матрицы используется стандартная программа MINV, построенная на алгоритме гауссова исключения. Текст программы MINV приведен в приложении. Перед обращением к программе NEWTS необходимо: 1) составить подпрограмму f(n, x, у) для вычисления f (х); 2) составить подпрограмму g(n, x, d) для вычисления элемен- ГаЛ тов матрицы [£} 3) описать в головной программе имена f и g оператором external; 4) присвоить фактические значения параметрам х, eps, n. Задание. Используя программу NEWTS, решить систему нелинейных уравнений. Порядок выполнения лабораторной работы 1. Определить из геометрических соображений начальное приближение решения. 2. Составить подпрограммы f и g для вычисления значений "[!} 3. Составить головную программу, содержащую описание массива х, имен f и g, присвоение фактических значений параметрам n, x, eps, обращение к NEWTS и печать результатов. 4. Провести вычисления на ЭВМ. Пример. Решить систему уравнений у-ех = 0. А Из геометрических соображений ясно, что решение системы лежит в прямоугольнике 0^x^0.5, l^j>^1.5. Выберем в качестве 39
нулевого приближения вектор [0,5, 1,5]т. Матрица производных для этой системы легко находится: UJ |_-е" 1 } Программа решения задачи может иметь следующий вид: external frg ! описание внешних п/прогр. real x(2) с х(1) = 0.5 ! нулевое приближение х(2) = 0.5 eps = 0.001 ! погрешность вычислений с с обращение к программе NEWTS с call NEWTS (2, xr f, g, epsr k) print l,x,k ! печать результатов 1 format(2xrrpetiJ.CHCTembi x(l)= r,el2.5/13x, r х(2) = \е12.5/2хггкол.итераций'^3) stop end subroutine f(nrxry) с Подпрограмма вычисления функций f(x) * с с п - количество уравнений * с х - массив размерности пг содержит значения аргументов * с у - массив размерности пг содержит значения функций * с . ' '• real x(l)ry(l) у(1) = х(1) - ехр(-х(2)) у(2) = х(2) - ехр(х(1)) return end subroutine g(nrx,d) c„,„ „„„„„„„„„„„„„„„„„„„ + „„„„„ •**•••• с Подпрограмма вычисления матрицы производных df/dx * с с п -• количество уравнений (переменных) * с х - массив размерности пг содержит значения аргументов * с d - массив размерности n*nr содержит элементы матрицы * с производных, расположенные по столбцам: * real x(l)rd(l) d(D = 1. d(2) =-exp(x(l)) 40
d(3) = exp(-x(2)) d(4) = 1. return end В результате вычисления по программе получены следующие результаты реш.системы х(1)« .27223Е+00 х(2)« .130906Е+01 кол.итераций 4 Варианты 1. tg(xy + 0,4) = x2, f tg(Jcy + jo,6x2 + ftg( I 0,8 11. 2y2 = \, x>0,y>0. tg(xy + 0,\) = x2, x2 + 2y2=\. tg(xy + 0,3) = x2, 0,9jc2 + 2j>2=1. ,8jc2 + 2^2=1. tg(xy) = x2, 0,7jc2 + 2>>2=1. tg(xy + 0,2) = x2, 0,6jc2 + 2j>2=1. tg(xy + 0,4) = x2, 8jc2 + 2j>2=1. tg(xy + 0,l) = x2, 0,9x2 + 2.y2=l. Г tg(jcy + 0,l) = Jc2, [0,5x2 + 2y2=\. (tg(x-y)-xy = 0, ' \x2 + 2y2=\. Г tg(xy + 0,2) = x2, U2 + 2.y2=l. I 0,8 15. задании 2. jc2+.y2=l, x>0,^>0. sin (*+>>) — 1,6jc = 0, x2+y2=\ sin(x+y)- x2+y2=\ s\n{x+y)- x2+y2=\ s\n(x+y)- -1,2jc = 0,2, -1,3jc = 0, -1,5jc = 0,1, 10. ,,{ 14. . x2+y2-- s\n(x+y) x2+y2 = sin(x+y) x2+y2 = sin(x+y) x2+y2 = ,{ sin (x + j>)—1,4.x = 0, x2+y2-- 18. 20. 22. -1,2jc = 0,1, = l,2x-0,l, 1,5jc-0,1, sin(jc+j>)=l,ljc+0,l, x2+y2-- sin(jc—y) — xy= — 1, x2-y2 = 0J5. sin (*+>>)—1,5jc = 0, x2+y2=\. 41
tg(xy) = x2, С sin(x+y) = l,2x-0,2, 23. < „ 24. [0,5jc2 + 2.y2=l. "" (. jc2-h^2= 1. Г tg(jcy + 0,l) = *2, f sin(x+.y)= 1,5jc+0,2, 25. < „ „ 26. ; 1 0,7jc2 + 2^2=1. ' \x2+y2 = \ 27. { V ' 28. ' 0,6jc2 + 2y2 = l. (. jc2-h^2= 1. f tg(xj> + 0,3) = *2, зо (sin{x+y)-\ Лабораторная работа 7 РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ГАУССА Методом Гаусса называют точный *) метод решения невырожденной системы линейных уравнений, состоящий в том, что последовательным исключением неизвестных систему л £ aijXj = bi, /=1, 2, ..., п, приводят к эквивалентной системе с треугольной матрицей Х1 + ^12*2 + ••• + С1пхп = "1> х2 +... + с2пхп = а2, х =d решение которой находят по рекуррентным формулам л Xi = dt- X с****> '*и = 4п / = л-1, л-2, ..., 1. Существует много вариантов этого метода. Рассмотрим схему с выбором главного элемента. Пусть исходная система имеет вид *} Метод численного решения задачи относят к классу точных методов, если в предположении отсутствия округлений с его помощью можно получить точное решение в результате конечного числа арифметических и логических операций. 42
a11x1 + ... + alnxn = b1, О) anlx1-b...-\-annxn = bn. Предположим, что Яцт^О, и разделим обе части первого уравнения системы на Лц. В результате получим *1+*12*2 + .~+Ь1п*п = Ь(£\ (2) где b1j = aljjalu 7 = 2, 3, ..., b{l) = b1la11. С помощью уравнения (2) исключим во всех уравнениях системы (1), начиная со второго, слагаемые, содержащие х±. Для этого умножаем обе части уравнения (2) последовательно на а21, Лзь •••> яИ1 и вычитаем соответственно из второго, третьего, ..., я-го уравнения системы (1). В результате получаем систему, порядок которой на единицу меньше порядка исходной системы: a<&x2 + ..:+a<ftxn = b<}\ "и2Х2Т...+«ииЛя-(?и , где afi^aij-anbij, i,j=2, 3, ..., п, b{il) = bi-anbu /=2, 3, ..., л. Аналогично преобразуем полученную систему. В результате кратного повторения этого преобразования получим систему с треугольной матрицей Xi~\-C12X2-\- ...-\-ClnXn = d1, X2 + C23X3 + ... + C2nXH = d2, (3) хп йп, которая эквивалентна системе (1) и легко решается. В самом деле, из последнего уравнения находим хп, подставляя хп в предпоследнее уравнение, найдем хп-1, затем хи_2 и т. д. до xl9 которое находим из первого уравнекия системы, когда уже известны хп, хп^1, хп-2, ..., х2. Таким образом, вычисления по методу Гаусса распадаются на два этапа: на первом этапе, называемом прямым ходом метода, исходную систему преобразуют к треугольному виду. На втором этапе, который называют обратным ходом, решают треугольную систему (3). эквивалентную исходной. Коэффициенты яп, а^22\ я(32з\ ... называют ведущими элементами метода Гаусса. На каждом шаге предполагалось, что tfj&_1)#0. Если окажется, что это не так, то в качестве ведущего элемента можно использовать любой другой ненулевой коэффициент системы. Однако если коэффициент я&_1М0 мал, то после деления на этот элемент и вычитания к-то уравнения из 43
последующих возникают большие погрешности округления. Чтобы избежать этого, на каждом этапе уравнения переставляют так, чтобы на главной диагонали оказался наибольший по модулю элемент к-го столбца. Если матрица системы хорошо обусловлена *\ то в методе Гаусса с выбором главного элемента погрешйости округления невелики. Одновременно с решением системы можно найти определитель матрицы системы. Нетрудно убедиться, что определитель матрицы системы равен произведению ведущих элементов, т.е. Лц a^l ... яЙГ1^ Описанный алгоритм реализован в виде подпрограммы: subroutine SIMQ (a,b,n,ks) с Программа SIMQ решает линейную систему уравнений * с вида ах-b методом Гаусса * с с п - размерность системы * с а - массив размерности п*п содержит матрицу системы, * с записанную по столбцам: а(1) - all, а(2) « а21... * с b - массив размерности п содержит правые части * с * с Результат: * с b - решение системы * с ks - признак выхода: * с ks-О - решение найдено * с ks-1 - решения нет * с dimension a(l),b(l) tol - 0.0 ks - 0 jj - -n do 65 j-l,n ! выбор ведущего элемента jy - J + 1 i j - jj + n + 1 Iga - 0. it * jj-j do 30 1 - j,n ij - It + 1 aa - abs(a(ij)) 1f(abs(biga -aa) 20,30,30 20 biga - a(ij) imax - i 30 continue с 1f(abs(b1ga)-tol) 35,35,40 ! проверка разрешимости 35 ks-1 return с 40 il - j + n*(j-2) it - imax-j *} Матрица А плохо обусловлена, если малые изменения ее элементов приводят к существенным изменениям элементов матрицы А'1. Более подробно об обусловленности см. в лабораторной работе 10. 44
50 с с 55 с do 50 к - jrn il - il + n 12-11 + it save - a(il) a(11) - a(i2) a(i2) - save a(il) - a(1l)/biga save - b(imax) bfimax) - b(j) b(j) - save/biga if(j-n) 55,70,55 iqs - n'(j-l) ! гауссово исключение с с do 65 1х - jy,n ixj - iqs + ix it * j-ix do 60 jx - jy,n ixjx - n*(jx-l) + ix jjx - ixjx + it 60 a(ixjx) - a(ixjx) - (a(ixj)'a(jjx)) 65 b(ix) « b(ix) - (b(j)'a(ixj)) 70 ny » n-1 it - n*n ! обратная подстановка do 80 ky - l,ny ia - it-ky ib * n-ky 10 - n do 80 k - lfky b(1b) - b(1b)-a(ia)4>(i0) ia - ia-n 80 iO - i0-l return end Входные параметры: n — целое положительное число, равное порядку п системы (1); а — массив из пхп действительных чисел, содержащий матрицу коэффициентов системы (1) (а(1) = я11? а(2) = я21, ..., а(п) = яи1, а(п+1) = я12, ..., a(nxn) = fl„„); b —массив из п действительных чисел, содержащий столбец свободных членов системы (1) (b(l) = 61? Ь(2) = 62, •••> Ь(п) = 6и). Выходные параметры: b — массив из п действительных чисел (он же входной); при выходе из программы содержит решение системы (1) Ь(1) = х1? Ь(2) = х2, •••> b(n) = x„; ks — признак правильности решения (код ошибки): если ks = 0, то в массиве b содержится решение системы (1), если ks= 1, исходная система не имеет единственного решения (определитель системы равен нулю). 45
Перед обращением к Ьодпрограмме SIMQ необходимо: 1) описать массивы а и Ь. Если система содержит п уравнений, то массив а должен содержать п2 элементов, а массив b — п элементов; 2) присвоить значение параметру п. который равен числу уравнений системы; 3) присвоить элементам массивов а и b значения коэффициентов системы следующим образом: а(1) = д11? а(2) = д21? я(3) = я31, •••> а(п) = ап1, а(п+1) = я12, а(п + 2) = я22, а(пхп) = яии, Ь(1) = 61? Ъ(2) = Ь2, ..., Ъ(п) = Ьп; 4) проверить соответствие фактических параметров по типу и порядку следования формальным параметрам подпрограммы SIMQ. Параметры а и b — величины вещественного типа, п и ks — целого типа. Задание. Используя программу SIMQ, решить заданную систему трех линейных уравнений. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к SIMQ и печать результатов. 2. Произвести вычисления на ЭВМ. Пример. Решить систему уравнений х^ —х$ = 2, Х± +2л:2 -\- х$ = о. А Программа решения этой системы с использованием SIMQ может иметь следующий вид: dimension a(9),b(3) data a / 1., 1., 1., ! ввод матрицы системы 1., 0., 2., 1..-1., 1./ data b/6.,-2.,8./ ! ввод правых частей с с обращение к программе SIMQ с call SIMQ (a, b, 3, ik) print 2,b,ik ! печать результатов format(2x/ x(l)«\el3.6, x 2 -\el3.6, »\el3.6/ Vx(3. 2x/признак выхода \i2) stop end 46
Вычисления по программе привели к следующим результатам: Х(1)= .100000Е + 01 Х(2)= .200000Е + 01 Х(3)= .300000Е + 01 признак выхода О Варианты заданий Решить систему линейных уравнений вида Ах = Ь Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 Матрица 1,84 2,32 1,83 2,58 1,32 2,09 2,18 2,17 3,15 1,54 3,69 2,45 1,53 2,35 3,83 2,36 2,51 2,59 3,43 4,17 4,30 3,88 3,00 2,67 3,40 2,64 4,64 2,53 3,95 2,78 2,16 3,55 4,85 2,69 2,73 2,93 3,72 4,47 4,96 коэффициентов 2,25 2,60 2,06 2,93 1,55 2,25 2,44 2,31 3,22 1,70 3,73 2,43 1,61 2,31 3,73 2,37 2,40 2,41 3,38 4,00 4,10 3,78 2,79 2,37 3,26 2,39 4,32 2,36 4,П 2,43 1,96 3,23 4,47 2,47 2,39 2,52 3,47 4,10 4,53 системы А 2,53 2,82 2,24 3,13 1,58 2,34 2,49 2,49 3,17 1,62 3,59 2,25 1,43 2,07 3,45 2,13 2,10 2,06 3,09 3,65 3,67 3,45 2,39 1,96 2,90 1,96 3,85 1,93 3,66 1,94 1,56 2,78 3,97 2,07 1,92 2,02 3,06 3,63 4,01 Столбец свободных членов Ь -6,09 -6,98 -5,52 -6,66 -3,58 -5,01 -4,34 -3,91 -5,27 -1,97 -3,74 -2,26 -5,13 -3,69 -5,98 1,48 1,92 2,16 5,52 6,93 7,29 10,41 8,36 7,62 13,05 10,30 17,89 12,66 21,97 13,93 13,16 21,73 29,75 19,37 19,43 20,80 30,74 36,80 40,79 47
Продолжение таблицы Номер варианта 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Матрица 4,35 4,04 3,14 4,07 2,84 4,99 3,19 4,43 3,40 2,57 4,47 4,89 2,83 3,00 3,72 3,78 4,33 4,76 4,59 4,83 4,06 4,56 3,21 4,58 3,75 4,18 4,43 2,95 5,П 4,38 2,93 3,47 4,78 3,74 4,02 4,18 4,07 5,30 5,11 4,90 3,79 4,01 4,25 3,86 5,40 3,35 коэффициентов 4,39 3,65 2,69 3,79 2,44 4,50 2,89 4,02 2,92 2,26 4,03 4,40 2,50 2,55 3,21 3,44 3,88 4,24 4,24 4,36 3,53 4,20 2,73 4,04 3,39 3,70 3,88 2,58 4,62 3,82 2,55 2,98 4,22 3,36 3,51 3,61 4,28 4,79 4,54 4,50 3,27 3,43 3,84 3,34 4,82 2,94 системы А 3,67 3,17 2,17 3,37 1,95 3,97 2,47 3,53 2,40 1,84 3,57 3,87 2,08 2,07 2,68 3,02 3,39 3,71 3,82 3,88 3,01 3,78 2,25 3,52 2,97 3,22 3,36 2,16 4,14 3,30 2,14 2,50 3,70 2,94 3,04 3,09 3,87 4,32 4,03 4,09 2,81 2,91 3,43 2,87 4,30 2,53 Столбец свободных членов b 40,15 36,82 28,10 40,77 27,68 49,37 33,91 47,21 32,92 28,66 50,27 55,03 33,28 33,59 43,43 46,81 53,43 58,73 59,54 62,33 52,11 61,86 42,98 61,67 53,38 59,28 62,62 44,16 46,68 65,34 46,41 54,78 75,81 63,26 67,51 70,03 84,43 95,45 91,69 94,18 71,57 75,45 86,07 77,12 108,97 70,69 48
Продолжение таблицы Номер варианта 30 Матрица коэффициентов системы А 5,41 4,88 4,41 3,88 3,30 2,78 3,05 2,64 2,23 4,14 3,61 3,14 5,63 5,03 4,52 Столбец свободных членов Ъ 115,38 81,07 67,17 91,43 125,40 Лабораторная работа 8 РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ПРОСТЫХ ИТЕРАЦИЙ Методы решения задач линейной алгебры можно разделить на точные и итерационные. Метод решения задачи относят к классу точных, если в предположении отсутствия округлений с его помощью можно получить точное решение задачи в результате конечного числа арифметических и логических операций, т. е. прямые методы относятся к классу точных методов. В работе 7 был рассмотрен точный метод — метод исключения Гаусса с выбором главного элемента. Ниже приведены некоторые другие методы этой группы. Точные методы применяют для решения линейных систем относи!ельно невысокого порядка (до 103). Для решения систем большей размерности (103—106) используют итерационные методы *\ Они хороши для систем с разреженными матрицами. Такие системы имеют место, например, при решении разностными методами уравнений с частными производными эллиптического типа. Рассмотрим простейший итерационный метод решения линейных систем — метод простых итераций, называемый иногда методом последовательных приближений. Он состоит в том, что система уравнений Cx = d (1) преобразуется к виду х=Ъ+Ах (2) и ее решение вычисляется как предел последовательности х<*+1) = Ь + Лх(к). (3) *] Для решения очень больших систем (порядок которых больше 106) используют специальные методы, которые здесь не рассматриваются. 4 3045 49
К виду (2) систему можно привести, например, выделив диагональные элементы: xi = -(di-YJcijxj), /=1, 2, ..., п. Cii }Фг Чтобы записать достаточное условие сходимости метода, напомним определения норм, наиболее употребляемых при исследовании линейных систем. Если в пространстве векторов х = (х1? х2, ..., хп) введена норма ||х||, то согласованной с ней нормой в пространстве матриц называют величину II Л\\ МХП МП = sup—-. хФО \W\ Например, л если ||х|| = max |xf|, то ||л(||=тах £ |я1;|; л л если ||х||=£|х4|, ТО МИ = max £ |ау|; ,= 1 1<К«(=1 если ||х||= /Ц*,|2, то М||=£ 2г4т- Для сходимости итераций в методе (3) достаточно выполнение условия ||Л|| <1. При использовании различных матричных норм достаточные условия сходимости итераций имеют следующий вид: тах£Й<1; или maxX^Ul, или ££J^<1, т. е. последовательность (3) сходится для матриц, у которых диагональные элементы велики по сравнению с внедиагональ- ными. Итерации сходятся тем скорее, чем меньше \\А\\. Очередное приближение в методе простых итераций вычисляется по формуле tf+1)-£(4-I<vtf)) '-!.-.«. *Г+1,=f ( 4" I cyxf ), i= 1, ..., и, (4) где А; = 0, 1, ... — номер очередного приближения к решению. Небольшое усовершенствование алгоритма позволит ускорить сходимость итераций. Из формулы (4) следует, что к моменту вычисления (fc+l)-ro приближения для /-го компоненты решения уже вычислены (fc+l)-e приближения компонент с меньшими номерами: 1, 2, 3, ..., i—1. Если учитывать эти уточненные значе- 50
ния для каждой последующей компоненты решения, то получим итерационный метод Зейделя xri)=-U-j:ctjxf+»- i cijXf\ /=i, ...,„. (5) Cii\ 7=1 7 = 1 + 1 / Необходимое и достаточное условие сходимости метода Зейделя отлично от условия сходимости простых итераций. Метод простых итераций на практике используется не часто. Лучшие итерационные методы основаны на специальных способах преобразования системы (1) к виду (2), при которых \\А\\ в некотором смысле минимальна. Алгоритм простых итераций реализован программой LIS, а алгоритм Зейделя — программой LISS. Итерационный процесс в программах LIS и LISS заканчивается *\ когда ||x» + 1>-x(*>||/||x(t + 1>||<6, где е>0, ||х|| =y/Y,\xi\2- Приближенное значение решения полагаем равным х<к + 1). В качестве нулевого приближения программа выбирает вектор Ь: subroutine LIS (nfafbfxfepsfxlfk-) с Программа LIS решает линейную систему Х=В+АХ * с методом простых итераций * с * с п - размерность системы * с а - массив размерности п*п, содержащий элементы * с матрицы А * с b - массив размерности п, содержащий элементы вектора В* с х - массив размерности пг содержащий решение системы * с xl - рабочий массив размерности п * с eps - малое число для условия окончания итерационного * с процесса * с к - количество выполненных итераций * dimension a(l)rb(l)r х l).xl(l) k = О с загрузка нулевого приближения do 1 i - lfn x(i) -b(1) 1 continue с начало очередной итерации 1000 k - k + 1 do 3 i = l,n xl(i) - 0. *} Заметим, что при медленной сходимости использование этого критерия может привести к завершению итерационного процесса задолго до достижения корня. С другими критериями окончания итераций можно познакомиться в специальной литературе (см., например, [14]). 51
вычисление очередного приближения do 2 j = lrn ik - (j-l)*n + i 2 xl(i) - xl(1) + a(ik)'x(j) 3 xl(i) - b(i) + xl(i) dk = 0. sk - 0. вычисление нормы разности последовательных приближений do 4 i - l,n dk - dk + (x(i) - xl(i))"2 sk - sk + xl(i)**2 ! вычис 52 вычисление нормы d - sqrt(dk/sk) ! приближенного решения с do 5 i = lrn 5 x(i)=xl(i) с if(d.gt.eps) go to 1000 ! проверка условия окончания return ! итерационного процесса end subroutine LISS (nfafbfxfepsfxlfk) c**,*,**,************ *,****„„„„„„„„„«*,„„„„„„ с ' Программа LISS решает линейную систему Х=В+АХ * с методом Зейделя * с с п - размерность системы * с а - массив размерности п*п, содержащий элементы * с матрицы А * с b - массив размерности п, содержащий элементы вектора В* с х - массив размерности п, содержащий решение системы * с xl - рабочий массив размерности п с eps - малое число для условия окончания итерационного * с процесса * с к - количество выполненных итераций с, dimension а(1),Ь(1), xd).xl(l) к = 0 с загрузка нулевого приближения do 1 i = lrn х(1) - b(1) 1 contihue с с начало очередной итерации с 1000 к = к + 1 do 3 i = l,n х 1 (i) = 0. sk = 0. dk - 0. с вычисление очередного приближения do 2 j = l,n ik = j - l)'n + i 2 xl(i) - xl(i) + a(ik)*x(j) xl(i) - b(1) + xl(i) sk = sk + xl(i)**2 dk = dk + (x(i) - xl(i))**2 ..**** *******************************************************
3 x(i) - xl(i) с d - sqrt(dk/sk) с проверка условия окончания итераций if(d.gt.eps) go to 1000 с return end Входные и выходные параметры программ LIS и LISS и правила обращения к ним совершенно одинаковы. Входные параметры: п — число уравнений системы; а—массив размерности пхп, содержащий элементы матрицы А, записанные по столбцам: а((/— l)xn-\-i): = aij*); массив b размерности п, содержаищи координаты вектора b; eps — значение г из условия окончания итераций; xl—рабочий массив размерности п. Выходные параметры: х — массив размерности п, содержит вычисленное приближенное значение решения, к — число итераций. Перед обращением к программе LIS необходимо: 1) описать в головной программе размерности массивов а, Ь, х, xl; 2) присвоить фактические значения параметрам n, a, b, eps. Задание. Решить систему Cx = d методом простых итераций, используя программу LIS, и методом Зейделя, используя программу LISS. Порядок выполнения лабораторной работы 1. Проверить выполнение достаточного условия сходимости. 2. Преобразовать систему к виду х = Ь + Ах, ||А||<1. 3. Составить головную программу, содержащую описание массивов а, Ь, х, xl, присвоение фактических значений параметрам n, a, b, eps, обращение к LIS и LISS и печать результатов. 4. Провести вычисления на ЭВМ, сравнить количество итераций для обоих Методов. Пример. Решить методом простых итераций систему г 100*!+ 6*2- 2*3 = 200, < 6*! +200х2- 10*3 = 600, *!+ 2*2+100*з = 500. *} Здесь символ := означает, что элемент матрицы atj засылается в элемент массива а с номером (у— 1)л + /. 53
Преобразуем систему к виду Xl =2-0.06*2 + 0.02*3, J x2 = 3-0.03jc! + 0.05jc3, Хз = 5-0.01*1 + 0.02*2. Легко видеть, что достаточное условие сходимости 3 ||А ||= max У |я»| = 0.08<-1 выполнено. Программа решения задачи может иметь следующий вид: dimension a(3v3)vb(3)vx(3)vxl(3)vx2(3) data a /0. , -0.03, -0.01, -0.06, 0. , 0.02, * 0.02, 0.05, 0. / ! ввод матрицы А data b /2. , 3. , 5. / ! ввод вектора В с с обращение к программе LIS, решающей систему методом с простых итераций с call LIS (3, a, b, x, 0.00001, xlr к) с с обращение к программе LISS, решающей систему с методом Зейделя с call LISS (3, a, b, x2, t).00001, xl, kl) с с печать результатов с do 1 i - 1,3 print 2,i,x(i),i,x2(i) 2 format(2x,,x(,,il,,)=,,el2.5,,x(,,il,,)=r,el2.5 1 continue с print *,' количество итераций ' print *, k, kl с stop end После вычислений на ЭВМ получен результат: х (1)- 0.19092Е+01 х (1) - 0.19092Е+01 х 2- 0.31950Е+01 х 2) = 0.31950Е+01 х (3)« 0.50448Е+01 х (3) * 0.50448Е+01 количество итераций 4 3
Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 .4000 -.0029 -.0055 -.0082 1.7000 .0000 -.0003 -.0005 3.0000 .ООП -.0005 -.0022 4.3000 .0100 .0037 -.0027 5.6000 .0147 .0087 .0028 6.9000 .0191 .0134 .0077 8.2000 .0234 .0179 .0124 9.5000 .0278 .0224 .0170 10.8000 .0321 .0268 .0215 12.1000 .0365 .0312 .0260 13.4000 .0408 .0356 .0304 14.7000 .0452 Матрица .0003 -.5000 -.0050 -.0076 .0003 .8000 -.0002 -.0004 .0038 2.1000 .0005 -.ООП .0217 3.4000 .0090 .0027 .0268 4.7000 .0150 .0090 .0319 6.0000 .0205 .0149 .0370 7.3000 .0260 .0205 .0422 8.6000 .0315 .0261 .0475 9.9000 .0369 .0316 .0528 11.2000 .0423 .0370 .0581 12.5000 .0477 .0425 .0635 13.8000 системы .0008 -.0018 -1.4000 -.0070 .0004 .0001 -.1000 -.0003 .0049 .0032 1.2000 -.0001 .0270 .0207 2.5000 .0080 .0331 .0271 3.8000 .0153 .0390 .0333 5.1000 .0220 .0451 .0396 6.4000 .0286 .0513 .0459 7.7000 .0351 .0576 .0523 9.0000 .0416 .0639 .0586 10.3000 .0481 .0702 .0650 11.6000 .0546 .0765 .0714 .0014 -.0012 -.0039 -2.3000 .0005 .0002 .0000 -1.0000 .0059 .0043 .0026 .3000 .0324 .0260 .0197 1.6000 .0393 .0334 .0274 2.9000 .0461 .0405 .0348 4.2000 .0532 .0477 .0422 5.5000 .0604 .0550 .0496 6.8000 .0676 .0623 .0570 8.1000 .0749 .0697 .0644 ' 9.4000 .0822 .0770 .0718 10.7000 .0896 .0844 Правая часть .1220 -.2532 --9876 -2.0812 .6810 .4803 -.0802 -1.0007 1.5136 1.4782 1.0830 .3280 2.6632 2.7779 2.5330 1.9285 4.0316 4.3135 4.2353 3.7969 5.6632 6.1119 6.2000 5.9275 7.5591 8.1741 8.4281 8.3210 9.7191 10.5000 10.9195 10.9775 12.1430 13.0897 13.6744 13.8972 14.8310 15.9430 16.6926 17.0800 17.7828 19.0599 19.9744 20.5261 20.9985 22.4406 55
Продолжение таблицы Номер варианта 13 14 15 16 17 18 19 20 21 22 23 .0400 .0349 16.0000 .0496 .0444 .0393 17.3000 .0539 .0488 .0437 23.8000 .0757 .0707 .0656 19.9000 .0626 .0576 .0525 21.2000 .0670 .0619 .0569 22.5000 .0714 .0663 .0612 23.8000 .0757 .0707 .0656 25.1000 .0801 .0750 .0700 26.4000 .0844 .0794 .0744 27.7000 .0888 .0838 .0788 29.0000 .0932 .0882 .0831 Матрица .0531 .0479 .0688 15.1000 .0585 .0534 .0741 16.4000 .0639 .0588 .1010 22.9000 .0909 .0858 .0849 19.0000 .0747 .0696 .0902 20.3000 .0801 .0750 .0956 21.6000 .0855 .0804 .1010 22.9000 .0909 .0858 .1063 24.2000 .0963 .0912 .1117 25.5000 .1017 .0966 .1171 26.8000 .1070 .1020 .1225 28.1000 .1124 .1074 системы 12.9000 .0610 .0829 .0777 14.2000 .0674 .0892 .0841 15.5000 .0739 .1212 .1161 22.0000 .1060 .1020 .0969 18.1000 .0867 .1084 .1033 19.4000 .0932 .1148 .1097 20.7000 .0996 .1212 .1161 22.0000 .1060 .1276 .1225 23.3000 .1124 .1339 .1289 24.6000 .1189 .1403 .1353 25.9000 .1253 .1467 .1417 27.2000 .1317 .0793 12.0000 .0970 .0918 .0867 13.3000 .1043 .0992 .0941 14.6000 .1414 .1363 .1313 1.1000 .1191 .1140 .1090 17.2000 .1265 .1215 .1164 18.5000 .1339 .1289 .1238 19.8000 .1414 .1363 .1313 21.1000 .1488 .1437 .1387 22.4000 .1562 .1512 .1461 23.7000 .1636 .1586 .1536 25.0000 .1710 .1660 .1610 26.3000 1 Правая часть 23.5195 24.2353 24.4781 26.0849 27.3281 28.2078 28.2215 29.9928 31.4001 32.4435 50.8968 53.4873 55.7118 57.5703 36.5001 38.5997 40.3345 41.7045 41.0351 41.2986 45.1968 46.7299 45.8340 48.2611 50.3226 52.0184 50.8968 53.4873 55.7118 57.5703 56.2234 58.9772 61.3645 63.3853 61.8139 64.7307 67.2806 69.4636 67.6682 70.7478 73.4601 75.8051 73.7864 77.0286 79.9030 82.4098 56
Продолжение таблицы Номер варианта 24 25 26 27 28 29 30 30.3000 .0975 .0925 .0875 31.6000 .1019 .0969 .0919 32.9000 .1062 .1013 .0963 34.2000 .1106 .1056 .1006 35.5000 .1150 .1100 .1050 36.8000 .1193 .1143 .1094 38.1000 .1237 .1187 .1137 Матрица .1278 29.4000 .1178 .1128 .1332 30.7000 .1232 .1182 .1386 32.0000 .1286 ,1236 .1400 33.3000 .1340 .1290 .1494 34.6000 .1394 .1344 .1547 35.9000 .1448 .1398 .1601 37.2000 .1502 .1452 системы .1531 .1481 28.5000 .1381 .1595 .1545 29.8000 .1445 .1659 .1610 31.1000 .1510 .1724 .1674 32.4000 .1574 .1788 .1738 33.7000 .1638 .1852 .1802 35.0000 .1702 .1916 .1866 36.3000 .1766 .1784 .1734 .1684 27.6000 .1859 .1809 .1759 28.9000 .1933 .1883 .1833 30.2000 .2007 .1957 .1907 31.5000 .2082 .2032 .1982 32.8000 .2156 .2106 .2056 31.1000 .2230 .2180 .2131 35.4000 Правая часть 80.1684 83.5730 86.6095 89.2778 86.8143 90.3811 93.5793 96.4090 93.7240 97.4528 100.8126 103.8034 100.8976 104.7881 108.3093 111.4610 108.3351 112.3871 116.0694 119.3819 116.0363 120.2497 124.0930 127.5660 124.0015 128.3760 132.3800 136.0134 Лабораторная работа 9 ОБРАЩЕНИЕ СИММЕТРИЧНОЙ ПОЛОЖИТЕЛЬНО ОПРЕДЕЛЕННОЙ МАТРИЦЫ МЕТОДОМ КВАДРАТНОГО КОРНЯ Если А—симметричная положительно определенная *> матрица, то существует действительная невырожденная нижняя треугольная матрица L, такая, что A=LU. *] Матрица А положительно определена, если скалярное произведение (х, Ах)>0 для всех ненулевых х. 57
На этом разложении *) (теорема о треугольном разложении Холецкого) основан предлагаемый метод обращения симметричной положительно определенной матрицы. Поскольку А-'^и)-1^1, обращение матрицы А осуществляется в два этапа. На первом этапе находят треугольное разложение матрицы А (вычисляют матрицу L). На втором этапе вычисляют элементы матрицы L"1, обратной к L. Так как j aij = 2^ likljki то легко получить формулы для вычисления элементов матрицы L. Имеем hi = Jaa- Z^' i=l> 2> -> "> 7-1 aij~ l_, hkljk Полагая последовательно /=1, 2, ..., л, вычисляем элементы матрицы L по строкам. Обозначим обратную матрицу L"1 через Р. Элементы обратной матрицы вычисляем по следующим формулам: y-i . Z hkPki Полагая последовательно /=1, 2, ..., п, вычисляем элементы матрицы L"1 по строкам. Так как матрица А'1 симметричная, то достаточно вычислить элементы, расположенные ниже главной диагонали. Для этого воспользуемся формулами и {аИ)-'={РтР)ц = ^Рк}Рк^ j=i, ..., л, /=1, 2, ..., п. Метод квадратного корня требует примерно п3/6 арифметических действий, он вдвое быстрее метода Гаусса для больших *} Представление матрицы А в виде произведения двух или большего числа матриц называется разложением (факторизацией) матрицы А. 58
п и требует вдвое меньше памяти. Метод полезен при решении интегральных уравнений Фредгольма с симметричным ядром, поскольку получаемая в этом случае линейная система имеет симметричную матрицу. Описанный алгоритм реализован программой MPSV: subroutine MPSV (a,n,ier) с Программа MPSV обращает симметричную положительно • с определенную матрицу А порядка п*п методом Холец- * с кого * с с Исходная матрица расположена в массиве а размер- * с ности п*(п+1), в его первых п столбцах (достаточ- * с но задавать элементы под диагональю ) * с Результат помещается на место исходной матрицы, * с последний столбец массива а используется как рабо- * с t ний массив * с ier - признак выхода: * с ier=0 -нормальное завершение * с ier=l -нарушена положительная определенность * с (возможно, из-за округления) * dimension a(l) ier = О с с формирование матрицы L с do 1 i - l,n il = i + 1 do 1 j * i,n jl « j + 1 ka = (i-l)*n + j x - a(ka) 12 - i - 1 do 3 kl - 1,12 k « i - kl kal » (jl-l)*n + k ka2 = (il-l)'n + k x « x - a(kal)*a(ka2) 3 continue с if(j.ne.i) go to 4 с с нарушена положительная определенность с if(x.le.O) go to 12 с у = l/sqrt(x) ka « (il-l)'n + i a(ka) = у go to 1 4 ka = (jl-lpn + i a(ka) « x'y 1 continue 59
kal ka2 с с вычисление матрицы, обратной к L с do 5 i - l,n 13-1+1 do 5 j - i3,n z - 0. jl - j + 1 j2 - j - 1 do 7 kl - i,j2 k - j - 1 - kl + 1 kal - (jl-l)'n + k ka2 - k*n + i z - z - a(kal)*a(ka2) (jl-1 *n + i jl-l'n + J a(kal) * z*a(ka2) 5 continue с с вычисление обратной матрицы с do 8 i - l,n do 8 j - i,n z - 0. jl * n + 1 j4 * j + 1 do 9 k = j4,jl kal - (k-l)'n + j ka2 - k-l)*n + i 9 z * z + a(kal)*a(ka2) ka * j*n + i a(ka) - z 8 continue с с пересылка результата в массив а с do 11 1 - lfn do 11 j - 1,n kal * (i-l)*n + j ka2 » (j-l)*n + 1 ka3 - j*n + i a(kal) = a(ka3) a(ka2) = a(ka3) 11 continue с return 12 1er - 1 return end Входные параметры: а — массив размерности п(п+1), содержащий элементы матрицы А, в его первых столбцах (достаточно задать элементы, расположенные под главной диа- 60
гональю: aij9 i^j) последний столбец массива используется как рабочий массив; п — размерность п матрицы А. Выходные параметры: а — на месте исходной матрицы расположен результат — элементы обратной матрицы; ier — признак выхода: ier = 0 — нормальное завершение, получен правильный результат, ier=l—нарушена положительная определенность исходной матрицы. Перед обращением к программе MPSV необходимо: 1) описать в головной программе размерность массива а; 2) присвоить фактические значения параметрам а, п. Задание. Найти матрицу, обратную заданной матрице А. Порядок выполнения лабораторной работы 1. Проверить симметричность и положительную определенность заданной матрицы *}. 2. Составить головную программу, содержащую описание массивов, присвоение фактических значений параметрам а и п, печать результатов. 3. Провести вычисления на ЭВМ. Пример. Обратить симметричную положительно определенную матрицу 1 1 1 1 2 2 1 1 2 з 1 ▲ Легко убедиться, например по критерию Сильвестра, в ее положительной определенности. Программа обращения матрицы может иметь следующий вид: dimension a(12),ар(3,3) data а /1., 1., 1., * 12 2 * 12 3 0., 0., 0./ с с обращение к программе MPSV, вычисляющей обратную матрицу с call MPSV (a, 3, ier) с с проверка признака окончания вычислений с if(ier.ne.O) go to 3 *} Проверить положительную определенность матрицы можно, например, с помощью критерия Сильвестра. Матрица А = {ду}"= i, J= i положительно определена тогда и только тогда, когда положительны все определители det||fly||r-i,r-i. ™=1>2, .... 61
с печать результатов с do 1 j = 1,3 do 1 i = 1,3 kp « (i-l)'3+j 1 ap(i.j) « a(kp) write(3,*) ' обратная матрица' do 2 i - 1,3 write(3,*) (ap(1vj)vj-lv3) 2 continue stop с 3 print *,'нет положительной определенности' stop end После вычисления на ЭВМ получим результат: обратная матрица 2.000000 -1.000000 0.000000Е+00 -1.000000 2.000000 -1.000000 0.000000Е+0О -1.000000 1.000000 Варианты заданий Номер варианта 1 2 3 4 5 6 .0012 .0046 .0080 .0114 .0046 .0182 .0318 .0454 .0104 .0410 .0716 .1022 .0185 .0729 .1273 .1817 .0289 .1139 .1989 .2839 .0416 .1640 .2864 .4088 .0046 .0898 .1300 .1702 .0182 .3591 .5199 .6807 .0410 .8080 1.1698 1.5316 .0729 1.4365 2.0797 2.7229 .1139 2.2445 3.2495 4.2545 .1640 3.2321 4.6793 6.1265 Матрица А .0080 .1300 .4422 .5526 .3018 .5199 1.7687 2.2103 .0716 1.1698 3.9797 4.9733 .1273 2.0797 7.0749 8.8413 .1989 3.2495 11.0546 13.8146 .2864 4.6793 15.9186 19.8930 .0114 .1702 .5526 1.2347 .0454 .6807 2.2103 4.9387 .1022 1.5316 4.9733 11.1121 .1817 2.7229 8.8413 19.7549 .2839 4.2545 13.8146 30.8670 .4088 6.1265 19.8930 44.4485 62
Продолжение таблицы Номер варианта .0566 .2232 .3898 .5564 .0740 .2916 .5092 .7268 .0936 .3690 .6444 .9198 .1156 .4556 .7956 1.1356 .1399 .5513 .9627 1.3741 .1665 .6561 1.1457 1.6353 .1954 .7700 1.3446 1.9192 .2266 .8930 1.5594 2.2258 .2601 1.0251 1.7901 2.5551 .2959 1.1663 2.0367 2.9071 .3341 1.3167 2.2993 3.2819 .3745 1.4761 .2232 4.3992 6.3690 8.3388 .2916 5.7459 8.3187 10.8915 .3690 7.2722 10.5284 13.7846 .4556 8.9780 12.9980 17.0180 .5513 10.8634 15.7276 20.5918 .6561 12.9283 18.7171 24.5059 .7700 15.1728 21.9666 28.7604 .8930 17.5969 25.4761 33.3553 1.0251 20.2005 29.2455 38.2905 1.1663 22.9837 33.2749 43.5661 1.3167 25.9464 37.5642 49.1820 1.4761 29.0887 Матрица А .3898 6.3690 21.6670 27.0766 .5092 8.3187 28.2998 35.3654 .6444 10.5284 35.8169 44.7593 .7956 12.9980 44.2184 55.2584 .9627 15.7276 53.5043 66.8627 1.1457 18.7171 63.6745 79.5721 1.3446 21.9666 74.7291 93.3867 1.5594 25.4761 86.6681 108.3065 1.7901 29.2455 99.4914 124.3314 2.0367 33.2749 113.1991 141.4615 2.2993 37.5642 127.7912 159.6968 2.5777. 42.1135 .5564 8.3388 27.0766 60.4993 .7268 10.8915 35.3654 79.0195 .9198 13.7846 44.7593 100.0091 1.1356 17.0180 55.2584 123.4680 1.3741 20.5918 66.8627 149.3963 1.6353 24.5059 79.5721 177.7939 1.9192 28.7604 93.3867 208.6609 2.2258 33.3553 108.3065 241.9973 2.5551 38.2905 124.3314 277.8030 2.9071 43.5661 141.4615 316.0781 3.2819 49.1820 159.6968 356.8225 3.6793 55.1383
Продолжение таблицы Номер варианта 2.5777 3.6793 .4173 1.6447 2.8721 4.0995 .4624 1.8224 3.1824 4.5424 .5098 2.0092 3.5086 5.0080 .5595 2.2051 3.8507 5.4963 .6115 2.4101 4.2087 6.0073 .6659 2.6243 4.5827 6.5411 .7225 2.8475 4.9725 7.0975 .7815 3.0799 5.3783 7.6767 .8427 3.3213 5.7999 8.2785 .9063 3.5719 6.2375 8.9031 .9722 3.8316 6.6910 9.5504 42.1135 55.1383 1.6447 32.4106 46.9228 61.4350 1.8224 35.9120 51.9920 68.0720 2.0092 39.5930 57.3212 75.0494 2.2051 43.4535 62.9103 82.3671 2.4101 47.4936 68.7594 90.0252 2.6243 51.7133 74.8685 98.0237 2.8475 56.1125 81.2375 106.3625 3.0799 60.6913 87.8665 115.0417 3.3213 65.4496 94.7554 124.0612 3.5719 70.3875 101.9043 133.4211 3.8316 75.5050 109.3132 143.1214 Матрица А 143.2676 179.0372 2.8721 46.9228 159.6284 199.4828 3.1824 51.9920 176.8736 221.0336 3.5086 57.3212 195.0031 243.6895 3.8507 62.9103 214.0170 267.4507 4.2087 68.7594 233.9154 292.3170 4.5827 74.8685 253.6980 318.2884 4.9725 81.2375 276.3650 345.3650 5.3783 87.8665 298.9164 373.5468 5.7999 94.7554 322.3522 402.8338 6.2375 101.9043 346.6723 433.2259 6.6910 109.3132 371.8767 464.7231 179.0372 400.0363 4.0995 61.4350 199.4828 445.7195 4.5424 68.0720 221.0336 493.8720 5.0080 75.0494 243.6895 544.4939 5.4963 82.3671 267.4507 597.5851 6.0073 90.0252 292.3170 653.1457 6.5411 98.0237 318.2884 711.1758 7.0975 106.3625 345.3650 771.6750 7.6767 115.0417 373.5468 834.6438 8.2785 124.0612 402.8338 900.0817 8.9031 133.4211 433.2259 976.9891 9.5504 143.1214 464.7231 1038.3660
Продолжение таблицы Номер варианта Матрица А 30 | 1.0404 4.1004 7.1604 10.2204 4.1004 80.8020 116.9820 153.1620 7.1604 116.9820 397.9656 497.3256 10.2204 153.1620 497.3256 1111.2120 Лабораторная работа 10 РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ИСКЛЮЧЕНИЯ ГАУССА С ОЦЕНКОЙ ЧИСЛА ОБУСЛОВЛЕННОСТИ Метод исключения Гаусса решения линейной системы Ах = Ь, рассмотренный в лабораторной работе 7, относится к точным методам. В реальных условиях вычисления на ЭВМ практически всегда сопровождаются погрешностями, вызванными погрешностями округления и погрешностями перевода числовых исходных данных из десятичной системы счисления в двоичную уже при записи информации в память ЭВМ *). Б. Парлетт во введении к книге «Симметричная проблема собственных значений» [23] предупреждает: «Причудливые подчас эффекты арифметики конечной точности должны всегда быть в поле зрения при матричных вычислениях». В лабораторной работе 7 отмечено, что если матрица системы хорошо обусловлена, то в методе Гаусса с выбором главного элемента погрешности округления невелики. Попытаемся понять, как сильно могут влиять погрешности округления на погрешность результата, полученного методом Гаусса, какие свойства матрицы системы определяют ее «чувствительность» к погрешностям округления и какие «причудливые эффекты» могут .возникать в машинных расчетах. Рассмотрим пример [41 ]: *] В дальнейшем оба типа погрешностей будем называть ошибками округления. 3-187 65
^0,780*!+0,563*2 = 0,2*17, 1 0,913*!+ 0,659*2 = 0,254. Нетрудно проверить, что точным решением системы является вектор (1.000,—1.000). Если решать эту систему методом Гаусса на калькуляторе, сохраняющем только три значащих цифры, то имеем х = (-0,443.1.000). В результате округления получено совершенно непригодное решение. ~ II1 1 II Рассмотрим другой пример системы с матрицей . Решением системы *1+*2 = 2, *1 + 1.0001*2 = 2.0001 является вектор х = (1, 1), а решением системы f *!+*2 = 2, ]*! +1.0001*2 = 2.0002 служит вектор х = (0, 2), т. е. изменение в правой части пятой значащей цифры повлекло изменение решения в первой значащей цифре. Заметим, что в обоих примерах определитель матрицы системы мал и, по-видимому, система почти вырождена. Если А\ = Ъ—совместная система с detA^O и матрица А почти вырождена, то малые изменения элементов системы могут привести к новой системе А\ = Ъ с ёеЫ=0, которая может оказаться несовместной, т. е. не иметь ни одного решения или иметь бесчисленное множество решений. Этот общеизвестный факт и рассмотренные примеры позволяют сделать вывод, что если матрица системы «почти вырождена», то ошибки округления могут привести к неверному результату. В таком случае необходимо уметь заранее определить меру «близости» матрицы системы к множеству вырожденных матриц. Можно подумать, что величина detA как раз и служит мерой близости матрицы А к вырожденным. Но следующий пример показывает, что это не так. В системе Г2-10-6*1 + 10-6*2 = 3-10-6, 1 10-6*1 + 10-6*2 = 2-10-6 определитель матрицы равен 10 ~12, однако система не является вырожденной, т. е. погрешности решения этой системы слабо 66
зависят от погрешностей правых частей. В этом легко убедиться, если привести эту систему к виду С другой стороны, решением системы Гх1 + 100х2 = 100, \ х2 = 1 является вектор х = (0,1), а решением системы с той же матрицей, но незначительно измененной правой частью Г*! +100х2 = 100, \ ^2=0 является вектор х = (100,0). Здесь небольшое изменение правой части (порядка 10~^) вызвало «катастрофическое» изменение решения (порядка 102), хотя определитель матрицы системы равен единице. Таким образом, мы убедились, что detA не может служить мерой близости матрицы А к вырожденной. Для исследования этого вопроса потребуется понятие нормы матрицы. Пусть норма вектора x = (xl9 ..., хп) в Rn определяется по формуле iixii=£i*,i. Умножая вектор х на матрицу А, получаем новый вектор Ах, норма которого может сильно отличаться от нормы вектора х. Величину ||Лх||/||х|| можно рассматривать как своеобразный «коэффициент растяжения» вектора х матрицей А. Для некоторых векторов он может быть малым, а для некоторых — большим. Если М и т — максимальное и минимальное значения введенного «коэффициента растяжения», то ||х|| " Нормой матрицы А называется максимальное значение «коэффициента растяжения», т. е. ||Л||=тахМх||/||х||=М. х=0 Минимальное значение «коэффициента растяжения» также играет важную роль в линейной алгебре. Дело в том, что если 67
A — невырожденная матрица, то для нормы обратной матрицы справедливо равенство М-111 = 1/™. Пусть теперь х — точное решение системы Ах = Ъ, а Ах + х— решение системы с возмущенной *} матрицей А + АА (А + АА)(х + Ах) = Ъ. (1) Выясним, как возмущения А А влияют на величину отклонения решения х + Ах от точного решения х. Вычитая из (1) равенство А х = Ь, получим ||Ах|| = М-1А^(х + Ах)||, откуда """ г^МНМ-1!!^- (2) |х + Ах Для некоторых векторов х неравенство (2) превращается в равенство. Это означает, что при большом значении || А || || А _1 || относительная погрешность решения || Ах ||/1| х + Ах || может стать во много раз больше относительной погрешности || АЛ ||/1| Л || матрицы А. Таким образом, величина || А \\ \\ А _1 || играет важную роль в исследовании матриц. Эту величину принято называть числом обусловленности матрицы А (обозначение — cond(A)). Итак, cond(A)=\\A\\ \\А~1\\=М/т. Замечательно, что число обусловленности совершенно таким же образом определяет влияние на погрешность решения погрешностей правой части системы. Пусть АЬ—погрешность правой части, а Ах — вызванная ею погрешность решения; тогда Ах = Ъ, Л(х + Ах) = Ь + АЬ, ААх = АЬ. Поскольку || b || ^М || х ||, || АЬ || ^т || Ах ||, для невырожденных матриц (га>0) получаем 1^1 М\\АЬ1 е l^^cond(.M. II v II и- II К II ' II v II V / II К II Таким образом, чем больше число обусловленности, тем чувствительней система к округлениям в процессе гауссова исключения. Значит, мерой близости матрицы А к вырожденной является величина сопё(Л). Чем больше величина сопё(Л), тем ближе матрица А к вырожденной. *} Уилкинсон показал, что влияние погрешности округления при решении системы линейных уравнений методом Гаусса с выбором главного элемента эквивалентно возмущению матрицы исходной системы. 68
Системы с большим числом обусловленности называют плохо обусловленными. Не существует численного метода, с помощью которого можно было бы устранить чувствительность плохо обусловленной системы к возмущениям элементов матрицы и правой части. Решение линейных систем с плохо обусловленными матрицами может оказаться некорректной задачей. Плохо обусловленные системы возникают при решении интегральных уравнений первого рода. Один из методов решения плохо обусловленной системы будет рассмотрен в лабораторной работе 47. Полезно знать некоторые основные свойства числа обусловленности. Ясно, что cond(Е) = 1, cond(A)^l. Если А — диагональная матрица, cond (А) = max | аа | /min | аа |, cond (сА) = cond (А). Это свойство позволяет понять, почему число обусловленности является лучшей мерой близости к вырожденной матрице, чем определитель матрицы. Рассмотрим в качестве примера диагональную матрицу порядка 100x100, все диагональные элементы которой равны 0.1. Определитель матрицы мал (det А = 10"100), хотя в качестве матрицы линейной системы она ведет себя скорее как единичная, чем как вырожденная. Действительно, ведь cond(^4) = = cond (0.1£) = cond (£■)= 1. В случае систем второго порядка понятие обусловленности матрицы допускает наглядную геометрическую интерпретацию. В этом случае каждое из уравнений графически изображается прямой линией, и если система плохо обусловлена, то прямые почти параллельны. При этом небольшое изменение угла наклона или сдвиг одной из прямых сильно изменяет положение точки пересечения прямых, т. е. сильно меняет решение соответствующей линейной системы (рис. 8). В многомерном случае геометрическая картина может быть гораздо сложнее. Для трехмерного пространства плохая обусловленность возможна в случае, когда плоскости пересекаются под большими углами, а линии их попарного пересечения почти параллельны. Реальное вычисление числа cond (А) предполагает знание величины \\А~г ||. Норму || А || вычислить легко, нахождение же величины \\ А ~г || примерно удваивает время гауссова исключения. Однако знание точного значения cond (А) требуется Рис.8 69
достаточно редко и обычно достаточно получить некоторую хорошую оценку его величины. Описываемая программа DECOMP оценивает число обусловленности следующим образом: cond(4)^max||a,||M v _ j II у II где aj—столбцы матрицы Л; у и z—векторы, определяемые программой, такие, что || z || /1| у || = || А "* ||. Для этого в программе решаются две системы уравнений Ату = е и Az = y, где Ат—транспонированная матрица для А, е — специально выбранный программой вектор, координаты которого равны +1. Полученная в программе оценка является нижней границей истинного значения числа обусловленности, однако имеются основания считать, что это очень точная оценка; почти для всех матриц программа DECOMP вычисляет величину cond, удовлетворяющую неравенствам cond (А) /п < cond < cond (A). Программа DECOMP выполняет также ту часть гауссова исключения, которая зависит только от матрицы, она сохраняет информацию о ведущих элементах. Программа SOLVE использует эти результаты, чтобы получить решение системы Ах=Ъ для произвольной правой части. Погрешности округления не позволяют программе DECOMP определить вырожденность исходной матрицы. Если в процессе исключения встретится ведущий элемент, равный нулю, то DECOMP присваивает cond значение 1032, чтобы сигнализировать об обнаруженной вырожденности. Ниже приведены тексты программ DECOMP и SOLVE, взятые из [41]: subroutine DECOMP (ndim,n,a,cond,ipvt,work) С Программа DECOMP производит Гауссово исключение * с для квадратной матрицы А и вычисляет нижнюю оценку* с числа обусловленности матрицы А * с * с ndim - число строк в массиве а * с п - размерность матрицы А * с а - массив, содержащий элементы матрицы А * с cond - оценка числа обусловленности матрицы А * с cond - cond(A) * с ipvt - массив размерности п, содержащий номера ведущих * с элементов, * с после выхода из программы DECOMP можно вычислить * с det(A) = ipvt(n)*a(l,l)*a(2,2)\..*a(n,n) с work - рабочий массив размерности п * с с !!!! В программе DECOMP используется программа SOLVE * 70
real a(ndim,n),cond,work(n) integer ipvt(n) ipvt(n) = 1 if(n.eq.l)go to 80 nml = n - 1 с с вычисление нормы матрицы А с anorm =0.0 do 10 j = l,n t = 0.0 do 5 i = l,n t - t + abs(a(i,j)) 5 continue if(t.gt.anorm) anorm = t 10 continue с с начало Гауссова исключения с частичным выбором с ведущего элемента с do 35 k = l,nml kpl = к + 1 m = к с do 15 i - kpl,n if(abs(a(i,k)).gt.abs(a(m,k))) m = i 15 continue с ipvt(k) - m if(m.ne.k) ipvt(n) = -ipvt(n) t = a(m,k) a(m,k) « a(k,k) a(k.k) - t if(t.eq.O.O) go to 35 с do 20 i «= kpl,n a(i,k) = -a(i,k)/t 20 continue с do 30 j = kpl,n t - a(m,j) a(m,j) = a(krj) a(krj) = t if(t.eq.O.O) go to 30 с do 25 i = kplrn a(i,j) = a(irj) + a(irk)*t 25 continue с 30 continue 35 continue с с вычисление числа обусловленности с do 50 к = 1,п t = 0.0 71
if(k.eq.l) go to 45 kml = к - 1 с do 40 i = lrkml t = t + a(i,k)*work(i) 40 continue с 45 ek = 1.0 if(t.lt.0.0) ek = -1.0 if(a(k,k).eq.0.0) go to 90 work(k) = -(ek + t)/a(krk) 50 continue с do 60 kb = lrnml к = n - kb t = 0.0 kpl = к + 1 с do 55 i = kplrn t - t + a(i,k)%iork(k) 55 continue с work(k) = t m = ipvt(k) if(m.eq.k) go to 60 t = work(m) work(m) = work(k) work(k) = t 60 continue с ynorm =0.0 do 65 i - lrn ynorm - ynorm + abs(work(i)) 65 continue с с обращение к программе SOLVE с call SOLVE (ndimrnrarworkripvt) с znorm - 0.0 do 70 i - lrn znorm = znorm + abs(work(l)) 70 continue с с проверка обусловленности матрицы с cond - anorm*znorm/ynorm iffcond.lt.1.0) cond - 1.0 return с 80 cond = 1.0 if(a(l,l).ne.0.0) return с 90 cond = 1.0e+32 return end 72
с Программа SOLVE решает линейную систему АХ=В после * с того как для матрицы А программой DEC0M выполнено * с Гауссово исключение * с с ndim - число строк в массиве а * с п - размерность матрицы А * с а - массив размерности ndinTn, содержащий элементы * с матрицы системы, полученной в DEC0MP * с b - массив размерности пг содержит правые части * с ipvt - вектор ведущих элементов из DEC0MP * с с Результат: * с b - массив, содержащий решение системы * integer ipvt(n) real a(ndimrn)r b(n) с с прямой ход с if(n.eq.l) go to 50 nml = n-1 с do 20 k = l,nml kpl = k+1 m = ipvt(k) t - b(m) b(n)- b(k) b(k)= t do 10 i = kpl,n b(i) = b(i)+a(1,kpt 10 continue 20 continue с с обратная подстановка с do 40 kb = l,nml kml - n-kb k = kml+1 b(k)- b(k)/a(k,k) t = -b(k) do 30 i = 1,kml b(i) = b(i)+a(i,k)4 30 continue 40 continue с 50 b(l) = b(l)/a(l,l) return end Входные параметры программы DECOMP: ndim — число строк в массиве а; п — размерность матрицы А; а— массив размерности пхп, содержит элементы матрицы А, a(i, j): = fly; work — рабочий массив размерности п. 73
Выходные параметры программы DECOMP: a — массив размерности п х п, содержит матрицу А после гауссова исключения; cond — оценка числа обусловленности матрицы системы; ipvt — массив размерности я, содержит номера ведущих элементов гауссова исключения, det^4 = ipvt(w)*a(l, 1)*а(2, 2}*...* а (и, п). Входные параметры программы SOLVE: ndim — число строк массива а; п—размерность матрицы А; а—массив размерности пхп, содержит элементы матрицы А, в которой выполнено гауссово исключение, например, программой DECOMP; b—массив размерности п, содержит правые части системы; ipvt— массив размерности и, вектор ведущих элементов гауссова исключения, выполненного для матрицы А, например, программой DECOMP. Выходные параметры программы SOLVE: b — массив размерности п, содержит решение системы. Перед обращением к программе DECOMP необходимо: 1) описать массивы a, ipvt, work; 2) присвоить фактические значения параметрам ndim, n, a (ndim^n). Перед обращением к программе SOLVE необходимо: 1) описать массивы a, b, ipvt; 2) провести гауссово исключение в матрице .А, лучше всего программой DECOMP; 3) присвоить фактические значения элементам массива Ь. Задание. Используя программы DECOMP и SOLVE, решить методом исключения Гаусса предложенные системы, оценить число обусловленности и погрешность результата. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую описание массивов a, ipvt, work, b, присвоение фактических значений параметрам ndim, п, а, обращение к DECOMP, печать cond, присвоение фактических значений элементам массива Ь, обращение к SOLVE, печать Ь. 2. Выполнить вычисления на ЭВМ. 3. Изменить в головной программе фактические значения параметров и провести вычисления на ЭВМ для второй системы. Пример. Решить методом Гаусса систему г Юх1 — 7х2 = 7, < — 3*! +2х2+ 6х3 = 4, jX± — Х2 Т" ^^з = ^j оценить число обусловленности. А Программа решения задачи может иметь следующий вид: 74
real a(3,3),b(3),work(3),cond,condpl integer ipvt(3) data a / 10.r-3.r 5., -7., 2.,-l., 0.r 6.r 5. / data b / 7., 4.r 6. / ndim = 3 n = 3 write(3,*) ' матрица системы ' do 1 i = lrn write(3r2) (a(i,j),j=l,n) 1 continue 2 format(lx,10f5.0) с с обращение к программе DEC0MP, вычисляющей число с обусловленности и Гауссово исключение с call DECOMP (ndimr nr ar condr ipvtr work) с write(3,*) ' число обусловленности ' write(3,3) cond 3 format(6x,' cond=',el5.5) write(3r8) с с проверка обусловленности матрицы с condpl = cond+1 if(condpl.eq.cond) write(3r4) 4 format(40x,'матрица плохо обусловлена') if(condpl.eq.cond) stop с write(3,*) ' правые части ' write(3,2) (b(i)r i=lrn) write(3r8) с с обращение к программе SOLVE, решающей систему с call SOLVE (ndim, nr a, br ipvt) с с печать результата с write(3r*) ' решение системы' write(3r8) write(3r2) (b(i)ri-lrn) 8 format(lx) с stop end В результате вьршслений на ЭВМ получены следующие результаты: матрица системы 10. -7. 0. -3. 2. 6. 5. -1. 5. 75
число обусловленности cond- .12106E+02 правые части 7. 4. 6. решение системы 0. -1. 1. Варианты заданий Номер варианта 1 2 3 4 Матрица системы .126Е + 01 .541Е + 00 -.286Е + 00 -.571Е-01 -.171Е-01 .469Е + 00 .257Е + 00 -.120Е + 00 -.229Е + 00 .142Е + 01 .861Е + 00 .114Е + 00 .114Е-01 .518Е + 00 -.171Е + 00 -.941Е + 00 .211Е + 03 .214Е + 03 -.213Е + 03 -.212Е+03 .212Е + 03 .213Е + 03 -.214Е + 03 -.211Е + 03 .213Е + 03 .212Е + 03 -.211Е + 03 -.214Е + 03 .214Е + 03 .211Е + 03 -.212Е + 03 -.213Е + 03 .175Е + 00 -.194Е + 00 .241Е + 01 -.200Е + 01 .291Е + 00 Л51Е + 01 -.337Е + 00 • .486Е + 00 -.600Е-01 -.126Е + 00 .830Е + 00 -.243Е + 00 -.109Е + 00 -.914Е-01 -.166Е + 00 .776Е + 00 .212Е + 03 -.211Е + 03 -.214Е + 03 .213Е + 03 .211Е + 03 -.212Е + 03 -.213Е + 03 .214Е + 03 .213Е + 03 -.214Е + 03 -.211Е + 03 .212Е + 03 .214Е + 03 -.213Е+03 -.212Е + 03 .211Е + 03 .223Е + 01 .838Е + 00 -.571Е + 00 -.114Е + 00 -.343Е-01 .892Е + 00 .514Е + 00 -.240Е + 00 -.457Е + 00 .236Е + 01 Л43Е + 01 .229Е + 00 .229Е-01 .792Е + 00 -.343Е + 00 Л59Е + 01 .460Е + 03 .465Е + 03 -.463Е + 03 -.462Е + 03 .462Е + 03 .463Е + 03 -.465Е + 03 -.460Е + 03 .463Е + 03 .462Е + 03 -.460Е + 03 -.465Е + 03 .465Е + 03 .460Е + 03 -.462Е + 03 -.463Е + 03 .304Е + 00 -.389Е + 00 .409Е + 01 -.352Е + 01 .583Е + 00 .274Е + 01 -.674Е + 00 .971Е + 00 -Л20Е + 00 -.251Е + 00 Л37Е + 01 -.486Е + 00 -.217Е + 00 -Л83Е + 00 -.331Е + 00 Л26Е + 01 .462Е + 03 -.460Е + 03 -.465Е + 03 .463Е + 03 - .460Е + 03 -.462Е + 03 -.463Е + 03 .465Е + 03 .463Е + 03 -.465Е + 03 -.460Е + 03 .462Е + 03 .465Е + 03 -.463Е + 03 -.462Е + 03 .460Е + 03 Правая часть -.642Е + 00 -.259Е + 00 -.955Е + 00 -.572Е + 00 Л04Е-06 -.447Е-05 -.417Е-05 -Л12Е-05 -Л69Е + 00 -.859Е + 00 -Л77Е + 00 -Л80Е + 00 Л12Е-05 .417Е-05 -Л04Е-06 .447Е-05 -Л05Е + 01 ' -.498Е + 00 -Л57Е + 01 -.909Е + 00 Л19Е-06 -.964Е-05 -.782Е-05 -.232Е-05 -.211Е + 00 -Л59Е + 01 -.226Е + 00 -.233Е + 00 .232Е-05 .782Е-05 -Л19Е-06 .964Е-05 76
Продолжение таблицы Номер варианта 5 6 7 8 9 10 Матрица системы .320Е + 01 .114Ё + 01 -.857Е + 00 -.171Е + 00 -.514Е-01 .131Е + 01 .771Е + 00 -.360Е + 00 -.686Е + 00 .330Е + 01 .200Е + 01 .343Е + 00 .343Е-01 .107Е + 01 -.514Е + 00 .224Е + 01 .716Е + 03 .723Е + 03 -.720Е + 03 -.719Е + 03 .719Е + 03 .720Е + 03 -.723Е + 03 -.716Е + 03 .720Е + 03 .719Е + 03 -.716Е + 03 -.723Е + 03 .723Е + 03 .716Е + 03 -.719Е + 03 -.720Е + 03 .432Е + 00 -.583Е + 00 .576Е + 01 -.504Е + 01 .874Е + 00 .396Е + 01 -.101Е + 01 .146Е + 01 -.180Е + 00 -.377Е + 00 .191Е + 01 -.729Е + 00 -.326Е + 00 -.274Е + 00 -.497Е + 00 .175Е + 01 .719Е + 03 -.716Е + 03 -.723Е + 03 .720Е + 03 .716Е + 03 -.719Е + 03 -.720Е + 03 .723Е + 03 .720Е + 03 -.723Е-03 -.716Е + 03 .719Е + 03 .723Е + 03 -.720Е + 03 -.719Е + 03 .716Е + 03 .418Е + 01 .143Е + 01 -.114Е + 01 -.229Е + 00 .686Е-01 .174Е + 01 Л03Е + 01 -.480Е + 00 -.914Е + 00 .424Е + 01 .258Е + 01 .457Е + 00 .457Е-01 .134Е + 01 -.686Е + 00 .290Е + 01 .970Е + 03 .980Е + 03 -.976Е + 03 -.974Е + 03 .974Е + 03 . .976Е + 03 -.980Е + 03 -.970Е + 03 .976Е + 03 .974Е + 03 -.970Е + 03 -.980Е + 03 .980Е + 03 .970Е + 03 -.974Е + 03 -.976Е + 03 .561Е + 00 -.777Е + 00 .744Е + 01 -.656Е + 01 .117Е + 01 .518Е + 01 -Л35Е + 01 .194Е + 01 -.240Е + 00 -.503Е + 00 .245Е + 01 -.971Е + 00 -.434Е + 00 -.366Е + 00 -.663Е + 00 .223Е + 01 .974Е + 03 -.970Е + 03 -.980Е + 03 .976Е + 03 .970Е + 03 -.974Е + 03 -.976Е + 03 .980Е + 03 .976Е + 03 -.980Е + 03 -.970Е + 03 .974Е + 03 .980Е + 03 -.976Е + 03 -.974Е + 03 .970Е + 03 .515Е + 01 .173Е + 01 -.143Е + 01 -.286Е + 00 -.857Е-01 .216Е + 01 .129Е + 01 -.600Е + 00 -.114Е + 01 .517Е + 01 .315Е + 01 .571Е + 00 .571Е-01 .162Е + 01 -.857Е + 00 .355Е + 01 Л22Е + 04 Л24Е + 04 -Л23Е + 04 -Л23Е + 04 Л23Е + 04 Л23Е + 04 -Л24Е+04 -Л22Е + 04 Л23Е + 04 Л23Е + 04 -Л22Е + 04 -Л24Е + 04 Л24Е + 04 Л22Е + 04 -Л23Е + 04 -Л23Е + 04 .689Е + 00 -.971Е + 00 .912Е + 01 -.807Е + 01 Правая часть -Л46Е + 01 -.737Е + 00 -.218Е + 01 -Л25Е + 01 -.212Е-04 -.537Е-05 -ЛОЗЕ-04 -.249Е-04 -.252Е + 00 -.232Е + 01 -.275Е + 00 -.286Е + 00 -.561Е-05 -.202Е-04 -.927Е-05 -.251Е-04 -Л86Е + 01 -.976Е + 00 -.280Е + 01 -Л58Е + 01 Л19Е-06 -.231Е-05 -.234Е-05 -.477Е-05 -.294Е + 00 -.305Е + 01 -.324Е + 00 -.339Е + 00 .477Е-05 .234Е-05 -Л19Е-06 .231Е-05 -.227Е + 01 -Л21Е + 01 -.341Е + 01 -Л92Е + 01 -Л27Е-04 -.292Е-05 Л94Е-05 Л17Е-04 -.335Е + 00 77
Продолжение таблицы Номер варианта 10 11 12 13 14 15 Матрица системы Л46Е + 01 .640Е + 01 -Л69Е + 01 .243Е + 01 -.300Е + 00 -.629Е + 00 .299Е + 01 -Л21Е + 01 -.543Е + 00 -.457Е + 00 -.829Е + 00 .272Е + 01 Л23Е + 04 -Л22Е + 04 -Л24Е + 04 Л23Е + 04 Л22Е + 04 -Л23Е + 04 -Л23Е + 04 Л24Е + 04 Л23Е + 04 -Л24Е + 04 -Л22Е + 04 Л23Е + 04 Л24Е + 04 -Л23Е + 04 -Л23Е + 04 Л22Е + 04 .612Е + 01 .203Е + 01 -Л71Е + 01 -.343Е + 00 -Л03Е + 00 .258Е + 01 Л54Е + 01 -.720Е + 00 -Л37Е + 01 .611Е + 01 .372Е + 01 .686Е + 00 .686Е-01 Л89Е + 01 -Л03Е + 01 .420Е + 01 Л47Е + 04 Л49Е + 04 -Л48Е + 04 -Л48Е + 04 Л48Е + 04 Л48Е + 04 -Л49Е + 04 -Л47Е + 04 Л48Е + 04 Л48Е + 04 -Л47Е + 04 -Л49Е + 04 Л49Е + 04 .147Е + 04 -Л48Е + 04 -Л48Е + 04 .818Е + 00 -Л17Е + 01 Л08Е + 02 -.959Е + 01 Л75Е + 01 .763Е + 01 -.202Е + 01 .291Е + 01 -.360Е + 00 -.754Е + 00 .353Е + 01 -Л46Е + 01 -.651Е + 00 -.549Е + 00 -.994Е + 00 .320Е + 01 Л48Е + 04 -Л47Е + 04 -Л49Е + 04 Л48Е + 04 Л47Е + 04 -Л48Е + 04 -Л48Е + 04 Л49Е + 04 Л48Е + 04 -Л49Е + 04 -Л47Е + 04 Л48Е + 04 Л49Ё + 04 -Л48Е + 04 -Л48Е + 04 Л47Е + 04 .709Е + 01 .232Е + 01 -.200Е + 01 -.400Е + 00 -Л20Е + 00 .301Е + 01 Л80Е + 01 -.840Е + 00 -Л60Е + 01 .705Е + 01 .429Е + 01 .800Е + 00 .800Е-01 .216Е + 01 -Л20Е + 01 .485Е + 01 Л73Е + 04 Л74Е + 04 -Л74Е + 04 -Л73Е + 04 Л73Е + 04 Л74Е + 04 -Л74Е + 04 -Л73Е + 04 Л74Е + 04 Л73Е + 04 -Л73Е + 04 -Л74Е + 04 Л74Е + 04 Л73Е + 04 -Л73Е + 04 -Л74Е + 04 .946Е + 00 -Л36Е + 01 Л25Е + 02 -Л11Е + 02 .204Е + 01 .885Е + 01 -.236Е + 01 .340Е + 01 -.420Е + 00 -.880Е + 00 .407Е + 01 -Л70Е + 01 -.760Е + 00 -.640Е + 00 -Л16Е + 01 .369Е + 01 Л73Е + 04 -Л73Е + 04 -Л74Е + 04 Л74Е + 04 Л73Е + 04 -Л73Е + 04 -Л74Е + 04 Л74Е + 04 Л74Е + 04 -Л74Е + 04 -Л73Е + 04 Л73Е + 04 Л74Е + 04 -Л74Е + 04 -Л73Е+04 Л73Е + 04 .806Е + 01 .262Е + 01 -.229Е + 01 -.457Е + 00 -Л37Е + 00 .343Е + 01 .206Е + 01 -.960Е + 00 Правая часть -.379Е + 01 -.373Е + 00 -.392Е + 00 -Л17Е-04 -Л94Е-05 Л27Е-04 .292Е-05 -.268Е + 01 -Л45Е + 01 -.402Е + 01 -.226Е + 01 -.353Е^04 -.230Е-04 .621Е-05 -.426Е-04 -.377Е + 00 -.452Е + 01 -.422Е + 00 -.444Е + 00 .426Е-04 -.621Е-05 .353Е-04 .230Е-04 -.309Е + 01 -Л69Е + 01 -.464Е + 01 -.259Е + 01 .325Е-04 .349Е-04 .520Е-04 .545Е-04 -.418Е + 00 -.525Е + 01 -.471Е + 00 -.497Е + 00 -.545Е-04 -.520Е-04 -.325Е-04 -.349Е-04 -.349Е + 01 -Л93Е + 01 78
Продолжение таблицы Номер варианта 15 16 17 18 19 20 Матрица системы -Л83Е + 01 .798Е + 01 .486Е + 01 .914Е + 00 .914Е-01 .244Е + 01 -Л37Е + 01 .550Е + 01 Л98Е + 04 .200Е + 04 -Л99Е + 04 -Л98Е + 04 Л98Е + 04 Л99Е + 04 -.200Е + 04 -Л98Е + 04 Л99Е + 04 Л98Е + 04 -Л98Е + 04 -.200Е + 04 .200Е + 04 Л98Е + 04 -Л98Е + 04 -Л99Е + 04 Л07Е + 01 -Л55Е + 01 Л41Е + 02 -Л26Е + 02 .233Е + 01 Л01Е + 02 -.270Е + 01 .389Е + 01 -.480Е + 00 -Л01Е + 01 .461Е + 01 -Л94Е + 01 -.869Е + 00 -.731Е + 00 -ЛЗЗЕ + 01 .418Е + 01 Л98Е + 04 -Л98Е + 04 -.200Е + 04 Л99Е + 04 Л98Е + 04 -Л98Е + 04 -Л99Е + 04 .200Е + 04 Л99Е + 04 -.200Е + 04 -Л98Е + 04 Л98Е + 04 .200Е + 04 -Л99Е + 04 -Л98Е + 04 Л98Е + 04 .903Е + 01 .292Е + 01 -.257Е + 01 -.514Е + 00 -Л54Е + 00 .385Е + 01 .231Е + 01 -Л08Е + 01 -.206Е + 01 .892Е + 01 .543Е + 01 Л03Е + 01 Л03Е + 00 .271Е + 01 -Л54Е + 01 .615Е + 01 .223Е + 04 .225Е + 04 -.224Е + 04 -.224Е + 04 .224Е + 04 .224Е + 04 -.225Е + 04 -.223Е + 04 .224Е + 04 .224Е + 04 -.223Е + 04 -.225Е + 04 .225Е + 04 .223Е + 04 -.224Е + 04 -.224Е + 04 Л20Е + 01 -Л75Е + 01 Л58Е + 02 -Л41Е + 02 .262Е + 01 Л13Е + 02 -.ЗОЗЕ + 01 .437Е + 01 -.540Е + 00 -Л13Е + 01 .515Е + 01 -.219Е + 01 -.977Е + 00 -.823Е + 00 -Л49Е + 01 .466Е + 01 .224Е + 04 -.223Е + 04 -.225Е + 04 .224Е + 04 .223Е + 04 -.224Е + 04 -.224Е + 04 .225Е + 04 .224Е + 04 -.225Е + 04 -.223Е + 04 .224Е + 04 .225Е + 04 -.224Е + 04 -.224Е + 04 .223Е + 04 ЛООЕ + 02 .322Е + 01 -.286Е+01 -.571Е + 00 -Л71Е + 00 .427Е + 01 .257Е + 01 -Л20Е + 01 -.229Е + 01 .986Е + 01 .600Е + 01 Л14Е + 01 Л14Е + 00 .299Е + 01 -Л71Е + 01 .680Е + 01 .248Е + 04 .250Е + 04 -.249Е + 04 -.249Е + 04 .249Е + 04 .249Е + 04 -.250Е + 04 -.248Е + 04 .249Е + 04 .249Е + 04 -.248Е + 04 -.250Е + 04 .250Е + 04 .248Е + 04 -.249Е + 04 -.249Е + 04 ЛЗЗЕ + 01 -Л94Е + 01 Л75Е + 02 -Л57Е + 02 .291Е + 01 Л25Е + 02 -.337Е + 01 .486Е + 01 -.600Е + 00 -Л26Е + 01 .569Е + 01 -.243Е + 01 Правая часть -.525Е + 01 -.293Е + 01 .503Е-05 -.291Е-04 .294Е-04 -.474Е-05 -.459Е + 00 -.598Е + 01 -.520Е + 00 -.550Е + 00 .474Е-05 -.294Е-04 -.503Е-05 .291Е-04 -.441Е + 01 -.325Е + 01 -.483Е + 01 .289Е + 01 -.224Е + 04 -.223Е + 04 -.225Е + 04 -.224Е + 04 -Л46Е + 02 -.234Е + 01 -.275Е + 01 .406Е + 01 .224Е + 04 .225Е + 04 .224Е + 04 .223Е + 04 -.488Е + 01 -.361Е + 01 -.533Е + 01 .320Е + 01 -.249Е + 04 -.248Е + 04 -.250Е + 04 -.249Е + 04 -Л62Е + 02 -.259Е + 01 -.305Е + 01 79
Продолжение таблицы Номер варианта 20 21 22 23 24 25 Матрица системы -.109Е + 01 -.914Е + 00 -Л66Е + 01 .515Е + 01 .249Е + 04 -.248Е + 04 -.250Е + 04 .249Е + 04 .248Е + 04 -.249Е + 04 -.249Е + 04 .250Е + 04 .249Е + 04 -.250Е + 04 -.248Е + 04 .249Е + 04 .250Е + 04 -.249Е + 04 -i49E + 04 .248E + 04 .110Е + 02 .351Е + 01 -.314Е + 01 -.629Е+00 -.189Е + 00 .470Е + 01 .283Е + 01 -.132Е + 01 -.251Е + 01 .108Е + 02 .658Е + 01 .126Е + 01 .126Е + 00 .326Е + 01 -.189Е + 01 .746Е + 01 .273Е + 04 .275Е + 04 -.274Е + 04 -.274Е + 04 .274Е + 04 .274Е + 04 -.275Е + 04 -.273Е + 04 .274Е + 04 .274Е + 04 -.273Е + 04 -.275Е + 04 .275Е + 04 .273Е + 04 -.274Е + 04 -.274Е + 04 .146Е + 04 -.214Е + 01 .192Е + 02 -.172Е + 02 .321Е + 01 .137Е + 02 -.371Е + 01 .534Е + 01 -.660Е + 00 -.138Е + 01 .623Е + 01 -.267Е + 01 -.119Е + 01 -.101Е + 01 - 182Е + 01 .563Е + 01 .274Е + 04 -.273Е + 04 -.275Е + 04 .274Е + 04 .273Е + 04 -.274Е + 04 -.274Е + 04 " .275Е + 04 .274Е + 04 -.275Е + 04 -.273Е + 04 .274Е + 04 .275Е + 04 -.274Е + 04 -.274Е + 04 .273Е + 04 .119Е + 02 .318Е + 01 -.343Е+01 -.686Е + 00 -.206Е + 00 .512Е + 01 .309Е + 01 -.144Е + 01 -.274Е + 01 .117Е + 02 .715Е + 01 .137Е + 01 .137ЕЧ-00 .354Е + 01 -.206Е + 01 .811Е + 01 .298Е + 04 .301Е + 04 -.299Е + 04 -.299Е + 04 .299Е + 04 .299Е + 04 -.301Е + 04 -.298Е + 04 .299Е + 04 .299Е + 04 -.298Е + 04 -.301Е + 04 .301Е + 04 .298Е + 04 -.299Е + 04 -.299Е + 04 .159Е + 01 -.233Е + 01 .209Е + 02 -.187Е + 02 .350Е + 01 .150Е + 02 -.405Е + 01 .583Е + 01 -.720Е + 00 -.151Е + 01 .677Е + 01 -.291Е + 01 -.130Е + 01 -.110Е + 01 -.199Е + 01 .612Е + 01 .299Е + 04 -.298Е + 04 -.301Е + 04 .299Е + 04 -.298Е + 04 -.299Е + 04 -.299Е + 04 .301Е + 04 .299Е + 04 -.301Е + 04 -.298Е + 04 .299Е + 04 .301Е + 04 -.299Е + 04 -.299Е + 04 .298Е + 04 .129Е + 02 .411Е + 01 -.371Е + 01 -.743Е + 00 -.223Е + 00 .554Е + 01 .334Е + 01 -.156Е + 01 -.297Е + 01 .127Е + 02 .772Е + 01 .149Е + 01 Правая часть .449Е + 01 .249Е + 04 .250Е + 04 .249Е + 04 .248Е + 04 -.534Е + 01 -.397Е + 01 -.583Е + 01 .351Е + 01 -.274Е + 04 -.273Е + 04 -.275Е + 04 -.274Е + 04 -.178Е + 02 -.283Е + 01 -.334Е + 01 .492Е + 01 .274Е + 04 .275Е + 04 .274Е + 04 .273Е + 04 -.924Е + 01 -.124Е + 01 .815Е + 00 .177Е + 01 -.598Е + 04 -.598Е + 04 -.598Е + 04 -.598Е + 04 .154Е + 01 -.712Е + 01 .314Е + 01 .337Е + 01 -.120Е + 02 .120Е + 02 .120Е + 02 -.120Е + 02 -.999Е + 01 -.134Е + 01 .887Е + 00 80
Продолжение таблицы Номер варианта 25 26 27 28 29 30 Матрица системы 1 Л49Е + 00 .381Е + 01 -.223Е + 01 .876Е + 01 .323Е + 04 .326Е + 04 -.324Е + 04 -.324Е + 04 .324Е + 04 .324Е + 04 -.326Е + 04 -.323Е + 04 .324Е + 04 .324Е + 04 -.323Е + 04 -.326Е + 04 .326Е + 04 .323Е + 04 -.324Е + 04 -.324Е + 04 Л72Е + 01 -.253Е + 01 .225Е + 02 -.202Е + 02 .379Е + 01 Л62Е + 02 -.438Е + 01 .631Е + 01 -.780Е + 00 -Л63Е + 01 .731Е + 01 -.316Е + 01 -Л41Е + 01 -Л19Е + 01 -.215Е + 01 .660Е + 01 .324Е + 04 -.323Е + 04 -.326Е + 04 .324Е + 04 .323Е + 04 -.324Е + 04 -.324Е + 04 .326Е + 04 .324Е + 04 -.326Е + 04 -.323Е + 04 .324E + 04 .326Е + 04 -.324Е + 04 -.324Е + 04 .323Е + 04 Л39Е + 02 .440Е + 01 -.400Е + 01 -.800Е + 00 -.240Е + 00 .597Е + 01 .360Е + 01 -Л68Е + 01 -.320Е + 01 Л36Е + 02 .829Е + 01 Л60Е + 01 Л60Е + 00 .408Е + 01 -.240Е + 01 .941Е + 01 .347Е + 04 .351Е + 04 -.350Е + 04 -.349Е + 04 .349Е + 04 .350Е + 04 -.351Е + 04 -.347Е + 04 .350Е + 04 .349Е + 04 -.347Е + 04 -.351Е + 04 .35 IE+ 04 .347Е + 04 -.349Е + 04 -.350Е + 04 Л85Е + 01 -.272Е + 01 .242Е + 02 -.217Е + 02 .408Е + 01 • Л74Е + 02 -.472Е + 01 .680Е + 01 -.840Е + 00 -Л76Е + 01 .785Е + 01 -.340Е + 01 -Л52Е + 01 -Л28Е + 01 -.232Е + 01 .709Е + 01 .349Е + 04 -.347Е + 04 -.351Е + 04 .350Е + 04 .347Е + 04 -.349Е + 04 -.350Е + 04 .351Е + 04 .350Е + 04 -.351Е + 04 -.347Е + 04 .349Е + 04 .351Е + 04 -.350Е + 04 -.349Е + 04 .347Е + 04 Л49Е + 02 .470Е + 01 -.429Е + 01 -.857Е + 00 -.257Е + 00 .639Е + 01 .386Е + 01 -Л80Е + 01 -.343Е + 01 Л45Е + 02 .886Е + 01 Л71Е + 01 Л71Е + 00 .436Е + 01 -.257Е + 01 Л01Е + 02 .372Е + 04 .376Е + 04 -.375Е + 04 -.374Е + 04 .374Е + 04 .375Е + 04 -.376Е + 04 -.372Е + 04 .375Е + 04 .374Е + 04 -.372Е + 04 -.376Е + 04 .376Е + 04 .372Е + 04 -.374Е + 04 -.375Е + 04 Л97Е + 01 -.291Е + 01 .259Е + 02 -.232Е + 02 .437Е + 01 Л86Е + 02 -.506Е + 0К .729Е + 01 -.900Е + 00 -Л89Е + 01 .839Е + 01 -.364Е + 01 Правая часть Л92Е + 01 -.648Е + 04 -.648Е + 04 -.648Е + 04 -.648Е + 04 Л66Е + 01 -.771Е + 01 .339Е + 01 .364Е + 01 -ЛЗОЕ + 02 Л ЗОЕ+ 02 ЛЗОЕ + 02 -ЛЗОЕ + 02 -Л07Е + 02 -Л44Е + 01 .959Е + 00 .206Е + 01 -.698Е + 04 -.698Е + 04 -.698Е + 04 -.698Е + 04 Л78Е + 01 -.829Е + 01 .364Е + 01 .390Е + 01 -Л40Е + 02 Л40Е + 02 Л40Е + 02 -Л40Е + 02 -Л15Е + 02 -Л55Е + 01 Л03Е + 01 .220Е + 01 -.749Е + 04 -.749Е + 04 -.749Е + 04 -.749Е + 04 Л89Е + 01 -.887Е + 01 .388Е + 01 81
Продолжение таблицы Номер варианта 30 Матрица системы -.163Е + 01 -.137Е + 01 -.249Е + 01 .758Е + 01 .374Е + 04 -.372Е + 04 -.376Е + 04 .357Е + 04 .372Е + 04 -.374Е + 04 -.375Е + 04 .376Е + 04 .375Е + 04 -.376Е + 04 -.372Е + 04 .374Е + 04 .376Е + 04 -.375Е + 04 -.174Е + 04 .372Е + 04 Правая часть .417Е + 01 -.150Е + 02 .150Е + 02 Л50Е + 02 -Л50Е + 02 Лабораторная работа 11 СИНГУЛЯРНОЕ РАЗЛОЖЕНИЕ ПРЯМОУГОЛЬНОЙ МАТРИЦЫ В лабораторной работе 10 рассматривалось влияние погрешностей округления на погрешность решения системы линейных уравнений. Уже при записи исходной системы в памяти ЭВМ элементы матрицы и правой части могут претерпеть изменения, связанные с переходом из десятичной системы исчисления в двоичную. Поэтому в памяти машины окажется записанной ^ не система Ах = Ъ, а другая, близкая к ней система Ах = Ъ. Как уже отмечалось, близкая система может оказаться несовместной, или вместо одного решения иметь их бесконечное множество.л Выясним, как решать новую (возмущенную) систему Ах = Ъ и как соотнести полученное решение х* этой системы с искомым решением первоначальной системы. Если полученное решение х* подставить в исходную систему Ах = Ъ, то оно, вообще говоря, не превратит каждое из уравнений системы в тождество. Вектор г = Ах* — b принято называть вектором невязок. Если х* совпадает с точным решением системы Ах = Ъ, то, очевидно, вектор невязок обращается в нуль. Если же вместо точного решения х мы располагаем решениями близкой (возмущенной) системы, то среди этих решений следует выбрать такое, для которого невязка минимальна. Величину невязки удобнее всего определять как длину вектора |r| = (ri + ... + ^)1/2. Будем говорить, что вектор х* является нормальным обобщенным решением системы Ах = Ь, если он минимизирует невязку | г | и сам обладает минимальной длиной. Можно показать, что для всякой линейной системы Ах = Ъ такой вектор х* существует и он единственный, а вектор невязки г = Ах* — b не только обладает минимальной длиной, но и ортогонален к образу матрицы, т. е. к каждому из столбцов матрицы А. 82
Как же находить нормальное обобщенное решение? Рассмотрим простой пример. Пусть матрица системы Ах = Ъ имеет вид А = О О О 0 а, 0 0 0 0 0 0 0 1 0 0 о 1 Если b = *i , ах#0, а2#0. и Ь3^к0, Ь4фО, то система Ах = Ъ, очевидно, несойместна. Ее нормальное обобщенное решение находится легко. В самом деле, пусть х* = -нормальное обобщенное решение, тогда вектор невязки г = а его <*i*i о2х2 длина -ЬЛ -Ьг\ ~ЬьЛ \r\ = j{o1x1-b1)2 + (G2x2-b2)2 + bl + bl достигает минимума на множестве векторов вида х = Ь1/а1 где хъ и х4 произвольны. Среди этих векторов выберем тот, у которого длина минимальна. Очевидно, это вектор х* = b1/G1 Ь21^2 О о и, согласно определению, это и есть нормальное обобщенное решение системы Ах = Ь. , 83
Таким образом, для матриц вида А = , Gl9 ..., CJk7^0, О О процедура отыскания нормального обобщенного решения системы Ах = Ъ очень проста: первые к элементов вектора ;х* находят по формуле х( = Ь(/а(, /=1, ..., к, а остальные полагают равными нулю, х{ = 0, i = k+\, к + 2, .... Для произвольных систем существует алгоритм, позволяющий перейти от исходной системы к эквивалентной системе с простой матрицей вида (1). Он основан на сингулярном разложении матрицы А. Для ознакомления с сингулярным разложением нам понадобится понятие ортогональной матрицы. Квадратная матрица U называется ортогональной, если ее столбцы — попарно ортогональные векторы единичной длины. Под действием ортогональной матрицы векторы только поворачиваются в пространстве, а длина их не меняется, т. е. || Ux \\ = \\ х ||. Простейший пример ортогональной матрицы — матрица поворота на угол Ф в пространстве R2\ U= cos ф —sin ф sin ф cos ф Все ортогональные матрицы удовлетворяют соотношению UTU=E или, что то же самое, U~1 = Ur. Одним из важных понятий теории матриц является понятие сингулярного числа. Из произвольной прямоугольной тхп матрицы можно образовать две квадратные матрицы АТА и ААТ (размерности п х п и га х га соответственно). Доказано, что ненулевые собственные значения этих матриц положительны и всегда совпадают. Арифметические квадратные корни из собственных значений ААТ (или АТА) называются сингулярными числами матрицы А. Обычно сингулярные числа обозначают а15 а2, ..., ок и нумеруют их в порядке невозрастания o1^G2^...^Gk^0. Сингулярные числа матрицы не изменяются в результате умножения этой матрицы слева и справа на любые ортогональные матрицы. Можно показать, что модуль определителя квадратной матрицы равен произведению всех ее сингулярных чисел, а, значит, квадратная матрица является невырожденной тогда и только тогда, когда все ее сингулярные числа отличны от нуля. 84
Сингулярным разложением матрицы А размера т х п называется представление ее в виде произведения A = USV, где U—ортогональная тхт матрица; V—ортогональная пхп матрица, a S—прямоугольная диагональная матрица размера тхп вида I, О s= О о с невозрастающими неотрицательными элементами на главной диагонали ах ^ а2 ^... ^ <зк>0. Доказано, что если A = USV—сингулярное разложение, то на главной диагонали матрицы S стоят сингулярные числа матрицы А. В англоязычной литературе по численным методам сингулярное разложение принято называть SVD-разложением. В лабораторной работе 10 введено понятие числа обусловленности матрицы, оценка которого вычисляется программой DECOMP. Через сингулярное разложение можно ввести более удобное в ряде приложений определение числа обусловленности. Пусть т^п и ранг матрицы г = п. Числом обусловленности матрицы А назовем отношение наибольшего сингулярного числа к наименьшему: cond(^) = amax/amin. Заметим, что?так же как и определение cond {А) в лабораторной работе 10, это определение связано с нормой матрицы А. Однако в этом случае ||х||, а следовательно, и \\А\\ вводятся иначе [35]. Как и в лабораторной работе 10, можно показать справедливость неравенств crmin< \\Лх\\ ^an Эти неравенства позволяют дать простую геометрическую интерпретацию сингулярных чисел и числа обусловленности матрицы. Матрица А отображает единичную сферу (множество векторов х с ||х|| = 1) в множество векторов х различной длины. Это 85
[AxJ/xlhi} Mx/Mf Рис. 9 множество — r-мерный эллипсоид в RT т = п = г = 2 изображен на рис. 9. (г ранг А). Случай Здесь ап и ап -соответственно длины большой и малой осей эллипса — образа круга. Число обусловленности связано с эксцентриситетом эллипса и плохая обусловленность отвечает сильно вытянутым эллипсам. Опишем теперь алгоритм отыскания нормального обобщенного решения, основанный йа SVD-разложении матрицы системы. Если A = USV, то систему Ах = Ъ можно записать в виде USVx = b. (1) Умножая обе части равенства на U'1 и учитывая, что U— ортогональная матрица, а значит, U~1 = UT, получаем SVx=*7Tb. (2) Введем обозначения Fx = y, Urb = z. В этих обозначениях система (2) принимает вид Sy = z. (3) Нормальное обобщенное решение у* системы (3) находится легко, поскольку матрица S очень простая. Нормальное обобщенное решение исходной системы х* выражается через у* по формуле Итак, если SVD-разложение матрицы A = USV известно, т. е. известны матрицы U, S и К, то алгоритм поиска нормального обобщенного решения системы Ах = Ъ состоит из следующих шагов: 1) по формуле z=UTb вычисляют вектор z; 2) находят нормальное обобщенное решение у* системы Sy = z; 3) по формуле x* = VTy* вычисляют нормальное обобщенное решение исходной системы. Отыскание нормального обобщенного решения — это только одно из приложений сингулярного разложения — мощного вычислительного средства анализа матриц. 86
Следует заметить, что при вычислении сингулярного разложения имеется определенный произвол. Если производить реальные вычисления по описанной ниже программе SVD на различных машинах или даже на машинах с различными программами извлечения квадратного корня, то могут быть получены различные матрицы U и К, удовлетворяющие, однако, определению сингулярного разложения. Сингулярное разложение позволяет, например, легко вычислить ранг матрицы, поскольку ранг матрицы совпадает с количеством ее ненулевых сингулярных чисел. Как известно, пространство матриц размера тхп изоморфно пространству линейных операторов, действующих из Rn в Rm. В теории линейных операторов важную роль играют следующих четыре линейных пространства: ядро линейного оператора кегЛ, его ортогональное дополнение в Rn, образ оператора im^, его ортогональное дополнение в Г. SVD-разложение позволяет получить базисные векторы каждого из этих пространств. Напомним, что ядро матрицы (оператора)—это множество векторов, для которых Ах = 0. Если y4 = USV—сингулярное разложение матрицы А, то столбцы матрицы VT, которые соответствуют нулевым сингулярным числам матрицы А, образуют базис ядра матрицы А, в чем можно убедиться непосредственной проверкой. Знание этого базиса позволяет, в частности, записать общее решение однородной системы Ах = 0. Аналогично, базис в образе матрицы А — это совокупность тех столбцов матрицы U, которые соответствуют ненулевым сингулярным числам матрицы А. Знание этого базиса позволяет ответить на вопрос о разрешимости системы Ах = Ъ при заданном векторе Ь. Если вектор Ь принадлежит образу оператора А, то система разрешима. В противном случае система несовместна. Однако условие принадлежности вектора b образу оператора трудно проверяемо. В то же время ясно, что если b принадлежит образу оператора, то он ортогонален ортогональному дополнению образа, и, значит, каждому вектору базиса этого ортогонального дополнения, т. е. ортогонален последним п — г столбцам матрицы U (г—ранг матрицы А, количество ненулевых сингулярных чисел). Итак, если (b, Uj) = 0, j=n — r+\, 2, ..., п {U}—у-й столбец С/), то система Ах = Ъ разрешима. Если хотя бы при одном j условие не выполнено, то система несовместна. Ниже приведен текст программы SVD для вычисления сингулярного разложения произвольной прямоугольной матрицы. Эта программа получена в результате ординарной переработки АЛГОЛ-процедуры Голуба и Райнша (1971) из [39]. Там же приведено детальное описание структуры алгоритма. 87
subroutine SVD (nm,m,n,a,w,matu,u,matv,v,ierrrrvl) с Программа SVD осуществляет сингулярное разложение * с A-USv действительной прямоугольной матрицы А раз- * с мерности m*n * с с nm - количество строк двумерных массивов, nm>=n, nm>=m * с m - число строк матрицы А ( и U ) * с п - число столбцов матрицы А ( и U ) и размерность V * с а - массив размерности m*n содержит элементы матрицы А* с w - массив размерности п содержит диагональные элемен-* с ты матрицы S * с matu - равно .true., если вычисляется U, иначе - «false. * с и - массив размерности пГп, содержит элементы U * с matv - равно .true., если вычисляется V,иначе - .false. * с v - массив размерности пГп содержит элементы V * с ierr - признак выхода * с ierr=0 - нормальное завершение * с ierr=k - не вычисляется k-е сингулярное число * с rvl - рабочий массив размерности m * с real a(nm,n),w(n),u(nm,n),v(nm,n),rvl(n) logical matu,matv ierr = 0 100 do 100 i = l,m do 100 j = l,n u(i,j) = a(i,j) continue с с Хаусхолдерово приведение к двухдиагональной форме с с 120 с g = 0.0 scale - 0.0 anorm =0.0 do 300 i - l,n 1 = i + 1 rvl(i) = scale*g g = 0.0 s = 0.0 scale = 0.0 if(i.gt.m) go to 210 do 120 k = i,m scale = scale + abs(u(k,i)) if(scale.eq.O.O) go to 210 do 130 k = i,m u(k,i) = u(k,i)/scale s = s + u(k,i)"2
130 continue f=u(i,i) g = -sign(sqrt(s),f) h = Г g - s u(i,i) = f - g if(i.eq.n) goto 190 с do 150 j - 1,-n s = 0.0 do 140 к = i,m 140 ' s = s + u(kri)»u(krj) f = s/h do 150 к = i,m u(k,j) - u(k,j) + fu(k,i) 150 continue 190 do 200 к = i,m 200 u(k,i) = scale'u(k,i) 210 w(i) = scale'g g = 0.0 s = 0.0 scale = 0.0 if(i.gt.m.or.Keq.n) goto 290 do 220 к = l,n 220 scale = scale + abs(u(i,k)) if(scale.eq.O.O) goto 290 do 230 к - l,n u(irk) = u(i,k)/scale s = s +* u(irk)**2 230 continue f - u(i,l) g - -sign(sqrt(s),f) h - f*g - s. u(ij) - f - g do 240 к - l,n 240 rvl(k) « u(irk)/h if(i.eq.m) goto 270 с do 260 j = l,m s = 0.0 do 250 к = lrm 250 s » s + u(jrk)*u(irk) do 260 к = lrn u(j,k) - u(j,k) + s'rvl(k) 260 continue 270 do 280 к - lrn 280 u(i,k) - scale*u(irk) 290 anorm = amaxl(anormrabs(w(i)) + abs(rvl(i))) 300 continue с с вычисление V с 89
с if(.not.matv) goto 410 с do 400 ii = l,n i = n + 1 - ii if(i.eq.n) goto 390 if(g.eq.O.O) goto 360 с do 320 j = l,n 320 v(j,i) = (u(i,j)/u(i,l))/g do 350 j = l,n s = 0.0 do 340 к = l,n 340 s = s + u(i,k)'v(k,j) do 350 к = l,n/ v(k,j) = V(k.j) + sMkri) 350 continue с 360 do 380 j = l,n v(i,j) = 0.0 v(j,i) = 0.0 380 continue 390 v(i,i) = 1.0 g - rvl(i) 1 = i 400 continue с с вычисление U с 410 if(.not.matu) goto 510 mn = n if(m.lt.n) mn = m с do 500 ii = l,mn i = mn + 1 - ii 1 = i + 1 g = w(1) if(i.eq.n) goto 430 с do 420 j = l,n 420 u(i,j) = 0.0 с 430 if(g.eq.O.O) goto 475 if(i.eq.mn) goto 460 с do 450 j = l,n s = 0.0 do 440 к = lrm 440 s = s + u(k,i)*u(k,j) f = (s/u(iri))/g do 450 к = irm u(k,j) = u(krj) + fu(kri) 450 continue 460 do 470 j = i,m 470 u(j,i) = u(jri)/g go to 490 90
с 475 do 480 j = i,m 480 u(j,i) = 0.0 490 u(i,i) = u(i,i) + 1.0 500 continue с с диагонализация двухдиагональной формы с 510 do 700 кк = 1,п kl = n - кк к = kl + 1 its = 0 520 do 530 11 = 1,к И = к - 11 Т =11+1 if(abs(rvl(1)) + anorm.eq.anorm) goto 565 if(abs(w(11)) + anorm.eq.anorm) goto 540 530 continue с 540 с = 0.0 s = 1.0 do 560 i = l,k f = s'rvl(i) rvl(i) = c*rvl(i) if(abs(f) + anorm.eq.anorm) goto 565 g = w(i) h = sqrt(ff + g'g) w(i) = h с = g/h s = -f/h if(.not.matu) goto 560 с do 550 j = l,m У = u(j,ll) z = u(j,i) u(jjl) = y*c + z*s u(j r i) = -y*s + z'c 550 continue 560 continue с с проверка сходимости с 565 z = w(k) if(l.eq.k) goto 650 if(its.eq.30) goto 1000 its = its + 1 x = w(l) у = w(kl) g = rvl(kl) h - rvl(k ) f = ((У - z)*(y + z) + (g - h)*(g + h))/<2.0»h»y) g = sqrt(f*f + 1.0) f = ((x - z)*(x + z) + h*(y/(f + sign(grf)) - h))/x с « 1.0 s - 1.0 91
do 600 il - l,kl i = il + 1 g = rvl(i) у = w(i) h = s'g g = c*g z = sqrt(f f + h'h) rvl(il) = z с = f/z s = h/z f = x*c + g*s g - -x*s + g*c <h - y's У = У*с if(.not.matv) goto 575 с do 570 j = l,n x - v(j,il) z = vfj,i) v(j,i1) = x*c + z*s v(j, i) = -x*s + z*c 570 continue с 575 z = sqrt(f f + h'h) wMl) = z if(z.eq.O.O) goto 580 с = f/z s = h/z 580 f - c*g + s*y x = -s*g + c*y if(.not.matu) goto 600 590 600 с 650 с 690 700 do 590 j = l,m У = u(jril) z = u(j,i ) u(jril) - У*с + z*s u(jri) = -y*s + z*c continue continue rvl(l) = 0.0 rvl(k) = f w(k) = x goto 520 if(z.ge.O.O) goto 700 w{k) = -z if(.not.matv) goto 700 do 690 j = l,n v(j,k) = -v(j,k) continue с с нет сходимости к k-му сингулярному числу с выполнено более 30 итераций 92
с goto 1001 1000 ierr = к 1001 return end Входные параметры: nm — количество строк в двумерных массивах; m—число строк в матрице А; п — число столбцов в матрице А; а — массив размерности тхп, содержит элементы матрицы A, matu — равно .true., если нужно вычислять U, иначе — .false., matv — равно .true., если нужно вычислять К, иначе — .false.; rvl—рабочий массив размерности т. Выходные параметры: w — массив размерности п, содержит диагональные элементы матрицы S; и — массив размерности гахя, содержит первые п столбцов матрицы U; v — массив размерности т х и, содержит первые п столбцов V. Внимание! nm = max (я, га). Количество строк всех двумерных массивов равно nm. ierr — признак выхода; ierr = 0 — нормальное завершение, ierr = fc — не вычисляется к-ъ сингулярное число. Перед обращением к программе SVD необходимо описать размерности массивов a, u, v, w, rvl, присвоить фактические значения параметрам nm, n, m, соблюдая следующее условие: пт^п, пт^т. Задание. Вычислить с помощью программы SVD сингулярное разложение матрицы А. Определить ранг и число обусловленности системы. Описать четыре основных пространства, связанных с матрицей. Порядок выполнения лабораторной работы 1. Составить головную программу для вычисления SVD- разложения матрицы А, печать u, v, s. 2. Найти ранг и число обусловленности системы. Пример. Вычислить сингулярное разложение матрицы: 85.15408 -225.70750 -103.29670 132.61960 17.00422 -26.91581 -12.31822 26.48351 6.63384 -27.48251 -12.564530 10.33160 11.22706 -17.77119 -8.133120 17.48510 А Программа решения задачи может иметь следующий вид: dimension a(4,4),u(4,4),v(4,4),sigma(4),work(4) data a / 85.15408 , 17.00422 , 6.633843, 11.227060, -225.70750 ,-26.91581 ,-27.454000,-17.77119 , -103.29670 ,-12.31822 ,-12.564530, -8.133120, 132.61960 , 26.48251 , 10.331600, 17.485100/ 93
m - 4 n = 4 с обращение к программе SVD с call SVD(4tmfn,a,sigma,.true.,u,.true.,v,ierr,work) с if(ierr.ne.O) write(3,2) ierr 2 format(5x,'ошибка',i4) с с печать результатов с write(2,*) ' матрица s' do 3 j « l,n write(2t6) sigqia(j) 3 continue печать матрицы s write(2,*) * матрица u' do 4 i = ltm write(2f6) (u(i,j),j=l,n) ! печать матрицы и continue write(2f*) ' матрица v' do 5 i = l,n write(2,6) (v(i,j),j=l,n) ! печать матрицы v continue format(6fl0.6) format!lx) stop end В* результате вычислений на ЭВМ прлучен следующий результат: матрица s 00.000100 14.000000 .000007 .000005 матрица и -.980085 -.139708 -Л 06800 -.092242 матрица v -.291927 .765148 .350175 -.454649 -.106800 .749229 -.427250 .494679 .454649 .491295 .224845 .708074 -.062228 .637863 .333719 -.691296 -.841460 -.002145 .004686 .540295 .155417 -.110765 -.833476 -.518549 .004336 -.416141 .909285 -.002784 Таким образом, ранг матрицы равен двум, число обусловленности равно 300/14 = 21.429. 94
Векторы Г -.8414601 Г .004336] -.002145 -.416141 .004686 .909285 |_ .540295 J [-. 002784 J образуют базис в ядре матрицы. Векторы Г-.9800851 - Г-.1068001 -.139708 .749229 -.106800 -.427250 [_ -.092242 J [_ -494679J образуют базис в образе. Варианты заданий Номер варианта 1 2 3 4 5 6 .15446Е + 00 .33012Е + 00 -.54037Е + 00 .58495Е + 00 .10194Е + 01 Л3770Е + 00 .14613Е + 00 — Л2171Е —01 .37712Е + 01 -.43613Е + 01 .52997Е + 01 .40591Е + 01 .41585Н + 00 .13936Е + 01 -.87625Е + 00 -.48377Е + 01 .11107Е + 01 .33082Е + 00 -.17127Е + 00 .29074Е + 00 .94217Е + 01 -.82311Е + 01 .10527Е + 02 .28367Е + 01 Матрица А -.43024Е + 00 -.94878Е + 00 .15346Е + 01 -.16812Е + 01 .13661Е + 01 .19687Е + 00 .19598Е + 00 -Л7401Е-01 .48587Е + 00 -.59594Е + 00 .69610Е + 00 .55464Е + 00 -.35891Е + 00 .12212Е + 01 -.73761Е + 00 -.42394Е + 01 .10590Е + 02 .30755Е + 01 -.17300Е + 01 .27030Е + 01 -.20262Е + 01 .17141Е + 01 .22359Е + 01 -.59074Е + 00 -.55900Е-01 -.12327Е + 00 .19939Е + 00 -.21843Е + 00 -.5.1685Е + 01 -.74484Е + 00 -.74144Е + 00 .65832Е-01 .19836Е + 00 -.24330Е + 00 .28419Е + 00 .22644Е + 00 -.63151Е + 00 -.21488Е + 01 Л2978Е + 01 .74592Е + 01 .79845Е + 01 .23188Е + 01 -.13043Е + 01 .20379Е + 01 .20679Е + 01 -.17494Е + 01 -.22819Е + 01 .60288Е + 00 .24055Е + 00 .51413Е + 00 -.84158Е+00 .91101Е + 00 -.22275Е + 01 -.30089Е + 00 -.31930Е + 00 .26593Е-01 -.53757Е + 00 .62168Е + 00 -.75546Е + 00 -.57861Е + 00 .48148Е + 00 .16136Е + 01 -.10145Е + 01 -.56012Е + 01 -.37547Е + 01 -Л1183Е + 01 .57899Е + 00 -.98286Е + 00 -.27418Е + 01 .23953Е + 01 .30634Е + 01 -.82550Е + 00 95
Продолжение таблицы Номер варианта 7 8 9 10 11 12 13 14 15 16 .22224Е + 00 .17226Е + 01 .10474Е + 02 .54542Е + 01 .42016Е + 00 Л9439Е + 00 I-.61729E-01 -.20038Е + 00 .15788Е + 02 -Л0221Е + 02 .46778Е + 01 -.11261Е + 02 .41750Е-01 .93292Е-01 -.19135Е + 02 .89416Е + 01 .70954Е-03 -.99360Е-04 .37446Е-03 -.35194Е-04 .21121Е + 02 -.97494Е + 01 .54455Е + 01 .92933Е + 01 .58993Е + 00 -.43515Е + 01 .67688Е + 01 -.31085Е + 02 .46329Е + 00 .37616Е + 00 -.42388Е + 00 .28498Е+00 —t .23797Е + 02 -.72308Е + 01 -.74144Е + 01 -.96619Е + 00 .33057Е + 01 -.11653Е + 02 .27268Е + 02 Матрица А .20919Е + 00 Л2234Е + 01 .74958Е + 01 .38736Е + 01 -Л6937Е + 02 -.76571Е + 01 .28952Е + 01 .78932Е + 01 —.31013Е + 01 .20256Е + 01 -.88782Е + 00 .22317Е + 01 .72743Е-01 -.69765Е-01 Л4194Е + 02 -.66866Е + 01 -.35012Е + 01 .22264Е + 01 .25177Е + 01 -.78859Е + 00 Л5882Е + 02 -.74096Е+01 .39960Е + 01 .70629Е + 01 .36004Е-01 -.24076Е + 00 .39005Е + 00 -Л7198Е + 01 .23325Е + 02 Л9986Е + 02 -.21495Е + 02 Л5141Е + 02 -.96479Е + 01 .28581Е + 01 .30008Е + 01 .38190Е + 00 Л0035Е + 01 -.31905Е + 01 .76123Е + 01 .26602Е + 00 Л5558Е + 01 .95322Е + 01 .49260Е + 01 Л0087Е + 02 .45605Е + 01 -Л7243Е + 01 -.47011Е-+01 -.71755Е + 01 .46865Е + 01 -.20541Е + 01 .51635Е + 01 -.20820Е-01 Л9967Е-01 .40626Е + 01 Л9138Е + 01 .23236Е + 02 Л4775Е + 02 Л6709Е + 02 -.52335Е + 01 -.32325Е + 00 Л5081Е + 00 — .81334Е —01 -Л4376Е + 00 -.32946Е + 00 .22030Е + 01 -.35692Е + 01 Л5737Е + 02 .56599Е + 01 .48497Е + 01 -.52159Е + 01 .36742Е + 01 .25078Е + 02 -.74291Е + 01 -.78002Е + 01 -.99269Е + 00 .54364Е + 00 -Л7284Е + 01 .41238Е + 01 Л9367Е + 00 Л5012Е + 01 .91273Е + 01 .47530Е + 01 -.28570Е + 01 -Л3218Е + 01 .41974Е + 00 Л3625Е + 01 -.71410Е + 01 .46230Е + 01 -.21158Е + 01 .50935Е + 01 .27069Е-01 .60487Е-01 -Л2406Е+02 .57974Е + 01 -Л6032Е+00 .22450Е-01 -.84609Е-01 .79521Е-02 -Л3430Е + 02 .61993Е + 01 -.34626Е + 01 -.59092Е + 01 .27315Е + 00 -.20148Е + 01 .31341Е + 01 -Л4393Е + 02 .33563Е + 01 .27251Е + 01 -.30708Е + 01 .20646Е + 01 -.20370Е + 02 .61895Е + 01 .63466Е + 01 .82706Е + 00 .99381Е+ 00 -.35034Е+01 .81975Е + 01 96
Продолжение таблицы Номер варианта 16 17 18 19 20 21 22 23 24 25 Матрица А .32367Е + 02 .16823Е + 01 .19161Е + 01 .73100Е-01 -.28993Е + 01 .23026Е + 02 .-.34268Е + 01 .25324Е + 01 -.24584Е + 01 .93047Е + 01 -.20747Е + 02 -.50813Е + 02 .23840Е + 01 .29497Е + 01 .46102Е + 01 .63919Е + 01 .53881Е + 01 .18899Е + 02 -.15438Е + 00 .11694Е + 00 .15299Е + 00 .18736Е + 02 -.29757Е + 02 .31857Е + 02 -.45869Е + 02 .36164Е + 01 .74821Е + 01 -.17309Е + 02 .38860Е + 01 .12738Е + 02 .16202Е + 01 .15111Е + 01 .81142Е + 00 .30846Е + 02 -.36344Е + 02 .17157Е + 02 .53507Е + 02 .88617Е + 01 -.12521Е + 02 -.14239Е + 02 -.90481Е + 00 .21545Е + 02 -.28865Е + 02 .44373Е + 01 -.30771Е + 01 .31833Е + 01 -. 96771Е + 00 .25205Е + 01 .60245Е + 01 -.28963Е + 00 -.87224Е + 01 -.13263Е + 02 -Л8646Е + 02 -.15501Е + 02 .47944Е + 02 -.43842Е + 00 -.45833Е-01 .43447Е + 00 -.80167Е-01 .57914Е-01 -.12683Е + 00 .89269Е-01 .10248Е + 02 .22156Е + 02 -.50828Е + 02 .11507Е + 02 .26061Е + 01 .35161Е + 00 .30380Е + 00 .17609Е + 00 -.40806Е + 01 .49263Е + 01 -.20743Е + 01 -.72527Е + 01 .48006Е + 01 .17330Е + 02 .19707Е + 02 .12523Е + 01 -.29821Е + 02 -.27154Е + 02 .41743Е + 01 -.28947Е + 01 .29947Е + 01 .79337Е + 00 -.20664Е + 01 -.49391Е + 01 .23745Е + 00 -.13989Е + 02 -.21272Е + 02 -.29905Е + 02 -.24861Е + 02 -.21890Е + 02 .20017Е + 00 .20926Е-01 -.19837Е + 00 -.25998Е + 00 .18781Е + 00 ' -.41130Е + 00 .28950Е + 00 -.17581Е + 01 -.38011Е + 01 .87201Е + 01 -.19742Е + 01 .63995Е + 02 .86341Е + 01 .74599Е + 01 .43241Е + 01 -.36208Е + 00 .43712Е + 00 -.18406Е + 00 -.64354Е + 00 .97306Е + 01 .58778Е + 01 .66946Е + 01 .25541Е + 00 -.10130Е + 02 -.26187Е + 02 .38973Е + 01 -.28802Е + 01 .27959Е + 01 ■Л4105Е + 01 -.31451Е + 01 -.77027Е + 01 .36139Е + 00 .65990Е + 01 Л0314Е + 02 Л4300Е + 02 Л2054Е + 02 -.28868Е + 02 .23582Е + 00 -Л7863Е + 00 -.23370Е + 00 Л6584Е + 00 -.26340Е + 00 .28199Е + 00 -.40601Е + 00 .57433Е + 01 Л1883Е + 02 -.27490Е + 02 .61716Е + 01 -.27195Е + 02 -.34589Е + 01 -.32261Е + 01 -Л7323Е + 01 -.41187Е + 01 .48529Е + 01 -.22910Е + 01 -.71445Е + 01 "4 — 187 97
Продолжение таблицы Номер варианта 26 27 28 29 30 .27346Е + 01 .91361Е + 01 .12961Е + 02 -.28402Е + 02 .63868Е + 01 .18697Е + 01 -.17156Е + 01 .75164Е + 00 .43510Е + 02 -.38692Е + 02 -.48615Е + 02 -.17455Е + 02 .10921Е + 01 .74301Е + 01 .26781Е + 01 .42614Е + 02 .17965Е + 01 .78083Е + 00 .26239Е + 00 -.82565Е + 00 Матрица А -Л1110Е + 01 -.35849Е + 01 -.51725Е + 01 .11145Е + 02 -.67524Е + 02 -.18932Е + 02 .18209Е + 02 -.76109Е + 01 .59136Е + 01 -.50907Е + 01 -.65295Е + 01 -.22966Е + 01 -.12118Е + 01 -.72230Е + 01 -.07865Е + 01 -.41427Е + 02 .49866Е + 02 .22034Е + 02 .60831Е + 01 -.23299Е + 02 •.50222Е + 01 .16206Е + 02 .23383Е + 02 -.50380Е + 02 -.24412Е + 02 -.68445Е + 01 .65832Е + 01 -.27516Е + 01 -.11467Е + 02 .98719Е + 01 .12662Е + 02 .44536Е + 01 -.83855Е + 00 -.49981Е + 01 -.49087Е + 02 -.28666Е + 02 -.55218Е + 02 -.24399Е + 02 -.67359Е + 01 .25799Е + 02 •.32234Е + 01 .10769Е + 02 .15278Е + 02 -.33479Е + 02 -.20908Е + 02 -.61208Е + 01 .56162Е + 01 -.24606Е + 01 -.12245Е + 02 .10889Е + 02 .13682Е + 02 .49125Е + 01 .9688 IE+ 00 .65916Е + 01 .76564Е + 01 .37805Е + 02 -.11507Е + 02 -.50015Е + 01 -.16807Е + 01 .52886Е + 01 Лабораторная работа 12 ИССЛЕДОВАНИЕ ПРОИЗВОЛЬНОЙ СИСТЕМЫ ЛИНЕЙНЬК УРАВНЕНИЙ Рассмотрим систему линейных уравнений А\ = Ъ, (1) где А — заданная матрица размера тхп; b— известный вектор. Исследование такой системы позволит ответить на следующие вопросы: совместна ли система? единственно ли решение? имеет ли система А\ = 0 ненулевое решение? каков вид общего решения системы, если она совместна, а решение не единственно? Классическая линейная алгебра, казалось бы, дает исчерпывающие ответы на все эти вопросы. Например, теория определителей позволяет выяснить, совместна ли система, а правило Крамера — получить решение в явном виде. Однако «изящные» результаты классической линейной алгебры оказываются практически бесполезными при численных решениях задач на ЭВМ, так как не учитывают особенности машинной арифметики, 98
влияния погрешностей округления и возмущения входных данных на окончательный результат и т. п. Исследование реальных систем на ЭВМ требует применения специальных методов. Одним из наиболее наглядных и простых методов исследования системы (1) является сингулярное разложение матрицы системы. Покажем, как знание сингулярного разложения матрицы системы позволяет провести ее исследование. Пусть необходимо исследовать систему из пяти уравнений с тремя неизвестными: х1 + 6х2 + 11хъ = Ь1 2хх + 1х2 + \2хъ = Ъ2, 3x1 + Sx2 + l3x3 = b3, 4^+9*2 +14*3 = 64, 5хх + 10х2 + 15х3 = Ь5 с двумя различными правыми числами Ь1 = {5, 5, 5, 5, 5}, 62 = {4, 5, 5, 5, 5}. В этой системе матрица А имеет вид 1 2 3 4 5 6 7 8 9 10 И 12 13 14 15 Матрицы U, S, V сингулярного разложения A = USVT можно найти с помощью программы SVD из предыдущей лабораторной работы 11. Имеем U= s=\ 0.355 0.399 0.443 0.487 0.531 35.127 0 0 0 0 -0.684 -0.376 -0.062 0.251 0.564 0 2.465 0 .0 0 0 0 0 0 0 0.541 -0.802 0.160 -0.079 0.180 0.193 -0.113 -0.587 0.742 -0.235 0.265 0.210 -0.656 -0.378 0.559 99
v= 0.202 0.890 0.408 0.517 0.257 -0.816 0.832 -0.376 0.408 (2) Тогда USVrx = h. Умножая на С/-1, получаем SVTx=U~1b. (3) Введем обозначения z = Vхх, й=и~1Ъ. Теперь система (3) имеет совсем простой вид, поскольку матрица ее диагональна: Sz = d, (4) т. е. ' 35.127*! = */!, 2A65z2 = d2, 0z3 = d3, 0 = d4, 0 =d5. Вычислим вектор d для правых частей Ь = ЬХ = {5, 5, 5, 5, 5} и b = b2 = {4, 5, 5, 5, 5}. Получим d(1)= J7_1b = {11.071, -1.561, 0, 0, 0} и d(2)=[/-1b = {10.716, -0.872, -0.541, 0.193, —0.265}. Для каждой правой части запишем систему (4) в развернутом виде: 35.127zx = 11.071, 2.465z2=-1.561, 0z3 = 0, •< 0 =0, 0 =0; 35.127z1 = 10.716, 2.465z2 =0.872 0z3=-0.541, 0 =-0.193, 0 = -0.265. Очевидно, что вторая система несовместна. Решение первой найти легко: z1 = 11.071/35.127 = 0.315; z2= -1.561/2.465= -0.633; z^ — любое. 100
Полагая z3 = 0, находим наименьшее по длине, т. е. нормальное обобщенное решение системы (4): z* = {0.315, -0.633, 0}. Нормальное обобщенное решение исходной системы вычисляем по формуле х*= Vz*={—0.5, 0, 0.5}. Полагая теперь z3 = C, где С—произвольная константа, найдем общее решение исходной системы с правой частью b = b. Запишем вектор z = {0.315, -0.633, 0} + С{0, 0, 1}. Тогда 0.315 -0.633 1 0 + CF 10 0 1 = -0.5 0 0.5 + С 0.408 -0.876 0.408 1 Очевидно, вектор С {0.408, —0.876, 0.408} является общим решением однородной системы Ах = 0 и, значит, базисом ядра А. Итак, подведем итог. Система Ах = Ъ± совместна, имеет бесконечное множество решений; система Ах = 0 имеет ненулевое решение — векторы С {0.408, —0.876, 0.408}; общее решение неоднородной системы можно записать в виде { — 0.5, 0, 0.5} +С {0.408, — 0.876, 0.408}, где С—произвольная постоянная. Классического решения системы с правой частью Ь2 не существует. Нормальное обобщенное решение этой системы совпадает с вектором х*. Исследование системы проведено полностью. Заметим, что в системе (2) уравнений больше, чем неизвестных. Использование SVD-разложения позволяет утверждать, что линейно независимы первых три уравнения, а два последних являются линейной комбинацией первых трех. Опишем алгоритм исследования произвольной системы с использованием SVD-разложения. Пусть найдено сингулярное разложение матрицы системы A = USVr. Здесь А — матрица размерности тхп; U—ортогональная тхт матрица; S—диагональная тхп матрица с элементами ок на диагонали; V—ортогональная пхп матрица. Рассмотрим систему линейных уравнений Ах = Ъ. Здесь х — искомый вектор из Л", b — заданный вектор из Rm. Обозначив, как и выше, z=FTx, d=Z7Tb, получим систему Sz = d. Исследуем эту простую систему с диагональной матрицей. Перепишем систему в явном виде OjZj = dj для j ^r и 0,-7*0, 0zj = dj для j^n и Oj = 0, 0 = dj для j > п. 101
Очевидно, что рассматриваемая система совместна тогда и только тогда, когда dj = 0 для всех j>n и тех j <«, для которых С7у = 0, т.е. для j <г (г—ранг матрицы системы). Пусть dj = 0 для j>r. Тогда система совместна. Рассмотрим совместные системы. Если г = п (в системе отсутствуют уравнения вида 0Zj = dj), то соответствующая система в явном виде запишется так: ojZj = dj, j^n, Gj^O, 0 = 0. Эта система имеет единственное решение z = {d1/G1, d2/G2,... ..., dn/on}. И тогда единственное решение исходной системы находим по формуле x=Vz. Если же г < п, то соответствующая система в явной форме имеет следующий вид: GjZj = dj, j^r, 0,-7*0, 0z,- = 0. Эта система имеет бесконечное множество решений. Вычислив решение наименьшей длины z = {d1/o1, d2/o2, ..., dr/ar, 0, О, ..., 0}, по формуле x=Vz найдем нормальное обобщенное решение исходной системы. В лабораторной работе 11 описано, как с помощью SVD- разложения можно получить полное описание ядра и образа оператора (матрицы). Там же показано, что столбцы v- матрицы К, соответствующие нулевым сингулярным числам, образуют ортонормированный базис ядра матрицы системы. Значит, можно записать общее решение однородной системы А\ = 0 в виде линейной комбинации базисных векторов ядра: x0 = C1vr+1 + ...+Cn_rvn. Тогда общее решение линейной неоднородной системы равно сумме общего решения однородной системы х0 и найденного ранее нормального обобщенного решения. Задание. Используя сингулярное SVD-разложение матрицы системы Ах = Ъ, исследовать предложенные системы уравнений. Порядок выполнения лабораторной работы 1. Вычислить, обращаясь к SVD, сингулярное разложение матрицы А. Печатать результат — матрицы /7, 5, V. 2. Вычислить для заданных правых частей векторы d=Z7Tb, исследовать системы на совместность и найти нормальное обобщенное решение. Для совместной системы записать выражение для общего решения. Пример. Исследовать системы А\ = ЪХ и Ах = Ъ2 с матрицей А из примера, рассмотренного в предыдущей лабораторной 102
работе, где Ь1 = (—1.1937, 1.3587, -0.9613, 0.8971), Ь2 = ( —0.2618, 6.6297, -5.9589, -11.201). А В лабораторной работе 11 вычислено сингулярное разложение матрицы А линейной системы. Там получены матрицы U, S, V. Исследовать систему на совместность и построить нормальное обобщенное решение можно с помощью приведенной ниже программы. dimension u(4,4),v(4,4),bl(4),b2(4) dimension xl(4)lx2(4)ldl(4)ld2(4) dimension zl(4),z2(4) data u /-0.9800,-0.1397,-0.1068,-0.0922, -0.1068, 0.7492,-0.4272, 0.4947, -0.0622, 0.6379, 0.3337,-0.6913, 0.1554,-0.1108,-0.8335,-0.5185/ data v /-0.2919, 0.7651, 0.3502,-0.4546, 0.4546, 0.4913,-0.2248, 0.7080, -0.8415,-0.0021, 0.0047, 0.5403, 0.0043,-0.4161, 0.9093,-0.0028/ data Ы/-1.1937,1.3587,-0.9613, 0.8971/ data b2/-0.2618,6.6297,-5.9589,-11.201 / do 1 i - 1,4 dl(i) = 0. d2(i) = 0. do 1 j - 1,4 dl(1) = dl(i) + u(j,i)4>l(j) 1 <J2(1) = d2(i) + u(j,i)*b2(j) write(3,*) ' вектор Dl-UTBr write(3 *) dl write(3,'*) ' вектор D2=UT*B2' write(3,*) d2 zl(l) = dl(l)/300. zl(2) = dl(2)/14. zl(3) = 0. zl(4) = 0. z2(l) = d2(l)/300. z2(2) = d2(2)/14. z2(3) = 0. z2(4) = 0. do 2 i = 1,4 xl(i) = 0. x2(i) = 0. do 2 j = 1,4 xl(i) = xl(i) + v(i,j)'zl(j) 2 x2(i) = x2(i) + v(1,j)'z2(j) 103
с write(3,*) ' нормальное обобщ.решение АХ=ВГ write(3,*) xl writers,*) ' нормальное обобщ.решение АХ=В2' write(3,*) х2 с stop end Вычисления по программе привели к следующим результатам: вектор D1=UT*B1 9.999698Е-01 1.999888 1.190218Е-05 5.235702Е-05 вектор D2=UT*B2 9.995377Е-01 1.999439 10.000140 9.999207 нормальное обобщ.решение АХ=В1 6.396624Е-02 7.273203Е-02 -3.094519Е-02 9.962190Е-02 нормальное обобщ.решение АХ=В2 6.395208Е-02 7.271517Е-02 -3,093848Е-02 9.959984Е-02 Поскольку два последних сингулярных числа матрицы S— нули, а последние две координаты вектора dx практически нулевые, можно утверждать, что система Ах = Ъх совместна. Этот пример замечательно иллюстрирует утверждение В. В. Воеводина о том, что любая система, записанная в ЭВМ, перестает быть совместной. Действительно, ведь ни одна координата вектора dx на самом деле не равна нулю. Так как все координаты вектора d2 существенно отличаются от нуля, то система Ах = Ъ2 несовместна. Варианты заданий Номер варианта 1 2 3 4 5 Правые части системь (.10000Е + 01 (.70000Е + 01 (-.30831Е + 01 (.69078Е-01 (.11545Е + 01 (.85859Е + 01 (.28763Е + 01 (.10929Е + 02 (.53776Е + 00 (.37155Е + 01 с матрицей из .10186Е + 01 -.36729Е + 01 -.36524Е+01 -.57791Е+01 .37480Е + 00 .50561Е + 01 -.33795Е + 01 -.77860Е + 00 -.48913Е + 01 -.53144Е + 01 вариантов лабораторной работы 11 .00000Е + 00 .40000Е + 01 .17178Е+01 .95885Е + 01 .30321Е + 01 .23892Е + 01 -.21987Е + 01 .12169Е-01 .10915Е + 01 .19260Е + 01 .48952Е + 01) .68927Е+01) -.45114Е+00) .81094Е+00) -.39157Е+01) -.45856Е+01) -.12131Е + 01) -.24413Е+01) -.77083 Е+00) -.89578Е+01) 104
Продолжение таблицы Номер варианта 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Правые части системы с матрицей из (.36774Е + 01 (.92587Е + 01 (-.20926Е + 01 (-.91899Е + 01 (.86119Е + 00 (.50218Е + 01 (-.13426Е + 01 (-.91466Е + 01 (-.52671Е + 00 (.42485 Е +01 (-.18316Е + 01 (-.82524Е + 01 (.45128Е + 00 (.56442Е + 01 (-.77861Е + 00 (-.20529Е + 00 (.15495Е + 01 (-.18562Е + 01 (.93925 Е + 00 (-.50544Е + 01 (-.11806Е + 01 (-.74737Е + 01 (.13478Е + 00 (-.57877Е + 01 (.17577Е + 01 (.76966Е + 01 (-.24947Е + 01 (-.71062Е + 01 (.12127Е + 01 (.74598Е + 01 -.ЗОЗПЕ + 01 .91714Е + 00 .43687Е + 01 .26835Е + 01 .48169Е + 01 .84022Е + 01 .36545Е + 01 .47059Е + 01 .47313Е + 01 .84932Е + 01 .40326Е + 01 .62153Е + 01 -.49502Е + 01 -.64346Е + 01 -.49209Е + 01 -.76644Е + 01 .48566Е + 01 .80721Е + 01 .49991Е + 01 .87047Е + 01 -.48249Е + 01 -.68149Е + 01 -.50471Е + 01 -.80330Е + 01 .42716Е + 00 .46883Е + 01 .44425Е + 01 .46674Е + 01 -.48989Е + 01 -.61878Е + 01 вариантов лабораторной работы 11 .88441Е +00 -.31962Е + 01 -.55658Е + 00 -.55097Е + 01 -.10962Е + 01 .46625Е + 01 .30185Е + 01 .36404Е + 01 -.67239Е + 00 .57343Е + 01 .21077Е + 01 -.33687Е + 01 .10678Е + 01 .45113Е + 01 .10832Е + 01 -.28616Е + 00 .10695Е + 00 .42411Е + 01 -.35254Е + 00 .49188Е + 01 .95005 Е + 00 -.18731Е + 01 -.70958 Е +00 .42182Е + 01 -.18689Е + 01 .27884Е + 01 .20149Е + 00 -.72540Е + 01 .53240Е + 00 .79730Е + 00 -.15833Е + 01) -.54056Е + 01) -.14919Е + 01) -.Д9972Е + 01) .92419Е + 00) -.29063Е + 01) .13156Е + 01) -.26347Е + 01) -.16985Е + 01) -.17129Е + 01) .13933Е + 01) .28141Е + 01) -.38956Е + 00) .56909Е + 01) -.69099Е-01) .81934Е + 01) .35048Е-01) .62777Е + 01) -.49308Е-01) .69745 Е +00) .65096Е + 00) -.44936Е + 01) -.72115Е-01) -.31907Е + 01) -.43858Е + 01) -.60834Е + 01) .10267Е-02) -.10473Е + 01) -.49661Е +00) .56060Е + 01) 105
Продолжение таблицы Номер варианта 21 22 23 24 25 26 27 28 29 30 Правые части системы с матрицей из (.12635Е + 01 (.50259Е + 01 ( .42760Е + 00 (.44499Е + 01 ( .42971Е +00 (.55995Е + 01 ( .13678Е + 01 (-.74176Е + 01 (.65786Е + 00 (.55082Е + 01 (.28850Е + 00 (-Л2854Е + 01 (-.23356Е + 01 (-.95038Е + 01 (-.50096Е + 00 (-.56583Е + 01 (-.83326Е-01 (.33490Е + 01 (-.14717Е+00 (.56685Е + 01 .48530Е + 01 .46882Е + 01 .50662Е + 01 -.81397Е+01 .50489Е + 01 .79340Е + 01 .48764Е + 01 .57821Е + 01 -.50369Е + 01 -.71092Е + 01 .50690Е + 01 .68237Е + 01 -.45106Е + 01 -.36132Е + 01 -.50707Е + 01 -.68155Е + 01 -.50867Е + 01 -.70668 Е + 01 .50947Е + 01 .75483Е + 01 вариантов лабораторной работы 11 -.38199Е + 00 -.56804Е + 01 -.21169Е + 00 .16697Е + 01 -.29276Е + 00 .53164Е + 01 .38818Е + 00 -.57840Е + 01 .34150Е + 00 -.17290Е + 01 -.22069Е + 00 .30330Е + 01 .39458Е-01 .36633Е + 01 -.19248Е + 00 .26224Е + 01 -.19197Е + 00 .37206Е + 01 -.12600Е + 00 .58904Е + 01 .83999Е + 00) .68186Е + 01) .32503 Е + 00) -.60956Е + 01) -.48824Е + 00) -.18528Е + 01) .44691Е+ 00) .20229Е + 01) -.28366Е + 00) .64908Е + 01) .41671Е + 00) .82816Е + 01) .44507Е + 00) -.30335Е + 01) Л7425Е —01) .63762Е + 01) -.28660Е + 00) -.71415Е + 01) .81081Е-01) .14814Е + 01) Лабораторная работа 13 ВЫЧИСЛЕНИЕ СОБСТВЕННЫХ ЗНАЧЕНИЙ И СОБСТВЕННЫХ ВЕКТОРОВ СИММЕТРИЧНОЙ ПОЛОЖИТЕЛЬНО ОПРЕДЕЛЕННОЙ МАТРИЦЫ Пусть А — квадратная матрица размерности пхп. Число А, называется собственным значением матрицы А, если существует ненулевое решение линейной системы Ах = Хх. Ненулевой вектор, удовлетворяющий системе, называется собственным вектором, отвечающим собственному значению X. 106
Как известно, ненулевые решения системы Ах = Хх существуют тогда и только тогда, когда параметр А, является корнем характеристического уравнения dct(A-XE) = 0. Выражение det(A — ХЕ) представляет собой многочлен я-й степени относительно А,, поэтому может показаться, что задачу о собственных значениях следует решать следующим образом: сначала найти коэффициенты характеристического уравнения, а затем с помощью какого-либо численного метода найти корни этого многочлена. На самом деле это не так. Для матриц высокого порядка в этом случае возникает трудно разрешимая проблема вычисления коэффициентов характеристического многочлена с приемлемой точностью. Современные методы решения проблемы собственных значений основаны на совершенно иных идеях. Как правило, это итерационные алгоритмы, в которых собственные значения вычисляются как пределы некоторых числовых последовательностей без предварительного определения коэффициентов характеристического многочлена. Одновременно с нахождением собственных значений определяются и собственные векторы. К настоящему времени разработано много различных алгоритмов решения проблемы собственных значений. Все они эффективны, но достаточно сложны и трудоемки. Предлагаемый ниже алгоритм не является эффективным и редко применяется в вычислительной практике. Он включен в Лабораторный практикум потому, что опирается на теоретический материал, изложенный в лабораторных работах 11 и 12. Кроме того, поскольку многие современные алгоритмы решения проблемы собственных значений основаны на построении того или иного разложения матрицы, знакомство с предложенным простым алгоритмом послужит хорошей базой для освоения более сложных алгоритмов. Пусть А—симметричная положительно определенная матрица размера пхп. Известно, что все собственные числа такой матрицы — положительные действительные числа. Пусть найдено сингулярное разложение матрицы А A = USV, где U и V—ортогональные матрицы размера пхп, a S— диагональная матрица S = \\ Gtj ||, Gtj = О, / Ф], G}j = о,-. Матрица А —симметричная, т. е. А = АТ, и, значит, Ат = = (USV)T=VTSUT. Найдем разложение матрицы А2: A2 = ArA = (VTSUT)USV=VTS2V (здесь мы воспользовались тем, что для ортогональных матриц UrU=E). Умножая обе части последнего соотношения на Vх, получаем A2Vr=VTS2, 107
а так как матрица S2—диагональная, то VTS2 = S2 VT и, значит, A2Vr = S2V\ Если Vj—7-й столбец матрицы Кт, то A2Vj = GJVj. Последнее соотношение означает, что о]—собственное значение, a i)j—отвечающий ему собственный вектор матрицы А2. Теперь выясним, как связаны эти собственные векторы и собственные значения с искомыми собственными векторами и собственными значениями матрицы А. Если X — собственное значение и х собственный вектор матрицы А, т. е. Ах = Хх, то в результате умножения обеих частей этого равенства на матрицу А слева получаем А(Ах) = А2х = А(Хх) = ЦАх) = Х2х, т. е. собственные значения матрицы А2 являются квадратами собственных значений матрицы А, а соответствующие собственные векторы совпадают. Для симметричной положительно определенной матрицы собственные значения Xj9 7=1, 2, ..., и, положительны, поэтому \, = 0/, 7=1, 2, ..., л, а собственные векторы матрицы А совпадают со столбцами Vj матрицы Vх. Таким образом, произведя сингулярное SVD-разложение матрицы А, мы найдем ее собственные значения и отвечающие им собственные векторы. Задание. Найти собственные значения и отвечающие им собственные векторы заданной симметричной положительно определенной матрицы. Порядок выполнения лабораторной работы 1. Составить (см. лабораторную работу 11) головную программу с обращением к SVD для вычисления сингулярного разложения матрицы. 2. Выполнить вычисления на ЭВМ. 3. Выписать собственные значения и собственные векторы матрицы. Пример. Вычислить собственные значения и собственные векторы симметричной положительно определенной матрицы II 2- 2- ~2-Ц 2. 5. -4. . 11-2. -4. 5. 108
Программа решения задачи может иметь следующий вид: dimension а(3, 3), и(3, 3), v(3, 3), s(3), w(3) data a/ 2., 2., —2., 2., 5., -4., -2., -4., 5. / n = 3 m = 3 call SVD (3, m, n, a, s, .true., u, .true, v, ier, w) 1 write(3r20) do 1 1- 1,4 s(i) - sqrt(s(i)) write(3r10) s(i),(v(j,i),j=l,4) continue 10 format(2x,el2.5,6x,'(\4(el2.5,2x),')') 20 format(2x/ собств. число собственный вектор ') stop end В результате вычислений на ЭВМ получаем собственное число ЛООООЕ + 01 .10000Е+02 Л0000Е + 01 (-.94281Е + 00 (-.ЗЗЗЗЗЕ + 00 ( .00000Е + 00 собственный вектор .23570Е + 00 -.66667Е + 00 -.70711Е + 00 -.23570Е + 00 .66667Е + 00 -.70711Е + 00 Номер варианта 1 2 3 .25000Е + 00 Л8700Е + 00 Л7050Е + 00 .50000Е-01 Л0000Е + 01 .74800Е + 00 .68200Е + 00 .20000Е + 00 .22500Е + 01 Л6830Е + 01 Варианты заданий Матрица Л8700Е + 00 .61094Е + 00 .22019Е + 00 .36341Е +00 .74800Е + 00 .24438Е + 01 .88076Е + 00 .98007Е + 00 Л6830Е + 01 .54985Е + 01 А Л7050Е + 00 .22019Е + 00 .20945Е + 01 .40680Е + 00 .68200Е + 00 .88076Е + 00 .83780Е + 01 Л5340Е + 01 Л5345Е + 01 Л9817Е + 01 .50000Е-01 .36341Е + 00 .40680Е + 00 .46060Е + 00 .20000Е + 00 .98007Е + 00 Л5340Е + 01 Л3059Е + 01 .45000Е + 00 Л8500Е + 01 109
Продолжение таблицы Номер варианта 3 4 5 6 7 8 9 10 11 12 .15345Е + 01 .45000Е + 00 .40000Е + 01 .29920Е + 01 .27280Е + 01 .80000Е + 00 .62500Е + 01 .46750Е + 01 .42625Е + 01 .12500Е + 01 .90000Е + 01 .67320Е + 01 .61380Е + 01 .18000Е+01 .12250Е + 02 .91630Е + 01 .83545Е + 01 .24500Е + 01 .16000Е + 02 .11968Е + 02 .10912Е + 02 .32000Е + 01 .20250Е + 02 .15147Е + 02 .13811Е-4-02 .40500Е + 01 .25000Е + 02 .18700Е + 02 Л7050Е + 02 .50000Е + 01 .30250Е + 02 .22627Е + 02 .20630Е + 02 .60500Е + 01 .36000Е + 02 .26928Е + 02 .24552Е + 02 .72000Е + 01 Матрица .19817Е + 01 .18500Е + 01 .29920Е + 01 .97751Е + 01 .35230Е + 01 .29731Е + 01 .46750Е + 01 .15274Е + 02 .55048Е + 01 .43496Е + 01 .67320Е + 01 .21994Е + 02 .79268Е + 01 .59792Е + 01 .91630Е + 01 .29936Е + 02 .10789Е + 02 .78621Е + 01 Л1968Е + 02 .39100Е + 02 .14092Е + 02 .99983Е + 01 .15147Е + 02 .49486Е + 02 .17835Е + 02 .12388Е + 02 .18700Е + 02 .61094Е + 02 .22019Е + 02 .15030Е + 02 .22627Е + 02 .73924Е + 02 .26643Е + 02 .17926Е + 02 .26928Е+02 .87976Е + 02 .31707Е + 02 .21075Е + 02 А .18851Е + 02 .33817Е + 01 .27280Е + 01 .35230Е + 01 .33512Е + 02 .59498Е + 01 .42625Е + 01 .55048Е + 01 .52363Е + 02 .92384Е + 01 .61380Е + 01 .79268Е + 01 .75402Е + 02 .13247Е + 02 .83545Е + 01 .10789Е + 02 .10263Е + 03 .17977Е + 02 .10912Е + 02 .14092Е + 02 .13405Е + 03 .23427Е + 02 Л3811Е + 02 Л7835Е + 02 Л6965Е + 03 .29597Е + 02 Л7050Е + 02 .22019Е + 02 .20945Е + 03 .36488Е + 02 .20630Е + 02 .26643Е + 02 .25344Е + 03 .44099Е + 02 .24542Е + 02 .31707Е + 02 .30161Е + 03 .52431Е + 02 .33817Е + 01 .26550Е + 01 .80000Е + 00 .29731Е + 01 .59498Е + 01 .45079Е + 01 Л2500Е + 01 .43496Е + 01 .92384Е + 01 .68645Е + 01 Л8000Е + 01 .59792Е + 01 Л3247Е + 02 .97249Е + 01 .24500Е + 01 .78621Е + 01 Л7977Е + 02 Л3089Е + 02 .32000Е + 01 .99983Е + 01 .23427Е + 02 Л6957Е + 02 .40500Е + 01 Л2388Е + 02 .29597Е + 02 .21329Е + 02 .50000Е + 01 Л5030Е + 02 .36488Е + 02 .26204Е + 02 .60500Е + 01 Л7926Е + 02 .44099Е+02 .31583Е + 02 .72000Е + 01 .21075Е + 02 .5243 IE+ 02 .37466Е + 02 ПО
Продолжение таблицы - Номер варианта 13 14 15 16 17 18 19 20 21 22 .42250Е + 02 .31603Е + 02 .28815Е + 02 .84500Е + 01 .49000Е + 02 .36652Е + 02 .33418Е + 02 .98000Е + 01 .56250Е + 02 .42075Е + 02 .38363Е + 02 .11250Е + 02 .64000Е + 02 .47872Е + 02 .43648Е + 02 Л2800Е + 02 .72250Е + 02 .54043Е + 02 .49274Е + 02 .14450Е + 02 .81000Е + 02 .60588Е + 02 .55242Е + 02 .16200Е + 02 .90250Е + 02 .67507Е + 02 .61550Е + 02 .18050Е + 02 .10000Е + 03 .74800Е + 02 .68200Е + 02 .20000Е + 02 .11025Е + 03 .82467Е + 02 .75191Е + 02 .22050Е + 02 .12100Е + 03 ■.90508Е + 02 Матрица .31603Е + 02 .10325Е + 03 .37212Е + 02 .24478Е + 02 .36652Е + 02 .11974Е + 03 .43157Е + 02 .28133Е + 02 .42075Е + 02 .13746Е + 03 .49543Е + 02 .32042Е + 02 .47872Е + 02 .15640Е + 03 .56369Е + 02 .36204Е + 02 .54043Е + 02 .17656Е + 03 .63635Е + 02 .40620Е + 02 .60588Е + 02 .19794Е + 03 .71342Е + 02 .45288Е + 02 .67507Е + 02 .22055Е + 03 .79489Е + 02 .50210Е + 02 .74800Е + 02 .24438Е + 03 .88076Е + 02 .55386Е + 02 .82467Е + 02 .26943Е + 03 .97104Е + 02 .60814Е + 02 .90508Е + 02 .29570Е + 03 А .28815Е + 02 .37212Е + 02 .35397Е + 03 .61483Е + 02 .33418Е + 02 .43157Е + 02 .41052Е + 03 .71255Е + 02 .38363Е + 02 .49543Е + 02 .47126Е + 03 .81748Е + 02 .43648Е + 02 .56369Е + 02 .53619Е + 03 .92962Е + 02 .49274Е + 02 .63635Е + 02 .60531Е + 03 .10490Е + 03 .55242Е + 02 .71342Е + 02 .67862Е + 03 .11755Е + 03 .61550Е + 02 .79489Е + 02 .75612Е + 03 .13092Е + 03 .68200Е + 02 .88076Е + 02 .83780Е + 03 .14502Е + 03 .75191Е + 02 .97104Е + 02 .92368Е + 03 .15984Е + 03 .82522Е + 02 .10657Е + 03 .84500Е + 01 .24478Е + 02 .61483Е + 02 .43853Е + 02 .98000Е + 01 .28133Е + 02 .71255Е + 02 .50743Е + 02 .11250Е + 02 .32042Е + 02 .81748Е + 02 .58137Е + 02 .12800Е + 02 .36204Е + 02 .92962Е + 02 .66035Е + 02 .14450Е + 02 .40620Е + 02 .10490Е + 03 .74437Е + 02 .16200Е + 02 .45288Е + 02 .11755Е + 03 .83343Е + 02 .18050Е + 02 .50210Е + 02 .13092Е + 03 .92752Е + 02 .20000Е + 02 .55386Е + 02 .14502Е + 03 .10266Е + 03 .22050Е + 02 .60814Е + 02 .15984Е + 03 .11308Е + 03 .24200Е + 02 .66496Е + 02 111
Продолжение таблицы Номер варианта 22 23 24 25 26 27 28 29 30 .82522Е + 02 .24200Е + 02 .13225Е + 03 .98923Е + 02 .90194Е + 02 .26450Е + 02 .14400Е + 03 .10771Е + 03 .98208Е + 02 .28800Е + 02 .15625Е + 03 .11688Е + 03 .10656Е + 03 .31250Е + 02 .16900Е + 03 .12641Е + 03 .11526Е + 03 .33800Е + 02 .18225Е + 03 .13632Е + 03 .12429Е + 03 .36450Е + 02 Л9600Е + 03 Л4661Е + 02 Л3367Е + 03 .39200Е + 02 .21025Е + 03 Л5727Е + 03 Л4339Е + 03 .42050Е + 02 .22500Е + 03 Л6830Е + 03 Л5345Е + 03 .45000Е + 02 Матрица Л0657Е + 03 .66496Е + 02 .98923Е + 02 .32319Е + 03 Л1648Е + 03 .72430Е + 02 Л0771Е + 03 .35190Е + 03 Л2683Е + 03 .78619Е + 02 Л1688Е + 03 .38184Е + 03 Л3762Е + 03 .85060Е + 02 Л2641Е+03 .41300Е + 03 Л4885Е + 03 .91755Е + 02 Л3632Е + 03 .44538Е + 03 Л6052Е + 03 .98702Е + 02 Л4661Е + 03 .47898Е + 03 Л7263Е + 03 Л0590Е + 03 Л5727Е + 03 .51380Е + 03 Л8518Е + 03 Л1336Е + 03 Л6830Е + 03 .54985Е + 03 Л9817Е + 03 Л2107Е + 03 А Л0137Е + 04 Л7537Е + 03 .90194Е + 02 Л1648Е + 03 Л1080Е + 04 Л9163Е + 03 .98208Е + 02 Л2683Е + 03 Л2064Е + 04 .20861Е + 03 Л0656Е + 03 Л3762Е + 03 Л3091Е + 04 .22630Е + 03 Л1526Е + 03 Л4885Е + 03 Л4159Е + 04 .24472Е + 03 Л2429Е + 03 Л6052Е + 03 Л5269Е + 04 .26386Е + 03 Л3367Е + 03 Л7263Н + 03 Л6421Е + 04 .28372Е + 03 Л4339Е + 03 Л8518Е + 03 Л7615Е + 04 .30430Е + 03 Л5345Е + 03 Л9817Е + 03 Л8851Е + 04 .32560Е + 03 Л7537Е + 03 Л2400Е + 03 .26450Е + 02 .72430Е + 02 Л9163Е + 03 Л3543Е + 03 .28800Е + 02 .78619Е + 02 .20861Е +03 Л4735Е + 03 .31250Е + 02 .85060Е + 02 .22630Е + 03 Л5979Е + 03 .33800Е + 02 .91755Е + 02 .24472Е + 03 Л7272Е + 03 .36450Е + 02 .98702Е + 02 .26386Е + 03 Л8616Е + 03 ' .39200Е + 02 Л0590Е+03 .28372Е + 03 .20010Е + 03 .42050Е+02 Л1336Е + 03 .30430Е + 03 .21455Е + 03 .45000Е + 02 Л2107Е+03 .32560Е + 03 .22950Е + 03 112
Лабораторная работа 14 ЧИСЛЕННОЕ ИНТЕГРИРОВАНИЕ Пусть требуется найти определенный интеграл I=]f(x)dx, а где функция f(x) непрерывна на отрезке [я, Ь]. Для приближенного вычисления интегралов чаще всего подынтегральную функцию заменяют «близкой» ей вспомогательной функцией, интеграл от которой вычисляется аналитически. За приближенное значение интеграла принимают значение интеграла от вспомогательной функции. Заменим функцию на отрезке [я, Ъ ] ее. значением в середине отрезка. Искомый интеграл, равный площади криволинейной фигуры, заменяется на площадь прямоугольника. Из геометрических соображений нетрудно записать формулу прямоугольников UxW^ib-a). Приблизив f(x) линейной функцией и вычислив площадь соответствующей трапеции, получим формулу трапеций \f(x)^-(f(a)+f(b))(b-a). а Если же приблизить подынтегральную функцию параболой, проходящей через точки (а,/(я)), (^>/(^))> (*>/(*))> то получим формулу Симпсона ]f{x)^\(f(a)+Af{^i+f{b))(b-a). Все три формулы хорошо иллюстрируются геометрически (рис. 10). Для повышения точности интегрирования применяют составные формулы. Для этого разбивают отрезок [я, b ] на четное п = 2т число отрезков длины h = (b — a)/n и на каждом из отрезков длины 2А применяют соответствующую формулу. Таким образом получают составные формулы прямоугольников, трапеций и Симпсона. Рис. 10 113
На сетке x{ = a + ih, y=f(x(), /=0, 1, 2, ..., 2га, составные квадратурные формулы имеют следующий вид: формула прямоугольников ъ R1^^f"(x)dx = 0(h2); а формула трапеций )f{x)dx = h- У (f(xt)+f(xi+1))+R2', a Z i = 0 b i?2^-^jV"(x)dx = 0(A2); формула Симпсона b .. m—1 lf(x)dx=\ I (/Ы+4/(х2|+1)+/(х2| + 2)); i = 0 D где i?l5 R2, R3 — остаточные члены *\ Оценки остаточных членов получены в предположении, что соответствующие производные f(x) непрерывны на [ауЬ]. Нетрудно показать, что при и-► оо приближенные значения интегралов для всех трех формул (в предположении отсутствия погрешностей округления***) стремятся к точному значению интеграла. Любая попытка сравнить достоинства приведенных формул связана с вопросом типа «что больше h*f"(x) или А4/'"?» Ответ зависит от свойств интегрируемой функции. Можно лишь утверждать, что остаточный член формулы прямоугольников *] Следует заметить, что все приведенные формулы можно записать в виде a i где величины *,-, называемые узлами, и с,-, называемые коэффициентами квадратурной формулы, не зависят от f(x) **) Погрешности округления носят случайный характер, и существует точка зрения, что они увеличиваются с ростом п как Jn 114
примерно вдвое меньше, чем формулы трапеций, и оба они имеют порядок h2. А остаточный член формулы Симпсона убывает быстрее—со скоростью h4. Для практической оценки погрешности квадратурной формулы можно использовать правило Рунге. Для этого проводят вычисления на сетках с шагом h и /г/2, получают приближенные значения интеграла Ih и Ih/2 и за окончательные значения интеграла принимают величины: А/2 + (А/2 — Д)/3 —Для формулы прямоугольников; hii~(h/2~4)/3 —Для формулы трапеций; h/2~(Jh/2~h)ll5 — Для формулы Симпсона. При этом за погрешность приближенного значения интеграла принимаем величину \Ih/2 — Ih\/3 — для формул прямоугольников и трапеций и величину |/л/2 —Д1/15—для формулы Симпсона. Такую оценку погрешностей применяют обычно для построения адаптивных алгоритмов, т. е. таких алгоритмов, которые автоматически так определяют величину шага /г, что результат удовлетворяет требуемой точности. В настоящей лабораторной работе предлагается с помощью правила Рунге найти по заданной погрешности е наибольшее значение шага h для каждой приведенной квадратурной формулы (наименьшее значение п). Для вычислений интегралов предлагаются программы: subroutine RECT (a,b,n,f,res) с Программа RECT вычисляет интеграл по формуле с прямоугольников * с с а - нижний предел интегрирования с b - верхний предел интегрирования * с п - число отрезков в сетке с f - подынтегральная функция (имя внешней подпрограммы-* с функции) с res - значение интеграла h = (b-a)/n h2 = h/2. s = 0. с do 1 j = l,n x = a+j*h-h2 s = s+f(x) 115
1 continue с res '= s*h return end subroutine TRAP (a,b,n,f,res) c***"*** **** •••••»•••*•••••••••♦••••. *»»»» с Программа TRAP вычисляет интеграл по формуле тра- * с пеций * с с а - нижний предел интегрирования с b - верхний предел интегрирования с п - число отрезков в сетке * с f - подынтегральная функция (имя внешней подпрограммы -* с функции) * с res - значение интеграла h = (b-a)/n nl = n-1 s = (f(a)+f(b))*0.5 с do 1 j = l.nl x = a+j*h 1 s = s+f(x) с res = s*h return eno subroutine SIMPS (a,b,n,f,res) _**********************»*************»********************** с Программа SIMPS вычисляет интеграл по формуле * с Симпсона * с с а - нижний предел интегрирования * с b - верхний предел интегрирования * с п - число отрезков в сетке * с f - подынтегральная функция (имя внешней подпрограммы -* с - функции) * с res - значение интеграла * с*********************************,**♦*****•♦*•,****♦******* п2 = п*2 nl - п2-1 h « (b-a)/n2 s - f(a)+f(b) с do 1 j - l,nl z - 3.-(-D**J x - a+j*h 1 s » s+z*f(x) с res - s*h/3. return end
Смысл входных и выходных параметров у всех трех программ идентичен. Входные параметры: а — нижний предел интегрирования; b — верхний предел интегрирования; п — количество отрезков в сетке (четное!); f—^мя внешней подпрограммы-функции, вычисляющей f(x). Выходные параметры: res — приближенное значение интеграла. Перед обращением ко всем трем программам необходимо: описать имя f оператором external, присвоить фактические значения формальным параметрам Задание. Используя программы RECT, TRAP и SIMPS, составить программу, вычисляющую заданный интеграл, найти наименьшее значение п, при котором каждая из формул (прямоугольников, трапеций и Симпсона) дает приближенное значение интеграла с погрешностью, не превышающей е. Порядок выполнения лабораторной работы 1. Написать подпрограмму-функцию для вычисления подынтегральной функции. 2. Составить головную программу, содержащую оценку по Рунге погрешности каждой из перечисленных выше квадратурйых формул, удваивающую п до тех пор, пока погрешность не станет меньшей е, и печатающую для каждой формулы значение интеграла и значение п. 3. Провести вычисления на компьютере. Пример. Выполнить задание для приближенного вычисления интеграла 1 cos х- ^ с погрешностью е = 0.0001. о Программа решения задачи может иметь следующий вид: external f eps = 0.0001 а =0. b = 1. с write(3,*) ' формула прямоугольников ' п = 1 res = I.elO 1 n = гГ2 zz = res call RECT (a, b, n, f, res) write(3,*) n,res ts = abs(res - zz)/3. if(ts.gt.eps) go to 1 write(3,*) ' результат ' write(3,*) res - ts 117
write(3,*) ' формула трапеций n = 1 res = I.elO 2 n = n'2 zz = res call TRAP (a, b, n, f, res) write(3,*) n,res ts = abs(res - zz)/3. if(ts.gt.eps) go to 2 write(3,*) ' результат ' write(3,*) res + ts write(3,*) ' формула Симпсона ' n = 1 res = I.elO 3 n = n'2 zz = res call SIMPS (a, b, n, f, res) write(3,*) n,res tr = abs(res - zz)/15 if(tr.gt.eps) go to 3 write(3,*) ' результат1 write(3r*) res + tr stop end function f(x) f = -0.5 if(abs(x).gt.l.e-8) f = (cos(x) - l.)/x"2 return end В результате вычислений на ЭВМ получены следующие результаты: формула прямоугольников 2 -4.871994Е-01 4 -4.865884Е-01 8 -4.864361Е-01 результат -4.864869Е-01 формула трапеций 2 -4.847593Е-01 4 -4.859794Е-01 8 -4.862839Е-01 16 -4.863600Е-01 результат -4.863346Е-01 формула Симпсона 2 -4.863861Е-01 4 -4.863854Е-01 результат -4.863854Е-01
Варианты заданий 1. Jcos(x + x3)dx. 0 i 3. jVin*d;c. 0 i 5. $ecosxdx. 0 l 7. Jcosx2dx. 0 i 9. Jcosxe'^dx. 0 2 / 4 11. $e-(x+*)dx. i я 13. J y/xe~x2dx. я/2 1 15. J cos x 2 dx. 0 2. Jsin(x4 + 2x3 + x2)dx. 0 l 4. Jsinxe~^2dx. 0 l 6. Jchx2dx. 0 l 8. Jsin(x + x3)dx. 0 2 10. Jsin^xe'^dx. i 2 12..-Jlnjc-(jc+l)"1djc. i i 14. Jcosx3dx. 0 я/2 16. J lnsinxdx. я/4 17. J" cos (2 sin л: )dx. 18. $x2e-x2dx. 19. 21. 23. 25. 27. 29. j"jt4e-Jc2cb<:. 0 2 J sin x 3 dx. i 2 J x ~* e * dx. i я/4 J xsinx3dx. 0 я/4 J x cos x 3 dx. 0 2 sin* t — dx. J >fi 20. 22. 24. 26. 28. 30. J cos(x+x3)dx. я/2 2 j"x_1ln(l+x)dx. 2 Jshx2dx. i я/4 J ln(l+cosx)dx. 0 2 fedx. J s* 0,1 я Jsin(2cosx)dx. 0 0,1 119
ВХОДНЫЕ ПАРАМЕТРЫ j, b, xj , Ai, i—1,2,...,8 Лабораторная работа 15 ПРИБЛИЖЕННОЕ ВЫЧИСЛЕНИЕ ИНТЕГРАЛА ПО КВАДРАТУРНОЙ ФОРМУЛЕ ГАУССА В лабораторной работе 6 отмечалось, что алгебраический порядок точности квадратурной формулы Симпсона равен трем. Гауссом были построены квадратурные формулы наивысшего алгебраического порядка точности. В квадратурной формуле Гаусса )f(x)ux*!LAif(xi) -1 i=l узлы х19 х2, ..., хп и коэффициенты А19 А29 -.., Ап подобраны так, чтобы формула была точна для всех многочленов степени 2п — 1. Можно показать, что если п — число узлов квадратурной формулы, то ее алгебраический порядок точности не может быть выше 2п — I. Для приближенного вычисления интеграла по конечному отрезку [а, Ъ ] выполняем замену переменной t = {a + b)\ /2 + (b — a)x/2; тогда квадратурная формула Гаусса принимает вид )f(t)dt^!LAif{ti), a Z i=l где 1{ = (Ъ + а)12 + (Ъ-а)х{12; х{ — узлы квадратурной формулы Гаусса; А{ — гауссовы коэффициенты, i=l, 2, ..., п. Можно показать, что узлы х{ квадратурных формул Гаусса являются корнями многочленов Лежандра степени п. Например, при п = 2 для узлов xt получаем xi = —1/\/3> *2 = 1/\/3- При этом А1 = А2 = 1. Таким образом, квадратурная формула Гаусса / ВЫХОДНОЙ ПАРАМЕТР ( GAUSS 8 я $Ь f(x)dx 120
имеет такой же алгебраический порядок точности, что и формула Симпсона, но требует вычисления подынтегральной функции только в двух точках. Если подынтегральная функция достаточно гладкая, то квадратурная формула Гаусса обеспечивает очень высокую точность при небольшом числе узлов, так как для погрешности Rn формулы Гаусса с п узлами справедлива оценка b~a ^YWi/^wi- \К\'- '"2,5 J~n Зп [я.Ь] Блок-схема вычисления интеграла по формуле Гаусса приведена на рис. 11. В данной лабораторной работе предлагается вычислить интеграл по квадратурной формуле Гаусса с восемью узлами: Xl=-x8= -0.96028986, Л1=у48 = 0.10122854; x2=-xn = = -0.79666648, Л2 = Л7 = 0.22238103; хг = -х6 = -0.52553242, А,=А6 = 0.31370664; х4 = -0.18343464, Л4 = Л5 = 0.36268378. Алгоритм реализован в виде подпрограммы-функции (function) GAUSS8 (a, b, f): function GAUSS8 (a,b,f) Подпрограмма-функция GAUSS8 вычисляет определенный * интеграл по 8-точенной квадратурной формуле Гаусса * ,»«««««««««««««««««*««««««««««««««««««««««««««««««««»««««««« с с с с с а - нижний предел интегрирования * с b - верхний предел интегрирования * с f - подынтегральная функция ( имя внешней подпрограммы-* с функции ) * С dimension ag(8)rxg(8) data ag/ 0.10122854, 0.22238104, 0.31370664, 0.36278378, ! коэффициенты ! квадратурной 0.36268378, 0.31370664, 0.22238104, 0.10122854/ ! формулы ! Гаусса data xg/ -0.96028986, -0.79666648, -0.52553242, -0.18343464, 0.18343464, 0.52553242, 0.79666648, 0.96028986/ ! Гаусса ! узлы ! квадратурной ! формулы al - (b+a)*0.5 а2 = [b-a)*0.5 g = 0. do 1 i = 1,B x = al+a2*xg(i) g - g+ag(i)*f(x) gauss8 = g*a2 return end ! преобразование отрезка 8 [a,b] в [-1,1] ! вычисления по формуле ! Гаусса 121
Входные параметры: а—значение я, нижний предел интегрирования; b — значение Ь, верхний предел интегрирования; f—имя внешней подпрограммы-функции (function) f(x), вычисляющей значение подынтегральной функции f(x). Для того чтобы использовать подпрограмму GAUSS8, необходимо только написать имя функции GAUSS8 там, где необходимо получить значение интеграла и поставить в скобках фактические значения аргументов a, b, f. Аргумент f должен быть описан оператором external. Задание. Используя подпрограмму-функцию GAUSS8, вычис- а лить J f(x)dx. b Порядок выполнения лабораторной работы на ЭВМ 1. Составить подпрограмму-функцию f(x) для вычисления значений подынтегральной функции f(x). 2. Составить головную программу, содержащую обращение к GAUSS8 и печать результатов. 3. Произвести вычисления на ЭВМ. Пример. Вычислить Jcos(x+^:5)dx. о А Программа, реализующая вычисления, имеет вид external f с с обращение к программе GAUSS8 gi = GAUSS8 (0., 1., f) с с печать результатов с print l,gi 1 format(2x,'интеграл =',е16.8) с stop end function f(x) c»»»»» ,,,,,,,,,,,,,»,,,,,,,,,,,,,,,,,,„„„ „„„„„„„„ с Подпрограмма-функция, вычисляющая f(x) * f = cos(x + x**5) return end Окончательно получен следующий результат: интеграл - 0.6981390Е+00 122
1. jx_1exdx. l 2 4 ln(l+x) 5. $x2e-2xdx. _ I COS* _ , cos л: л 7. rdx. Варианты заданий з 2. J xc~xdx. -l 2 4. Jx ~2e~2xdx. l 6. Je(*"2-*2)d;c. l l i. f j^ Jl+Д ! л , л: cos л: , 0 0 1S- Jit- 0 :dx. dx. -c xdx. ге х dx. о l 19. Jsin(x2 + x+l)dx. о l 21. Jx3/2e"*dx. 23. f— dx. од 8. I^dx 10. I^dx. 0 1 12. f-^ 0 1 14. f^ Jl+X 0 Ifc L=, dx. -_e xdx. о l 18. Jcos(x2 + x+l)dx. о l 20. J cos x In xdx. о я/2 22. Je-cosxcos(sinx)dx. о 24. Jch(cosx)dx. о 123
25. Jecosxcos2xdx. 0 я 27. Jesin2xsin3xdx. 0 я 29. Jsin(x—cosx)dx. 0 26. 28. 30. 0 я Jcos(x —sinx)dx 0 я/2 х J e~sinjcdx. 0,1 Лабораторная работа 16 ВЫЧИСЛЕНИЕ НЕСОБСТВЕННОГО ИНТЕГРАЛА НА ПОЛУПРЯМОЙ Очень часто в приложениях возникает необходимость вычислить несобственный интеграл вида J/(*)e-«d*, о где ос>0, а/(х) — достаточно гладкая функция. Линейной заменой переменной интегрирования х-^х/а этот интеграл приводится к стандартному виду 1f(x)e-'dx, о Для вычисления стандартного интеграла воспользуемся квадратурной формулой +ff{x)e-xdx=tAif{xi), (1) 0 f=l где узлы xl9 x2i ..., хп и коэффициенты А19 А2, ..., Ап выбраны так, чтобы квадратурная формула (1) обладала наивысшим алгебраическим порядком точности. Можно показать, что узлы такой квадратурной формулы должны быть корнями многочленов Лагерра Ln(x). Это не случайно, так как эти многочлены тесно связаны с функцией е"х: для многочленов Лагерра справедлива формула L (х) = -ех — (xnQ-x). Каждый многочлен Лагерра Ln(x) имеет ровно п действительных корней. Зная корни х19 х2, ..., хп, можно найти и коэффициенты квадратурной формулы А,= ' (п-\уЫ+1(х,)' 124
Построенная таким образом квадратурная формула обладает алгебраическим порядком точности 2п— 1. Численные значения коэффициентов и узлов' квадратурной формулы для различных п приведены в [18]. Если функция f(x) имеет на всей числовой оси производную /(2л) порядка 2п, то погрешность квадратурной формулы типа Гаусса оценивается величиной *»=ё/<2и)^ и°' +оо). Таким образом, построенная квадратурная формула обеспечивает высокую точность вычисления интеграла при небольшом числе узлов. В данной лабораторной работе предлагается вычислить интеграл +f/(x)e-°*dx О по квадратурной формуле с восемью узлами. Описанный алгоритм для формулы с восемью узлами реализован в программе IEX (f, alf, res): subroutine IEX (fralfrres) с Программа IEX вычисляет интеграл по полупрямой * с от 0 до бесконечности от функции f(x)*exp(-alf*x) * с с f - имя подпрограммы-функции, вычисляющей f(x) * с alf - значение параметра альфа * с res - значение интеграла * dimension a(8)rx(8) data х / 0.1702796 , 0.9037017 , ! узлы 2.2510866 г 4.2667001 г ! квадратурной 7.0459054 ,10.7585160 г ! формулы 15.7406786 ,22.8631317 / с data a / 3.6918858 е-01,4.1878678 е-01,! коэффициенты 1.7579498 е-01,3.3343492 е-02,! квадратурной 2.7945362 е-03,9.0765087 е-05,! формулы 8.4857467 е-06,1.0480011 е-09/ res = 0. do l i = 1,8 res = res + a(i)*f(x(i)/alf) 1 continue res = res/alf return end Входные параметры: f— имя внешней подпрограммы- функции, вычисляющей значения /(*), alf—значение параметра а. Выходные параметры: res — значение интеграла. 125
Перед обращением к программе IEX необходимо описать в операторе external имя f внешней подпрограммы-функции. Задание. Вычислить интеграл + 00 J f(x)e~axdx для заданных /(х). о Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию, вычисляющую значения fix). 2. Составить головную программу, содержащую описание имени внешней подпрограммы-функции, обращение к IEX и печать результатов. 3. Провести вычисления на ЭВМ. Пример. Вычислить интеграл + 00 J e"27(l+x2)cbc. о ▲ Программа, реализующая вычисления, может иметь следующий вид: external f alf = 2. call IEX (f, alf, res) print '/значение интеграла ',res с stop end function f(x) с Подпрограмма-функция, вычисляющая значения f(x) * с«, «««„«„ „„„„«„,„„,„ „„„„„„„ «„„„„„„«„ f = l./(l + x»x) return end В результате вычислений на ЭВМ получен следующий результат: значение интеграла 3.990404Е-01 Варианты заданий 00 Вычислить интеграл J / (х) ехр (— ах) dx. Номер варианта 1 2 /(*) х2 sin(x+x2) Значение а 1. 1. Номер варианта 16 17 Значение а 1. 2. fix) X* sin (x 2) 126
Продолжение таблицы Номер варианта 3 4 5 6 7 8 9 10 11 12 13 14 15 fix) cos л: (i+хГ1 хО+е-*2)"1 In (2 + cos x) 1/(1 +*4) cos (sin x) cos (х3) sin х/(2 + sin х) ecosx arctg(x— l) arctg(e~x) (x2 + l)/(x4+l) sinx/(x4+l) Значение а 0.5 1. 0.5 1. 0.25 1. 1. 1. 2. 1. 1. 1. 1. Номер варианта ML8 19 20 21 22 23 24 25 26 27 28 29 30 Значение а 0.5 1. 1. 1. 1. 2. 1. 2. 1. 1. 1. 1. 1. fix) cos (х 2) (1+е-*)"1 (2 + cosjc2)"1 sh(x2) sin (cos x) x2/(\+chx2) ln(l+x + x2) esinx sh(cosx) cos(shx) sin x/x sin x 2/x 2 sin(e~*2) Лабораторная работа 17 ВЫЧИСЛЕНИЕ НЕСОБСТВЕННОГО ИНТЕГРАЛА С БЕСКОНЕЧНЫМИ ПРЕДЕЛАМИ Очень часто в приложениях возникает необходимость вычислить несобственный интеграл вида + 00 $f(x)e-*x2dx, — оо где ос>0, а/(х)—достаточно гладкая функция. Линейной заменой переменной интегрирования х-^х/у/й этот интеграл приводится к стандартному виду +ff(x)e-*2dx. — оо Для вычисления стандартного интеграла воспользуемся квадратурной формулой +ff(x)e-x2dx=iAJ(Xi), (1) — оо i = 1 где узлы х19 х2, ..., хп и коэффициенты А19 А2, ..., Ап выбраны так, чтобы квадратурная формула (1) обладала наивысшим алгебраическим порядком точности. Можно показать, что узлы 127
такой квадратурной формулы должны быть корнями многочленов Эрмита Нп{х). Это не случайно,■ тдк как многочлены Эрмита тесно связаны с функцией е-*2; для многочленов Эрмита справедлива формула tf.(*H-l)"e"'£e-'. Каждый многочлен Эрмита Нп(х) имеет ровно п действительных корней. Зная корни х19 х2, ..., хп, можно'найти и коэффициенты квадратурной формулы А,= 2п+1п\^ н*:(х,) Построенная таким образом квадратурная формула обладает алгебраическим порядком точности 2/1—1. Численные значения коэффициентов и узлов квадратурной формулы для различных п приведены в [18]. Если функция f(x) имеет на всей числовой оси производную порядка 2п, то погрешность квадратурной формулы типа Гаусса оценивается величиной Таким образом, построенная квадратурная формула обеспечивает высокую точность вычисления интеграла при небольшом числе узлов. В данной лабораторной работе предлагается вычислить интеграл +ff{x)t-'l6x — оо по квадратурной формуле с 16 узлами. Описанный алгоритм для формулы с 16 узлами реализован в программе IEX2 (f, res): subroutine IEX2 (f,res) с Программа 1ЕХ2 вычисляет несобственный интеграл по * с промежутку от минус до плюс бесконечности от функ- * с ции f(x)'exp(-x"2) с с f - имя подпрограммы-функции,вычисляющей f(x) * с res - значение интеграла * с, „„„„„г,,,,,,,*,,,,,,,,,,,,,*,************ „„„„„„ dimension а(8),х(8) data х / 0.27348105, 0.82295145, ! узлы 1.38025854, 1.95178799, ! квадратурной 2.54620216, 3.17699916, ! формулы 3.86944790, 4.688738939 / 128
data a / 0.50792948, 0.280647458, ! коэффициенты 0.83810041е-01, 0.12880311е-01, ! квадратурной 0.9322840le-03, 0.2711860le-04, ! формулы 0.23209808e-06, 0.26548075e-09 / с res = 0. do 1 i = 1,8 xl = x(i) res = res + a(i)'(f(xl) + f(-xl)) 1 continue return end Входные параметры: f — имя внешней подпрограммы- функции, вычисляющей значения f(x). Выходные параметры: res — значение интеграла. Перед обращением к программе IEX2 необходимо описать в операторе external имя f внешней подпрограммы-функции. Задание. Вычислить интеграл + 00 J /(x)e"ax2dx для заданных f(x). Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию, вычисляющую значения л*). 2. Составить головную программу, содержащую описание имени внешней подпрограммы-функции, обращение к IEX2 и печать результатов. 3. Провести вычисления на ЭВМ. Пример. Вычислить интеграл +fx2cos{x)e-°>25x2dx. — оо А Приведем интеграл к стандартному виду заменой х-*х/2. В результате получим J x2cos(x)e-°>25x2dx = S J x2cos(2x)e-*2d;c. Программа, реализующая вычисления, может иметь следующий вид: 5-187 129
external f call IEX2 (f,res) print *,' Значение интеграла ', res*8 stop end function f(x) с Подпрограмма функция, вычисляющая значения f(x) * с»,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, f = x*x'cos(2.'x) return end В результате вычислений на ЭВМ получен следующий результат: Значение интеграла -2.608197 Варианты заданий 00 Вычислить интеграл J f(x) exp (— ах2) dx. Номер варианта X 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /м х2 sin(x + .x2) cos л: 1/(1 +*2) х/(1+е-*2) In (2 + cos x) 1/(1 +*4) :os(sinx) cos*3 sin x/(2 + sin x) ecos* arctg(x— 1) arctg(e~x) (x2+l)/(x4+l) sinx/(l+x4) Значение a ' 1. 0.5 1. 0.5 1. 0.25 1. 1. 1. 2. 1. 1. 1. 1. Номер варианта 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 1 30 Значение a 1. 2. 0.5 1. 1. 1. 1. 2. 1. 2. 1. 1. 1. 1. 1. . /w X4 sin (x2) cos(x2) 1/(1 +e"*) 1/(2 +cos*2) sh(x2) sin (cos x) x2/(\+chx2) \n(\+x+x2) esinx sh(cosx) cos(shx) sin x/x sin я2/*2 sin(e~*2) 130
Лабораторная работа 18 ВЫЧИСЛЕНИЕ НЕСОБСТВЕННОГО ИНТЕГРАЛА ОТ НЕОГРАНИЧЕННОЙ ФУНКЦИИ Пусть необходимо вычислить несобственный интеграл вида ъ J In (*)/(*) cbc, о где f(x)— гладкая, ограниченная на [О, Ь] функция. Для вычисления такого интеграла естественно применить квадратурную формулу вида }ln{x)f{x)dx^£jAif{xi), (1) О i=l где узлы хи х2■>...,хп и коэффициенты Аи А2,...,Ап выбраны таким образом, чтобы формула (1) обладала наивысшим алгебраическим порядком точности. Если п — число узлов квадратурной формулы, то наивысший алгебраический порядок точности равен 2п— 1. Это означает, что формула (1) при заданной функции 1п(х) является точной для всех многочленов степени не выше 2п — 1. В данной лабораторной работе предлагается вычислить интеграл ъ J In (x)f(x) dx. о Чтобы квадратурная формула не зависела от длины промежутка интегрирования, приведем интеграл к отрезку [0, 1 ]. Для этого выполним замену переменной x-+xb. В результате получим Ъ Ъ 1 J In x f{x) dx = In b J f(x) dx - b J In - f(bx) dx. о о о x Интеграл в первом слагаемом является собственным и для его вычисления можно воспользоваться, например, программой GAUSS8 из лабораторной работы 15. Для вычисления интеграла во втором слагаемом применяют квадратурную формулу наивысшего алгебраического порядка точности. Можно показать, что узлы такой формулы должны быть корнями многочленов q„(x), которые ортогональны на отрезке [0,1] с весом ln(-), т.е. ]\nr-\qn(x)qm{x)dx при п фт. 131
В данной лабораторной работе использована квадратурная формула с восемью узлами. Описанный алгоритм реализован в виде подпрограммы GSL (b, f, res): subroutine GSL (b,f,res) с с с Q с с с с с с Программа GSL вычисляет определенный интеграл от * функции вида ln(l/x)*f(x) с непрерывной f(x) по * отрезку [0,Ь] * Вычисленное значение интеграла помещается в res . * Программа GSL содержит обращение к программе * GAUSS8 external f dimension x(8)fa(8) data x /0.133202 e-1, 0.797504 e-1, 0.197871 , 0.354154 0.529485 , 0.701814 0.849379 , 0.953326 / data a /0.164417 , 0.237526 0.226842 , 0.175754 0.112295 , 0.578722 e-1 , 0.209790 e-1, 0.362541 e-2 / s - 0. do 1 j - 1,8 xx - b*x(j) s - s + f(xx)*a(j) 1 continue ! узлы ! квадратурной ! формулы ! весовые ! коэффициенты ! квадратурной ! формулы res « -s*b + alog(b)*GAUSS8(0.,b,f) return end Входные параметры: b — значение верхнего предела интегрирования; f—имя внешней подпрограммы-функции, вычисляющей значения f(x). Выходные параметры: res—значение интеграла. Программа GSL содержит обращение к программе GAUSS8! Текст программы GAUSS8 приведен в лабораторной работе 15. Перед обращением к программе GSL необходимо описать в операторе external имя f внешней подпрограммы-функции; присвоить фактическое значение параметру Ь. Задание. Вычислить интеграл от заданной функции по интервалу (О, Ь). Порядок выполнения лабораторной работы Л4 132 1. Составить подпрограмму-функцию для вычисления значений
2. Составить головную программу, содержащую описание имени внешней подпрограммы-функции, обращение к GSL, печать результатов. 3. Провести вычисления на ЭВМ. Пример. Вычислить интеграл 1 Jlnxcosx2dx. о Преобразуем интеграл к виду 1 — Jln.xcos.x2dx. о Значит, в данном случае f(x)= —cosx2. Программа, реализующая вычисления, может иметь следующий эид: external f call GSL (1., f, res) print 1, res 1 format(' Значение интеграла \el8.6) stop end function f(x) программа вычисляет значения f(x) * f - -cos(x**2) return end В результате вычислений на ЭВМ получен следующий результат: Значение интеграла .979864Е+00 Варианты заданий ь <- Вычислить интеграл' \f(x) In х dx Номер варианта 1 2 3 4 Значение b 1. 2. 3. 1. /М 1 cos* lnx COS2 л: In л: \nx/(l+x3) \n(l/x)/(\+x2) 1 Номер варианта 16 17 18 1 19 Значение b 2. 4. 3. 10. /w ln(l+e-x)lnx sin (sin x) In x sin(cosx)ln(l/x) ln[ln(l+x2)]ln(l/x) 133
Продолжение таблицы Номер варианта 5 6 7 8 9 10 11 12 13 14 15 Значение Ь 2. 1. 1. 2. 1. 1. 1. 1. 2. 2. 4. /м arctg(x+l)lnx tg х In х sin x2 In x cosx2 Inx lnx/(l+cosx) lnx/(l+sinx) e~xlnx e"x2ln(l/x) e_sinxln(l/x) ecosxln(l/x) cos (sin x)\nx 1 Номер варианта 1 20 21 22 23 24 25 26 27 28 29 1 30 Значение b 1. 2. 3. 3. 2. 1. 3. 3. . 1. 2. 2. /W cosjc/(1 +x)ln(l/x) arctgx/(l +x2)lnx cosxe~xlnx cosx2e~xlnx e-cos2*ln;c cos (jc — sin x) In (1 /x) sin (x + cos x) In x arctg(x + cosx)lnx sin(\+x + x2)\n(\/x) 1п(1+е_х)1пх e-x7(l+^2)ln(l/x) Лабораторная работа 19 ВЫЧИСЛЕНИЕ ДВОЙНОГО ИНТЕГРАЛА ПО ПРЯМОУГОЛЬНОЙ ОБЛАСТИ Вычисление двойного интеграла ДО/(х, у) dx dy значительно D труднее решения аналогичной одномерной задачи. Это обусловлено не только увеличением объема вычислений, связанным с повышением размерности задачи. Усложняет задачу разнообразие форм областей интегрирования. Как и в одномерном случае, за приближенное значение интеграла принимают линейную комбинацию значений подынтегральной функции в конечном числе точек, лежащих в области Hf(x,y)dxdy^iAif{xhyi). (1) Формулу вида (1) обычно называют кубатурной формулой, точки (хь у\)—ее узлами, а числа А{—коэффициентами. Узлы и коэффициенты зависят от многих факторов: класса интегрируемых функций, вида области интегрирования, гарантированной точности и т. д. Одной из важных характеристик кубатурной формулы является ее алгебраический порядок точности (см. лабораторную работу 15). Величина т называется алгебраическим порядком точности кубатурной формулы (1), если формула (1) 134
дает точный результат для любого многочлена Р(х, у) степени ^га, т. е. для подынтегральных функций вида /(*, у) = Р(х9 y) = ZlLCijxmiymj> т{ + т^т. i J Наиболее полно вопрос о кубатурных формулах решен для случая прямоугольной области интегрирования Ь{(х, у)\хе[а, Ь]9 уе\_с, d\]. Линейной заменой переменных а + Ъ , - Ъ — а c+d , d—c х-> \-х , у-» \-у 2 2 ' ' ■ 2 у 2 область D преобразуется к стандартному виду D0 = {(x, у)\хе €[-1,1], ^б[-1,1]}. В справочной литературе узлы и коэффициенты кубатурных формул вида (1) приводятся обычно для стандартной области интегрирования D0. В данной лабораторной работе используется' кубатурная формула с 12 узлами и алгебраическим порядком точности т = 1. Расположение узлов в области D0 показано на рис. 12. Узлы, отмеченные на рис. 12 цифрами 1—4, лежат на координатных осях в точках (v, 0), ( — v, 0), (0, v), (0, — v), где v = 0.9258200. Значения функции, вычисленные в этих узлах, входят в кубатурную формулу (1) с коэффициентом >4Х = 0.2419753. Вторая группа узлов с номерами 5—8 лежит на диагоналях квадрата £>0 и координаты узлов этой группы (vl9 v{), { — vu v±), (~vu — v{)9 (vl9 —Vx)9 где v1 = 0.3805544. Значения функции, вычисленные в этих узлах, входят в кубатурную формулу (1) с коэффициентом ^42 = 0,5205929. Третья группа узлов с номерами 9—12 располагается также на диагоналях квадрата £>0, но в точках с координатами (v2, v2)9 (-v2, v2)9 (-v29 -v2), (v29 -v2), где v2 = 0.8059797. Значения функции в этих узлах входят в кубатурную формулу с коэффициентом Аъ = 0.2374317. К сожалению, для описанной здесь кубатурной формулы неизвестна форма остаточного члена, что, конечно, не позволяет получить априорную оценку для ее погрешности. На практике эту трудность можно преодолеть, разбивая область интегрирования на более мелкие области. Предложенная процедура вычисления двойного интеграла Я/(*> У) ^х ^У по прямоугольной D области D = {{х9 у) | х е [я, Ь], у е Рис. 12 135
e[c, d\) реализована в виде подпрограммы INT2P (а, Ь, с, d, f, res): subroutine INT2P (arbrcrd,frres) с Программа INT2P вычисляет интеграл от функции с Ч*,у) по прямоугольной области [A,B]*[C,D] с с arbrcrd - значения А,В,С и Dr соответственно с f - имя подпрограммы-функции, вычисляющей f с res - значение интеграла с,»„„„„„„„ „„„„„„„„„„„„„„„„„„, data al / 0.2419753 /, ! коэффициенты Ы / 0.5205929 /, ! кубатурной Ь2 / 0.2374317 / ! формулы с data vl / 0.9258200 /, ! узлы si / 0.3805544 /, ! кубатурной s2 / 0.8059797 / ! формулы с хО = (а + Ь)*0.5 ! приведение уО = (с + d)*0.5 ! к стандартной dx = (b - а)*0.5 ! области dy = (d - срО.5 с suml = f(x0 + dx*vl,y0) ! вычисления по , * +f(x0 - dx*vl,y0) ! кубатурной * +f(x0,y0 + dy*vl) ! формуле +f(x0,y0 - dy'vl) с sum2 = f(x0 + dx*sl,y0 + dy*sl) +f(x0 + dx'sl,y0 - dy'sl +f(x0 - dx'sl,y0 + dy'sl) +f(x0 - dx'sl,y0 - dy'sl) с sum3 = f(x0+dx*s2,y0+dy*s2) +f(x0+dx's2,y0-dy's2) +f x0-dx's2,y0+dy's2) +f(x0-dx»s2ry0-dy»s2) с res = (al*suml + bl*sum2 + b2*sum3)*dx*dy с return end Входные параметры: a, b, c, d—значения пределов интегрирования я, b, с, d соответственно, f—имя внешней подпрограммы-функции, вычисляющей значения подынтегральной функции. Выходные параметры: res—значение интеграла. Перед обращением к программе INT2P необходимо описать в головной программе в операторе external имя f внешней подпрограммы-функции. Задание. Вычислить jjf(x, у) dx dy по области D = {(x, y)\xe е[а, b], ye[c, d]}.- 136
Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию для вычисления значений подынтегральной функции f(x, у). 2. Составить головную программу, содержащую обращение к INT2P, и печать результатов. 3. Провести вычисления на ЭВМ. 4. Разбить область D на четыре одинаковые части и составить головную программу, вычисляющую с помо^цью INT2P сумму интегралов по этим частям. v 5. Провести вычисления на ЭВМ и сравнись результаты. Пример. Вычислить интеграл S4 JJsin (x + \ny)dxdy D по области D = {(x, у)\хе[0, 2], j>e[l, 3]}. А Программа решения задачи может иметь следующий вид: external f call INT2P (0., 2., 1., 3., f, res) print *,' значение интеграла по D',res call INT2P (0., 1., 1., 2., f, resl) call INT2P 1., 2., 1., 2., f, res2) call INT2P 0., 1., 2., 3., f, res3) call INT2P (1., 2., 2., 3., f, res4) res - resl + res2 + res3 + res4 print V значение интеграла по D=D1+D2+D3+D4',res stop end function f(x,y) c*,»»»***» „„,,„„„„,„„„„„„„„„„„ •♦•••••♦♦♦,,, с Подпрограмма-функция, вычисляющая f(x,y) * c*,»*****,♦ „„„„„„„„„„„„„„„„„„„„„ •♦••••♦ f - sin(x + alog(y)) return end После вычислений на ЭВМ получены результаты значение инетеграла по D 3.198793 значение интегала по D=D1+D2+D3+D4 3.198853 Уменьшение размеров области интегрирования практически не изменило значение интеграла, поэтому можно считать погрешность вполне удовлетворительной. 137
Варианты заданий Вычислить JJ/(*, yjdxdy по области D = {(x, у), хе\а, b], ys[c, d]}. Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Л*. у) ех"/(1+» jVO+j^ + e*1)3'2 xsin(x+^2) arctg2(x+^2) yl\n{x + J~y) %\nxl{x+y) cosxj{x+y2) xe-y/(x + \ny) e-x'7(l+*2) e-cos(x + y)sin;; cos(y2 + x2+.x) sin(^2 + x2 + x) (1+^/(1+7^7) cos (sin y—x) sin (sin x—у) Q-x/siny (sinjc)cos>' sin(x+^2)/(l+^2) ln(y2 + sinjcy) sin (In x + In y2) cos (sin (jc + cos y)) (arcsinjc)cos>' sh(jc+.y2) ch(y + shx) ln(x + jx+y2) In (ch x + y/tfix + ch2y) (\+x2+yA)/(\+x6+y2) [(sin2x + cos2^)/(ex + e^)]1/2 sin (x cos y) cos (x sin y) a 0 0 0 1 2 0 0 0 0 0 0 0 0 -1 . я/2 2 я/3 2 0 0.1 1 0.5 0 0 1 0 0 0 0 0 b 1 1 я 2 3 я я 2 2 я 2 2 2 3 я 3 я/2 3 1 1.5 10 1 1 1 3 2 1 2 я я с 0 0 я -2 4 2 2 2 0 0 -2 -2 0 — я 2 я/3 2 -3 1 -2 0 0.5 -1 -1 1 0 1 -2 0 — я d 1 1 2я я 5 4 4 3 3 я 3 3 4 я 3 я/6 4 -1 4 2 1 1 2 1 5 10 2 0 я я
Лабораторная работа 20 ВЫЧИСЛЕНИЕ ДВОЙНОГО ИНТЕГРАЛА ПО КРУГУ Пусть необходимо вычислить двойной интеграл ДДх, yjdxdy, D где область интегрирования D — круг радиуса R с центром в начале координат, т.е. D = {(x, y)\x2+y2^R2} (если центр области D не лежит в начале координат, то простой заменой переменных начало координат можно перенести в центр круга). Самый простой способ вычислить такой интеграл — воспользоваться программой INT2P из лабораторной работы 19. Для этого достаточно описать вокруг круга D квадрат со сторонами, параллельными осям Ох и Оу, и доопределить функцию f(x, у) нулем вне круга, т. е. Дх, у) = 0 для x2+y2^R2. Нетрудно видеть, что этот способ нерационален. Во-первых, при продолжении функции нулем за границу области D она, вообще говоря, утратит гладкость. Во-вторых, некоторые узлы кубатурной формулы лежат вне круга Д значит, вклад в интеграл этих узлов заведомо равен нулю, но программа INT2P этого «не знает» и будет вычислять значения функции в этих узлах. Программа INT2P не учитывает специфику области интегрирования. Поэтому для вычисления двойного интеграла по кругу лучше использовать специальную кубатурную формулу. В справочной литературе узлы и коэффициенты таких специальных кубатурных формул обычно приводятся для стандартного круга радиуса 1. Круг радиуса R заменой переменных x-^Rx, y^Ry преобразуется в стандартный круг радиуса 1. В настоящей лабораторной работе используется кубатурная формула с 64 узлами и алгебраическим порядком точности 15. Расположение узлов этой кубатурной формулы для первого квадранта показано на рис. 13. Все 64 узла можно разбить на восемь групп по восемь узлов. В каждой группе узлов точки имеют координаты (±£i, ±л0 и (±л*, ±Ь)> Значения параметров ±^h ±ц( и коэффициентов даны в тексте программы INT2C, которая предназначена для вычисления двойного интеграла по кругу радиуса 1 с центром в начале координат. рис 13 139
Приведем текст программы: subroutine INT2C (r,f,res) f res Программа INT2C вычисляет двойной интеграл от функции f(x,y) по кругу х**2 + у**2 = г Вычисления проводятся по 64-точечной кубатурной формуле Гаусса имя подрограммы-функции, вычисляющей f(x,y) значение интеграла dimension х(16),а(2) data a/ data x/ 3415057е-1, 2584362 , 5634263 , 4776498 , 8028017 , 6805824 , 2190916 , 9461239 , 8020851 , ,6402420е-1 ,5140615е-1 ,1120724 ,3191554 ,1596872 ,4547506 ,1463923 ,1881957 ,5359362 коэффициенты и узлы кубатурной формулы Гаусса s-0. do 1 к = 1,8 kbs « (к-1)'2 1,8 (к - (пот 1)*8+j + 55)/32-1 = пк - пк/2'2+1 - (J - D/2 + 1 = (j - 1)/4 + 1 - 3 - J4 -l)"j'x(kbs + j4)V -l)"j2*x(kbs + k4)V (xx,yy) s + z'a(lk) do 1 j пот nk Ik J2 J4 k4 xx УУ z s 1 continue с res = s*r**2 return end > Входные параметры: г—радиус круга; f—имя внешней подпрограммы-функции, вычисляющей /(*, у). Выходные параметры: res—значение интеграла. Перед обращением к программе INT2C необходимо описать оператором external имя f внешней подпрограммы-функции и присвоить фактическое значение параметру г. Задание. Вычислить JJ/(x, y)dxdy по кругу D радиуса г с центром в начале координат. 140
Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к INT2C, и печать результатов. 2. Провести вычисления на ЭВМ. Пример. Вычислить $$f(x, у) dx dy по кругу D радиуса 1 с центром в начале координат от функции /(х, у)= 1/(4+х2+у2)2. ' Программа решения задачи может иметь следующий вид: external f г - 1. call INT2C (г, f, res) print *,' Значение интеграла ',res stop end function f(x,y) Подпрограмма-функция, вычисляющая значения f(x,y) f « l./(4 + x**2 + y**2)**2 return end После вычислений на ЭВМ получен следующий результат: Значение интеграла 1.570795Е-01 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 Л** у) sinyexy212 (у3+ \) cos ух2 (4y + x2)eAix+y) (x2 + 4sin(x+y) + 2)-1 ((^+l)2 + 3cosx+l)-1 sinx+e-* x2+y2+\ cosx+e~2* (x-y)2+y+l (Зх3 + 2у2)е~4{х+у) г 1 2 1 1 2 1 2 1 Номер варианта 16 17 18 19 20 21 22 23 /M shx-{-chy2 sinx+1 (chx+shy^cosx+l)"1 (x+y2-sinx)ecosx (x+y2 + cosx)esinx ln(x2+l)sin2;t2 sm3(x2+y2 + x + 3y) cos2(x+ln(/ + l)) fx\2 sin2! -1 cosixy) V4/ r 1 0.5 1 2 1 2 3 3 141
Продолжение таблицы Номер варианта 9 10 11 12 13 14 15 /м {х2+\у1*Цу-Ъх) (у2+\)-'сЦу-Ъх) smjx2+y+\ coSy/x3+y2 + 3 ln(.x2 + cos2(.xy + 7)) sin(x2 + ln(x2+/ + 7)) cos(x2 + ln(x2+^2 + 3)) г 2 0.5 1 2 1 1 1 1 Номер варианта 24 25 26 27 28 29 1 30 /м . /*V+l\ _ху sin е ху \ з ) сЦхъ+у2 + Ъ) sm{x2+\)ch(x+y) cos(x2+\)sh{x+y) sin(.x2+.y2)sh(.xy) cos (л:2+ y2)ch(xy) г 0.5 0.5 Лабораторная работа 21 ВЫЧИСЛЕНИЕ ТРОЙНОГО ИНТЕГРАЛА ПО ПРЯМОУГОЛЬНОЙ ОБЛАСТИ Пусть необходимо вычислить тройной интеграл Щ/(*, у, z) x xdxdydz по прямоугольной области D = {(x, у, z)\xe\au a2~\, У2е\ри Ьз\, ze\cu c2]}. Линейной заменой переменных й1+й2 . «2-й! Ь^ + Ьг . b2-b1 Ci + c2 . с2-с1 Х->— + X, V-> + V, Z-> + Z 2 2" 2 2 " 2 2 область Z) преобразуется в стандартную прямоугольную область—куб D0 = {{x,y,z)\xe[-l,l], ye[-l, 1], ze[-l, ll}. Для вычисления тройных интегралов по стандартной области построено много различных кубатурных формул. В данной лабораторной работе используется кубатурная формула с 34 узлами. Ее алгебраический порядок точности равен 7. Это означает, что кубатурная формула дает точный результат для всех подынтегральных функций вида f(x, у, z)= X Сикх1у^\ i+j+k^l. ij,k Кубатурная формула имеет следующий вид: 34 WAX> У> z)dxdydz^ YaAifixb Уь zt). D i=l Узлы этой кубатурной формулы естественным образом разбиваются на четыре группы. Первая группа состоит из шести 142
узлов вида (±v, 0, 0), (0, ±v, 0), (0, 0±v), v = 0/925820. Коэффициенты кубатурной формулы для этих узлов А1=А2 = Аъ = ААг = = Л5=Л6 = 0.295747. Вторая группа состоит из 12 узлов, расположенных в точках с координатами (±и, ±и, 0), (±и, 0, ±и), (0, ±и9 ±w), u = 0.92582. Для этой группы узлов Ап = ...=А18 = 0.0941015. Следующие две группы по восемь узлов расположены в точках с координатами (±и>1,2, ±wi,2» ±^1,2)» wi =0.7341125, w2 = 0.4067031. Коэффициенты кубатурной формулы для первой из этих двух групп А19 = ... = А26 = 0.2247031, а для второй—А 27 = ••• = ^34 = 0-4123338. Описанная кубатурная формула реализована в виде программы INT3P (al, а2, Ы, Ь2, cl, c2, f, res): subroutine INT3P (al,a2,bl,b2,cl,c2,f,res) c„„„„„,„„„„„„„„„„„„„„„„„„„„„I с Программа INT3P вычисляет тройной интеграл от с функции f(x,y,z) прямоугольной области с [al,a2]*[bl,b2]4cl,c2] с с f - имя подпрограммы-функции, вычисляющей f(x,y,z) с res - значение интеграла data aal / 0.2957476 /, bbl / 0.0941015 /, ccl / 0.2247031 /, cc2 / 0.4123338 /, vl / 0.9258200 /, si / 0.9258200 /, el / 0.7341125 /, e2 / 0.4067031 / xO = (al + a2)'0.5 yO = bl + b2)*0.5 zO = (cl + c2)'0.5 dx = (a2 - al)*0.5 dy = b2 - bl)*0.5 dz = (c2 - clpO.5 suml = f(x0 + dx*vl,y0 I 1 1 j zO) + f xO - dx*vl,y0,z0) + f(x0,y0 + dy'vl + f x0,y0 - dy'vl + f x0,y0,z0 + dz' " + f(x0,y0,z0 - dz' sum2 = 0. do 1 j = 1,4 i = (-l)"j k = (-l)**int(i/3) sum2 = sum2 + f(x0 + V zO) zO) Wl) Wl) коэффициенты и узлы кубатурной формулы ! приведение • области ! к единичному ! кубу 'dx*sl,y0 + k*dy*sl,z0) , + f(x0 + i'dx'sl,y0,z0 + k'dz'sl) + f(x0,y0 + i*dx*sl,z0 + k'dz'sl) 143
1 continue sum3 = 0. sura4 = 0. do 2 j = 1,8 i = (-1ГЧ к = (-l)"int(( j + l)/2) 1 = (-l)"int(j/5) sum3 = sum3 + f(xO+i*dx*el,yO+k*dy*el,zO+rdz*el) sum4 = sum4 + f(x0+i*dx*e2,y0+k*dy*e2,z0+rdz*e2) 2 continue res = (aal*suml+bbl*sum2+ccl*sum3+cc2*sum4)'dx*dy*dz return end Входные параметры: al, a2, bl, b2, cl, c2 — значения al9 a2, bu b2, cu c2\ f—имя внешней подпрограммы-функции, вычисляющей f(x, у, z). Выходные параметры: res—значение интеграла. Перед обращением к программе необходимо описать оператором external имя f внешней подпрограммы-функции, вычисляющей значения f{x, у, z), и присвоить фактические значения параметрам al, a2, bl, bz, cl, c2. Задание. Вычислить интеграл ЩДх, у, z)dxdydz по заданной области D = {(x, у, z)\xe\0, a]9 ye\0, b]9 ze[0, с]. Разбить область интегрирования на части и провести повторные вычисления. Сравнить результаты. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к INT3P для вычисления интеграла по области D, и печать результатов. 2. Провести вычисления на ЭВМ. 3. Разбить область D на части и провести вычисление интеграла по каждой части, используя INT 3P, и найти интеграл по области D в виде суммы интегралов по подобластям. Полученные результаты сравнить. Пример. Вычислить интеграл от ln(2 + x4 + sin(^) + z) по области D = {(*, j;,z)|*e [0,1], ^[2,4], ze [1, 3]}. Программа. решения задачи может иметь следующий вид: external f call INT3P (0., 1., 2., 4., 1., 3., f, res) с print V интеграл по D \res call INT3P (0., 1., 2., 3., 1., 2., f, resl) с call INT3P (0., 1., 2., 3., 2., 3., f, res2) call INT3P (0., 1., 3., 4., 1., 2., f, res3) 144
call INT3P (0., 1., 3., 4., 2., 3., f, res4) res = resl + res2 + res3 + res4 print V интеграл no D*D1+D2+D3+D4',res stop end function f(xryrz) с Подпрограмма-функция, вычисляющая f(xryrz) * f = alog(2. + x**4+sin(y) + z) return end В результате вычислений на ЭВМ получен результат: значение интеграла по D 5.829555 значение инетеграла по D=D1+D2+D3+D4 5.8010374 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 Л*, у.*) sin(.x2+.y3 + 4;c2 + l) cos (х 3 +у 2 + 4у 2z + z) (x2+z2\ arctg V У+z J /^ + z3 + 3\ arctg ■ \х+ъу+\) ln(x2 + z+14^2 + 7) (У2+*Ъ\ arccosl V x+3; . fx2+y3+z2\ arcsin 1 1 V 12 / .xsin(y2)cos(y2+z3) (sinx+cos2^+4)_1 x3y2sin(xyz + 3) -(x2+y3 + z)^x+y^ 3V a 1 1 1 1 1 1 0,5 1 1 1 1 Ь 2 1 1,5 0,5 1 0,5 0,5 1 1 2 1 с 3 1 2,5 1 1 0,5 0,5 1 1 0,5 1 145
Продолжение таблицы Номер варианта 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 А*,М -(x2+y2 + z)sh(x+y+z) sin (x2 + cos (xy)) (х 2 + j>z 3 + 2) sin (х 2 + cos (xy)) cos(x2+.yz3 + 3)e 2xyz (cos xy + cos xz + sin .xyz) esin xyz arctg (x 2+z 3 + 4x^z +1) (х2 + г3 + 4хуг)е™{хуг) /x2+y + z3\ m arcctgl I sin (xyz) [x2+y2 + z2\ / ч cthl I sh (jcy) \n(x2 + %xz + l)sm(xz) *m cos(z2+l+e(x+'}) ch(y2 + z+ex~y) sin(e*2+'-z2+l) sh (cos (xyz)) arctg (z2 + exyz) esin (xyz) sin(3 + e"^2+1) e-*2^cos(.x+.y+z+l) a 1 1 1 1 1 0,5 0,5 0,5 0,5 1 1 1,5 0,5 1 1 1 1 1 1 b 1 1 0,5 1 1 1 0,5 2 0,5 2 1 0,5 2,5 1 3 0,5 1 1 1 с 1 1 0,5 2 1 2 0,5 0,5 1 1 1 2,5 1,5 1 2 0,5 ' 1 1 1 Лабораторная работа 22 ВЫЧИСЛЕНИЕ ТРОЙНОГО ИНТЕГРАЛА ПО ШАРОВОЙ ОБЛАСТИ Пусть необходимо вычислить тройной интеграл Ш/(*> У* z)d-xdydz, где область D = {(x, у, z)\x2+y2 + z2^R2}, D т. е. D — шар с центром в начале координат радиуса R. Если центр области D не лежит в начале координат, то простой заменой переменных можно перенести начало координат в центр. 146
Для вычисления интегралов по шаровой области построены специальные кубатурные формулы, которые при заданном числе узлов обеспечивают наивысший алгебраический порядок точности. Обычно такие формулы строят для шара радиуса 1. Если радиус шара R отличен от единицы, то заменой переменных x^xR, y^yR, z^zR область D преобразуется в стандартный шар радиуса 1. В данной лабораторной работе используется кубатурная формула с 27 узлами. Ее алгебраический порядок точности равен 7 (см. лабораторную работу 21). Кубатурная формула имеет вид 27 Ш f(x,y,z)dxdydz= X Atf(xi9 уь zt). x2+y2 + z2^\ i=l Узлы этой кубатурной формулы естественным образом разбиваются на четыре группы. Первая группа состоит из единственного узла (0, 0, 0), для него коэффициент кубатурной формулы равен Ах = 0.444139. Вторая группа состоит из шести узлов t координатами (±и, 0, 0), (0,±t>, 0), (0, 0,±t>), 17 = 0,9410448. Коэффициенты кубатурной формулы для этих узлов одинаковы: А2 = -~47 = 0.095738. Следующую группу из 12 узлов составляют точки вида (±и, ±и, 0), ( + м, 0, ±и), (0, ±м, ±и\ м = 0.546041. Соответствующие коэффициенты равны А9 = ...А20 = 0.250838. И наконец, последняя группа состоит из восьми узлов с координатами (±w, ±w, ±w), w = 0.6604983. Коэффициенты кубатурной формулы для этой группы узлов соответственно равны А21 = ...А21 = 0.0200197. Описанный алгоритм реализован в программе INT3C (г, f, res): subroutine INT3C (rrfrres) с Программа INT3C вычисляет интеграл от функции * с f(x,yrz) по шаровой области с центром в начале * с координат * с с г - радиус шара * с f - имя подпрограммы-функции,вычисляющей f(x,y,z) * с res - значение интеграла data aO / 0.4441396 al / 0.0957384 Ы / 0.2508385 cl / 0.0200197 vl / 0.9410448 si / 0.5460414 • el / 0.6604983 sumO = f(0.,0.,0.) rvl = r'vl /, ! коэффициенты /r ! и узлы /r ! кубатурной /, ! формулы Л / ! вычисления 147
suml * f(rvl,Q.,Q.)+f(-rvl,Q.,Q.) ! по кубатурной +f(Q.,rvl,Q.)+f(Q.,-rvl,Q.) ! формуле +f(Q.,Q.,rvl)+f(Q.,Q.,-rvl) rsl = r*sl sum2 - 0. do 1 i = 1,4 J --(-D"1 k = (-l)"int(i/3) sum2 = sum2 + f(j*rsl,k*rsl,Q.) + f jVsl,Q.,k'rsl) + f Q.,j*rsl,kVsl) 1 continue с rel - r'el sum3 - 0. с do 2 i « 1,8 J - (-D"1 k - -l)*'int((i+l)/2) 1 « (-l)**1nt(1/5) sum3 = sum3+f(j*rel,k*rel,rrel) 2 continue res = (a0*sum0+arsuml+brsum2+cl*sum3)*r*r*r return end Входные параметры: г—радиус области интегрирования; f—имя внешней подпрограммы-функции, вычисляющей f(x, у, z). Выходные параметры: res—значение интеграла. Перед обращением к программе INT3C необходимо описать оператором external имя f внешней подпрограммы-функции, присвоить фактическое значение параметру г. Задание. Вычислить тройной интеграл от функции Дх, у, z) по шару радиуса R с центром в начале координат. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к INT3C, и печать результатов. 2. Провести вычисления на ЭВМ. Пример. Вычислить интеграл JJJ sin (х+cos (у) + sin (z)) dxdydz. xz+yz + zz^\/4 Программа решения задачи может иметь следующий вид: external f с call INT3C (0.5, f, res) 148
print V значение интеграла \res stop end function f(x,y,z) с Подпрограмма-функция, вычисляющая значения f(x,y,z)* f - sin(x + cos(y) + sin(z)) return end В результате вычислений на ЭВМ получен следующий результат: значение интеграла 4.12Z838E-01 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Л*. У. *) 1 -(x+y + z)sin(xy2z3 — 1) -(x+.y+z)cos(;ty2z3+l) -(x+y + z)Qsiaixyz) -(x+y+z)e-™(xyz) (x+sin xy+sin xz+cos z 2) e ~zcosx cx>z/(cos2xz+\) er'7(sin2;ty + z + 4) e™(*y)Cos(xyz2+x2yz+\) ln2(x2+^2 + 8z+10) x2+y2 tg -e- z+3 sin(x^+xz+^z) .cos(x^2+x2z2+.yz2) cx2y+y2' cos (xyz+z2) едг +^ z arct 2 cos (x 2z 2 +j/ 2z +1) arctg (x+y + z) R 1 1 2 1 1,5 • 1 1 2 3 1 2 1 1 1 2,5 149
Продолжение таблицы Номер варианта 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 А*, у.*) e"^zarctg(x+^+z) x2+y2 + z2 sin {xyz) arcsin : ^3cos(x2+^+z3) z3sin(x+^) (sin z3 + cos (xyz)) e "*lyzl х2+у + гъ cos(x3+^2 + z)sh sin (x+y + cos xyz) cos (x + z sin xyz) (cos (x + z) + sin (x+y - z) e ~2xyz xyz x+y — z x2yz sh ch 3 3 / \иХ+у2 + 2Ъ cos (Jcyz) ch • / \ .x2+y+z3 sin (xyz) sh x2+.y2 + z3 sin (л*+у+z) arctg cos(x+.y+z)e-(*2+'+z) sin(x+^+z)e-(x2+^+z) Л 1 1 1,5 1 1 2 1,5 1,5 1 1 0,5 1 1 2 2 Лабораторная работа 23 ВЫЧИСЛЕНИЕ ПОВЕРХНОСТНОГО ИНТЕГРАЛА ПО СФЕРЕ Пусть требуется вычислить поверхностный интеграл JXA-x, у) ds <j по сфере S— {(х9 у, ,z)\x2+y2 + z2^R2}. Заменой переменных x^xR, y^yR, z^zR область интегрирования — сфера радиуса R с центром в начале координат — преобразуется в стандартную сферу So единичного радиуса с центром в начале координат: S0 = {(x,y,z)\x2+y2 + z2^l}. Для вычисления поверхностного интеграла по сфере S0 построено много различных кубатурных формул. В данной лабораторной 150
работе используется кубатурная формула с 12 узлами. Ее алгебраический порядок точности равен 15. Это означает, что кубатурная формула дает точный результат для всех подын+ег- ральных функций вида f(x, M= L Cijkxyz\ i+j+k^ 15. i,j,k Чтобы получить наглядное представление о расположении узлов кубатурной формулы, введем на сфере угловые координаты Э и ф по формулам: .x = sin0cos(p, ;; = sin0sin(p, z = cos0, О^Э^л, 0^ф<2я. Проведем на сфере 16 «меридианов» ф = 7л/8, i=l, 2, ..., 16 (рис. 14), и на каждом из меридианов расположим по восемь узловых точек, которым соответствуют углы, определяемые по формулам 0,— arccbs (*,-), где Xi—узлы восьмиточечной кубатурной формулы Гаусса на отрезке [—1, 1]. Тогда кубатурная формула для интеграла по стандартной единичной сфере S0 принимает вид 16/8 МДх, у, z)ds = (n/S) £ I ]£/(sine,-cos ер,, sinfysincp,, cos0y Вычисления по этой кубатурной формуле реализуются подпрограммой INT2S (г, f, res): subroutine INT2S (r,f,res) Рис. 14 Программа INT2S вычисляет поверхностный интеграл от* функции f(x,y,z) по сфере радиуса г с центром в на-* чале координат с** с с с с с г - радиус сферы * с f - имя подпрограммы-функции, вычисляющей f(x,y,z) * с res - значение интеграла * dimension a(4),ct(4),st(4) data pi6 / 0.3926574/ data a / 0.1012285, 0.2223810, 0.3137066, 0.3626837 / ct / 0.9602898, 0.7966664, 0.5255324, 0.1834346 / st / 0.2790044, 0.6044192, 0.8507736, 0.9830319 / sum = 0. с do 1 j = 1,16 151
fi = pi8'j cf = cos(fi) sf = s1n(fi) do 1 i - 1,4 rs = r'st(i) rc = r'ct(i) sum = sum+a(i)*(f(rs*cf,rs*sf,rc)+f(rs*cf,rs*sf,-rc)) 1 continue с res = pi8*sum*r*r return end Входные параметры: г—радиус сферы; f—имя внешней подпрограммы-функции, вычисляющей f(x, у, z). Выходные параметры: res — значение интеграла. Перед обращением к программе INT2S необходимо описать в операторе external имя f внешней подпрограммы-функции, вычисляющей значения f(x, у, z). Задание Вычислить интеграл по сфере S от функции f(x, у, z), (х, у, z)eS. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую описание имени f, присвоение фактического значения параметру г и печать результата. 2. Провести вычисления на ЭВМ. Пример. Вычислить поток векторного поля a = {x + ln(l+^2), y + ex, z+x} через поверхность сферы S={{x,y,z)\x2+y2 + z2^0.52}. Единичный вектор внешней нормали к сфере S легко вычисляется по формуле n^ = {x/R, у/Я z, R}, т.е. в данном случае n(°) = {;c/0.5, у/0.5, z/0.5}. Тогда для потока П4а) = ЯК0))^ = 0.5Я{^(^ + 1п(1+^2))+^(^ + е-) + 2(2 + х)}^. S S Программа вычисления этого интеграла может иметь следующий вид:
external f с call INT2S(2., f, res) с print *,' значение интеграла',res stop end function f(x,y,z) c»»»»»„,„„„„,„„,„,„,, „,,„„ ••••••• ,,„„„,„„„ с Подпрограмма-функция, вычисляющая f(x,y,z) .,, * c,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,»,,,,,,,,»,, f = Q.5*(x*(x+alog(l.+y*y))+y*(y+exp(x))+z*(z+x)) return end В результате вычислений на ЭВМ получен следующий результат: значение' интеграла 100.515200 Варианты заданий Вычислить поток векторного поля а = {Р, Q, R} через поверхность единичной сферы с центром в начале координат Номер варианта 1 2 3 4 5 6 7 8 9 10 Р 1п(3 + х2) ех + 3 х2 Q~xy xarctgz sin (x cos y) .x2 sin (.xyz) ex+zx sin(x+^) Q xj^2 sin(.x+z) sin [xyz) y2-dLictg{xy) ^arctg(x+z) p —xsinz cos (x sin (yz)) у 2 cos (xyz) ey+yz Qx + z R sin (xyz) QX-y+Z cos(;ry)+sin(;cyz) ln(x2 + y^2 + z2) e-cos(zx2^) zarctg(.x+_y + z) Q-cos (xyz) z2Q-xyz ez+xy2z3 cos(x+.y+z) Вычислить интеграл через поверхность единичной сферы с центром (0, 0, 0) Номер варианта 11 12 F(x,y,z) (х+yz + z sin xyz) e "*2yz* (x2+y2 + sinxyz + 4y1 | Номер варианта 21 22 F(x, У, z) ln(x2 + z2)ch(-^ ln(x2+y2+z2)sh(xyz) 153
Продолжение таблицы Номер варианта 13 14 15 16 17 18 19 20 F(x,y,z) (х 2 +у 2 + cos xyz+3)"1 (sin xz + cos xz + 7)"* sin jcyz arctge-(*+,,+z) e-arctg (x + y + z) arctg sh (.xyz) sh (arctg (xyz)) arcctgch(x+^ + z) ch arctg (x+.y + z) 1 Номер варианта 23 24 25 26 27 28 29 30 ^(*, У, z) sin(xyz)\n(x2+y2 + z2) sin (xyz) cos (*+у + z) sh (jryz) arctg (x+^ + z) sin (cos (.xyz)) cos(sin(x^z)) ch (arctg (xyz)) arctg (sh(.xyz)) ch(sh( — xyz)) Лабораторная работа 24 ПРИБЛИЖЕННОЕ РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ ЭЙЛЕРА Пусть требуется найти приближенное решение дифференциального уравнения y'=f(x9 у), удовлетворяющее начальному условию у(х0)=у0. Численное решение задачи состоит в построении таблицы приближенных значений уи у2, ...,у„ решения уравнения у(х) в точках xl9 х29..., хп. Чаще всего х{ = х0 + Иг9 /=1,2, ...,л. Точки xt называются узлами сетки, а величина h — шагом (А>0). В методе Эйлера величины у{ вычисляются по формуле yi+i=y.i + hf(xi9 yt)9 /=0, 1, 2,... (1) Этот метод относится к группе одношаговых методов, в которых для расчета точки (xi + 1; yi+1) требуется информация только о последней вычисленной точке (xt; yt). Метод допускает простую геометрическую интерпретацию (рис. 15). Предположим, что известна тбчка (xt; yt) на искомой интегральной кривой. Тогда касательная к этой кривой, проходящая через точку (xt; yt), определяется уравнением y=y,i(x — xi)+yb а так как y'i=f{xi9 yt) и xi+1=xi + h9 то yi+i=yi + hf(xi9 yt). Для оценки погрешности метода на одном шаге сетки разложим точное решение в ряд Тейлора в окрестности узла xt y(xi+1)=y(xi + h)=y(xi)+y'(xi)h + 0(h2) = =y(xi) + hf(xi9yi) + 0(h2). (2) Сравнение формулы (1) с разложением (2) показывает, что они Согласуются до членов первого порядка по А, а погрешность формулы (1) равна 0(h2). Если расчетные формулы численного метода согласуются с разложением в ряд Тейлора до членов 154
У=У(*)/ /входные параметры \ ^ х-о,Ь,п,Уо-{-У1о,У20,...,У-по} J \ f Yo+F(x0,Yo)-^Y0 Т x0+h^-^x0 ¥ /выходные параметры^ \ хо,?о"{у11>у2Ь...>Ут} J Рис. 16 порядка Лр, то число р называют порядком метода. Таким образом, метод Эйлера — метод первого порядка. Для практической оценки погрешности расчета можно рекомендовать правило Рунге. Для этого проведем вычисления с шагом Л и Л/2 и сравним величины y\h) и у2н!2)- За оценку погрешности вычислений с шагом Л/2 можно принять величину тах|^|*>-^(2*/2)|. Метод Эйлера легко обобщается на случай нормальных систем дифференциальных уравнений. Пусть требуется найти решение системы дифференциальных уравнений yi=fi(x9yl9...9yn)9 Уп=Мх9у19...9уп)9 удовлетворяющее начальным условиям у± (х0)=у10, У2(хо) = =У2о,-,Уп(х0)=уп0. Или в векторной форме: Y' = f(*,Y), Y(x0) = Y0, Y(x) = {y1(x)9 y2(x)9...9yn(x)}9 Y0 = {y109y209...9yn0}. Приближенные значения yki точного решения ук(х() в точках х{ вычисляются по формулам Уы=Ум-1+Ь/к (*i-b ^ki-dj Ущ-1)1 •••? Уп(1-1))> к= 1? 2, ..., п; 1=1,2,... Блок-схема алгоритма Эйлера представлена на рис. 16. Описанный алгоритм реализован в виде подпрограммы (subroutine) EYLER (п, х, у, h, p, f): 155
subroutine EYLER (n,x,y,h,p,f) с Программа EYLER решает задачу Коши для нормальной * с системы дифференциальных уравнений методом Эйлера * с с п - количество уравнений в нормальной системе * с х - текущее значение аргумента х * с у - массив размерности л, содержит решение системы: * с перед обращением к программе содержит значения * с у в начальной точке хг при выходе - в точке x+h * с h - значение шага по х • с р - имя программы, вычисляющей значения правых частей * с f - массив размерности, п, содержит значения правых * с частей * dimension f(l), y(l) call р(х,у,т) ! правые части в точке х с do 1 i - lrn 1 y(i) * y(i) + h*f(i) ! решение в точке x+h x - x + h ! новое значение х • с return end Входные параметры: n—порядок системы; х—начальное значение х0; у—массив из п чисел, содержащий начальное значение у; h^-значения шага А; р—имя внешней подпрограммы (subroutine) р (х, у, f), вычисляющей значения правых частей уравнений системы по заданным х и у и размещающей их в элементах массива f; f—рабочий массив размерности п, содержащий значения f(x, у). Выходные параметры: х—значение x0+h, у—массив из п чисел, содержащий приближенное решение в точке x0+h (y(0 = yI^yI(xo+A), i=l, 2,...,п). Перед обращением к подпрограмме EVLER необходимо: 1) составить подпрограмму р(х, у, f) вычисления правых частей уравнений системы; 2) описать имя р оператором external; 3) описать размерность массивов у и f; 4) присвоить фактические значения параметрам п, х, у, h. Следует помнить, что входные параметры х и у являются одновременно выходными. Задание. Используя подпрограмму EYLER, составить программу решения задачи Коши y'i=fi(x, уи у2), уАх=а=у№\ i=h 2, на отрезке [а9Ь]. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к EYLER. 156
2. Составить подпрограмму вычисления правых частей уравнений системы. 3. Произвести вычисления на ЭВМ. Пример. Решить задачу Коши dyi-v "d7"e ' f*(0)=o, Ь2(0) = 0 методом Эйлера с шагом А = 0,1 на отрезке [0; 3]. ▲ Поскольку результаты вычислений представляют собой довольно большую таблицу, в программе, реализующей решение задачи, предусмотрен вывод результатов вычислений во внешний файл. Эта программа имеет следующий вид: external p dimension y(2)rf(2) с х - 0. ! начальное значение х уП) * 0. • начальное значение yl у(2) * 0. ! начальное значение у2 с do 1 i - 1,30 ! вычисляем решение call EYLER (2,x,y,0.1,p,f) ! в 30 точках write(3r2) xr(jry(j)rj=}r2) ! печать строки таблицы 1 continue 2 format(2x/ x «\f6.2, 2(r y(\il,r) -\ell.4)) stop end subroutine p(xryrf) cM* * ' с Подпрограмма вычисляет правые части уравнений с системы с с х - значение переменной х с у - массив размерности п, содержит значения у с f - массив размерности пг содержит значения правых с частей С* "ММ ммммммммм.ммм мм dimension y(2)rf(2) f(l) = У(2). f(2) = expf-x'y(l)) return end Вычисления по программе привели к следующим результатам: 157
ggfgggfffffSSSSoSSSoSSSSSSSoSS gSSSSggggggggggSoSSSSSSSSSSSSS 111 111 111 111 111 \ 11 txj txj Lxj LxJ LxJ LxJ l_U LxJ UJ LxJ LxJ LxJ LxJ LU UJ UJ LlJ UJ UJ UJ UJ UJ UJ ''' OOOCONinNOaigJ^CO^OCOcvJOO^tNOtCOcvJVDO^-Wro OOOOCOWCONroaJ^Ch^rOLONO^POinNOCJ^NOCVJit^Cn ooo<7><7>4j-or^mroroeNjro4j-mo^Hro4j-m^oo<7»0^c\j^-m^r^ И H U II II II II H И II H H II II II H II H И II И II К N И И И И Н II SgSSSSSSS§S8S5gSgSS§Sgg5gSgSSg II II II II II II II II II ЦИНИКИ II II II II II II II II II II Н К Н II К хххххххххххххххххххххххххххххх -о ч ^ <3 es ^ ^ <3 ^ ^ ^ £ < ^ £ 1 к ^ ^ . ° rt S \ X m m - ^ ~ 1 1-Н Ч* СЧ wr> ~ 1 1 <L> fS ^t (N ^ 1 1 ~ X 1 + . h^ + + m (N О О о 1 '* (N О О о + С ^ ^ ел О О 1Л - о ^ 1 1 ^ ад >> + чо - 7 ^ о ^ 1 ^5 + г- (N О о о ^^ 1 о о + я '3 00 ^* о о о ^-^ + + + 9\ ГА о (N ~ 1 ел 8 /"-S "Й О 1-И' 7 о ^ £ .S 'Й ^ + ^ <Ч~н ^ + ^ -14
Продолжение таблицы Номер варианта 12 13 14 15 16 17 18 19 20 21 22 Т\ Л»Э ТА 25 26 27 2Я АО 29 30 fi(x,yuy2) У\+У2 &vctg(x2+yl) х2+^1 х2У1+Уг sm(x2+y22) smy2 2^3х2+у1+У1 y2 + Jx2+y\ хcos (уt + у2) X J\+x2+yl sin yx cos3 ^2 1 3 + е"'* у г In л: arctg(xy2) 1 Уг+Л^ьЛ cos(x+^2) 1 ch(x+^2 + 3) уг+л+я е->/ЛТЛ /г(*, .Уь-Ы ^1^2 sin^+^i) ATl^2 cos(^!+^2) cos(^i) COS^i Jx2+y\+y2 y2cosx — sin 2.x sin^i-^) Уг J\+x2+yl cos у 1 cos >>2 1 2+е-у1 ^1+^2 sin^i 1 У^Л+Л sin(x-^2) sh(x2-yi) sin(y1y2) У1У2 У1 (a) -1 0.5 1 -1 0 0.5 0.5 0.8 -0.6 0.2 0 0 -2 0 1 0.7 0.2 -2 0 \yi(a), 1 1.5 0 1 0 -0.5 1.2 3.5 2 0 0 -3 -1 0 1 -0.5 0 3 0 a 0 0 0 0 0 1 0 2 2 -1 -1 2 1 -2 0 0 0 -1 -5 b 4 2 5 4 4 3 2 4 5 1 3 5 4 1 3 4 3 1 0 Лабораторная работа 25 ПРИБЛИЖЕННОЕ РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ РУНГЕ—КУТТА Пусть требуется найти решение дифференциального уравнения y'=f(x, у), удовлетворяющее начальному условию у(х0)=у0. Численное решение задачи состоит в построении таблицы приближенных значений уи у2, .-.,у„ решения уравнения в точках хи х2,..., хп. Точки xl9 x2,..., х„—узлы сетки. Используем систему равноотстоящих узлов. Величина h — шаг сетки (Л>0). 159
(1) Методом Рунге — Кутта в литературе обычно называют од- ношаговый метод четвертого порядка, относящийся к широкому классу методов типа Рунге — Кутта. В этом методе величины yi+1 вычисляют по следующим формулам: Л+1=Л + (А/6)(Л1 + 2Л2 + 2Л3 + Л4), к± =/(*,-, уд, к2=/(х( + к/2; yt + hkjl), k3=f(xt + h/2; yi + hk2/2)9 kA=f(Xi + h; yt + hk3). Погрещность метода на одном шаге сетки равна МЛ4, но на практике оценить величину М обычно трудно. При оценке погрешности используют правило Рунге. Для этого проводят вычисления сначала с шагом Л, а затем — с шагом Л/2. Если y\h) — приближение, вычисленное с нщгом Л, а у2н!2) — с шагом Л/2, то справедлива оценка /ВХОДНЫЕ ПАРАМЕТРЫ\ [ x0,Yo,h,N J у (Уо~{У1о>У20>->Упо}) J \ Y0—Y ) f F(x0,Y)-*Kl \ f xo+0.5-h-*-xo ' f Yo+0.5-hKi-^Y ] f F(x0,Y)-^K2 ■ i Yo+0.5-h-K2—Y 1 f F(x0,Y)-^K3 1 f xo + 0.5-h—»*xo ' f Y0+h-K3—K4 1 ' - Y0+ ^(Kj+2K2+2K3+K4)-^Y0 t /ВЫХОДНЫЕ ПАРАМЕТРЫ\ V xoY0 J |j,W2). 2i .16 15 -у(х2д\^\уТ- -y\ (Ml За оценку погрешности вычислений шагом Л/2 можно принять величину ,;(*)- max -уТ\ 15 Рис. 17 Метод Рунге — Кутта легко переносится на нормальные системы дифференциальных уравнений вида Ук(х)=/к(х, уъ у2, ...9уп)9 1 ^к^п, которые для краткости удобно записывать в векторной форме: y'(*)=f(*,y), У = (У1,У2, -,Уп), *=(А,/2, ->fn)- Для получения расчетных формул методом Рунге — Кутта достаточно в формулах (1) заменить у и f(x, у) соответственно на у и f(х9 у), а коэффициенты kj—на kj(/=l, 2, 3,t 4). Блок-схема алгоритма Рунге — Кутта представлена на рис. 17. 160
Описанный алгоритм реализован в виде подпрограммы (subroutine) RGK (n, x, у, h, p, f): subroutine RGK (n,x,y,h,p,f) с* Программа RGK решает задачу Коши для нормальной * с системы дифференциальных уравнений методом Рунге- * с Кутта * с с* п - порядок системы * с* х - текущее значение х * с* у - массив размерности п, перед обращением к программе* с содержит значения у в начальной точке, при выходе * с из программы содержит решение в точке х + h * с h - шаг по х * с р - имя программы, вычисляющей значения правых частей * с в точке (х,у) * с f - массив размерности п, содержит значения правых * с частей, вычисленные программой р * с,„„ „„„„„„„„„„„„„„„„„„„„„„„„ „„„„ dimension f(l),y(l) dimension yl(10),fk(4,10) с call p(n,x,y,f) ! вычисляем правые части do 1 i = l,n ! в точке х fk(l,i) = h'f(i) ! вычисляем значения kl yl(i) - y(i) + 0.5*fk(l,i) 1 continue с x = x + 0.5*h call p(n,x,yl,f) do 2 1 - l,n fk(2,i) = h*f(i) ! вычисляем значения k2 yl(i) = y(i) + Q.5*fk(2,i) 2 continue с call p(n,x,yl,f) do 3 i = l,n fk(3,i) = h*f(i) ! вычисляем значения k3 yl(i) = y(i) + fk(3,i) 3 continue с x = x + Q.5*h call p(n,x,yl,f) do 4 i = l,n fk(4,i) = h*f(i) '. вычисляем значения к4 y(*i) = y(i) + 0.1666667* ! решение в точке х + h (fk(l,i) + 2.*fk(2,i) + 2.*fk(3,i) + fk(4,i)) 4 continue с return end Программа RGK предназначена для решения систем не выше десятого порядка. 6-187 161
Входные параметры: п — порядок системы (п<10); х — значение х0; h — шаг интегрирования системы; у — массив из п действительных чисел, содержащий значение у; f—рабочий массив из п действительных чисел, содержащий текущее значение правых частей уравнений системы; р — имя внешней подпрограммы (subrotine) p (п, х, у, f), вычисляющей значения правых частей уравнений системы и размещающей их в элементах массива f. Выходные параметры: х — значение x0 + h; у—массив из п чисел (он же входной), содержащий решение системы в точке x0 + h. Перед обращением к программе RGK необходимо: 1) составить подпрограмму р(п, х, у, f) для вычисления правых частей уравнений системы; 2) описать имя подпрограммы р оператором external; 3) описать массивы у, f; 4) присвоить фактические значения параметрам п, х, у. Задание. Решить задачу Коши для системы дифференциальных уравнений второго порядка, используя подпрограмму RGK. Результаты печатать на каждом шаге. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к RGK, и печать результатов на каждом шаге. 2. Составить подпрограмму вычисления правых частей р (п, х, у, f). 3. Произвести вычисления на ЭВМ. Пример. Решить на отрезке [0,3] с шагом 0.1 задачу Коши: I dx Уъ Ыо)=о, |^i=e-^ Wo)=o. dx А Программа решения задачи без дробления шага имеет вид: external p dimension y(100),f(100) с х - 0. у(1) - 0. ! значение yl в точке х у(2) - 0. ! значение у2 в точке х с do 1 i - 1,30 ! вычисляем решение call RGK (2vxvyv0.1vpvf) ! в 30 точках write(3,2) x,(j,y(j),j-l,2)! печать строки таблицы 2 format(2x,'x - \f6.2,2(' y(\il,r) -\ell.4)) 1 continue stop end с 162
subroutine p(nrxryrf) Программа вычисляет правые части системы п - порядок системы х - текущее значение х у - массив размерности пг содержит значения у f - массив размерности пг содержит значения правых частей dimension f(2)ry(2) f(D - У(2) f(2) - ехр(-х"у(1)) return end Вычисления по программе привели к следующим результатам: X = X = X = X - X = X = X = X - X = X = X = х' = X = X = X = X = X = X = X = X = X = X = X - X = X - X = X - X - X = X » .10 .20 .30 .40 .50 .60 .70 .80 .90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.10 2.20 2.30 2.40 2.50 2.60 2.70 2.80 2.90 3.00 У уО У(1 У 1 У 1 У 1 У(1 У 1 У(1 У(1 У(1 У(1 У(1 У У У У У У У У У\ у{ У У У» У1 У( ) 1 ;i 1 1 1 Y I 1 11 У(1 У 1) ) ■= .5000Е-02 ) = .1999Е-01 = .4494E-0J. ) = .7975Е-01 ) = .1242Е+00 ) = .1781Е+00 ) = .2409Е+00 ) = .3122Е+00 ) - .3913Et00 I ■= .4774Е+00 I - .5697Е+00 ) = .6673Е+00 1 * .7694E+QQ i - .8753E+QQ i = .9840Е+00 ) = .1095E+01 ) = .1208E+01 - .1322E+01 = .1437E+01 = .1553E+01 = .1669E+01 = .1785E+01 - .1902E+01 = .2019E+01 - .2135E+01 = .2252E+01 « .2369E+01 = .2486E+01 = .2603E+01 = .2720E+01 y(2) - .9999E-01 У 2 У 2 У 2 = .1998Е+00 - .299QE+QQ = .3968Е+00 y(2) = .4924E+00 У(2 У 2 ) - .5844Е+00 ) = .6717Е+00 у 2) - .7529Е+00 у(2) - .8271Е+00 у(2) = .8933Е+00 у 2) = .9511Е+00 у(2) - .1QQ0E+Q1 у(2) = .1041Е+01 У(2 У(2 ) = .1074Е+01 ) « ЛЮОЕ+01 у(2) = .1120Е+01 У(2 У 2 ■У 2 У(2 У(2 Уо2 У(2 У(2 У(2 У 2) У(2) У(2) У 2) У 2) ) .- .1135Е+01 1 = .1146Е+01 i - .1154Е+01 = .1159Е+01 = .1163Е+01 = .1165Е+01 = .1167Е+01 = .1168Е+01 = ,П69Е+01 = .1159Е+01 = .1169Е+01 - .1169Е+01 - .1169Е+01 - .1170Е+01 Варианты заданий Решить задачу Коши у\ =/х {хх, ух, у2), у'г =/2{хх, ух, у2\ уг \х=а=Уу (я), Уг\х=а=У2{а) на отрезке [а, Ь] 163
Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ■М*» -Vi» 72) f ! "\ arct4i7^iJ arctg(x2+j/*) х2У!+У2 х2+у\ X у/\+Х2+У\ sm(x2+y22) smy2 xcosiy^+yj sin j^ cos3 y2 2^Ъх2+у\+у1 У\1Уг y2 + J*2+y\ yy+x (З + е"*)-1 cos0^2) y2\nx x+y\ arctg(*y2) У1+У2 у\+у\ el/x (2+y2+y22yv2 cos(x+_y2) еУ.У2 1 ch{x+y2) е_(У2+У2) >/i+*2+.y* sin(xy2) е-ч/Я+Л Sin (у 1^2) /2(*. ^ J>2) sin0^2) sanfr+yj COSQ^+XJ^) ^1^2 ■^2 yi+*2+^ COS^J COS^j sinOj-^2) cos^j cos>>2 y/x2+y\+y2 У\~Уг y2cosx — sm2x У2~х (2 + e-*)"'1 sinOi+^2) ^1+^2 (^!-^)2 sin^j О+^+^Г1 ^2 e2/y, (l+^+^^)-1/2 sm(x-y2) Q-ylyi sh(x2-yi) arctg^j sin0^2) X + COSixyJ ^1^2 cos(^^2) ^l(fl) 1 0.5 -1 1 0.2 0 0.5 -0.6 0. 0.5 1 0.8 1 0. 0 -2 0 0 0 -1 -1 1 0.7 0 0.2 1 -2 0 0 -1 y2(°) 0 1.5 1 0 0 0 -0.5 2 0 1.2 1 3.5 -1 -3 0 -1 1 0 0 1 5 1 -0.5 0 0 -1 3 0 0 2 a -1 0 0 0 -1 0 1 2 -1 0 1 2 2 2 0 1 -1 -2 0 0 2 0 0 0 0 0 -1 0 -5 0 b 1 1 2 4 5 1 1 4 3 5 3 2 3 4 4 5 2 4 1 1 4 4 4 3 4 2 3 1 1 2 0 2 164
ВХОДНЫЕ Y Лабораторная работа 26 ПРИБЛИЖЕННОЕ РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ ПРОГНОЗА И КОРРЕКЦИИ Пусть требуется найти решение дифференциального уравнения y'=f(x, у), удовлетворяющее начальному условию у(х0)=у0. Численное решение задачи состоит в построении таблицы приближенных значений уи У2>—> уп решения уравнения у(х) в точках хи х2, ..., хп. Точки хи х2,..., хп называются узлами сетки. Обычно Xi = x0 + ih, /=1, 2,..., л, и величина h называется шагом сетки. В методах прогноза и коррекции каждое значение у{ определяют в два этапа. На первом этапе находят начальное (нулевое) приближение для у{\ этот этап называют. прогнозом. На втором этапе начальное приближение уточняется с помощью итерационного процесса коррекции. Для прогноза обычно используют одну из следующих формул: ШЫЕ ПАРАМЕТРЫХ -y(x-h), Y0-y(x), J Х,£,Н J i_ f(X,Y0)^F x+h- i Y1+2H-F-Y y?li=yi + hf(xh yt) или y\Vi=yi-i + 2hf(xh yv). Y0-^Y1 (1) (2) f(X,Y)-^Fl В простейшем варианте метода «прогноза и коррекции» применяется следующий итерационный процесс коррекции: Yl+y(F+Fl)-—Y0 уП1=У1 + \и{*ъ Vi) + (3) Здесь yfli—k-t приближение для величины yi+1. Сравним методы (1) — (3) и (2) — (3). В методе (1) — (3) для нахождения величины yi+1 требуется информация только о последней вычисленной точке (xt; yt). Следовательно, методом (1) — (3) можно начинать решение задачи. Методом (2) — (3) решение задачи начать нельзя. Необходимо предварительно совершить один шаг каким-либо /выхо! \1Ь ^ВЫХОДНЫЕ^ПАРАМЕТРЫ -x+h, Y0-у(x+h) ) Рис. 18 165
другим методом, например методом Рунге — Кутта или методом (1) — (3). В то же время «прогноз» по формуле (2) более точен и, значит, итерации должны сходиться быстрее. Итерационный процесс (3) продолжают до тех пор, пока y\k+i и .yiVi1* не совпадут с заданной точностью. Принято считать, что заданная точность должна быть достигнута за две-три итерации. При большем числе итераций необходимо уменьшить шаг Л. Одно из достоинств методов «прогноза и коррекции» состоит в том, что одновременно с вычислениями получается хорошая оценка погрешности найденного решения. В частности, если для прогноза использована формула (2), то \у(хд-у^\^\\у?-у(^\. ■ Чтобы перенести метод «прогноза и коррекции» на нормальные системы, достаточно в формулах (1) — (3) или (2) — (3) заменить у на у и f(x, у) на f(x, у). Блок-схема алгоритма прогноза и коррекции представлена на рис. 18. В данной лабораторной работе методом «прогноза и коррекции» следует решить задачу Коши для нормальной системы дифференциальных уравнений. Описанный алгоритм реализован в виде подпрограммы (subroutine) PRCOR(n, x, yl, yO, h, p, f, eps, fl, у): subroutine PRCOR (n,x,yl,yO,h,p,f,eps,fl,y) c„ „„„„„„„„„„„„„„„„„„г,,,*,,,,,,,,******** с Программа PRCOR решает задачу Коши для нормальной * с системы y'=f(x,y) методом "прогноза и коррекции" * с с п - порядок системы * с х - текущее значение х * с уО - массив размерности п, содержит решение в точке х * с yl - массив размерности п, содержит решение в точке x-h* с h - шаг по х * с р - имя программы, вычисляющей правые части * с f - массив размерности п, содержит правые части * с eps - погрешность итерационного процесса "коррекции" * с П,у - рабочие массивы размерности п * dimension yQ(l),yl(l),y(l),fl(l),f(l) с call p(n,x,yQ,f) с х = х + h h2 = 0.5'h eps = 5.0*eps с do 1 j = l,n y(j) = yl(j) + 2.'h4(j) ! "прогноз" yi(j) = yO(j) 1 continue 166
с 3 er « О call p(nrxryrfl) do 2 j « lrn yO(j) - yl(j) + h2*(f(j) + fl(j))! "коррекция" ex - abs(yO(j)-y(j)) if(ex.gt.er) er «. ex y(j) - yO(j) 2 continue с if(er.gt.eps) goto 3 ! проверка условия окончания return ! итерационного процесса end Входные параметры: п — порядок системы; х — значение х0, yl—массив из п действительных чисел, содержащий начальное значение у; уО—массив из п действительных чисел, содержащий решение в точке x0 + h; h—шаг интегрирования системы; f— массив из п действительных чисел, в котором размещаются значения правых частей уравнений системы; р — имя внешней подпрограммы (subroutine) p(x, у, f), вычисляющей значения правых частей уравнений системы и размещающей их в элементах массива f: eps — значение е в условии окончания итерационного процесса коррекции; fl, у—рабочие массивы из п действительных чисел каждый. Выходные параметры: х—значение x0 + h; уО—массив из действительных чисел (он же входной), содержащий решение системы в точке x0 + h. Перед обращением к программе PRCOR необходимо: 1) составить подпрограмму (subroutine) p(x, у, f) вычисления правых частей уравнений системы; 2) описать имя подпрограммы р(х, у, f) оператором external; 3) описать массивы уО, yl, у, f, fl; 4) вычислить методом Рунге—Кутта (можно использовать и другие методы) решение системы в точке x + h; 5) присвоить фактические значения параметрам n, x, yO, yl, eps. Задание. Используя программу PRCOR, составить программу решения задачи Коши у'(=/((х, уи у2, у3), yi\x=a=yi(a), i=l, 2, 3 на отрезке [а, Ь]. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к PRCOR, и печать результатов. В головной программе перед обращением к подпрограмме PRCOR необходимо: а) вычислить приближенное решение системы в точке x0+h, обратившись к подпрограмме RGK (см. лабораторную работу 25); б) присвоить начальные значения решения системы элементов массива 167
yl, а вычисленное в подпрограмме RGK—элементам массива у0, присвоить параметру х значение x0 + h. 2. Составить подпрограмму р(х, у, f) для вычисления правых частей уравнений системы. 3. Произвести вычисления на ЭВМ. Пример. На отрезке [0, 3] с шагом Л = 0.1 решить задачу Коши для системы 4yi = 6.x А Программа решения задачи может иметь следующий вид: external p dimension yQ(2),yl(2),y(2),f(2),fl(2) с eps - 0.1е-03 yl(D - 0. yl 2) - 0. уО 1 - 0. у0(2) - 0. h = O.'l с вычисляем решение на первом шаге методом Рунге-Кутта call RGK (2, xr y0r 0.1, p,.f) write(3,2) xr(J-yO(j),j-l,2) с вычисляем решение в остальных 29 точках do I i = 1,29 call PRC0R(2, xr yl, y0r hr pr fr eps, fl, y) write(3r2) xr(Jry0(j),j-l,2) ! печать строки таблицы 2 format 2x,'x «\f6.2,' y(\11,r) -'.ell.4, • y(\il,') -'.ell.4) 1 continue 3 stop end subroutine p(nrxryrf) с Программа вычисляет правые части системы сп- порядок системы с х - текущее значение х с у - массив размерности пг содержит значения у с f - массив размерности пг содержит значения правых с частей dimension f(2),y(2) f(D -У(2) f(2) - ехр(-х*у(1)) return end 168
-4 OS <Л ^ + n> 1 <-, КЛ + 4i + K>K>| CD 1 ^- 4: "+ 4: X Б'? p О ^ + K> K> ^ 3 X "x + К) + П> >2 <-, *~* + ~ 4: H-K> + K>K>| 4: 4; 5£ + + x 4: 3 4i X + Q 4 p U) Ю - о о о 1 0.5 1 о l/i - 1 о 0.5 L/л О - О 1 о о о о 1 Ч: £, а OS W в ВС Ю к S хххххххххххххххххххххххххххххх g ИиИППННИНПНПНИННПНННННИМНННЯНН g CD tO ОО -4 <Т> СЛ -^ СО ГО *- CD VO 0D *>1 СП СП -^ СО ГО ь- О VO 00 "^1 <Т> СЛ -^ СО ГО н- О ОООООООООООООООООООООООООООООО •< •< ч: ч:«<ч: ч:,<,<,< •< •< •< *< •< *<*< •< •< *<*<*< *< *< "< "< ^^^^ *q и и п н I п н и н н н п п н н и п н и и и и и п я я и и и н 5 g ГОГО ГОГОГОГОГО!^!- ^ I- ^ t- «^*^ ^00^СЛСЛ^СОСОГ\Э1^1^,,^.^1—«СЛ ^> ^4 СГ> -^ CO ГО i— О VO *nJ О"» СП -^ СО ГО CD 00 "^1 O"» O"» O"» *-J VO H- -^ *-J ГО VO -^ VD CD _. H- CD 00 СГ» СЛ CO h— CD 00 <T> СЛ CO ГО CD VO CO •** 00 CT> VO *-J ь- ГО CD 00 -^ *-J VO <0 CD P to ГО СЛ 0О i—• -^ *>l CD -^ ""«J •—• Cf> •—• *>l -^ CD CO O"» Cf> •—• CD CD CD 00 CD ГО -^ 4b <0 CD ^ OOOOOOOOOOOOOOOOOOOOOOOOOCDOOOO w ^^^^►-►-►-►-►-►-►-►-►-►-►-ОООООООООООн-н-н-ГО 2 ч:ч:ч:ч:»<ч:ч:ч:ч:ч:ч:ч:ч:ч:ч:ч:ч:ч:ч:ч:ч: ^<J^]<j<J<^^<J<J<^^ го го го го го го го го го го го го го го го го го го го го го го го го гогогогогого ^ II || П H II It It II II И U H It U II H It II H II II U II П U II H It II П нЗ s **4 **4 ««J ^4 СГ> СГ> СГ> О"» СГ> СГ> СП СП -^ CO ГО CD ^J -^ VO CD ГО СГ> ГО H- -^ ГО CT> 00 VO VO ьн CD CD CD CD VO tO 00 *-4 CT> CO VO -^ СГ> СП CD CD -^ CD CT> -^ ^J СЛ .^ ГО CD •—' ^«J VO 00 VO Д +1ч- + + + + + + + + + + + + + + + + + + + ч- + + ч- + + + + • 3 oooooooooooooooooooooooooooooo g ммммммммммммммммммООООООООООО»- CD CO tr H p H p as
Продолжение таблицы Номер варианта 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Л(*» ^i, .Уг) * У1+*2+Я ^2+ч/^+Я е-*'/* cosCiJ^) ^1+^2 ^1+^2 xcos(yY+y2) arctg(xy2) УИ-^+Я cos(x+^2) 1 У1+У2 СУ>У2 у\\Уг sin (у ty2) *2+j>i sinj^cos3^ e-<*+*> sin(x2+j>2) ln*(yi + 2) Vl+^+72 /2(*> Уи У г) Уг J\+x2+y\ у 2 cos x—sin 2x e-^i sinOi+^2) 1 TT>T+7! ^1^2 sinOi-^г) sin yY y/x2+yl+y2 sin (yly2) sin(x-y2) 2 У21+У22 е-У,Уа ^1-^2 cos(*yi^2) ХУ1У2 COS^!COS^2 arctg^x COS^i) ^1+^2 sin(^^2) уМ 0.2 0.8 -1 0 0 -1 -0.6 0 0.5 -2 0.7 1 0 1 -1 1 0. 1 0 -2 -2 у2(°) 0 3.5 5 0 0 1 2 0 1.2 3 -0.5 -1 0 1 2 0 0 -1 0 -1 3 a -1 2 2 0 0 0 2 -2 0 -1 0 2 0 1 0 0 -1 0 0 1 -1 b 1 4 4 2 4 4 5 1 2 1 4 4 2 3 2 5 3 1 4 4 1 Лабораторная работа 27 ПРИБЛИЖЕННОЕ РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ АДАМСА—БАШФОРТА Пусть требуется найти приближенное решение дифференциального уравнения /=/(*, у), удовлетворяющее начальному условию у(х0)=у0. Как обычно, численное решение состоит в построении таблицы приближенных значений уи ..., уп решения уравнения у(х) в заданных точках хи ..., хп. Чаще всего х( = х0 + Иг, i=l, 2, .... Точки Xi называют узлами сетки с шагом h(h>0). 170
В методе Адамса—Башфорта четвертого порядка величины yi + 1 вычисляют по формуле ^• + i=^ + ^(55/(xi? yi)-59f(xi^u j>f-i) + 37/(*i-2, yt-2)- /1Ч (I) -9/(*,-з, Уг-з)\ Этот метод относится к группе многошаговых методов, в которых для нахождения точки (xi + 1, yi+1) требуется информация о нескольких предыдущих точках. Формула Адамса — Башфорта принадлежит классу четырехшаговых методов, поскольку в (I) используется информация о четырех предыдущих точках. Важной характеристикой метода является порядок точности. Для метода Адамса — Башфорта (I) он равен 4, т. е. погрешность метода на одном шаге равна О (Л5). Сравним методы Рунге — Кутта четвертого порядка и Адамса— Башфорта четвертого порядка. Для обоих методов порядок погрешности (но не сама погрешность!) одинаков и составляет величину О (/г). Однако способы достижения такой достаточно высокой точности различны. В методе Адамса — Башфорта (и других многошаговых методах) она достигается за счет использования информации о предыдущих точках. В методе Рунге — Кутта (и других одношаговых методах) недостающую информацию о поведении правых частей системы получают в результате вычислений в специальным образом выбранных дополнительных точках. Таким образом, многошаговые методы более экономичны, чем одношаговые (не требуют дополнительных вычислений). В этом состоит достоинство многошаговых методов. Однако эти методы обладают общим недостатком—с их помощью нельзя начать решать задачу. Поясним это на примере метода Адамса — Башфорта (I). Пусть задано начальное значение j0 в точке * о- На первом шаге необходимо вычислить значение у± в точке x1 = x0 + h. В соответствий с (I) значение ух следует находить по формуле ^i=^o+^{55/(x0? y0)-59f(x-u j>-i)+37/(*-2, У-2)- -9/(*-з, у-з)}. Отсюда видно, что для получения решения ух в точке хх необходима информация о точках х-и х-2> *-з> которой мы не располагаем. Выход из положения состоит в использовании какого-либо одношагового метода того жр порядка точйости до тех пор, пока не будет получено достаточно значений для работы многошагового метода. В данной лабораторной работе для этой цели используется метод Рунге — Кутта четйертого порядка. 171
Метод Адамса — Башфорта легко перенести на нормальные системы дифференциальных уравнений вида Ук{х)=/к{х, У и ..., Уп\ \^к^п, которые для краткости удобнее записывать в векторной форме y' = f(*, У), У = (Уь Уг> •••> Уп), f=(/i, /2, -.., Л). Для получения расчетных формул метода Адамса — Башфорта достаточно в формулах (1) заменить у и f(x9 у) соответственно на у и f(x9 у). Описанный алгоритм реализован в виде подпрограммы (subroutine) ADMSB(n, x, u, h, p, i): subroutine ADMSB (n,x,y,h,p,i) с Программа ADMSB решает задачу Коши для нормальной * с системы дифференциальных уравнений методом Адамса-* с Башфорта четвертого порядка * с с п - порядок системы (п<*10) * с i - управляющий параметр, перед первым обращением * с ему следует присвоить значение 1 * с х - текущее значение х * с у - массив размерности п, перед обращением к программе * с содержит значения у в начальной точке, при выходе * с из программы содержит решение в точке x+h * с h - шаг по х * с р - имя программы, вычисляющей значения правых частей * с в точке (х,у) * с с Содержит обращение к программе RGK * external p dimension y(l),f(4,10),ff(10) if (i.gt.l) go to 10 call p(n,x,y,ff) ! вычисление правых частей do 1 j - l,n f(U) - ff(J) 1 continue 10 1f(1.gt.3) go to 20 call RGK (n,x,y,h,p,ff ! вычисления методом Рунге- call p(n,xry,ff) ! Кутта в начальных узлах do 3 k - l,n f(i+l,k) = ff(k) 3 continue i - i+1 go to 100 20 continue in - mod (1,4) + 1 inl - mod (i+1,4) + 1 in2 - mod i+2,4) + 1 in3 - mod (1+3,4) + 1 172
с вычисления по формуле Адамса-Башфорта do 4 j - l,n y(j) - y(j) + h*(2.2916667*f(in3,j) - 2.45833334(in2, j) + 1.54166674(inl,j) - Q.375QQQ0*f(in,j)) 4 continue x = x + h i = i + 1 call p(n,x,yrff) do 5 j = l,n f(in,j) - ff(j) 5 continue 100 return end Программа ADMSB предназначена для решения систем не выше десятого порядка. Входные параметры: п—порядок системы (w^lO); x — значение х0; h—шаг интегрирования системы; у—массив из п действительных чисел, содержащий текущие значения u; i — целая переменная. При первом обращении к ADMSB ей следует присвоить значение 1; р—имя внешней подпрограммы р(п, х, у, f), вычисляющей значения правых частей уравнений системы и размещающей их в элементах массива f. Выходные параметры: х — значение величины x0 + h; у—массив их п чисел (он же входной), содержащий решение системы в точке x0 + h. Перед обращением к программе ADMSB необходимо: 1. Составить подпрограмму р(п, х, у, f) для вычисления правых частей уравнений системы. 2. Описать ими подпрограммы р в операторе external. 3. Описать массивы. 4. Присвоить фактические значения параметрам п, х, у. Задание. Решить задачу Коши y'i=f{x, У и У г, Уъ\ yi\x=a=yi{a\ *=1, 2; 3 на отрезке [а, £>], используя подпрограмму ADMSB. Результаты печатать на каждом шаге. Построить графики решения. Пример. Решить задачу Коши для системы \у'1=-У2 + ып{хУз)> \?г=У2и {уз=-Уъ-У1, yi{0)=U У2(0) = 0., Уъ{0)=1. А Программа решения задачи может иметь следующий вид: 173
external rp dimension y(3) data y/l.,Q.,b/ n - 3" x = 0.0 h = 0.1 i = 1 do 1 j - 1,20 call ADMSB (n,x,y,h,rp,i) write (1,2) x,y ввод начальных условий и исходных данных решение задачи Коши на сетке из 20 узлов печать результатов 1 continue 2 format (lx * с stop end subroutine с Подпрограм! 'х =' гр(п, ,f6.2/ Г <.y.f) yi =' уз -• f8.4,' f8.4) ча, вычисляющая правые части с п - поядок системы с х - значение х с у - массив, содержащий значения у у2 =' ,f8.4, системы * с f - массив, содержащий значения правых частей dimension y(l),f(l) f(D - -. f(2) = f(3) = - return end /(2) + /(1)" У(3) - s1n(y(3 г y(D )'х) * * * * Вычисления по программе привели к следующим рез х = .10 х = .20 х = .30 х = .40 х - .50 х = .60 х = .70 х = .80 х = .90 х = 1.00 х = 1.10 х = 1.20 х- 1.30 х = 1.40 х = 1.50 х = 1.60 х - 1.70 х = 1.80 х = 1.90 х - 2.00 У1 - yl = У1 - yl = У1 - У1 = yi - У1 = yl = yl - yi - yl = yl - У1 - yi = yi - yi = У1 - У1 - У1 = .9994 .9950 .9840 .9637 .9324 .8890 .8328 .7640 .6833 .5916 .4907 .3823 .2685 .1513 .0327 -.0853 -.2011 -.3128 -.4191 -.5186 у2 - у2 = У2 - у2 = У2 - у2 = у2 - у2 - у2 = у2 - У2 = у2 - У2 - У2 - У2 - у2 = У2 - У2 - У2 - у2 - .1000 .1995 .2975 .3925 .4825 .5656 .6398 .7037 .7562 .7970 .8264 .8456 .8564 .8610 .8620 .8622 .8645 .8712 .8848 .9070 уз = уз = уз - уз = УЗ - уз = уз - УЗ- уз = УЗ - уз - уз = уз = уз - уз = уз = уз - уз = уз - уз - .8097 .6377 .48Й8 .3442 .2211 .1134 .0206 -.0573 -.1207 -.1699 -.2052 -.2272 -.2365 -.2339 -.2203 -.1967 -.1643 -.1241 -.0773 -.0252 174
Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 fi(x, УиУ2,Уз) 1 2 + sinyly3 у/хухуъ+у2 хе-0'|+^2) ХУ1+Х2у2у3 y/1+yl+yl Q-iyx+Уг+Уз) 2У1+УгУъ ^{УхУг+Уъ) - лге-^1"1"^ cos (у\у2у3) sin^i+^a) ln(l+j>b>i) 2Л+^2^3 Л-^З sin^+j^) 1 arctgTT^T7! ( Х \ т\у£АГ sin(y1y2y3) у2с^ зЦд^+дъуз) xyi+Уг-Уз bi+УгУъ \n(x+y{+yl) ху1+х2у2уъ гЮ%(ху{у3) x(y1+y2siny3) УхУгУъ Ьу+УгУъ \n(x2+yl) sin(xy1y2y3) Варианты заданий /2(х,УиУ2,Уз) 3 3 + COSyly2y3 1 у/Ух+Уг+Уъ УхУгУъ -У\-Уг+Уъ sin (xyly2y3) arctgfcj^) У1У2УЭ+У1 МхУ1+УгУз) УхУгУъ У1 + У2+Уз <*>*{У1У2Уз) хуу+х2у2уъ У^УгУъ+У* х2+у\ ™*(УхУгУъ) 1 \+х2+у22 У*У1Уъ+Уг \n(x2+yl) узе«»ХУ2 сЦхууу2+уъ) Ьх+УгУъ У1У2УЗ+У1 МхУ1У2)+Уз -У1-У2+УЗ sinfcrctg^^)) xcos(y2+y3) x2+yl У1У2УЭ+У1 3idg(xyly3) -cos^+j^) 1 /3(^,^1,^2,^3) 1 2 + e-** ^2esin^' • ( x \ sm[H^r in(i+^i) -cos{xyl+y3) sinfcrctg^^) хУх+Уг-Уъ сЦхууу2+уъ) x2+y22 sin^+^3) У\+Уг+Уъ -Уу-Уг+Уъ УТ+Я+Я \n(x2+yl) -cos(xy1-{-y3) 3 1+У1+У2+у1 у/У\+Уг+Уъ e -УхУгУг esin(y,^2^3) sin^^+^a) У1У2У3+У1 ч/Т+Я+Я Ух + Ьг-хУъ XG-iy*+yl &-{У\+У2+Уз) \n(x2+yl) \n(x2+y22) ХУ1+У2-УЭ sin(arctg^^3) &-Ь>х+У2+Уз) Уг(а) 1 -2 -1 ' о 1 -1 0.2 -0.4 0 0.5 0 1 -1 0 1 -1 1 0 0 0 -1 -! 0 -0.3 0 0 0 0.2 0 0 Уг(а) 0 -1 0.3 0 -1 -1 0 -0.4 1 1 1 1 -5 -0.5 -1 0 1 0 0 -1 1 -5 1 0.5 -о.з -0.5 -0.5 0 -1 -0.3 Ы*) 0 0.5 0.45 1 -2 -2 0 1 -3 -0.3 -1 0 1 0.5 -2 1 1 0 0 0.4 2 1 -1 1 1 0.5 0.5 0 1 1 a 0 0.3 0 2 -1 0 0 0.3 0 2 0 0 -1 0 -1 1 0 1 0 1 -1 -1 1 0 1 0 0 0 -1 1 b r 0.2 1 1 3 0 1 1 1 1 3 1 1 0 1 0 2 1 2 1 2 1 0 2 1 2 1 1 1 0 2 175
Лабораторная работа 28 ПРИБЛИЖЕННОЕ РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ АДАМСА —МУЛТОНА Пусть требуется найти приближенное решение дифференциального уравнения y'=f(x, у), удовлетворяющее начальному условию у(х0)=у0. Численно решить дифференциальное уравнение — это значит построить таблицу приближенных значений У1> У2> ••• •> Уп решения уравнения у(х) в заданных точках х1? х2, ..., хп. Точки xt называются узлами сетки. Обычно xt = x0 + ih9 /=1, 2, .... Величина h называется шагом (й>0). В методе Адамса— Мултона четвертого порядка величины ^•вычисляются по формуле Л+1=Л+^(9/(^+ьЛ+1)+19Л^,Л)- -5/{х^иУ1^)+/{х^ъу^2)). (!) Этот метод относится к группе многошаговых методов, в которых для расчета точки (xi+1,yi+1) требуется информация о нескольких предыдущих точках. Сравним теперь метод Адамса — Мултона с методом Адамса— Башфорта (см. лабораторную работу 27). Эти методы относятся к группе многошаговых. Для обоих методов порядок погрешности одинаков и составляет величину О (А5). Установим, в чем же состоит разница между методами Адамса — Башфорта и Адамса — Мултона. В методе Адамса — Башфорта вычисление yi+1 проводится по формуле ^+i=^+-(55/(xf, У1)-59/(х^и yi-1) + + 37/(*,-2, Л-2)-9/(*,-3, *-з))- (2) Подлежащая определению величина yi+1 входит только в левую часть формулы (2). В методе Адамса — Мултона величина yi+1 входит не только в левую, но и в правую часть формулы (1). Таким образом, в формуле (1) величина yi+1 определяется неявно, поэтому что для вычисления величины f(xi+1, yi+i) нужно знать значение >Y+i, которое само пока неизвестно. Таким образом, формула (1) представляет собой уравнение для величины yi+i, которое следует решать каким-либо (вообще говоря, численным) методом. Вот почему методы Адамса — Мултона называют неявными многошаговыми методами; напротив, методы Адамса — Башфорта относят к группе явных многошаговых методов. 176
На практике, как правило, неявный метод Адамса — Мултона используют совместно с явным методом Адамса — Башфорта по следующей схеме: если известны значения yi9 yt-l9 yi-2> yt-ъ в точках xi9 х{-и Xi-2, xi-3> T0 сначала делают прогноз для величин yi+1 с помощью явного метода Адамса — Башфорта y\Vi=yt^{55f{xt,yi)-59f(xt.uyi.1) + + 37/(х,_2, yt-2)-9f{Xi-3, yt.3% (3> затем корректируют величину у{+1 по формуле С=Л+5№'- J#i)+19/(*i. У,)~ -Sfixi-uy^+fix^y,^))^ W Теперь можно организовать итерационный процесс для уточнения величины yi+1. Если yflx—значение после s итераций, то (j+l)-e уточненное значение величины yi+1 можно вычислять по формуле -5/(**-ь yi-i)+f{xt-2, yi-i))- Итерации можно прекратить, когда две последовательные итерации дают практически одинаковые результаты, т. е. при выполнении условия || iyl++i1)— yf] II <£, где 8—заданная малая величина. Может показаться, что неявные многошаговые методы должны уступать явным по быстродействию, поскольку в неявных методах приходится решать уравнение для определения величины yi+l9 а в явных методах она определяется сразу. Это действительно так, если сравнивать быстродействие на одном шаге. При интегрировании на промежутке, как правило, неявные методы позволяют проводить вычисления с крупным шагом, так что можно добиться значительной экономии числа шагов. В целом же неявный метод может дать существенную экономию машинного времени по сравнению с явным методом того же порядка точности. Как и все многошаговые методы, методы Адамса — Мултона не позволяют начать решение задачи. Для получения «стартовых» значений можно воспользоваться каким-нибудь одношаговым методом того же порядка точности. В данной лабораторной работе для этой цели используется метод Рунге — Кутта четвертого порядка. Метод Адамса — Мултона легко переносится на нормальные системы дифференциальных уравнений вида У'к=/к{х>У1> ->Уп)> ^^к^п, ill
которые для краткости удобно записывать в векторной форме y' = f(x, у), y = {yl9...,yn), f=t/i, . ..,/„). Для получения расчетных формул метода Адамса — Мултона достаточно в формуле (1) заменить у и f(x, у) соответственно на у и f (х, у). Описанный алгоритм реализован в виде подпрограммы (subroutine) ADMSM (n, х, у, h, p, i, eps): subroutine ADMSM (n,x,y,h,p,i,eps) с Программа ADMSM решает задачу Коши для нормальной * с системы дифференциальных уравнений методом Адамса- * с Мултона четвертого порядка * с с. п - порядок системы (п ^10) * с i - управляющий параметр, перед первым обращением ему * с следует присвоить значение 1 * с х - текущее значение х * с у - массив размерности п, перед обращением к программе * с содержит значения у в начальной точке, при выходе * с из программы содержит решение в точке x+h * с h - шаг по х * с р - имя программы, вычисляющей значения правых частей * с в точке (х,у) * с с Содержит обращение к программе RGK * с„м*мммммммм*мммммммммммммммммм* dimension y(l),f(4,lQ),ff(lQ),yl(lQ) external p с if (i.gt.l) go to 10 call p(n,x,y,ff) do 1 j - l,n f(l.j) = ff(j) 1 continue с 10 if(i.gt.3) go to 20 call RGK(n.x,y,h,p,ff) call p(n,x,y,ff) с do 3 k - l,n f(i+l,k) = ff(k) 3 continue i = i + 1 go to 100 20 continue с in = mod <i,4) + 1 inl = mod (i+1,4) + 1 in2 - mod (i+2r4) + 1 in3 = mod (i+3,4) + 1 do 4 j = l,n yl(j) - y(j) + h'(2.29166674(in3,j) - 2.45833334(in2,j)
+ 1.5416667'f(inl,j) - 0.37500004(in,j)) 4 continue 30 call p(ntx+h,yl>ff) do 5 j = l.n V(j). = v(j) + h'(0.37500004f(j) + 0.79166664(in3,j) - 0.20833334(in2,j) + Q.Q4166664(inl,j)) 5 continue del - 0. do 6 j - l,n del - amaxO(del,ab$(y(j)-yl(j))) 6 continue do 7 j - lrn yi(j) - y(j) 7 continue if(ddl*gt.eps) go to 30 x « x + h i - i + 1 call p(n,x,y,ff) do 8 j * l,n f(in,j) - ff(j) 8 continue 100 return end Входные параметры: n — порядок системы л^Ю; х — значение х0; h — шаг интегрирования системы; у—массив размерности л, содержит текущие значения у; р—имя подпрограммы, вычисляющей значения правых частей системы; eps — максимально допустимая разница между двумя последовательными итерациями; i — управляющий параметр, перед первым обращением i=l. Выходные параметры: х — значение x + h; у— массив, содержащий решение в точке x + h. Перед обращением к программе ADMSM необходимо: 1. Составить подпрограмму р(п, х, у, f) для вычисления правых частей системы. 2. Описать имя р оператором external. 3. Описать массивы. 4. Присвоить фактические значения параметрам п, х, у. Задание. Решить задачу Коши у\ =ft(х, yl9 у2, у3), у{\х=а =yt(a), /=1, 2, 3 на отрезке [а, Ь]9 используя программу ADMSM. Построить графики решения. Пример. Решить методом Адамса — Мултона задачу Коши для системы 179
У1 = -У2 + &п(ху3)9 У2=У1 Уз=-У1-Уз, УЛ0)=1, У2{0) = 0, у3{0)=1. Программа решения задачи может иметь следующий вид: external гр dimension y(3) с data у/1.,0.,1./ ! начальные условия п ■= 3 ! и параметры eps - 0.0001 ! Системы х - 0.0 h - 0.1 i - 1 с вычисления по формуле Адамса-Мултона do 1 j - 1,20 call ADMSM (n, x, y, hr rpr ir eps) write(l,100) x,y 100 format (lx/x «\f8.4/ yl -\f8.4/ y2 «\f8.4, ' уЗ -\f8.4) 1 continue с stop end с с subroutine rp(n,x,y,f) с Программа вычисляет правые части системы y'-f(x,y) * с с п - размерность системы * с х - значение х * с у - массив, содержащий значения у * с f - массив, содержащий значения правых частей * dimension y(l),f(l) у 2 ♦ s1n(y(3)*x) У 1Г*2 (3) - -у 3) - у(1) Ч1 f(2 f return end Вычисления по программе привели к следующим результатам: х = .1000 yl - .9994 у2 = .1000 уЗ = .8097 х- .2000 yl - .9950 у2 - .1995 уЗ - .6377 х- .3000 yl - .9840 у2 - .2975 уЗ - .4828 х - .4000 yl « .9637 у2 - .3926 уЗ - .3441 х - .5000 yl - .9324 у2 - .4826 уЗ = .2211 х - .6000 yl - .8890 у2 - .5658 уЗ - Л133 х - .7000 yl - .8328 у2 - .6401 уЗ - .0205 х = .8000 yl - .7639 у2 - .7041 уЗ - -.0574 х = .9000 yl - .6831 у2 - .7566 уЗ - -.1208 180
X = X - X - X - X - X "= X » X - X - X » X - 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000 yi - yi - yi - yi - yi - yi - Vl - Vl - yi - Vl - yi - .5914 .4903 .3819 .2680 .1507 .0321 -.0860 -.2017 -.3134 -.4196 -.5191 V2 - V2 - V2 - У2 - У2 - У2 - У2 = V2 - У2 - V2 - У2 -■ .7974 .8268 .8460 .8566 .8612 .8621 ;8623 .8645 .8712 .8848 .9069 уз - уз- уз - УЗ - уз - уз - уз = УЗ - УЗ - УЗ - уз - -.1700 -.2053 -.2272 -.2365 -.2338 -.2202 -.1965 -.1640 -.1238 -.0770 -.0249 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 И 12 13 14 15 16 17 18 19 20 21 22 /\{х,УиУ2,Уъ) sm(y^y3) ХУ1+У2-У3 Mi+ybl) у/\+у\+у1 xt-(ySyi] 1 ™*Tw^\ 1 2+e~V2 т(ухУгУъ) 1 Т^я sh(jcyi+^2^3) икХфухУз) х(у1+угшуъ) sm{xj{y] + \)y2 ^2esinyi \n(x+y]+y23) \n(x2+y2) ^{ху^уз) УхУгУъ sin(yi+y3) 1 у/хУ1Уъ+У2 xe~yi~y2 Мх,УиУ2*Уз) Gos(yiy2y3) 1У\+УгУъ Ч1+х2У2Уз Яй^угУз) У\УгУъ 1 \+Х2+у22 1 2-\-$т(у1у3) Щх2+у1) COs(x2+yly3) МхУ1У2+Уз) sm^rctgy^i) хю*(Уг+Уъ) у/хум+Уг ^зеС08(ху2) МхУ1Уг)+Уъ arctg(^^3) -cos(xyl-\-y3) х2+у\ <ж(У\УгУъ) 3 3+cos умуз s/Уг+Уг+Уз УхУгУъ /ъ{х,УиУ2,Уъ) У\+Уг+Уъ У\УгУъ+Уг\ -У\-Уг+Уз -oos(xy!+^3) x2+yl 3 \+у\+Уг+Уз 3 3+cosOi^2^3) Ъ~у1угуг t~xyiyiyz мЦухУг+уз) Q-(yl+y2+y3) \п(х2+у2) y/yi+Уг+Уз e,in^i'2'3> У\+Ьг-ху2з sinfarctgj^a) е-(у1+у2+у3) H^+yl) -COs(xy{+y3) 1 2+e"V2 y2e'inyi X sm -y— y2 УАа) 0 -1 1 1 0 -1 0 0 -1 0 0 0 1 0 0 0 0 0 1 1 -2 -1 yi{*) -1 0 0 0 -2 -1 -0.3 -0.5 1 0 1 -1 -0.3 -0.5 -1 0 -1 0.3 уМ -l 2 0 -2 -3 1 1 0 -3 0.4 1 0.5 1 0 -1 1 1 0.5 -2 0 0.5 0.45 a ~ -1 0 -1 0 1 0 1 2 1 1 0 0 0 1 -1 1 0 -1 0 0.3 0 b ~T~ 1 1 0 1 2 1 1 2 3 2 2 1 1 1 2 0 2 1 0 1 1 1 1 181
Продолжение таблицы Номер варианта 23 24 25 26 27 28 29 30 лм 1у\+УтУъ ху1+х2у2уъ Ь\+У2Уъ ху1+х2у2уъ е-*У1У2У3 sin (у хуг +уъ) е-(у1+у2+у3) ЛМ -^1-^2+^3 ^1^2^3+^f -У1~Уг+у1 1 sh(x^!+j;2^3) arctg(^^3) ЛМ sin^i+^з) ^1+^2-^3 1П(1+^Ь'22) хД+ТТ+Я xe~yt-y2 cos(x2+^i^3) сЪ(ху1у2+Уъ) sm(2LTCigyiy3) УАа) 0.5 0.2 0 -1 -0.3 0 -0.4 -1 УАа) 1 0 0 -5 0.5 0 -0.4 -1 уМ -0.3 0 1 1 1 0 1 -1 а 2 0 2 -1 0 1 0.3 0 ь 3 1 3 0 1 2 1 1 Лабораторная работа 29 РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ МЕТОДОМ МАТРИЧНОЙ ЭКСПОНЕНТЕ В вычислительной практике часто встречаются системы дифференциальных уравнений, которые принято называть жесткими. Не приводя точного определения жесткой системы, проиллюстрируем содержание этого понятия и возникающие проблемы на примере линейной системы двух дифференциальных уравнений с постоянными коэффициентами. Пусть необходимо численно решить систему 1/1 = -2^-998^2, [у'2= -Ю(%2, Л(0) = 2, j,2(0)=l, которую можно записать в векторной форме у' = Ау, где -2 -9981 (1) А = О 1000 — матрица системы. (2) Точное решение вычисляется легко: У1(х) = е-2х + е-1000х, У2(х)= е-юоо* Слагаемое е-1000* убывает очень быстро, а слагаемое е~2* — гораздо медленнее. Попытаемся применить к задаче (1) метод Эйлера. 182
Тогда yu + i=yii + h(-2yii-99Sy2il y2i + i=y2i + h(-m0y2i). { } При Л = 0.1 на первом же шаге получаем У11 =2 + 0.1 (-2x2-998x1)= -98,2, У21 = 1+0.1 (-1000x1)= -99. Сравнение с точным значением решения в этой точке х = 0Л л=е-°-2+е-1ОО = 0.8188, ^2 = е-1ОО = 0, показывает, что результат (3) неприемлем. Чтобы преодолеть возникшую трудность, нужно уменьшить шаг h. Для получения пр»авдоподобного результата шаг h должен быть меньше 0.001. Если интервал интегрирования достаточно большой, то метод Эйлера потребует очень много шагов. Казалось бы, эту трудность можно преодолеть следующим способом: сначала вести расчеты с малым шагом, а затем, когда компонента е-1000* станет малой, увеличить шаг и оставшийся промежуток интегрирования «пройти» с крупным шагом. На самом деле это не так. Цторая компонента решения заставляет вести интегрирование с малым шагом на всем промежутке интегрирования. Это и означает, что система (1)—жесткая. Замена метода Эйлера другим явным методом, например методом Рунге — Кутта, не приводит к желаемым результатам. Жесткость системы проявляется тогда, когда промежуток интегрирования Т удовлетворяет соотношению T^l/IXmaJ, A,max—наибольшее собственное число матрицы системы. Значит, для интегрирования жестких систем необходимо применять другие специально разработанные методы. Остановимся на одном из этих методов, предназначенных для интегрирования только однородных систем линейных дифференциальных систем с постоянными коэффициентами. Задача Коши для такой системы формулируется следующим образом: найти решение системы линейных дифференциальных уравнений {У\=й\\У\ + а12У2 + - + Я1П.УП, (4) У2 = ап1у1 + ап2У2 + - + аппуп, удовлетворяющее начальным условиям (у\х=о=Ум, Уп\х = 0=УпО- 183
Вводя стандартные обозначения, задачу (4) — (5) можно записать в матричной форме ■£ = АУ> У1*=о = Уо> (6) где А — матрица системы. Аналитическое решение задачи (3) записывается в следующем виде: У = е^у0, (7) где еЛх — матричная экспонента. Матричная экспонента еЛх определяется формулой е^ = Е+Ах+№ + ...+№... (8) Если бы матричная экспонента была известна, то решение задачи (4) — (5) при любых начальных условиях определялось бы по формуле (7). Пусть необходимо проинтегрировать систему (4) с шагом Я, т. е. найти значения решения в точках х = Н, 2#, 3# и т. д. Если точно знать матрицу еАН, то точное решение в точках х = Н, 2Н, ЗН, ... можно вычислять по формулам у\х=н = елну0, У\х=2н = елну\х=н и т.д. (9) Таким образом, задача состоит в том, чтобы достаточно точно вычислить матрицу tAH. При больших Н воспользоваться рядом (8) не удастся, так как для получения удовлетворительной точности потребовалось бы много членов {эяда. В данной лабораторной работе матричная экспонента елн вычисляется следующим образом: отрезок [О, Я ] разбивается на к частей так, чтобы длина одной части h = H/k удовлетворяла условию ||^4А||<0.1; в тейлоровском разложении (8) берутся первые пять членов ряда и вычисляется матричная экспонента eAh, условие ||^4А||<0.1 обеспечивает высокую точность ее вычисления; для ускорения вычислений применяется схема Горнера: ^ = E+Ah(E+^(E+f(E+^))); каждый столбец wt матрицы елн вычисляется по формуле Wf = (e^*)*w?, 184
где w° = столбец, в i-й строке которого стоит 1, а в осталь- ллн ных — нули. После того как матрица е~" найдена, решение системы в заданных точках определяется по формулам (7). Описанный алгоритм реализован программой SLIDE: subroutine SLIDE (n,x,y,h,a,ar,icount) Программа SLIDE предназначена для решения задачи Коши для линейной системы дифференциальных уравнений с постоянными коэффициентами методом матричной экспоненты п х h а аг icount У - с с с с с с с с с с с с с с с с с у - массив размерности пгсодержит решение в точке x+h с„„»„,»„„„»»»»»»»»»»»„,„»„,„»„„„„ dimension y(n)rar(nrn)r ys(10),yQ(lQ) dimension a(n,n),yl(10),a2(lQ,lQ) if (icount.gt.l) go to 1000 anorm = 0; do 400 i - l,n do 400 j = l,n anorm - amaxl(anorm,abs(a(i,j))) continue hm = Q.l/anorm nh « h/hm hm - h/nh порядок системы, п^Ю текущее значение х шаг интегрирования h массив размерности n*n,содержит матрицу системы рабочий массив размерности п*п счетчик номера шага, перед обращением к программе равен 1 массив размерности п, содержит перед обращением к программе значение.решения в начальной точке х Результат: 400 Вычисление матрицы exp(ah) 10 do 10 i do 10 j a(i,j ar(i,j continue - l,n - l,n - a(i,j)*hm - 0. int 185
с 100 do 20 i = l,n do 30 j - l,n ar(i,j) - ar(irj)/float(int) 30 continue ar(i,i) = 1. + ar(i,i) 20 continue do 40 i - lrn do 40 j - l,n s - 0. do 41 к - l.n s « s + a(k,j)*ar(i,k) 41 continue a2(i,j) - s 40 continue do 50 i - l,n do 50 j - l,n ar(i,j) - a2(i,j) 50 continue int - int - 1 if(int.gt.l) go to 100 do 60 i - l,n ar(iri) - ar(i,i) + 1. 60 continue с с Построение матрицы ехр(аН) с с do 200 i - l,n XX - X do 210 1 - l,n 210 y0(l) - 0. 3 i y0(i) - 1. do 220 j - l,nh do 230 1 - l,n s - 0. do 240 к - l,n s - s + ar(k,l)'y0(k) 240 continue У1(1) - s 230 continue с do 250 1 - l,n У0(1) -yl(l) 250 continue с 220 continue с do 260 j - l,n a(j,i) - y0(j) 186
260 200 1000 310 300 ' с 320 с continue continue do 300 i - lrn s = 0. do 310 j = lrn s - s + a(jri)*y(j) .continue ys(i) - s continue do 320 j = l,n y(j) = ys(j) continue x = x + h icount = icount + 1 return end Входные параметры: n — порядок системы; х — начальное значение х; у—массив размерности л, перед обращением к программе содержит решение в начальной точке; h—шаг интегрирования А; а — массив размерности пхп, содержит матрицу системы; аг — рабочий массив размерности пхп; icount — счетчик количества шагов, перед обращением к программе должен быть равен единице. Выходные параметры: у—массив, размерности п содержит решение в точке x + h. Задание. Решить методом матричной экспоненты задачу Коши для системы Y = AY, Y|X = 0 = Y0 обращением к SLIDE. Попытаться решить задачу методом Рунге — Кутта или методом Эйлера. Пример. Решить задачу Коши для системы у1=-ПУ1+ 9у2, y'i= 9y1-lly2, yi{o)=i, у2{о)=о. А Программа решения задачи Коши может иметь следующий вид: dimension y(2)ra(2r2)rar(2r2) data у/1.,0.Л a/-ll.,9.,9.,-ll./ с n - 2 x - 0. h « 0.1 icount - 1 write(3/) ' x y(l) y(2) ' 187
do 1 j - 1,20 call SLIDE(n,x,y,h,a,ar,icount) write(3,100) x,y(l),y(2) 0 format(3(el2.5,3x)) 1 continue stop end Вычисления по программе привели к следующим результатам: X Л0000Е+00 .2QQQQE+QQ .30000Е+00 .40000Е+00 .50000Е+00 .60000Е+00 .70000Е+00 .80000Е+00 .90000Е+00 Л0000Е+01 .11QQQE+Q1 .12000Е+01 Л3000Е+01 Л4000Е+01 Л5000Е+01 Л6000Е+01 Л7000Е+01 Л8000Е+01 Л9000Е+01 .20000Е+01 У(1 .47703Е+00 .34432Е+00 .27565Е+00 .22483Е+00 Л8396Е+00 Л5060Е+00 Л2330Е+00 Л0095Е+00 .82650Е-01 .67668Е-01 .55402Е-01 .45359Е-01 .37137Е-01 .30405Е-01 .24894Е-01 .20381Е-01 Л6687Е-01 Л3662Е-01 Л1185Е-01 .91578Е-02 У 2) .34170Е+00 .32600Е+00 .27317Е+00 .22450Е+00 Л8392Е+00 Л5059Е+00 Л2330Е+00 Л0095Е+00 .82650Е-01 .67668Е-01 .55402Е-01 .45359Е-01 .37137Е-01 .30405Е-01 .24894Е-01 .20381Е-01 Л6687Е-01 Л3662Е-01 Л1185Е-01 .91578Е-02 Варианты заданий Номер варианта 1 2 3 Матрица системы -Л8000Е+01 .23200Е+02 .97000Е+01 .83500Е + 01 -.51350Е+02 -.41500Е+02 -.40000Е+02 -.31350Е + 02 .12175Е + 02 -.25000Е+00 .50000Е+01 .21750Е+01 .51650Е+02 .16800Е+02 .ЗОЗООЕ+02 .21500Е+02 .22600Е + 02 .47600Е+02 .29600Е+02 .27800Е + 02 -.26800Е+02 -.22000Е+02 -.20000Е+02 -Л6800Е+02 -.46000Е+01 -.17000Е+02 -ЛООООЕ+02 -.96000Е+01 .22000Е+01 -.27600Е+02 -.96000Е+01 -Л3000Е+02 .37000Е+02 .65333Е+02 .42833Е+02 .40583Е+02 -Л8917Е+02 -Л5833Е+02 -ЛЗЗЗЗЕ+02 -Л2250Е+02 Вектор начальных условий .8415Е + 00 .5403Е + 00 -.4161Е + 00 .9093Е + 00 .9093Е+00 -.4161Е+00 -.6536Е+00 -.7568Е + 00 Л411Е + 00 -.9900Е+00 188
Продолжение таблицы Номер варианта 3 4 5 6 7 8 9 10 11 12 13 Матрица системы -.13042Е + 02 -.27083Е + 02 -Л8333Е + 02 -.16375Е + 02 -.20583Е + 02 -.52000Е + 02 -.29500Е + 02 -.30833Е + 02 .48900Е+02 .81400Е+02 .54400Е+02 .51700Е+02 -.15200Е+02 -ЛЗОООЕ+02 -Л0000Е+02 -Л0200Е+02 -Л9400Е+02 -.35500Е+02 -.25000Е + 02 -.21900Е+02 -.36700Е+02 -.71400Е + 02 -.44400Е + 02 -.44500Е + 02 .59800Е + 02 .96800Е + 02 .65300Е + 02 .62150Е + 02 Л3150Е+02 -Л1500Е+02 -.80000Е + 01 -.91500Е+01 -.24925Е+02 -.43250Е + 02 -.ЗЮООЕ + 02 -.26925Е + 02 -.50150Е + 02 -.88800Е + 02 -.57300Е + 02 -.56500Е + 02 .70200Е + 02 Л1187Е + 03 .75867Е + 02 .72267Е + 02 -Л1933Е+02 -Л0667Е+02 -.66667Е+01 -.86000Е + 01 -.ЗООЗЗЕ + 02 -.50667Е + 02 -.36667Е + 02 -.31700Е + 02 -.62267Е+02 -Л0520Е+03 -.69200Е+02 -.67667Е+02 .80314Е + 02 Л2674Е + 03 .86243Е + 02 .82193Е + 02 Л1193Е+02 -Л0214Е+02 -.57143Е + 01 -.83357Е+01 -.34904Е + 02 -.57893Е + 02 -.42143Е + 02 -.36332Е+02 -.73621Е+02 -Л2103Е+03 -.80529Е+02 -.78357Е+02 .90250Е+02 Л4150Е+03 .96500Е+02 .92000Е+02 -Л0750Ё+02 -Л0000Е+02 -.50000Е+01 -.82500Е+01 -.39625Е+02 -.65000Е+02 -.47500Е+02 -.40875Е+02 -.84500Е+02 -Л3650Е+03 -.91500Е+02 -.8875QE+02 Л0007Е+03 Л5618Е+03 Л0668Е + 03 Л0173Е+03 -Л0506Е + 02 -.99444Е + 01 -.44444Е + 01 -.82833Е + 01 -.44247Е + 02 -.72028Е + 02 -.52778Е + 02 -.45358Е + 02 -.95061Е + 02 -Л5173Е+03 -Л0223Е + 03 -.98944Е + 02 Л0980Е+03 Л7080Е+03 Л1680Е+03 Л1140Е+03 -Л0400Е + 02 -Л0000Е + 02 -.40000Е + 01 -.84000Е + 01 -.48800Е + 02 -.79000Е+02 -.58000Е + 02 -.49800Е + 02 -Л0540Е + 03 -Л6680Е+03 -Л1280Е + 03 -Л0900Е + 03 Л1947Е + 03 Л8538Е + 03 Л2688Е + 03 Л2103Е + 03 -Л0395Е+02 -Л0136Е+02 -.36364Е + 01 -.85773Е+01 -.53302Е + 02 -.85932Е + 02 -.63182Е + 02 -.54211Е + 02 -Л1558Е + 03 -Л8175Е + 03 -Л2325Е + 03 -Л1895Е + 03 Л2910Е+03 Л9993Е+03 Л3693Е+03 Л3063Е+03 -Л0467Е+02 -ЛОЗЗЗЕ + 02 -.ЗЗЗЗЗЕ + 01 -.88000Е + 01 -.57767Е + 02 -.92833Е + 02 -.68333Е + 02 -.58600Е+02 -Л2563Е + 03 -Л9660Е + 03 -Л3360Е + 03 -Л2883Е + 03 Л3869Е + 03 .21446Е + 03 Л4696Е + 03 Л4021Е + 03 Вектор начальных условий .9602Е + 00 -.2794Е + 00 -.7568Е + 00 -.6536Е + 00 -Л455Е + 00 .9894Е + 00 -.9589Е + 00 .2837Е + 00 -.8391Е + 00 -.5440Е + 00 .9602Е + 00 .9602Е + 00 .8439Е+00 -.5366Е + 00 .6570Е + 00 .7539Е + 00 Л367Е + 00 .9906Е + 00 .9894Е + 00 -Л455Е + 00 -.9577Е + 00 -.2879Е+00 .4121Е + 00 -.9111Е+00 .6603Е+00 -.7510Е + 00 -.5440Е + 00 -.8391Е + 00 .4081Е+00 .9129Е + 00 -Л000Е + 01 .4426Е-02 -Л000Е + 01 -.8851Е-02 -.5366Е + 00 .8439Е + 00 .4242Е + 00 -.9056Е + 00 .4202Е + 00 189
Продолжение таблицы Номер варианта 13 14 15 16 17 18 19 20 21 22 Матрица системы -.10596Е + 02 -.10577Е+02 -.30769Е + 01 -.90577Е + 01 -.62202Е + 02 -.99712Е + 02 -.73462Е + 02 -. 62971Е + 02 -.13560Е + 03 -.21138Е + 03 -Л4388Е+03 -Л3865Е + 03 .14826Е + 03 .22897Е + 03 Л5697Е + 03 Л4977Е + 03 -Л0771Е + 02 -.10857Е + 02 -.28571Е + 01 -.93429Е + 01 -.66614Е + 02 -.10657Е + 03 -.78571Е + 02 -.67329Е + 02 -Л4549Е + 03 -.22611Е+03 -Л5411Е + 03 -.14843Е + 03 Л5780Е + 03 .24347Е + 03 .16697Е + 03 Л5932Е + 03 -Л0983Е + 02 -.11167Е + 02 -.26667Е+01 -.96500Е + 01 -.71008Е + 02 -.11342Е + 03 -.83667Е + 02 -.71675Е + 02 -.15532Е + 03 -.24080Е + 03 -.16430Е + 03 -Л5817Е + 03 .16732Е + 03 .25795Е+03 Л7695Е + 03 Л6885Е + 03 -.11225Е + 02 -.11500Е+02 -.25000Е + 01 -.99750Е + 01 -.75387Е + 02 -.12025Е + 03 -.8875Е + 02 -.76013Е + 02 -.16510Е + 03 -.25545Е + 03 -.17445Е+03 -.16788Е + 03 .17684Е + 03 .27242Е+03 .18692Е + 03 .17837Е + 03 -.11491Е + 02 -.11853Е + 02 -.23529Е + 01 -.10315Е + 02 -.79754Е + 02 -.12707Е + 03 -.93824Е + 02 -.80343Е + 02 -47484Е + 03 -.27007Е + 03 .-.18457Е + 03 -.17756Е + 03 .18633Е+03 .28689Е+03 .19689Е+03 .18789Е+03 -.11778Е + 02 -.12222Е+02 -.22222Е + 01 -.10667Е + 02 -.84111Е + 02 -.13389Е + 03 -.98889Е + 02 -.84667Ё + 02 -.18456Е + 03 -.28467Е + 03 -.19467Е + 03 -.18722Е + 03 .19582Е + 03 .30135Е + 03 .20685Е+03 .19740Е + 03 -.12082Е + 02 -.12605Е + 02 -.21053Е+01 -.11029Е + 02 -.88459Е + 02 -.14070Е + 03 -.10395Е + 03 -.88986Е + 02 -. 19424Е + 03 - .29924Е + 03 - .20474Е + 03 -. 19687Е + 03 .20530Е + 03 .31580Е + 03 .21680Е + 03 .20690Е + 03 -.12400Е + 02 -ЛЗОООЕ + 02 -.20000Е + 01 -Л1400Е + 02 -.92800Е+02 -Л4750Е + 03 -Л0900Е+03 -.93300Е+02 -.20390Е + 03 -.31380Е + 03 -.21480Е+03 -.20650Е + 03 .21477Е + 03 .33025Е + 03 .22675Е + 03 .21640Е + 03 -Л2731Е + 02 -Л3405Е + 02 -Л9048Е+01 -Л1779Е + 02 -.97135Е + 02 -Л5430Е + 03 -Л1405Е + 03 -.97611Е + 02 -.21354Е + 03 -.32834Е + 03 -.22484Е + 03 -.21612Е + 03 .22424Е + 03 .34469Е + 03 .23669Е + 03 .22589Е + 03 -Л3073Е + 02 -Л3818Е + 02 -Л8182Е + 01 -Л2164Е + 02 -Л0146Е + 03 -Л6109Е + 03 -Л1909Е+03 -Л0192Е+03 -.22316Е + 03 -.34287Е + 03 -.23487Е + 03 -.22573Е + 03 Вектор начальных условий .9074Е + 00 .6469Е + 00 .7626Е + 00 .9906Е + 00 Л367Е+00 -.9626Е + 00 .2709Е + 00 .6503Е+00 -.7597Е + 00 Л543Е + 00 -.9880Е + 00 -.2879Е+00 -.9577Е + 00 .8342Е + 00 .5514Е + 00 -.9614Е + 00 -.2752Е + 00 -.8486Е + 00 .5291Е + 00 -.7510Е + 00 .6603Е + 00 -Л280Е + 00 -.9918Е+00 Л499Е + 00 .9887Е + 00 .9551Е + 00 .2964Е+00 .9129Е + 00 .4081Е + 00 -.6669Е+00 .7451Е +00 .8367Е+00 -.5477Е+00 -.4000Е + 00 -.9165Е+00 -.8851Е-02 -Л000Е + 01 .9998Е + 00 Л770Е-01 190
Продолжение таблицы Номер варианта 23 24 25 26 27 28 29 30 Матрица системы .23370Е+03 .35913Е+03 .24663Е+03 .23538Е + 03 -Л3424Е+02 -Л4239Е+02 -Л7391Е + 01 * -Л2554Е+02 -Л0579Е + 03 -.16788Е+03 -.12413Е+03 -Л0622Е + 03 -.23277Е+03 -.35739Е+03 -.24489Е+03 -.23533Е+03 .24315Е + 03 .37357Е+03 .25657Е+03 .24487Е+03 -Л3783Е + 02 -Л4667Е + 02 -Л6667Е + 01 -Л2950Е + 02 -Л1011Е+03 -Л7467Е+03 -Л2917Е+03 -Л1053Е+03 -.24237Е + 03 -.37190Е + 03 -.25490Е + 03 -.24492Е + 03 .25260Е + 03 .38800Е+03 .26650Е + 03 .25435Е + 03 -Л4150Е + 02 -Л5100Е + 02 -Л6000Е + 01 -Л3350Е + 02 -Л1443Е + 03 -Л8145Е + 03 -Л3420Е + 03 -Л1482Е + 03 -.25195Е + 03 -.38640Е + 03 -.26490Е + 03 -.25450Е + 03 .26205Е+03 .40243Е + 03 .27643Е + 03 .26383Е + 03 -Л4523Е+02 -Л5538Е+02 -Л5385Е+01 -Л3754Е+02 -Л1874Е+03 -Л8823Е+03 -Л3923Е+03 -Л1912Е+03 -.26152Е+03 -.40089Е+03 -.27489Е+03 -.26408Е+03 .27149Е+03 .41686Е+03 .28636Е+03 .27331Е+03 -Л4902Е+02 -Л5981Е+02 -Л4815Е+01 -Л4161Е+02 -Л2305Е+03 -Л9501Е+03 -Л4426Е+03 -Л2342Е+03 -.27109Е+03 -.41538Е+03 -.28488Е+03 -.27365Е+03 .28093Е+03 .43129Е+03 .29629Е+03 .28279Е+03 -Л5286Е+02 -Л6429Е+02 -Л4286Е+01 -Л4571Е+02 -Л2736Е+03 -.20179Е+03 — Л4929Е+03 -Л2771Е+03 -.28064Е+03 -.42986Е+03 -.29486Е+03 -.28321Е+03 .29037Е+03 .44571Е+03 .30621Е+03 .29226Е+03 -Л5674Е+02 -Л6879Е+02 -Л3793Е+01 -Л4984Е+02 -13166Е + 03 -.20856Е + 03 -.1543JE + 03 -Л3201Е + 03 -.29019Е+03 -.44433Е+03 -.30483Е+03 -.29278Е+03 .29980Е+03 .46013Е+03 .31613Е+03 .30173Е+03 -Л6067Е + 02 -Л7333Е+02 -ЛЗЗЗЗЕ+01 -Л5400Е+02 -Л3597Е+03 -.21533Е+03 -Л5933Е+03 -Л3630Е+03 -.29973Е+03 -.45880Е+03 -.31480Е+03 -.30233Е+03 Вектор начальных условий -.8462Е + 00 -.5328Е + 00 -.4322Е + 00 .9018Е + 00 -.9056Е + 00 .4242Е + 00 -.6401Е + 00 -.7683Е+00 -Л324Е + 00 .9912Е + 00 .9650Е + 00 -.2624Е + 00 .7626Е + 00 .6469Е + 00 -Л630Е + 00 .9866Е + 00 .9564Е+00 -.2921Е + 00 -.8293Е+00 -.5588Е+00 .2709Е + 00 -.9626Е+00 .8532Е+00 -.5216Е+00 -.6636Е+00 -.7481Е + 00 Л192Е+00 .9929Е+00 -.9880Е+00 Л543Е+00 -.9524Е+00 -.3048Е+00
Лабораторная работа 30 РЕШЕНИЕ КРАЕВОЙ ЗАДАЧИ ДЛЯ ЛИНЕЙНОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ ВТОРОГО ПОРЯДКА МЕТОДОМ ПРОГОНКИ Пусть на отрезке [а, Ь] требуется найти решение дифференциального уравнения У"+р{х)у' + Ф)у=Ах)> (1) удовлетворяющее следующим краевым условиям: с1у(а) + с2у'(а) = с, d1y(b) + d2y'(b) = d, \ci\ + \c2\*09\d±\ + \d2\*0. (2) Численное решение задачи состоит в нахождерии приближенных значений у0, yl9..., yn искомого решения у(х) в точках х0, хи ..., хп. Точки х0, хъ ..., хп называются узлами сетки. Используем равномерную сетку, образованную системой равноотстоящих узлов Xi = x0 + ih, /=0, 1, 2, ..., п. При этом х0 = а, xn = b, h = (b — a)/n. Величина к — шаг сетки. Пусть р(х()=рь 4(Xi) = qi9f(xt)=fi9 y(Xi)=yh y'{Xl)=y'b y"(Xi)=yl Аппроксимируем y'(Xi) и y"(Xi) в каждом внутреннем узле центральными разностными производными y{Xi)=y^zl!zi+o(h% y"(Xi)=y<+i-2*+y,-l + o(hi) и на концах отрезка — односторонними производными Уо =ZiZ* +o(h), y'n =*0^±+0(h). Используя эти формулы, получаем разностную аппроксимацию исходной задачи (1) — (2): ^ +Pi Yh + 4iyi=J» i=1' 2' •'•' Л_1> (3) Ciy0 + c2^-j^ = c, d1yn + d2^-j^ = d. Чтобы найти приближенные значения у0, уи ..., уп искомого решеция, необходимо решить систему п+\ линейных уравнений (3) с п+\ неизвестными. Эту систему можно решить одним из стандартных методов рещения линейных систем. Однако матрица системы (3) трехдиагональная, поэтому для ее решения применим специальный метод, называемый методом прогонки. 192
Перепишем систему (3) следующим образом: г < а^,-1 + Р^ + у^£+1 = ф£, /=1, 2, ..., л-1, (4) где $0 = cih-c2, Уо = Съ Фо = Ас, <pi=fih2, а£=1-(1/2)#А, Pi = rfiA2-2, у,= 1 + (1/2)/>,А, /=1, 2, ..., л-1, а„=-</2, ри = А?1 + ^2, фи = Arf. Будем искать решение системы (4) в виде yi = ui + viyi+1; (5) тогда для щ и vt получаем следующие рекуррентные формулы: Ji Ф«-а«"«-1 • Л 1 о Pi + cxfff-i Pi + afU( Чтобы сделать схему счета однородной, положим ао = 0, уи = 0. Прямой ход прогонки состоит в последовательном вычислении коэффициентов vt и ui9 исходя из значений v0=— y0/Po? "о = Фо/Ро- При обратном ходе прогонки по формуле (5) последовательно определяются величины yn9yn-i9 ..., у0- Так как уи = 0, то vn = 0 и уп = иП9 т. е. в прямом ходе прогонки вычисляются величины vi9 щ и приближенное значение решения уп на правом конце отрезка. Остальные величины yn-l9 уп-г, ••••> Уо вычисляются в обратном ходе прогонки по рекуррентной формуле (5). Таким образом, метод прогонки позволяет найти точное решение системы (3), значит, погрешность решения краевой задачи (1) — (2) определяется только погрешностью разностной аппроксимации исходной задачи системой (3) и равна 0(h). Так как h = (b — a)/n, то, выбирая h достаточно большим, можно добиться уменьшения погрешности ценой увеличения объема вычислений при решении системы (3). При практической оценке погрешности найденного решения обычно используют двойной пересчет и правило Рунге. Если у(хд — точное значение решения в узле xi9 а у{ и у{ — приближенные значения решения в том же узле, полученные соответственно с шагом h и А/2, то оценка погрешности решения у{ определяется формулой IU-j>(*i)l = |j>,—UI/3. Блок-схема алгоритма приведена на рис. 19. Описанный алгоритм реализован в виде подпрограммы (subroutine) PROG (а, b, cl, с2, с, dl, d2, d, fp, fq, f, n, y, p, q), предназначенной для решения краевой задачи (1) — (2) для линейного дифференциального уравнения второго порядка: 7-187 193
(ВХОДНЫЕ ПАРАМЕТРЫ^ Ci,C2,C,di,d2,d,a, b, N J (b-fl)/N-*H AH/(CiH-C2)-*u0 C2/(CiH-C2)—*w0 1-^1 X-X+H l-P(X)-H/2-—«! H2*q(X)-2-*ft l+P(X)H/2-—yt H2*f(X)—^ -V(0i-ai"i-i)—Vi (yj-ajUj-O/C^ + ajO^-^U! KN НЕТ ДА 1+1—I *1 -d2~^«N Hdi+d2-*-/?N H B—?N 0-^uN i (VN-aNUN-i)//?N-^uN ~r~ UN—УН I N-l — I 1 Vi-Yi+iVi—Yi| |het 1 N-l—I ДА ВЫХОДНЫВ ПАРАМЕТРЫ л Уо.Ур-,Ум ' Рис. 19 194
subroutine PROG(a,b,cl,c2,c,dl,d2,d,fp,fq,f,nn,y,p,q) с Программа PROG решает краевую задачу для линей- * с ного дифференциального уравнения 2-го порядка * с У" + р(х)у' + q(x)y - f(x) с cl*y(a + с2*у' а - с с dl*y(b) + d2*y'(b) - d с на отрезке [А,В] методом прогонки * с с а - значение А * с b - значение В * с cl,c2,c - коэффициенты граничного условия в точке а * с dl,d2,d - коэффициенты граничного условия в точке b * с fp,fq,f - имена программ,вычисляющих значения p,q,f * с пп - число узлов сетки * с у - массив размерности п, содержит при выходе * с решение в узлах сетки * с p,q - рабочие массивы размерности п * dimension y(l),p(l),q(l) n - nn n - n - 1 h - (b .- a)/n rl - h**2 r2 - h/2 с с инициализация прямого хода прогонки р(1) - -с2/(сГЬ - с2) q(l) « -c*h*p(l)/c2 х - а do 1 i - 2rn il - i - 1 x - x + h t - 1. - fp(x)*r2 pfi) « ft - 2y/(fq(x)Vl+rp(il) - 2.) 1 q(i) - (f(x)Tl - fq(1l))'p(1)/(t - 2.) с p(nn) - 0. q(nn) - (d*h + d2*q(n))/(dl*h + d2 - d2*p(n)) с с инициализация обратного хода прогонки с y(nn) - q(nn) с do 2 j * l,n i - n - j + 1 il - i + 1 y(1) - p(1)'y(1D +q(D 2 continue return end Входные параметры: a, b — значения левого и правого концов отрезка [я, b]; cl, с2, с—константы, входящие в краевое условие на левом конце отрезка [я, b]; dl, d2, d — константы, 195
входящие в краевое условие на правом конце отрезка [я, Ь]\ fp—имя внешней подпрограммы (function) fp(x), вычисляющей значения функции р(х); fq—имя внешней подпрограммы (function) fq(x), вычисляющей значения функции q(x); f—имя внешней подпрограммы (function) f(x), вычисляющей значения функции f(x); n — число узлов сетки; р, q—рабочие массивы размерности п каждый. Выходные параметры: у—массив из п чисел, содержащий вычисленное приближенное значение решения у(х) задачи (1) — (2) в узлах сетки. Перед обращением к программе PROG (a, b, cl, с2, с, dl, d2, d, fp, fq, f, n, y, p, q) необходимо: 1) составить подпрограммы-функции (function) fp(x), fq(x), f(x) вычисления коэффициентов уравнения p(x), q(x), j(x); 2) описать имена fp, fq, f оператором external; 3) описать массивы у, р, q; 4) присвоить фактические значения параметрам a, b, cl, с2, с, dl, d2, d, n. Задание. Используя программу PROG, решить заданную краевую задачу для дифференциального уравнения второго порядка. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к PROG. 2. Составить подпрограммы-функции (function) fp (x) fq (x), f(x), вычисляющие значения р(х), q(x), f(x).- 3. Произвести вычисления на ЭВМ. Пример. На отрезке [0.1, 1.1] методом прогонки решить на равномерной сетке из 21 узла краевую задачу: у" + еху' + ху/2 = х\ ^(0.1)-1.2/(0.1) = 0, 2^(1.1)-2,5/(1.1)=-4, Здесь р(х) = ех, q(x) = x/2, f(x) = x2, Ci = l, c2= —1.2, с = 0, dt=29 d2=-2.5, d=-4. А Программа решения этой задачи может иметь следующий вид: external fp,fq,f dimension y(21),p(21),q(21) с a - 0.1 b - 1.1 call PROG (a, b, 1., -1.2, 0., 2., -2.5, -4., fp, fq, f, 21, yf p, q) 196
do 1 i = 1,21 x - a + (b - a)/20.*(i - 1) write(l,2) x,y(i) 2 format(2x,' x - \f7.3/ у » \ell.4) 1 continue stop end function fp(x) с Подпрограмма вычисляет коэффициент р(х) при у' fp = ехр(х) return end с function fq(x) с Подпрограмма вычисляет коэффициент q(x) при у с*"**"*'*"* * * * •••' fq = 0.5'х return end с function f(x) с Подпрограмма вычисляет правую часть уравнения f(x) • с*""*****" •••••• ••••••• „„,,,,,„• f » х**2 return end Вычисления на ЭВМ приводят к следующим результатам: X = X = X = X = X = X - X = X = х - . X = X = X - X « X - X « X « X « X = X - X = X = .100 .150 .200 .250 .300 .350 .400 .450 .500 .550 .600 .650 .700 .750 .800 .850 .900 .950 1.000 1.050 1.100 У = У = У = У = У = У = У - У * у - у - у - У - у - У - У - у - У * у - у - У ~ у - -.1258Е+01 -.1310Е+01 -.1359Е+01 -.1405Е+01 -.1447Е+01 -.1486Е+01 -.1521Е+01 -.1553Е+01 -.1581Е+01 -.1605Е+01 -.1626Е+01 -.1642Е+01 -.1655Е+01 -.1664Е+01 -.1669Е+01 -.1671Е+01 -.1669Е+01 -.1663Е+01 -.1655E+Q1 -.1643Е+01 -.1628Е+01 197
861 -4 1 X to to + 0,1 о о X X + - о to о ^1 1 о t-ft о о Lh U) О ^ чо 1 о А is. о\ < 8 i х i X X tO <-* О t-ft 1 о U) о о *. ^ о 1 to (М в* ЕЗ X + ^1 о о *. 1 о to о о U) оо о ^ о\ о ^. 1 X to & X В- 1 to о о U) о С7\ О о U) *. о ;_- 1 о t-ft ы + X to + X ста о U) о to о ^ о о U) о оо о to to ы 8 со X & X О О со X 1 '""' |~- О О *. о о чо о чо to о 1—к 1 1 ^tO 8 X 8 со '""' to 1 О U) о о h—> ^i о L- чо о о * KJ + '""' U) о to о о h—> *. о ^1 ^1 о ^1 V© со X & X + X о |~- о о U) о о h—> Os о С7\ *. о U) 00 8 i X со 5' о to N"- о о ^ <S\ о ^1 Os О -4 1 X р 3 <-♦• X U) ^ 1 о о ЧО *. о Ц\ U) о to о о\ W /(1-х) X 1 X X to *. '—' — о to оо о U) *. о Е <л X to X ы О О со X О Я | О - о ^1 *. о ^ <S\ О 4к to <-»■ X 8 X X о '■"' ■~- о о ^ t-ft о U) о ы X + со В" X 1 X to t-rt N"- - о U) ^1 о to о ы X X о о со X о 1л U) о ^ о о to о о N- ~^г 1 X ю со 3' X |~- to N- о о о *. о о Ном вар ант ^ ^ ^ ^ & О г> г> ю съ 5- ,?■ 5^ ft. гъ 4j Ч: Ч: + + +S **.£ Ч: 4f4 + II II ^ Cd 80 80
661 'ё X + х\ - X to + X 1 - X 1 ^ ьо *. о 1л о *. о о £ 1 о 0\ чо о ё ^З4 + X ,н- + 1 со р 1 U) о h—» ьо 1 о н—» ЧО • 6 о 0\ о 0\ чо о оо в + to X to 1 1 ьо о On О О О U) о ьо о *. о у - X 1 - о 1 X X ьо *. о ьо ОО о н—» ^ О 1 о £ О о £ X ю 1 X to 1 ы| X Ч. + - t-ft О. н—» .&. о 0\ чо о оо ьо о чл О чо о к к + о 1 X 8- о о СЛ Г ьо о Ц\ -^л 1 о ^1 ьо 1 о оо |~- 1 о оо о ,х_ То о о ел ел 5' ^ ьо о о\ о о -J чл о оо *. о 1 о ON о а i? to X - ^ ьо ы NJ ^ чо _ t-ft о £ о В S3 + sT + X ю + о „^ 8 ьо о чо ьо м-* U) 1 |_» - чо о *. о 2 2 О о ы + 1 X 1 X о 1л ьо __» оо ьо W *. ьо £ о „ о g о о ел о о о to ел 5" X ьо Os ьо ^ чо 1 о о\ ьо l__t о о о 3 + лл о 1 X ^ ^ н- чо ьо о ьо ьо ы чо ^ о 00 1 X 8 ел 8- X ^ - 1л ЧО *. ьо U) |~- | ■ о Номер варианта Чз ^ ^ ^ ^ ^ & О ^ <■> ►** м^ ft. ft
Лабораторная работа 31 РЕШЕНИЕ КРАЕВОЙ ЗАДАЧИ ДЛЯ ЛИНЕЙНОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ МЕТОДОМ КОНЕЧНЫХ ЭЛЕМЕНТОВ Метод конечных элементов, используемый для решения широкого круга граничных задач, был создан инженерами. Но вскоре стало ясно, что этот метод — один из вариантов хорошо известного в математике метода Ритца. Познакомимся с методом конечных элементов на примере простейшей краевой задачи для линейного самосопряженного дифференциального уравнения второго порядка. Пусть на отрезке [а, Ь] требуется найти решение дифференциального уравнения -(p(x)y')' + q(x)y=f(x), (1) удовлетворяющее краевым условиям у{а) = 0, у(Ь) = 0. (2) Здесь р(х), q(x), f(x) — известные достаточно гладкие функции, удовлетворяющие условиям р(х)^ро>0, q(x)^qo>0; уравнение (1) записано в дивергентной форме. Задача (1) — (2) часто возникает в математической физике и в других областях знаний. Построим решение этой задачи методом Ритца. Нам понадобятся некоторые элементарные сведения из вариационного исчисления. Центральным понятием вариационного исчисления является понятие функционала, являющееся расширением понятия функции. Говорят, что функционал задан, если каждой функции из некоторого класса поставлено в соответствие действительное число. Рассмотрим простейшую задачу вариационного исчисления для одного, часто встречающегося функционала: среди всех гладких функций, удовлетворяющих условиям у(а) = 0, у{Ь) = 0, найти ту, которая доставляет экстремум функционалу I(y) = \{p(x)(y')2 + q(x)y2-2f(x)y}dx, (3) а где р(х), q[x) и f(x) — заданные функции. В вариационном исчислении доказано, что если р (х), q (x) и/(х)— достаточно гладкие функции и, кроме того, р (х)^ро>0, q(x)^qo>0 на [а, Ь], то такая функция существует и является решением краевой задачи -{p{x)y')' + g{x)y=f(x), y{a) = 0, у(Ь) = 0. 200
Итак, классическая краевая задача (1) — (2) для самосопряженного дифференциального уравнения второго порядка эквивалентна вариационной задаче о минимуме функционала (3). Обратим внимание на следующее важное обстоятельство: функционал 1(у) в (3) определен на менее гладких функциях, чем линейный дифференциальный оператор L= ——(р— 1 + я, входящий dx\ dx I в дифференциальное уравнение (1). Этот замечательный факт позволяет при численном решении задачи приближать искомое решение не очень гладкими функциями, например кусочно-линейными. Обратимся теперь к решению вариационной задачи (3). Приближенное решение вариационной задачи будем искать в виде л yn=Y, а,-ф*(4 (4) где {Ф;}, /=1, 2, ..., п — набор простых и удобных при вычислениях линейно независимых функций, определенных на отрезке [я, Ь] и удовлетворяющих краевым условиям Ф((а), Ф((Ь) = 0, /=1, 2, ..., п; а{ — подлежащие определению неизвестные коэффициенты. Подставим (4) в функционал (3). Имеем ^^3=1[pw(zi«^w)2+?w(i|i«^.w)2- -2/(x)f £fl^Y]d*. (5) Выберем коэффициенты а{ таким образом, чтобы выражение (5) принимало минимальное значение. Для этого необходимо выполнение условий ^ = 0, /=1,2 л. (6) Если ввести обозначения Аи = ](р{х)ФЩ+д(х)Ф{Ф^йх, (7) а А = ]ф{Дх)йх, (8) а то система уравнений (6) принимает вид п X Aijaj=fh i = l, 2, ..., п. (9) j=i Решив эту систему, найдем коэффициенты а3, у" =1,2, ..., п. Таким образом, для построения приближенного решения задачи (1) — (2) методом Ритца необходимо: 201
выбрать базисные функции Ф, (их часто называют пробными функциями); вычислить коэффициенты линейной системы (9) по формулам (7), (8); решить систему (9); найденные коэффициенты а{ подставить в формулу (4). При произвольнрм выборе пробных (базисных) функций {OJ матрица A = {Atj} системы (9) получается сильно заполненной (т. е. среди ее элементов мало нулей). Решение систем с заполненными матрицами может привести к значительным осложнениям при практической реализации на ЭВМ (например, из-за необходимости большой памяти для хранения матрицы системы, большого времени счета и др.). В то же время известно, что при решении краевых задач разностными методами матрица системы чаще всего оказывается трехдиагональной. Для системы с такой матрицей решены проблемы экономии памяти и разработаны эффективные алгоритмы ее решения. За счет выбора системы базисных функций можно добиться того, что и в методе Ритца матрица системы получится разреженной. Построение таких базисных функций и составляет суть метода конечных элементов. Матрица получается разреженной за счет выбора таких функций, которые отличны от нуля только на небольшой части той области, где решается задача. В данной лабораторной работе в качестве базисных выбраны кусочно-линейные функции на равномерной сетке xt = a + ih, h = (b — a)/n, изображенные на рис. 20. Как видно из рисунка, выбранные функции обладают замечательным свойством: Ф;Ф; = 0, если \i—j\>l. Именно поэтому матрица линейной системы получается разреженной. Нетрудно записать аналитическое выражение для вычисления этих базисных функций: rx—xt- , At \Х( — 1 , Х( j, <bi(x) = — < ^уА xe(xi9 xi+1)9 0, xe(xi9 xi + 1), i=l, 2, ...,/i-l. j_ \TFf l-i L+1 VI 1 \m 0 \ Л" 14 I IH A".. i+l i+3 i+4 1 x 202 Рис. 20
Поскольку система, полученная при использовании таких базисных функций, получается трехдиагональной, ее можно решать методом прогонки. Если коэффициенты а{ из системы (9) найдены, то значения искомой функции в узлах сетки вычисляются по формулам yi = a{lj~h, i = 0, 1, 2, ..., п. Для вычисления решения в произвольной точке следует воспользоваться формулой (4). Описанный алгоритм реализован программой FEM, в которой интегралы (7) и (8) вычисляются методом Симпсона, а система (9) решается методом прогонки. Тексты программ вычисления интегралов и текст программы PROGON приведены в приложении. • subroutine FEM (nryrepsrprqrf) с Программа FEM предназаначена для решения краевой * с задачи * с -(P(x)y')'+q(x)y=f(x) с У 0) = 0, у 1) = О с у'(0) - 0, у'(1) - 0 с на отрезке [0,1] методом конечных элементов * с с п - количество узлов сетки * с eps - погрешность квадратурных формул * с p,q,f - имена внешних функций, вычисляющих p,q,f * с с Результат: * с у - массив размерности п, содержит решение в узлах * с сетки * с с Программа содержит обращение к подпрограммам * с PROGON и INTGRL external p,q,f с dimension а(ЮО), b(10Q], c(100),yl(100)r d(100), u(10l), v(101), y(100) с h = l./(n - 1) hs = l./sqrt(h) sh = sqrt(h"3) h2 = h'2. nl = n - 1 n2 = n - 2 с do 1 i = l,nl xim = h*(i - 1) xi « h*i xip = h'(i + 1) if (i.eq.l) a(l) = 0. if (i.eq.l) go to 10 203
10 call INTGRL(ximrxir0.rQ.rlrOrQrprepsrrl) call INTGRL(ximrxirximrxir0r0rlrqrepsrr2) a(i) = - rl - r2 с call INTGRL(ximrxiprximrx1rlr0r0rp,epsrrl call INTGRLJximrxirximrximrQ,Qrlrqrepsrr2 call INTGRL(xi,xip,xip,xip,Q,Q,lrq»eps,r3 b(1) - - (rl + г2 + гЗ) с if(1.eq.nl) c(i) - 0. if(i.eq.nl) go to 20 call INTGRL(xi,xip,xim,xi,l,Q,Q»P»eps,rl call INTGRL(xirxiprxirxiprQrQrlrqrepsrr2 c(i) - - rl - r2 с 20 call INTGRL(ximrxirximrxirQrlrQrfrepsrrl) call INTGRL(xirxiprxiprxir0rlr0,frepsrr2) d(i) « (rl - r2)'sh 1 continue с call PROGON (a,b,c,d,u,v,yl,n2) с do 2 i - l,n2 y(i+l) ■= yl(i)*hs 2 continue с return end Входные параметры: n—количество узлов на отрезке [О, 1], п ^ 100; eps — погрешность квадратурных формул; р, q, f—имена внешних подпрограмм-функций, вычисляющих р (х% q (x), f(x) соответственно. Выходные параметры: у—массив размерности л, содержит решение в узлах. Перед обращением к программе FEM необходимо составить подпрограммы функции, вычисляющие значения р(х), q(x), /(*),■ и описать имена этих подпрограмм в головной программе оператором external. Задание. Найти методом конечных элементов решение уравнения -{P{x)y')' + q{x)y=f(x), удовлетворяющее граничным условиям у\х=а=у{а)-> у\х=ъ=У(Ь). 1. Составить подпрограммы-функции, вычисляющие значения р{х\ q(x\ f(x). 2. Составить головную программу, содержащую описание массива у, описание имен внешних подпрограмм, обращение к FEM и печать результатов. 3. Провести вычисления на ЭВМ. 204
Пример. Найти на отрезке [0, 1] решение уравнения — (е*>>')' + + In (1 + х)у = In (1+ х) sin (кх) — тсе* (cos (тех)) — к sin (nx)), удовлетворяющее однородным граничным условиям j(0) = 0, j(j) = 0. А Программа решения задачи может иметь следующий вид: external p,q,f dimension у(100) с n - 21 h = l./(n - 1) eps - l.e-8 call FEM (n,y,eps,p,q,f) do 1 i - l,n continue stop end x - (i - l)*h write (3,'j 'x =',x, ' у = \y(i) : Подпрограмма, вычисляющая р(х) * function p(x) С с Подпрограмма, вычисляющая р(х) с* """ P - ехр(х) return end с function q(x) с Подпрограмма, вычисляющая q(x) * q - alog(l. + х) return end с function f(x) с Подпрограмма, вычисляющая f(x) с* data pi/3.1415926/ f - alog(l. + x)*sin(pi*x) - pi*exp(x)*(cos(pi*x) - pi'sin(pi'x)) return end Вычисления по программе для 21 узла привели к следующим результатам: »««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« X - X « X * X * X * X « 0.000000Е+00 5.000000Е-02 1.000000Е-01 1.5QQQQQE-Q1 2.000000Е-01 2.500000Е-01 У - У - У - У - У = У = 0.000000Е+00 1.565343Е-01 3.Q91955E-Q1 4.542273Е-01 5.880610Е-01 7.074036Е-01 205
X - X - X * X - X - X - X - X - X - X - X * X - X = X « X = З.ООООООЕ-01 3.500000Е-01 4.000000Е-01 4.500000Е-01 5.000000Е-01 5.500000Е-01 6.000000Е-01 6.500000Е-01 7.000000Е-01 7.500000Е-01 8.000000Е-01 8.500000Е-01 9.000000Е-01 9.500000Е-01 1.000000 У - У - У - У - У - У - У - У - у - у - у - У - У в у - у - 8.093186Е-01 8.912988Е-01 9.513276Е-01 9.879287Е-01 1.000203 9.878498Е-01 9.511748Е-01 8.910826Е-01 8.090546Е-01 7.071119Е-01 5.877661Е-01 4.539573Е-01 3.089814Е-01 1.564096Е-01 0.000000Е+00 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 Р(*) е* 1 1+х2 1 1 1+е* е-*2'2 1+х 2 + х 1 1+е* cos(x/2) 1 1+chx arctg x ln(x + 5) 1 chx+sh2* x2+x+\ Я(х) 1 N/l+2cos2x e* esin* arctg y/x 1 X УГТР 2 — cos x chx lnlnx Jt+x yj\ + s\n2 x l+x/2 /w sin* arctg x X l+x+x2 Q~x cos* r2 л sin(x/2) sin* lnx 2 ln^+VT+T2) X a 0 -1 2 3 1 n -1 0 0 3 0 -2 2 6 1 1 4 5 2 4 3 2 7 2.5 2 3 У(а) 0.16 0.76 0.95 -0.61 -0.89 0. 0.49 0.18 0.86 0.49 0.78 -1 -0.5 У(Ь) 0.44 -0.204 0.88 0.49 0.67 0.74 -0.17 -0.37 0.18 -0.12 -0.12 0.43 0.71 206
Продолжение таблицы Номер варианта 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 рМ 1 х2 + л:+1 X 1+*/2 1/* 1/х2 ^/l+sin2* 1 l+x + x2 cos (л:/10) 1 yi+2cos2x lnlnx л^Т+Т1 cos (in (1+л:2)) %А+^ 1+л/* е* esinac Vl+e"' *М cos (x/10) 1 1+чД 1 l+chx УГ+^ lnlnx arctg x cos(ln(l+;t2)) 1 l+x+x2 Vl+e"* arctg x 1 1+e* -JC2 e * l+x 2 + x l+e~*2 cosx/3 1 l+chx ех/Ъ m cos (л:/10) 1 l+x2 7-* 1/x2 lnx sin* cos* 1 1 l+x2 — In * cos* V^ угт^ -e*/2 2л: sin - 4 a -2 1.5 0 1.0 2.0 0.5 -2 2.4 -5 3 0 -2 1.5 0.0 -2 0 0 6 0 2.5 2 7.0 5.0 4 2 4 5 7 3 2 3.5 1.5 1. 2 4 >M 2 0 0 1.2 0.14 -1.5 -2.0 0.66 0.82 -0.61 -0.31 0.79 0.29 2.6 -0.27 0.3 0.7 У(Ь) 0.1 0.98 0.102 -0.288 -0.423 0.643 0.15 -0.365 — 0.28 0.31 0.64 0.15 -0.17 -0.125 0.4 0 0
Лабораторная работа 32 аппроксимация функции с помощью КУБИЧЕСКОГО СПЛАЙНА Типичной задачей приближения функций является задача интерполяции: по заданной таблице чисел (xh /(.х*)), х{е\а, 6], /=1, 2, ..., N, вычислить функцию f[x) с той или иной точностью на отрезке [а, 6] действительной оси. Классический метод решения этой задачи основан на построении интерполяционного многочлена Лагранжа, определяемого равенством **(*)= i л*»),х w;S(xV ы*)= п (х-*). i=i (x-Xi)wN(Xi) i=1 Хотя, согласно теореме Вейерштрасса, всякая непрерывная на отрезке [я, 6] функция f[x) может быть как угодно точно приближена многочленом, практическая возможность применения многочленов ограничена. Ряд примеров показывает, что даже при большом числе узлов интерполяционный многочлен Лагранжа не гарантирует хорошее приближение функции. Например, С. Н. Бернштейном было установлено, что последовательность интерполяционных многочленов Лагранжа, построенных для непрерывной на отрезке [—1, 1] функции f(x) = \х| по равноотстоящим узлам, не сходится при возрастании числа узлов N к f(x). Еще более замечательный пример построен Рунге, который в качестве тестовой функции взял бесконечно дифференцируемую функцию Однако, несмотря на ее гладкость, последовательность интерполяционных многочленов Лагранжа не сходилась к этой функции в равномерной норме. А именно, в обоих случаях было получено, что lim max \f(x) — LN(x)\ = co. N— oo -1^л^1 В частности, в примере Рунге установлено, что max \f(x) — L20{x)\>5$. Относительная погрешность такой интерполяции составляет величину около 10000%. Иногда трудности построения хороших интерполяционных многочленов удается преодолеть за счет перехода к специальным 208
многочленам или выбора подходящей системы узлов интерполяции. Однако на практике, для того чтобы аппроксимировать функцию, вместо построения глобального интерполяционного многочлена на всем промежутке используют интерполяцию кусочными многочленами. Простейшим примером такого рода является кусочно-линейная интерполяция. В общем случае отрезок [я, 6] точками a = x1<x2<...<xN = b разбивают на части и на каждом промежутке \хь *i+1], /=1, ..., N, строят свой интерполяционный многочлен. Полученные таким образом многочлены (обычно одной степени) дают интерполяцию функции на всем отрезке. Такой интерполяционный многочлен-многозвенник может обладать различными свойствами, которые определяются степенью используемых многочленов на каждом отрезке [хи xi+1] и условиями сопряжения на концах соседних отрезков. Полученные при этом гладкие кусочно- многочленные функции (составленные из многочленов одной и той же степени) называются сплайнами. Сплайн называется кубическим, если он составлен из многочленов третьей степени. Гладкие сплайны обладают многими замечательными свойствами, которые и обеспечили им успех в приложениях. Так, для функции, рассмотренной в примере Рунге, кубический сплайн на сетке с шестью узлами дает погрешность настолько малую, что она не может быть изображена на одном графике с f(x). Алгоритмы построения кубических сплайнов весьма просты и легко реализуются на ЭВМ. Перейдем к построению кубических сплайнов класса С2 (являющихся дважды непрерывно дифференцируемыми функциями). Пусть на отрезке [а, 6] в узлах сетки w{a = x0<x1<...<xN = b} заданы значения некоторой функции f(x) :fi = f (xt), /=0, 1, 2, ..., N. Интерполяционным кубическим сплайном S(x) называется сплайн, удовлетворяющий условиям: s{xt)=fi9 s'(Xi)=f(Xi)9 s*W=f(4 (l) Так как S(x)—кубический сплайн, то на каждом из отрезков [xi9 xi+1~\ он определяется четырьмя коэффициентами, и поэтому для его построения на всем промежутке [я, Ь~\ необходимо определить AN коэффициентов. Условие принадлежности сплайна классу С2 [а, Ь~\ требует непрерывности во всех внутренних узлах интерполяции xh /=2, ..., N— 1, не только сплайна S(x), но и его производных S '(х) и S"(x), что дает 3(N— 1) уравнений для определения неизвестных коэффициентов сплайна. Добавив 7V+1 уравнение из (1), получим AN—2 уравнения. Два недостающих уравнения обычно получают из ограничений на значение сплайна и его производных на концах промежутка [я, Ь~\; их называют краевыми условиями. 209
Из множества различных видов краевых условий наиболее употребительными являются следующие: I. S'(a)=f'(a), S'(b)=f'{b). П. S"(a)=f"{a), S"{b)=f"{b). III. Sk(a) = S(k)(b), k=l,2. IV. S'"(xp + 0) = S"'(xp-0), /7=1, p = N-\. Воспользуемся так называемыми «естественными» условиями, которые имеют вид S"(a) = Q, S"(b)=0. Рассмотрим алгоритм построения интерполяционных кубических сплайнов. На каждом из промежутков \xh xi+1] будем записывать сплайн не в общем виде S(x) = ai + bix + cix2 + dix3, а в некотором специальном виде, позволяющем уменьшить число неизвестных коэффициентов сплайна. Для этого введем обозначения S'(Xi) = mi9 i = 0, 1, ..., N, ht = xi + 1-Xi и t = (x-Xi)/hi. а отрезке [хь xi+1] кубичес! где ht = : На отрезке [xh xi+1] кубический сплайн можно записать в виде S(x)=fi{l-t)^l+2t)+fi+1t2{3-2t) + mihit{l-t)2- -т{+112(\ + 1)к{. (2) Кубический сплайн, записанный в таком виде, на каждом из промежутков [хь xi+1] автоматически непрерывен вместе со своей первой производной всюду на [а, Ь\ Выберем величины т{ таким образом, чтобы и вторая производная была непрерывна во всех внутренних узлах. Из этого условия получим следующую систему уравнений: Я,ш|.1 + 2т| + ц|т|+1 = 3^^^+ (3) где |if=- -, Xi=l-\ii=- К уравнениям (3) следует добавить уравнения, полученные из граничных условий. В рассматриваемом случае эти уравнения имеют вид 2т0 + т1 = 3^, mN_1+2mN = 3^p^. (4) 210
Таким образом, задача построения кубического сплайна свелась к решению линейной системы для неизвестных коэффициентов т{\ по Х,щ.1 + 2щ+^щ+1 = з(у^^+х/^^\ (5) mN+l+2mN = 3*^±. Матрица системы (5) трехдиагональная, поэтому эту систему можно решить методом прогонки. Метод прогонки описан в лабораторной работе 30, а текст программы решения системы с трехдиагональной матрицей приведен в приложении. Для интерполяции функции кубическим сплайном предназначена программа SPLINE: subroutine SPLINE (x,y,n,a,b,c,d,z,u,v,xx,s,ind) с Программа SPLINE строит кубический сплайн для * с интерполирования таблично заданной функции * с с п - количество узлов интерполяции * с х - массив размерности п, содержит узлы интерполяции * с у - массив размерности п, содержит значения функции * с в узлах сетки * с arbr • с crd - рабочие массивы размерности п * с urv - рабочие массивы размерности п+1 * с z - массив размерности п, содержит коэффициенты * с сплайна * с ind - указатель режима работы: * с ind-О коэффициенты вычисляются * с ind-1 коэффициенты считаются известными * с хх - точка, в которой вычисляется функция * с с Содержит обращение к программе PR0G0N * с с Результат: • с s - приближенное значение функции в точке хх * dimension xm,yjlj,am,b(l),c(l),d(l), nm - n - 1 if(ind.ne.O) go to 2 a(l) - 0. b 1) - -2. с 1) - 1. d(l) - 3.'(y(2) - y(l))/(x(2) - x(l)) 211
do 1 j - 2,nm hj - x(j + 1) - x(j) hjl - x(j) - x(j-l) am - hjl/(hjl + hj) al - 1. - am a(j) - al b j) - -2. c(j) * am d(j) - 3. W(y(j+1) - y(j))/hj + aT(y(j) continue j) - y(j-l))/hjl) a(n) - 1. bn) « -2. d(n) I 3>(y(n) - y(n-l))/(x(n) call PROGON (a,b,c,d,u,vrz,n) 2 continue do 3 j = 2rn if(x(j).gt.xx) go to 4 3 continue 4 t = (xx - x(j-l))/(x(j) - x(j-l)) tl = (1. - t) hj = x(j) - x(j-l) t2 - t*t tl2 = trtl si = y(j-l)4l2*(l. + 2.4) si = y(j)42*(3. - 2.4) + si si = z(j-l)*hj4412 + si s = si - z(j)*hj42*tl return end x(n-l)) Входные параметры: n—число узлов интерполяции; х—массив размерности я, содержащий значения узлов интерполяции; у—массив размерности п, содержащий значения функции в узлах интерполяции; а, Ь, с, d—рабочие массивы размерности п; u, v—рабочие массивы размерности и+1, хх — точка, в которой вычисляем значение сплайна; ind—указатель режима работы: ind = 0 — программа вычисляет коэффициенты сплайна и значение сплайна в точке хх, ind = l—коэффициенты сплайна считаются известными и программа вычисляет только значение сплайна в точке хх. Выходные параметры: s—значение сплайна в точке хх; z—массив размерности п, содержащий коэффициенты сплайна. Программа SPLINE содержит обращение к программе решения системы линейных уравнений с трехдиагональнои матрицей PROGON, текст которой приведен в приложении. 212
Перед обращением к программе SPLINE необходимо: 1) описать размерности массивов х, у, z, a, b, с, d, u, v, не забывая, что размерность массивов и и v на 1 больше, чем размерность массивов х, у, и др.; 2) присвоить фактические значения элементам массивов х и у и переменным п и ind (ind = 0 перед первым обращением и ind=l при повторных обращениях). Задание. Вычислить значения заданной функции f[x) в узлах интерполяции Xi = a+h(i— 1), /=1, 2, ..., п, на отрезке [я, Ь\ По вычисленной таблице {хь /(*,)} построить интерполяционный кубический сплайн She), вычислить его значения в промежуточных точках Xj = a+h/2+h\j—l). Сравнить вычисленные значения с точными значениями функции в точках ху Построить график f(x) и S(x). Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию для вычисления значений f{x\ r 2. Головная программа должна: вычислить координаты узлов xt и значения функции f[x) в них; разместить результаты в соответствующих массивах х и у; с помощью программы SPLINE вычислить коэффициенты сплайна; вычислить значения функции/(х) и сплайна s(x) в промежуточных точках; сохранить полученные результаты в файле. 3. Выполнить вычисления на ЭВМ. 4. Выбрав подходящий масштаб, изобразить графики S(x), f(xl Пример. Вычислить значения функции f(x) = smx в 20 узлах интерполяции на отрезке [0, 2л]; построить интерполяционный кубический сплайн S(x) и вычислить его значения в промежуточных точках. Программа решения задачи может иметь следующий вид: dimension a(20)r b(20)r c(20)r d(20)r u(21)r v(21)r х(20), y(20)r z(20) с pi = 3.1415926 h - pi/10, с с вычисление узлов и значений функции в узлах с do 1 i - 1,20 х(1) - (1 - l)'h У(1).- f(x(D) 1 continue write(3r10) 10 format(2x/ x значение сплайна f(x) ') 213
с вычисление коэффициентов сплайна с call SPLINE (x,y,20,a,b,c,d,z,u,v,xx,s,0) с do 2 i = 1,19 il - i + Г xx = (x(i) + x(il))*0.5 с с вычисление значения сплайна и точного значения функции с call SPLINE (x,y,20,a,b,c,d,z,u,v,xx,s,l) с УУ - f(xx) write (3,11) xx,s,yy 11 format(2x,3(fl0.5,4x)) 2 continue с stop end ********************* ************************************** function f(x) V*************4 Подпрограмма-функция, вычисляющая f(x) * f = sin(x) return end В результате вычислений на ЭВМ получены следующие результаты: х значение сплайна .15708 .47124 .78540 1.09956 1.41372 1.72788 2.04203 2.35619 2.67035 2.98451 3.29867 3.61283 3.92699 4.24115 4.55531 4.86947 5.18363 5.49779 5.81195 .15643 .45398 .70709 .89098 .98766 .98766 .89098 .70709 .45398 .15643 -.15643 -.45398 -.70709 -.89099 -•98766 -.98769 -.89088 -.70747 -.45257 f(x) .15643 .45399 .70711 .89101 .98769 .98769 .89101 .70711 .45399 .15644 -.15643 -.45399 -.70711 -.89101 -.98769 -.98769 . -.89101 -.70711 -.45399 214
Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 N 20 25 25 20 10 25 25 20 30 25 20 20 20 25 20 [«.*] [0,2] [0,5] [0,5] [-2,2] [3,6] [0,5] [-1,4] [1,5] [-1,5] [0,5] [1,5] [0,3] [0,2] [-1,1] [2,Ю] т sin*2 COSJC2 esinx cos (х+х2) ln(cosjc+ex/2) sh(cosx/(l+x2)) cos (x+cos3 x) jccos(jc+ln(l+jc)) l+ex l+e2x arctgjc 1+arctgjc 1 1iijc/(1+jc) 2 — x2 sin* е * \+x2 chx2 cosjc+jc 2 + tgx jc2 + jc+jc3 | ln(x2+jc3) | Номер варианта 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 N 20 20 20 20 20 20 20 25 25 20 30 20 25 20 20 [«.*] [0,2] [0,4] [0,4] [-1.3] [1,100] [0,4] [0,4] [0,5] [0,5] [1,5] [0,6] [0,2] [-1,4] [-2,2] [1,2] /w 1/(1 +x2) l/(l+e-*) sin(jc + esinx) ln(sinx+ex) sin In x x2*-*2 jsinx/x, x^0 [l, x = 0 1+jc2 1+JC4 artcgx 1+jc2 e-(*+l/x) arctgx2 chx2 1+x3 1+jc4 ex—cosjc ex+cosjc sin cos x cos sin x Лабораторная работа 33 ЧИСЛЕННОЕ ДИФФЕРЕНЦИРОВАНИЕ Численное дифференцирование применяют в тех случаях, когда невозможно или очень сложно продифференцировать функцию аналитически. Например, если функция задана таблично или если вычисление ее производной требует большого числа арифметических операций. На первый взгляд, численное значение производной можно очень просто вычислить, воспользовавшись определением. Дей- г,( \ у f(x + h)-f(x) ствительно, поскольку f (x) = hm— ; v ;, положив л—о h 215
/'(*)= f{x + h)-f(x) (1) казалось бы, можно вычислить производную как угодно точно, выбрав h достаточно малым. Для иллюстрации проблем, возникающих в этом случае, выполним небольшой численный эксперимент. Возьмем очень гладкую функцию /(x) = sinx и сравним значение ее точной производной cosx в точке х со значением численной производной, вычисленной по формуле (1). Ниже приведены результаты вычислений в точке х = 0.5. sm(x + h) — sin(;c) COSJC 1.000000000000000Е—001 1.000000000000000Е—002 1.000000000000000Е—003 1.000000000000000Е—004 1.000000000000000Е—005 1.000000000000000Е—006 1.000000000000000Е—007 1.000000000000000Е—008 1.000000000000000Е—009 1.000000000000000Е — 010 1.000000000000000Е—011 1.000000000000000Е—012 1.000000000000000Е — 013 1.000000000000000Е—014 1.000000000000000Е—015 1.000000000000000Е—016 1.000000000000000Е—017 8.521693479083233Е — 001 8.751708278704502Е —001 8.773427028772944Е — 001 8.775585891507282Е —001 8.775801647440604Е —001 8.775823222027040Е — 001 8.775825374569507Е—001 8.775825639019970Е —001 8.775825368592842Е —001 8.775826343832697Е —001 8.775826338411685Е —001 8.775631859646997Е —001 8.778557308158906Е —001 8.768837435682574Е —001 8.768756120519637Е—001 8.744267025213470Е —001 0.000000000000000Е + 000 1.775826Е — 01 1.775826Е—01 1.775826Е —01 1.775826Е —01 1.775826Е —01 1.775826Е — 01 1.775826Е — 01 1.775826Е — 01 1.775826Е — 01 1.775826Е —01 ;.775826Е—01 ;.775826Е —01 ;.775826Е —01 ;.775826Е —01 ;.775826Е —01 .775826Е —01 .775826Е —01 Как видим, хотя вычисления проводились с двойной точностью, уменьшение h привело к совершенно противоположному результату и, начиная с й = 0.1Е—16, численное значение производной совершенно неприемлемо. Этот факт легко объяснить. Результаты вычислений на ЭВМ всегда содержат погрешность округления, а поскольку при малых h вычитаются близкие значения, происходит потеря первых значащих цифр, т. е. теряются достоверные знаки результата. Если же заранее известно, что значения функции заданы с некоторой погрешностью, то возникает вопрос: останется ли в ответе хоть один достоверный знак? Между тем из результатов того же эксперимента видно, что можно выбрать шаг h хотя не очень маленьким, но в то же время таким, чтобы значение численной производной мало отличалось от точной. В данном эксперименте это значения й = 0.1Е — 06-нО'ЛЕ—12. Этот факт позволяет успешно использовать формулы численного дифференцирования типа (1) при решении многих задач численного анализа. 216
Пусть функция f(x) задана своими значениями на Некоторой сетке {xi}"=1, xi + 1=xt-\-h. Очень простые формулы численного дифференцирования для такой функции можно получить из формулы Тейлора. Запишем формулу Тейлора п-то порядка для f(x), полагая ее достаточно гладкой в окрестности точки х: /(х+А)=/(х)+/'(х)А+^ (2) Если ограничиться первыми двумя слагаемыми в правой части (2), т. е. аппроксимировать f(x) в окрестности точки х линейной функцией, то получим знакомую формулу правой разностной производной /(^/(*+/0-/М (3) Погрешность такой аппроксимации является величиной 0(h). Заменив в последней формуле h на — А, получим левую разностную производную /^)з/М-Л»+*). (4) Вычитая из приближенного равенства f(x+h)*f(x)+f{x)h приближенное равенство f{x-h)*f(x)-f{x)h, получим центральную разностную производную /*Ws^±*bfc*l, (5) порядок погрешности которой 0(h2). Если в формуле Тейлора оставить на одно слагаемое больше, т. е. аппроксимировать функцию многочленом второй степени по А, то аналогично предыдущему получим центральную разностную производную второго порядка, погрешность которой является величиной 0(h2): f»lx)^(x+h)-W*)+f(x-h) ш (6) Однако если функция задана на сетке, то при численном дифференцировании невозможно выбрать шаг А, меньший шага сетки, и тогда формулы дифференцирования могут давать слишком большую погрешность. В этом случае функцию аппроксимируют какой-либо гладкой функцией и за приближенное значение производной в точке принимают значение точной производной в этой точке от аппроксимирующей функции. 217
В лабораторной работе 32 функция, заданная таблично на отрезке [я, Ъ ] в узлах хь аппроксимировалась кубическим сплайном s{x). На каждом из отрезков [хь xi+1] сплайн определяется формулой s(x)=fi{l-t)2^ + 2t)+fi+1t2(3-2t) + mihit{^-t)2- -mi + 1t2(l-t)hh где fi=f(xi), t= -, hi = xi+1—xu a m{—коэффициенты сплайна. Тогда для всех xg[x„ xI+1] за численное значение производных /' (х) и /" (х) принимают значения точных производных сплайна: f'{x)^s'{x) = \_-efit{\-t) + 6fi+1t(\-t) + mihi{\-t){\-3t)+ +mi+1hit(3t-2)]/hi; /"(x)sj"(jc) = 6[/i-/l-1](2/-l)/A? + 2[i»il(3/-2)+/iif+1(3/-l)].- Вычисление производной с помощью сплайна позволяет получить достаточно точные результаты. Алгоритм дифференцирования с помощью сплайна реализован подпрограммой SPL1 (х, у, п, хх, z, si, s2): subroutine SPL1 (xryrnrzrxxrslrs2) с Программа SPL1 предназначена для вычисления с производных сплайна s(x), построенного программой с SPLINE с с х - значения узлов, на которых строился сплайн с у - значения функции в узлах с п - количество узлов с z - коэффициенты сплайна с хх - точка, в которой необходимо вычислить с производные сплайна с si - значение производной s'(x) сплайна в точке хх с s2 ■ значение производной s"(x) сплайна в точке хх с x,y,z - массивы размерности п, совпадающие с соответ- с ствующими массивами программы SPLINE с с Программа работает только после обращения к с • SPLINE dimension x(l),y(l),z(l) do 1 j - 2,n if(x(j).gt.xx) go to 2 1 continue 2 t - (xx - x(j-l))/(x(j) - х(Ы)) tl - 1. - t hj - x(j) - x(j-l) t2 - ft t!2 - tl'tl 218
si = -6.414*(y(j-l) - y(j))/hj si = si + trz(j-l)*(l. - 3.4) + z(j)*(3.*t - 2.)4 s2 = 6.*(y(J-D - y(j))*(2.4 - l.)/hj s2 = s2 + z(j-l)*(6.*t-4.) - z(j)*(2. - 6.4) s2 = s2/hj с return end Входные параметры: x—массив размерности п, содержащий узлы для сплайна; у—массив размерности и, содержащий значения функции в узлах; п—количество узлов; z—массив размерности п, содержащий коэффициенты сплайна, вычисленные программой SPLINE; xx — точка, в которой вычисляются значения производных сплайна. Выходные параметры: si—значение первой производной сплайна в точке xx; s2—значение второй производной сплайна в точке хх: Перед обращением к программе SPL1 необходимо: 1) описать размерности массивов х, у, z, a, b, с, u, v, не забывая о том, что размерности массивов и и v на единицу больше числа узлов; 2) разместить значения узлов в массиве х и соответствующие значения функции в массиве у; 3) обратившись к программе SPLINE, вычислить коэффициенты сплайна. Задание. Взяв произвольную гладкую на отрезке [0, 1] функцию, построить кубический сплайн по десяти значениям функции в десяти равноотстоящих узлах. Вычислить значения точных первой и второй производной сплайна в произвольной, не совпадающей с узлом сетки, точке. Вычислить в этой же точке значения точных первой и второй производной функции. Вычислить по формулам (3) — (6) разностные производные с различными значениями h. Сравнить полученные значения. Ответить на следующие вопросы: при каких h все три способа дают практически одинаковые значения? при каких h разностные производные не дают ни одного верного знака? Повторить вычисления, изменив количество узлов для сплайна, с тем чтобы установить связь между гладкостью функции, погрешностью производных сплайна и возможными требованиями к точности вычисления производных. Пример. В качестве примера снова выберем функцию sinx и вычислим производные в точке х = 0,5. А Программа решения задачи может иметь следующий вид: dimension a(20),b(20),c(20),d(20),u(21),v(21), x(20),y(20)rz(20) с pi - 3.141596 219
h = pi/20, do 1 i - 1,20 x(1) - (1-D'h y(i) « s1n(x(1)) 1 continue xx - 0.5 call SPLINE (xryr20,arbrcrdrzrurvrxxrsr0) call SPL1 (xryr20rzrxxrslrs2) psl - cos(xx) ps2 - -sin(xx) write(3r*) ' первая производная ' write(3,*) ' точная производная 'rpsl write(3,*) ' производная сплайна \sl write(3r100) 100 format(lx,t8,'h 'Д18,'правая'Д31г'левая', * t44r'центральная') h - 1. do 23 i = 1,10 h - h/10. xr - xx + h ddfr - (sin(xr) - sin(xx))/h xl = xx - h ddfl « (sin(xx) - sin(xl))/h ddf - (sin xr) - sin(xl))*0.5/h write(3,200) hrddfrrddflrddf 200 format(lxr4(ell.4r2x)) 23 continue write(3,*) ' вторая производная \ps2 write(3,150) 150 format (1хД8/ h ' Д18,'разностная'Д31,'сплайна', * t44r'точная ') h - 1. do 24 i - 1,10 h - h/10. xr - xx + h xl = xx - h ddf - (sin(xr) - 2.*sin(xx) + sin(xl))/h/h write(3,200) hrddfrs2#ps2 24 continue stop end Вычисления по программе привели к следующим результатам: первая производная точная производная 8.775826Е-01 производная сплайна 8.775664Е-01
h ЛОООЕ+00 ЛОООЕ-01 Л000Е-02 .'ЮООЕ-03 Л000Е-04 Л000Е-05 Л000Е-06 Л000Е-07 Л000Е-08 Л000Е-09 правая .8522Е+00 .8752Е+00 .8773Е+00 .8777Е+00 .8792Е+00 .8643Е+00 .8941Е+00 .0000Е+00 .0Q00E+00 .0000Е+00 левая .9001Е+00 .8800Е+00 .8778Е+00 .8777Е+00 .8792Е+00 .8941Е+00 .8941Е+00 .0000Е+00 •0000Е+00 •0000Е+00 торая производная -4.794255Е-01 h ЛОООЕ+00 ЛОООЕ-01 Л000Е-02 Л000Е-03 Л000Е-04 Л000Е-05 Л000Е-06 Л000Е-07 Л000Е-08 Л000Е-09 разностная -.4790Е+00 -.4794Е+00 -.4794Е+00 .2136Е+01 -.4807Е+00 -.4922Е+00 .2615Е+07 .0000Е+00 .0000Е+00 .0000Е+00 сплайна -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 -.4795Е+00 центральная .8761Е+00 .8776Е+00 .8776Е+00 .8777Е+00 .8792Е+00 .8792Е+00 •8941Е+00 .0000Е+00 .0000Е+00 .0000Е+00 точная -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 -.4794Е+00 Лабораторная работа 34 ГАРМОНИЧЕСКИЙ АНАЛИЗ Гармоническим анализом называют разложение функции f(x), заданной на отрезке [0, 2тс], в ряд по функциям вида sinkx и coskx, где к—целое число. Если функция f(x) задана на другом отрезке, то линейной заменой переменной задачу можно свести к отрезку [0, 2л]. Каждой абсолютно интегрируемой на [О, 2л] функции можно поставить в соответствие ее тригонометрический ряд Фурье, т. е. 00 f(x)~—+ X (akCoskx+bksinkx). 2 *=1 у Коэффициенты ряда вычисляют по формулам Фурье—Эйлера 2я 2я ак=- \f(x)coskxdx, bk=- \f(x)sinkxdx, k = 0, 1, 2, ..., о о и называют коэффициентами ряда Фурье. Теорема. Если функция f(x) кусочно-гладкая на отрезке [О, 2л], то ее тригонометрический ряд Фурье сходится в каждой точке этого отрезка. Если S(x) — сумма тригонометрического ряда Фурье, т. е. 221
iS(a;)=—+ Yj (akCOskx + bksinkx), 2 k=i то справедливы следующие равенства: 1) S(x) = [f(x + 0) + +f(x — 0)1/2 для любой точки из интервала ГО, ^я"|; 2) 5(0) = = фя)4/(0 + 0)+/(2Л-0)]/2. Таким образом, гармонический анализ состоит в вычислении коэффициентов Фурье ak, bk. Для приближенного вычисления этих коэффициентов можно использовать любые квадратурные формулы. Однако специальный вид подынтегральных функций f(x)sinkx или f(x)coskx позволяет получить простые квадратурные формулы, если интерполировать алгебраическим многочленом только функцию f{x\ а не всю подынтегральную функцию: В частности, в случае кусочно-постоянной интерполяции 2N 2N / \ «o-^TlZ/W, a*=^TT|/^)cos^/J, (l) Здесь 2N+1—число узлов квадратурной формулы; лг; = ——/—узлы квадратурной формулы, /=0, 1, ..., 2N. Для вычисления приближенных значений коэффициентов ряда Фурье по формулам (1) предназначена подпрограмма (subroutine) FORIF (fun, n, m, a, b, ier): subroutine FORIF(fun,n,m,a,b,ier) с Программа FORIF вычисляет коэффициенты Фурье * с функции f(x) заданной на отрезке [0,2П] * с с fun - имя подпрограммы-функции, вычисляющей значения f(x) * с п - параметр формулы, длина отрезка сетки квадратурной * с формулы равна-2П/(2п+1) * с m - номер старшего коэффициента Фурье * с а - массив из го+1 чисел, содержит значения коэффициентов* с при cos(kx) * с b - массив из т+1 чисел, содержит значения коэффициентов* с при sin(kx) с ier - признак выхода: * с ier=0 - получен результат, * с ier-1 - n * m * с ier=2 - m < 0 * с с !!! перед обращенем к программе необходимо присвоить * с нулевое значение элементу Ь(1) * dimension a(l),b(l) ier = 0 222
20 if(m) 30,40,40 30 ier = 2 return с 40 if(m - n) 60,60,50 50 ier - 1 return 60 an = n coef = 2.0/(2.0'an + 1.0) const - 3.141593*coef si - sin(const) cl = cos(const) с - 1.0 s = 0.0 J - 1 funz = fun(O.O) 70 u2 = 0.0 u} = 0.0 ai = 2'n 75 x = ai'const uO = fun(x) + 2.0*c*ul - u2 u2 = ul ul = uO ai = ai - 1.0 if(ai) 80,80,75 с с вычисление a(j) и b(j) по рекуррентным формулам с 80 a(j) - coef*(funz + c*ul - u2) b j) = coef¥s*ul if(j-(m+l)) 90,100,100 90 q - сГс - si's s - el's + sl'c c. - 9 , J - J + 1 goto 70 с 100 continue return end Входные параметры: fun — имя внешней подпрограммы- функции (function) f(x), вычисляющей значение f(x) на отрезке [0, 2л]; п—число, задающее разбиение отрезка [0, 2л] на равные части длины 2л/(2и+1); m — номер старшего коэффициента Фурье. Выходные параметры: а—массив из т+1 чисел, содержащий значения коэффициентов Фурье а0, аи ..., ат; b—массив из т+1 чисел, содержащий значения коэффициентов Фурье Ь0, Ъъ ..., bm; ier=l, если п^т; ier = 2, если т<0. Перед обращением к подпрограмме FORIF необходимо: 223
1) составить подпрограмму-функцию fun(x) для вычисления значений f(x); 2) в головной программе описать имя fun оператором external; 3) присвоить фактические значения параметрам n, m, соблюдая требования: т^О, п>т. Задание. Используя программу FORIF, вычислить заданное количество коэффициентов Фурье кусочно-гладкой на отрезке [О, 2л] функции f(x). Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию для вычисления значений f(x). 2. Составить головную программу, содержащую обращение к подпрограмме FORIF, и печать результатов. 3. Провести вычисления на ЭВМ. Пример. Разбивая отрезок [0, 2л] на 21 равную часть, вычислить первые шесть пар коэффициентов разложения в ряд Фурье функции f(x) = sin3 x — 2cosx — 3. А В этом случае т = 5, «=10, 2/? +1=21. Программа решения задачи может иметь вид external fun dimension a(6)rb(6) с с перед обращением к F0RIF необходимо присвоить Ь(1)=0 Ь(1) - 0. с call F0RIF(funr10r5rarbrih) ! вычисление коэфф.Фурье с с а(к+1)- коэфф.при cos(kx)r b(k+1)- коэфф.при sin(kx) с do 3 к - 1,6 ! печать результатов 11 - к - 1 write(3,l) il,a(k)rilrb(k) 1 format(lx,'a(\il,')=\fl0.5,' b(\il,')=\fl0.5) 3 continue с stop end с function fun(x) p*«********************************************************* с Подпрограмма-функция, вычисляющая значения f(x) * £********* ************************************************** fun = sin(x)**3 - 2.*cos(x) - 3. return end В результате вычислений по программе получены следующие результаты: 224
a(0) = a 1 - a(2)- a(r3)= a(4) = a(5) = -6.00001 -2.00000 .00000 .00000 .00000 .00000 b(°h Ы- b(2)- b(3)- b(4)- b(5)- .00000 .75000 .00000 -.25000 .00000 .00000 т.е. я0/2=-3; b0 = 0; ax = -2; 6i=0,75; b3=-0.25; а2 = Ь2 = с1з = с14. = Ь4. = а5 = Ь5 = 0. Интересно сравнить полученные приближенные значения коэффициентов Фурье с точными, которые в данном примере легко определить. В самом деле, так как sin3x=( — sin3x+3sinx)/4, то получаем f(x) = sin3x—2cosx—3= — 6/2 — 2cosx+(3/4)sinx—(1/4) х xsin3x, т.е. а0/2=—3; ах = —2; а2 = аъ=аАг=а5=$\ b1=0J5; b2 = bA = b5 = 0; 63=-0.25. Варианты заданий Номер варианта /м « 5 4 10 12 10 6 5 8 6 12 7 5 10 5 8 1 Номер варианта 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /м ю и 12 13 14 15 >/sin2x+2 ecosx cos (sin x) sin (sin x) arctg(sinx) COSJC l+cos22x e"cosxcos(sinx) (2 + cos2x+sinx)3/2 cosjc 2 + e-s.nx sin2x+sin23x 3 + sinx+cos2x sign sin x 1 q 2 +cosjc sin3x I cos x I +1 sin x I cose|sin3x| cos x cos I sin x I cos (cos x) sin (cos.jc) arctg(cosx) 1 4 + sinjc+cosjc у/5 + sin x+2cos 2x cos (cos x+sin x) e~sinxsin(cosjc) sin(l+sin;c+sin2.x;) 1 -(cosx) l+chv cos (1 + cos x+sin 2 x) ch (cos jc) I sin x I +1 sin 2x I sin x sin I cos * I 7 6 8 Ц 6 9 6 5 13 9 14 9 8 8-187 225
Лабораторная работа 35 ТРИГОНОМЕТРИЧЕСКАЯ ИНТЕРПОЛЯЦИЯ Пусть функция f(x) задана на отрезке [0,2я] таблицей значений f(xt) в равноотстоящих узлах xt = я^~ ' (/=1, 2, ..., 2N+1). Тригонометрическим многочленом степени М называют многочлен м Рм{х)=—+ Z (fl*cosfcx + &ksinfcx). 2 k = i Задача тригонометрической интерполяции состоит в построении тригонометрического интерполяционного многочлена наименьшей степени, удовлетворяющего условиям Рм(*0=/(*ё)> *=1» •••> 27V+1. Можно показать, что решением этой задачи является тригонометрический многочлен N PN(x)=—+ £ (акcoskx + bksinkx), (1) 2 *=i коэффициенты которого вычисляются по следующим формулам: 2N+1 1 2N+1 / 2пк \ ак= У fix:) cos I —-—/ I, (2) к 2N+\ .~ J V ,; \2N+l у V ' 6k = У /"(*«) sin (—-—/ I. k 2N+\ .~ V ' \2N+\ J Широкие возможности тригонометрической интерполяции следуют из того факта, что с возрастанием N многочлен Р(х) аппроксимирует f(x) с возрастающей точностью, т. е. sup \f(x)-PN(x)\->09 7V->oo. Это утверждение справедливо для достаточно широкого класса функций. Этим тригонометрическая интерполяция существенно отличается от алгебраической интерполяции на системе равноотстоящих узлов. При алгебраическом интерполировании разность между функцией f{x) и интерполяционным многочленом может быть как угодно большой всюду, кроме узлов интерполяции. Тригонометрическое интерполирование полностью свободно от этого недостатка. Для вычисления коэффициентов (2) тригонометрического интерполяционного многочлена (1) предназначена подпрограмма (subroutine) FORIT (fnt, n, m, a, b, ier): 226
subroutine FORIT (fnt,n,m,a,b,ier) с Программа FORIT вычисляет коэффициенты интерполяци-* с онного тригонометрического Многочлена для функции, * с заданной таблицей значений в 2*п+1 равноотстоящих* с узлах, расположенных на отрезке [0,2П] * с с fnt - массив из 2*п+1 элементов, содержащий значения * с функции в узлах интерполяции * с m - степень тригонометрического многочлена * с а - массив из т+1 чисел, содержит коэффициенты a(i) * с b - массив из т+1 чисел, содержит коэффициенты b^i) * с ier - признак выхода: * с ier=0 - получен результат, * с ier=l - n <= m * с ier=2 - m < 0 * с dimension a(l),b(l),fnt(l) ier = О с*" с с 20 if(m) 30,40,40 30 ier = 2 return с 40 if(m - n) 60,60,50 50 ier = 1 return с 60 an = n coef = 2.0/(2.0*an + 1.0) const = 3.141593*coef с si = sin(const) cl = cos(const) с = 1.0 s = 0.0 J = 1 fntz = fnt(l) 70 u2 = 0.0 ul = 0.0 i = 2*n+l 75 uO = fnt(i)+2.0*c*ul - u2 u2 = ul ul = uO i - i - 1 if(i - 1) 80,80,75 с 80 a(j) = coef*(fntz+c*ul - u2) b(j) = coefs'ul if(j - (m+1)) 90,100,100 90 q - сГс - si's 227
s - cTs+sTc с - q, J - j+l go to 70 с 100 continue с return end Входные параметры: fnt—массив из 2и+1 чисел, содержащий значение таблично заданной функции в равноотстоящих узлах xi=——- (*'=1, 2, ..., 2и+1); п—число, задающее количест- 2/z+l во равноотстоящих узлов х{\ m — степень тригонометрического многочлена. Выходные параметры: а—массив из т+1 чисел, содержащий значения коэффициентов Фурье а0, аи ..., ат; Ъ — массив из т+1 чисел, содержащий значения коэффициентов Фурье Ь0, Ьи ..., bm\ ier—признак ошибки во входных параметрах: ier = 0 — нет ошибки; ier=l, если т^п; ier = 2; если т<0. Перед обращением к подпрограмме FORIT необходимо: 1) описать массив fnt; 2) присвоить фактические значения параметрам ш, п, присвоить значения элементам массива fnt (значения тип должны удовлетворять условиям т^О, п>т\ присвоить первому элементу массива b нулевое значение. Задание. Используя программу FORIT, построить интерполяционный тригонометрический многочлен, аппроксимирующий функцию f(x), заданную таблицей значений в точках xt=——' (i=l, 2, ..., 2N+1). Записать тригонометрический полином и с его помощью вычислить значения функции f(x) в точках xi+1/2 = xi-\ , i=l, 2, ..., 2N+1. Порядок вьшолнения лабораторной работы 1. Составить головную программу, содержащую описание массивов, присвоение фактических значений параметрам m и п, присвоение нулевого значения элементу b (1) (!), обращение к FORIT, печать результатов. 2. Провести вычисления на ЭВМ. 3. Составить программу, вычисляющую приближенные значения функции в точках xi+1/2 с помощью найденного тригонометрического полинома и печать результатов. 228
4. Выполнить вычисления на ЭВМ. Пример. Построить интерполяционный тригонометрический полином, аппроксимирующий функцию, заданную в точках xt = =-—t—' 0"=1, 2, ..., 21), следующей таблицей значений: X Xi f(x) -5 xs -1.35048 х15 х2 -4.88554 х$ -1.211923 Х\б х3 -4.47372 ■*10 -1.11638 *17 х* -3.76908 *11 -1.01903 ■*18 *5 -2.92406 *12 -1.02565 х19 х6 -2Л5783 *13 -1.27974 ■*20 хп -1.62831 Хц -1.84857 *21 -2.64951 -3.48161 -4.14109 -4.53731 -4.72488 -4.83123 -4.93675 Здесь N=10, М=5. Программа решения задачи может иметь следующий вид: dimension fnt(21),a(6),b(6) open (unit=l,file-'fnt.dat' open (unit>2rfile='res.dat' read(lr*) fnt b(l) - 0. с с обращение к программе F0RIT с call F0RIT (fnt,10,5,a,b,ih) с с печать результатов с do 3 i - lr6 il - i-1 write(2rl) ilra(i)rilrb(i) 3 continue с h - 2.ЧЛ41592/21 write(2,*) x f r do 5 i - lr21 x - (i-0.5)*h f - a(l)*0.5 do 4 k - 2,6 f - f + a(k)*cos((k-l)*x) + b(k)*sin((k-l)*x) 229
4 cntinue write(2 *) x f 1 format(2x,'a(\il,')«',fl0.5,r b(\ilrrК.П0.5) 5 continue close(l) close(2) stop Приведенная программа предназначена для вычислений на персональной ЭВМ типа IBMPC. Предполагается, что значения функции f(x) в точках х{ хранятся в файле fnt.dat, в который они были записаны без указания формата. Результаты вычислений записываются в файл res.dat. При проведении вычислений на ЭВМ других конфигураций следует изменить операторы описания файлов, предварительно ознакомившись с документацией. Вычисления на компьютере привели к следующим результатам: 0)- -5.99931 Ь(0)- 1 - -2.00051 Ь(1)- 2)- .00005 b 2) = 3)- .00043 Ь(3)= 4)= -.00069 Ь(4)= 5)- .00057 Ь(5)= 1.495996Е-01 4.487989Е-01 7.479981Е-01 1.047197 1.346397 1.645596 1.944795 2.243994 2.543194 2.842393 3.141592 3.440791 3.739991 4.039190 4.338389 4.637589 4.936788 5.235987 5.535186 5.834385 6.133584 .00000 .75047 • -.00069 -.24946 -.00010 -.00039 f -4.974448 -4.720663 -4.151260 -3.349984 -2.518745 , -1.855699 -1.461721 -1.271709 -1Л65357 -1.062275 -1.000789 -1.114812 -1.525776 -2.230742 -3.076337 -3.842255 -4.371334 -4.649491 -4.781120 -4.883595 -4.980623 230
Варианты заданий Построить интерполяционный тригонометрический многочлен, аппроксимирующий 2я(/-1) функцию, заданную в точках х(= , /=1, 2, ..., 27V+1, таблицей значений. 1.00; 1.803; 3.085; 4.778; 6.434; 7.347; 7.027; 5.652; 3.897; 2.381; 1.347; 7.422; 0.419; 0.256; 0.176; 0.142; 0.136; 0.155; 0.209; 0.324; 0.554 7.38; 6.76; 5.22; 3.47; 2.07; 1.16; 0.64; 0.36; 0.23; 0.16; 0.13; 0.13; 0.16; 0.23; 0.37; 0.64; 1.16; 2.08; 3.48; 5.22; 6.76 -0.79; -0.8; -1.34; -1.36; -4.99; -4.94; -1.64; -L26; -0.9; -1.37; -4.73; -1.05; -1.24; -1.17; -1.08; -0,96; -0.84; -1.1; -1.21; -1.02; -1.28; -1.32; -1.37; -1.36; -1.35; -1.33; -1.30 -3.0; -3.58; -4.12; -5.56; -4.86; -4.36; -3.86; -3.30; -2.7; -2.13; -1.00; -1.13; -1.43; -1.87; -2.43 1.0; 1.05; 90.6; 520.4; 1714.7; 2915.0; 2439.2; 1020.6; 230.7; 32.17; 3.29; 0.3; 0.03; 0.004; 0.001; 0.0003; 0.0006; 0.002; 0.01; 0.09; 0.9 2980.1; 2089.3; 742.4; 146.6; 18.6; 1.8; 0.16; 0.02; 0.003; 0.001; 0.001; 0.001; 0.002; 0.003; 0.018; 0.9; 1.22; 18.6; 146.6; 742.5; 2089.7 1.0; 1.34; 1.75; 2.18; 2.53; 2.71; 2.65; 2.37; 1.97; 1.54; 1.16; 0.86; 0.64; 0.5; 0.42; 0.37; 0.36; 0.39; 0.45; 0.56; 0.74 2.71; 2.6; 2.28; 1.86; 1.44; 1.07; 0.8; 0.46; 0.42; 0.4; 0.37; 0.37; 0.4; 0.48; 0.6; 0.8; 1.07; 1.44; 1.86; 2.28; 2.6 -1.32; -1.28; -1.26; -1.24; 1.25; -1.25; -1.25; -1.26; -1.27; -1.29; -1.29; -1.33; -1.34; -1.37; -1.37; -1.37; -1.37; -1.36; -1.36; -1.35; -1.34 -4.0; -4.2; -4.5; -4.7; -4.9; -5.0; -4.9; -4.8; -4.6; -4.4; -4.1; -3.8; -3.5; -3.0; -3.0; -3.0; -3.1; -3.2; -3.4; -3.7 1,0; 2,4; 5.4; 10.4; 16.3; 19.9; 18.6; 13.4; 7.7; 3.6; 1.6; 0.64; 0.27; 0.13; 0.07; 0.05; 0.05; 0.06; 0.09; 0.18; 0.4 20.0; 17.5; 11.9; 6,4; 2.9; 1.2; 0.5; 0.2; 0.1; 0.06; 0.05; 0.05; 0.06; 0.1; 0.5; 1.0; 1.2; 2.9; 6.4; 11.9; 17.5 -1.1; -0.8; -0.3; 0.3; 0.7; 0.8; 0.7; 0.5; 0.04; -0.6; -0.9; -1.1; -1.27; -1.32; -1.35; -1.37; -1.37; -1.36; -1.34; -1.3; -1.2 -2.0; -3.3 -0.3 -2.8; -2.4; -1.1 -3.7; -4.3; -4.7; -4.9; -4.9; -4.5; -4.1; -1.5; -0.6; -0.04; -0.6; 0.92; 0.99; 0.79; 0.34; 1.1; 3.2; 9.5; 22.8; 41.4; 53.9; 49.4; 31.9; 15.2; 5.7; 1.8; 0.55; 0.17; 0.06; 0.03; 0.02; 0.01; 0.02; 0.04; 0.1; 0.3 -0.78; -1.22; -1.34; -1.39; -1.42; -1.43; -1.42; -1.41; -1.37; -1.3; -1.1; -0.1; 1.1; 1.2; 1.33; 1.36; 1.37; 1.35; 1.3; 1.17; 0.65 54.5; 45.7; 27.2; 12.1; 4.3; 1.3; 0.4; 0.13; 0.05; 0.03; 0.02; 0.02; 0.03; 0.05; 0.13; 0.41; 1.3; 4.3; 12.1; 21.2; 45.7 231
Продолжение таблицы Вариант 18 Вариант 19 Вариант 20 Вариант 21 Вариант 22 Вариант 23 Вариант 24 Вариант 25 Вариант 26 Вариант 27 Вариант 28 Вариант 29 Вариант 30 -0.78; -1.01 -1.27; 0.18; 0.89; 1.13; 1.21; 1.24; 1.23; 1.18; 1.04; 0.63; -0.38 -1.22; -1.3; -1.35; -1.36; -1.37; -1.36; -1.33 -1.1 -1.0; -2.1; 3.2; -4.1; -4.7; -4.9; -4.8; -4.4; -3.7; -2.7 -1.6; -0.4; 0.7; 1.7; 2.4; 2.9; 3.0; 2.7; 2.1; 1.2; 0.2 1.0; 4.36; 16.7; 49.8; 105.0; 146.3; 130.9; 75.9; 30.0; 8.75; 2.1 0.47; 0.11; 0.03; 0.01; 0.007; 0.006; 0.009; 0.02; 0.05; 0.2 148.4; 118.8; 62.6; 22.5; 6.21; 1.45; 0.33; 0.08; 0.02; 0.01; 0.007 0.007; 0.01; 0.02; 0.08; 0.32; 1.45; 6.2; 22.6; 62.2; 119.0 0.0; 0.97; 1.23; 1.32; 1.36; 1.37; 1.36; 1.34; 1.28; 1.13; 0.64:-0.64; -1.13; -1.28; -1.34; -1.37; -1.36; -1.32; -1.23; -0.9; -0.2 -0.0001; -1.47; -2.8; -3.9; -4.65; -4.98; -4.87; -4.33 -3.4; -2.16; -0,74; 0.74; 2.17; 3.14; 4.33; 4.87; 4.98; 4.65 3.9; 2.8; 1.4 1.0; 5.8; 29.3; 108.9; 266.4; 396.7; 347.1; 180.5; 59.2; 13.5;'2.4; 0.4; 0.07; 0.01; 0.005; 0.003; 0.002; 0.004; 0.009; 0.03; 0.1 403.4; 309.0; 142.2; 42.1; 8.9; 1.56; .0.26; 0.05; 0.01; 0.0044; 0,0026; 0.0026; 0.0044; 0.01; 0.05; 0.263; 1.56; 8.95; 42.1; 142.2; 309.9 0.78; 1.22; 1.34; 1.39; 1.42; 1.43; 1.42; 1.41; 1.37; 1.3; 1.1; 0.1 -1.1; -1.2; -1.33; -1.36; -1.37; -1.35; -1.3; 1,17; -0.65 1.0; -0.77; -2.3; -3.6; -4.6; -4.9; -4.8; -4.1; -3.1; -1.6; 0.1; 1.9; 3.6; 5.1; 6.2; 6.84; 6.98; 6.58; 5.69; 4.4; 2.7 1.0; 7.8; 51.5; 238.1; 675.9; 1075.4; 920.1; 429.3; 1J0.8; 20.8; 2.83; 0.35; 0.04; 0.01; 0.002; 0.001; 0.001; 0.004; 0.02; 0.12 1.10; 1.32; 1.40; 1.43; 1.45; 1.46; 1.44; 1.42; 1.37; 1.25; 0.76; -0.8; -1.22; -1.33; -1.36; -1.37; -1.35; -1.29; -1.1; -0.1 2.0; -0.06; -1,9; -3.4; -4.9; -4.8; 4.0; -2.7; -1.1; 0.95; 3.0; 5.0; 6.7; 8.1; 8.8; 8.9; 8.5; 7.47; 5.94; 4.06 Лабораторная работа 36 ПРИБЛИЖЕННОЕ ВЫЧИСЛЕНИЕ ПРЕОБРАЗОВАНИЯ ФУРЬЕ При решении широкого круга прикладных задач, в частности в цифровом спектральном анализе, в цифровом моделировании фильтров, распознавании образов, анализе речевых сигналов, а также при решении многих задач численного анализа, возникает необходимость вычисления интегралов вида |/(х)е-'ъМх, (1) где со—произвольное действительное число. Для вычисления этого интеграла можно применить многие известные классические правила интегрирования, такие, например, как формула трапеций, 232
парабол и др., основанные на формулах Котеса, Гаусса и т. д. Однако все эти формулы имеют существенный недостаток, на который мы обратим внимание, чтобы объяснить причины, побудившие строить более удобные формулы для вычисления интегралов вида (1). Формулы, которые упоминались выше, получают с помощью замены интегрируемой функции алгебраическим многочленом невысокого порядка на всем отрезке интегрирования или его частях. Поэтому следует ожидать, что они будут давать хорошую точность, если интегрируемая функция достаточно гладка и не очень быстро меняется. В интеграле (1) интегрируемыми функциями являются произведения /(х) sin сох и /(х) cos сох. Если параметр со — большое число, то функции cos сох и sin сох быстро колеблются, и для того чтобы достаточно точно проследить за изменением произведений /(х) sin сох и /(х) cos сох даже при медленно меняющейся функции /Ы, нужно взять в квадратурной формуле большое число узлов. В результате вычисления могут стать трудными или даже невыполнимыми. Чтобы построить квадратурную формулу, пригодную для вычисления интеграла (1) в широком диапазоне изменения параметра со, необходимо учесть множители sin сох и cos сох (e~ItDX) в подынтегральной функции. В прикладных задачах чаще всего требуется вычислить интеграл (1) не при одном, а сразу при нескольких значениях параметра со вида со* = £Лсо, к = 0, 1, ..., п — 1. Все это приводит к необходимости получить такую квадратурную формулу и алгоритм ее реализации, в которых вычисления проводятся не последовательно для каждого значения параметра соь а сразу для всей совокупности значений этого параметра. В данной лабораторной работе используется квадратурная формула вида Ф) = "1/,Л> (2) ;=о где Т1 Aj= ехр (—/сох) dx = — J l р - imh Xj = a+jh, h = , 7 = 0, 1, ..., п— 1, х}— узлы равномерной сетки на [я, b]; fj=f{xj)— значения функции f(x) в узлах сетки. Для значений (ок=-—, Асо = формулу (2) можно о — а Ь — а переписать в виде . 233
где m=ifje~l~- (4) Переход от величин fj к величинам F{k) (j; к = 0, 1, ..., п— 1) называется дискретным преобразованием Фурье (ДПФ). Дискретное преобразование Фурье является составной частью решения многих прикладных задач. Замечательным свойством дискретного преобразования Фурье является возможность его обращения, т. е. восстановления величин fj по известным значениям F(k) (у, k, ..., п— 1). Эта операция осуществляется по формулам обратного преобразования Фурье fs=-!LnW~- (5) nk=o Непосредственно осуществление дискретных преобразований Фурье по формулам (4) или (5) требует 0(п2) арифметических операций. Для сокращения объема вычислений были разработаны алгоритмы быстрого преобразования Фурье (БПФ). Основная идея алгоритма быстрого преобразования Фурье основана на том, что при составном п в правой части (4) или (5) можно выделить такие группы слагаемых, которые дают вклад во многие коэффициенты Flk). Наибольшее распространение получил алгоритм БПФ, разработанный для случая п=2т. Для его реализации требуется 0(n\og2n) арифметических операций. Один из алгоритмов прямого и обратного быстрого преобразования Фурье реализован в программе FF, текст которой со всеми необходимыми комментариями приведен ниже, subroutine FF(xrrxiryrryirnrind) с Программа FF производит быстрое преобразование * с Фурье массива из п комплексных чисел * с * с xr,xi - массивы размерности п, содержат соответственно * с действительные и мнимые части элементов заданного* с массива * с уг,у1 - рабочие массивы размерности п * с п - количество заданных комплексных чисел * с ind - признак, указывающий направление преобразования * с Фурье * с inc>0 - производится прямое преобразование : * с ind<0 - производится обратное преобразование * с * с !!!! п - целая степень двойки !!!! * с *? с Результат: * с Действительная и мнимая части дискретного * с преобразования Фурье хранятся в массивах * с хг и xi r соответственно * 234
с dimension xr(l),x1(l),yr(l),y1(l) к = n log2 = 0 с 10 к = к/2 log2 = log2 + 1 if(k.gt.l) go to 10 с rrnn = 1 do 1 m = lrlog2 m2 = mm*2 kl = 2"(log2 - m) - 1 11 - mm - 1 do 2 к - lrkl + 1 do 3 1 - 1,11 + 1 j = m2*(k - 1) + 1 i = mrn'(k - 1) + 1 w - 3.1415'9265*(1 - l)/mm si = ind'sin(w) со = cos(w)^ ni - 2"(log2 - 1) + 1 jm = j + 2**(m - 1) xa = xr(ni)*co + xi(ni)*si xb « xi(ni)*co - xr(ni)*si yr(j) - xr(i) + xa yi(j) = xi(i) + xb yr(jm) = xr(i) - xa yi(jm) = xi(i) - xb 3 г с 5 С 1 с с 4 100 continue continue do 5 it * lrn xr(it) = yr(i xi(it) - yi(i continue mm = m2 continue if(ind.lt.O) go to 100 do 4 i - lrn xrM) - xrM)/n xi(i) = xi(i)/n continue return end 235
Входные параметры: are, aim—массивы размерности п, содержат действительную и мнимую части значений функции в п равноотстоящих узлах; п — количество значений функции, п должно быть целой степенью двойки; ind — признак, определяющий направление преобразования Фурье, ind>0—выполняем прямое преобразование, ind < 0 — обратное. Выходные параметры: действительная и мнимая части дискретного преобразования Фурье находятся в массивах are и aim соответственно. Алгоритм вычисления интеграла (1) по формулам (2) — (4) реализован программой IFF. subroutine IFF (arbrarrairxrrxirnrepsrip) с Программа IFF вычисляет интегралы от функций вида с f(x)*exp(-i*omega*x) , f(x)*exp(i*omega*x) с по отрезку [arb] с с arb - концы промежутка интегрирования с ar,ai - массивы размерности п, содержат действительные с и мнимые части значений функции f(x) в узлах с xk=a+khr k=0rI,...,п-1, равномерной сетки на [а,Ь] с xrrxi - рабочие массивы размерности п с п - количестве узлов сетки на [arb] с eps - параметр, регулирующий точность вычисления величины с (l-exp(t))/t при t близких к нулю с ip - параметр, определяющий знак показателя степени с экспоненты: с ip« 1 - под интегралом exp(-i*omega*x) с ip=-l - под интегралом ехр( i'omega'x) с с Результат: с Действительная и мнимая части значений интеграла с в точках omega(k)«2*pi*k/(b-a), k-Orlr...rn-l с расположены соответственно в массивах аг и ai с с !!! Программа содержит обращение к программе FF !!! с dimension ar(l)vai(l)vxr(l)vxi(l) data pi / 3.14159265 / h - (b - a)/n с вычисление быстрого преобразования Фурье программой FF с call FF(ar,ai,xr#xirnrip) с do 6 i - l,n k - i - 1 w - k*2*pi/(b - a) с - cos(w'a) s - sin(w'a) w - w*h»(b - a) 'ч>Ь 236
if(w.gt.eps) go to 3 с w4 - h - 2*pi"2*k"2*h**3/(b - a)**2 w5 - 2*pi*k*h"2/(b - a) - al = w4*ar(i) + ip*w5*ai(i) bl « w4*ai(i) - ip*w5*ar(i) go to 4 С 3 wl - sin(2*pi*k/n)*(b - a)/(2*pi*k) w2 - 2*(sin(pi»k/n))*»2 w3 - w2*(b - а)/(2*рГк) al - wl*ar(i) + ip»w3*ai(i) bl - wl'ai(i) - ip»w3*ar(i) 4 ar(i) - аГс + bl's'ip ai(i) = bl'c - al's'ip с if(ip.lt.0) go to 5 ar/i) - ar(i)*n*n ai(1) - ainrrTn 5 ar(1) - ar(i)/n ai(i) = a i(i)/n 6 continue return end ♦ Входные параметры; a, b — концы интервала интегрирования; ar, ai—массивы размерности и, содержат соответственно действительную и мнимую части значений функции fix) в равноотстоящих узлах Xi = a + i(b — a)/n, /=0, 1, ..., п—\ на [а, о]; xr, xi—рабочие массивы размерности п; п — количество узлов сетки на [я, b]; eps—параметр, регулирующий точность вычисления интеграла при близких к нулю значениях &кх; ip — параметр, определяющий аргумент экспоненты; ip = 1 — вычисляем интеграл от f(x)e~i<ox; ip= —1—вычисляем интеграл от f(x)eiax. Выходные параметры: действительная и мнимая части значения интеграла в точках (йк = 2кк/(Ь — а) находятся в массивах аг и ai соответственно. Задание. Вычислить для заданной фуйкции f(x) Ъ _• Ink jY(x)e l<oxdx при co = cok=-—, к = 0, 1, ..., л—1, « = 512, а используя программу IFF. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую вычисление значений f(x) в узлах равномерной сетки из п узлов на [я, Ь\ и размещающей их в соответствующих массивах, обращение к IFF, печать результатов. 237
2. Провести вычисления на ЭВМ. 20 Пример. Вычислить J e x2eItDXdx, используя квадратную фор- о мулу с 512 узлами. А Программа решения задачи может иметь следующий вид: dimension xr(512),xi(512),ar(512),ai(512) data pi/3.14159265/ 1 eps = .le-i a - b - n - h - do ■ 0. ■ 20. - 512 - 20./n 1 i - 1 x- (i ar(i) - ai(D = continue 5 гП - l)*h exp(-x*»2) 0. с обращение к программе IFF, вычисляющей интеграл с call IFF(a,brarrai.rxrrxirnrepsrl) с write(3r*) ' омега действ.часть мнимая часть' с с печать результатов вычислений с do 3 i = lrn от = (i - l)*2.*pi/(b-a) write(3,*) om,ar(i),ai(i) 3 continue с stop end Вычисления по программе привели к следующим результатам: омега ,000000е+00 ,141593е-01 ,283185е-01 ,424778е-01 1.256637 1.570796 1.884956 2.199115 2.513274 2.827434 157.708000 158.022100 158.336300 действ.часть 9.057581е-01 8.831888е-01 8.187760е-01 .216179е-01 .045151е-01 .812212е-01 .638563е-01 .611314е-01 1.776797е-01 1.144008е-01 мнимая часть 0.000000е+00 1.599023е-01 3.042652е-01 205081е-01 5.011386е-01 5.445265е-01 5.542706е-01 5.375432е-01 5.030348е-01 4.591037е-01 -4 -1.383713е-03 -2.046928е-03 -2.820304е-03 -8.217686e-03 -8.214554е-03 -7.984647е-03 238
158.650400 158.964600 159.278700 159.592900 159.907100 160.221200 -3.619629e-03 -4.314504e-03 -4.745772e-03 -4.759959e-03 -4.253143e-03 -3.210873e-03 -7.451057e-03 -6.572381e-03 -5.370083e-03 -3.945970e-03 -2.478432e-03 -1.193191e-03 Варианты заданий Вычислить Sf(x)e~i(OXdx. Номер варианта л* Номер варианта /м 6 7 8 9 10 11 12 13 14 15 sin(jc2) sm(y/\ + x2) Vio+jc2/ arcsin sin x cos (x2) sin x In (jc2-h 1) y/n2 — x2sin(x2) -x2 smxe y/n2-x2siTctg(x2 + 7) ch (x2 + 3)sinx >/x2+18x+20 sin (x2) cos(x—rc)2sinx In (^/x4* 2 +sin2 x) sin x cos (x2) 16 17 18 19 20 21 22 23 24 25 26 27 28' 29 30 cos(x2) cos(vO+jc2) 1 l + 100x2 ln(x2-ic2+l) cosi x+-)sin(x2) y^2-jc2arctgjc (x2-n2)sin(x2) с-Щх-к)2 sinxsh (x2 —я) sinxch (In х+2я) x2+chx l + 65x2 yjn2—x2chx sin(x—rc)2sinx x2-2x+23 10x+100 -sinx cos ■(x+iy sin(x2)
Лабораторная работа 37 ОДНОМЕРНАЯ МИНИМИЗАЦИЯ ФУНКЦИИ МЕТОДОМ ЗОЛОТОГО СЕЧЕНИЯ Минимизация функции одной переменной имеет самостоятельный интерес и является важным элементом различных процедур минимизации функций нескольких переменных. От правильной организации одномерного поиска существенно зависит успех решения всей задачи. Пусть f(x)—функция, определенная на отрезке [а, Ь]. Функцию fix) называют унимодальной, если существует единственная точка х*9 в которой f(x) принимает экстремальное значение. Для определенности будем считать, что реч*> идет о минимуме функции f(x) на отрезке [а, Ъ]. Отметим, что унимодальная функция не должна быть гладкой или даже непрерывной. Из определения унимодальности следует, что если xi<xi^x*, то /(*i)>/(*2). Аналогично, если x*^xi<xi, то f(xi)<f(x2). Задача состоит в построении такой последовательности {**}, чтобы при некотором / минимальное значение функции достигалось на интервале Xi-i^x*^Xi. Такой интервал называется интервалом неопределенности. Алгоритм выбора абсцисс {хк} называется стратегией поиска. При заданном количестве вычислений функции оптимальной стратегией является та, которая ведет к наименьшему интервалу неопределенности. Можно показать, что в этом случае оптимальна стратегия Фибоначчи, названная так потому, что она тесно связана со знаменитыми числами Фибоначчи [14]. В данной лабораторной работе для одномерной минимизации применяется метод золотого сечения. При достаточно большом количестве вычислений функции окончательный интервал в методе золотого сечения лишь на 17% больше, чем в методе Фибоначчи, однако организация вычислительного процесса значительно проще. Как известно, золотым сечением отрезка называют деление отрезка на две части так, что отношение длины всего отрезка к длине большей части равно отношению длины большей части к меньшей. Нетруднб проверить, что золотое сечение отрезка [а, Ь] производят две симметрично расположенные точки: xi = a + (\-x)(b-a), Х2 = а + т(Ь-а), где т = (х//5 —1)/2 = 0.6180339. Замечательно, что точка xl9 в свою очередь, производит золотое сечение отрезка [а, х2]9 а точка х1—золотое сечение отрезка [х19 Ы Опишем алгоритм поиска. Начальный отрезок делим точками х! и х 2 по правилу золотого сечения и в точках х1 и х2 вычисляем значения функций /{хЛ и f(x2). Сравнение этих значений позволяет отбросить лиоо интервал [а, хх]9 либо [х2, Ь]. На 240
оставшемся интервале уже есть одна точка, производящая его золотое сечение, и задача состоит в •построении второй такой точки. После этого процесс повторяем. Таким образом, на каждом шаге, начиная со второго, требуется лишь одно вычисление функции и интервал неопределенности уменьшается в 0.618 раза. Итерации продолжаются до тех пор, пока интервал неопределенности не станет меньше некоторого заданного числа е. Метод золотого сечения напоминает метод бисекций в том смысле, что он гарантирует нахождение минимума в самых неблагоприятных условиях, однако он обладает медленной сходимостью. Алгоритм одномерной минимизации методом золотого сечения реализован в виде подпрограммы GOLDS: subroutine G0LDS(a,b,x0,f,eps) с Программа GOLDS минимизирует функцию f(x) с на отрезке [а,Ь] методом золотого сечения с с а,Ь - концы отрезка,содержащего точку минимума с f - имя подпрограммы-функции,вычисляющей f(x) с eps - погрешность с с Результат: с хО - точка минимума функции f(x) с gs = 0.6180339 с с вычисление золотого сечения отрезка [а,Ь] с ЩЩЩЩЩЩЩЩ.ЩЩЩЩЩЩЩЩЩЩЩЩЩ^ЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЦ хр = а + (b - a)*gs xl = b - (b - a)*gs УР - f(xp) У1 = f(xl) if(yp.lt.yl) goto 1 ! выбор отрезка b = хр хр = xl УР = yl с с золотое сечение отрезка [а,хр] с xl = b - (b - aj'gs yl = f(xl) goto 2 с 1 a = xl xl = xp yl = ур с с золотое сечение отрезка [xl,b] 241
с хр - а + (b - a)*gs УР = f(xp) с 2 if((b - a).gt.eps) goto 3 xO = 0.5*(a + b) с return end Входные параметры: а—левый конец отрезка [а, Ь]; b—правый конец отрезка [a, b]; f—имя внешней подпрограммы- функции (function) /(х), вычисляющей значения /(х); eps—полуширина интервала неопределенности. Выходной параметр хО—приближенное значение точки минимума. Перед обращением к подпрограмме необходимо: 1) составить подпрограмму-функцию f (х), вычисляющую значение f(x). Имя f должно быть переменной вещественного типа; 2) описать имя f в головной программе оператором external; 3) присвоить значения входным параметрам a, b, eps. Задание. Используя программу GOLDS, найти точку минимума унимодальной функции f(x) с точностью е. Порядок выполнения лабораторной работы 1. Графически отделить точку минимума функции /(*), т. е. найти отрезок [а, Ь], на котором лежит точка минимума х*. 2. Составить подпрограмму-функцию вычисления /(*). 3. Составить головную программу, содержащую обращение к подпрограмме COLDS, и печать результатов. 4. Провести вычисления по программе. Пример. На отрезке [—1, 0] найти точку минимума функции /(х) = л:2 + ех с точностью е = 0.001. В этом случае головная программа и подпрограмма-функция достаточно просты и имеют вид external f с с Обращение к программе GOLDS, минмизирующей f(x) на [-1*0] с call GOLDS (-1., 0.r xor fr 0.001) с с печать результата с print 1,хо с stop 1 format(2x/точка минимума \f7.4) end с function f(x) 242
с* Подпрограмма-функция,вычисляющая значения f(x) * с f = х**2 + ехр(х) return end В результате вычислений по этой программе получены следующие результаты: точка минимума -.3517 Варианты заданий Номер варианта /М Характер экстремума Номер варианта /м Характер экстремума 6 7 8 9 10 11 12 13 14 h5cosx 2 2е* — х2 2 е~х + х2 x&Tctgx + e~x 1 V(i+*)*+■ 1+х2 1 + х2 (sinjc + cosx) arctg(sinx—cosx) 4x+8-6V(^+2)2+(x+l): |sin jc—cosjc| x2-6x + 4 Ъх-2 -+e* 9 + 6x-3x2 1 x2-2x+13 \+x2 J(x-\)(x + 2)2 + x* mm min mm max min max max min max 16 17 18 19 20 21 22 23 24 25 26 27 28 29 2x2-l x/^2 + *4 V2(jc-l)sin(jc-4) sin 2 (x — 2) sin 2 (x—6) + lnjc x-3 x2arctg2(x+l) 1 з П~л (x-2)2 1+jc2 зу(^Г^е-(*2-4*+12) sh2x + ex lnx 1/x + shx l/x2H-tgx shx зу^ГТ)2е-(-2+2-+9) max max max min min min min min min 243
Продолжение таблицы Номер варианта 15 /м [й]-« Характер экстремума min Номер варианта 30 /м ch;c + ln2;c Характер экстремума min Лабораторная работа 38 МЕТОД ГРАДИЕНТНОГО СПУСКА Общая задача нелинейного программирования без ограничений состоит в минимизации функции /(x)=/(jci, X29 ..., хХ заданной во всем «-мерном евклидовом пространстве. Функция j (x) называется целевой функцией. Как правило, численные методы отыскания экстремума состоят в построении последовательности векторов {х(к)}, удовлетворяющих условию /(х(0))>/(х1)>.../(х(и)). Методы построения таких последовательностей называются методами спуска. В этих методах элементы последовательности {х(к)} вычисляются по формуле x(* + D = x(*) + akp(*)? (1) к = 0, 1, 2, ..., где р(к)—направление спуска; а*—длина шага в этом направлении. Как известно, градиент функции в некоторой точке х(к) направлен в сторону наискорейшего локального возрастания функции. Следовательно, спускаться нужно в направлении, противоположном градиенту. Вектор, противоположный градиенту, называется антиградиентом. Выбирая антиградиент в качестве направления спуска, приходят к итерационному процессу вида x<k+1) = x(k)-akf(x<k)), (2) где f(x<k^grad/(x)|jc=;c(k). Все методы спуска, в которых вектор р(к) совпадает с антиградиентом, называются градиентными методами. Они отличаются друг от друга только способом выбора шага. Наиболее употребительны метод наискорейшего спуска и метод дробления шага. В методе наискорейшего спуска величина оск определяется из условия /(x(k)-afcr(x(k>)) = min/(x(k)-ar(x(k))), 244
т. е. на каждом шаге решается од- у\ номерная задача минимизации. Геометрическая интерпретация этого метода достаточно проста (рис.21). Заметим, что на двух последовательных шагах направления спуска ортогональны. Если/(х) — ограниченная снизу не- ^' прерывно дифференцируемая функция и для некоторой начальной точки х(0) Рис. 21 множество {х:/(х)</(х0)} также ограничено, то для метода наискорейшего спуска последовательность {х{к)} либо сходится к точке минимума при А;-юо; либо достигает точки минимума за конечное число шагов. В данной лабораторной работе для минимизации функции использован метод градиентного спуска с дроблением шага. Процесс (2) с дроблением шага протекает следующим образом. Выбираем некоторое начальное значение х(0). Общих правил выбора х(0) нет; если есть информация об области расположения искомой точки минимума, то точку х(0) выбираем в этой области. Затем выбираем некоторое ak = a = const и на каждом шаге процесса (2) проверяем условие монотонности /(х(к+1))< <f(xik)). Если это условие нарушается, то а дробим до тех пор, пока монотонность не восстановится. Для окончания счета можно использовать различные критерии. В данной работе итерации прекращаем, если ||grad/(x<k + 1))||<e. В этом случае полагаем xmin = x(k+1). Здесь Описанный алгоритм реализован в виде подпрограммы (subroutine) GRAD (n, х, у, g, al, eps, f, gr, k, xl): subroutine GRAD(n,x,y,g,a1,eps,f,gr,k,xl) c„,,„„, „„„„„„„„„„„„„ ***********•»»•••••••••• с Программа GRAD минимизирует функцию f(xl,x2,...xn)* с методом градиентного спуска * с с п - размерность пространства * с х - массив размерности пгсодержит значение аргументов * с g - массив размерности пгсодержит координаты градиента* с а! - шаг * с eps - погрешность • с f - имя программы,вычисляющей значение функции * с gr - имя программы,вычисляющей координаты градиента * 245
с к - число итераций с xl - рабочий массив размерности п * с щ с Результат*. * с х - координаты точки минимума * с у - значение функции в точке минимума * с к - количество итераций * с,мммммммммм*мммммммммм*мммммммм dimension x(l),g(l),xl(l) k - О call f(x,y) с 1 call gr(xrg) s - 0. do 2 1 - lrn 1 s « s + g(1)"2 с с проверка достижения точности с s - sqrt(s) if(s.le.eps) go to 7 с с начало очередной итерации с к - к + 1 3 do 4 1 « lrn 4 xl(i) -x(1) - дГд(1) call f(xlryl) с с проверка монотонности с if(y].1e.y) go to 5 al - аГ0.5 до to 3 с 5 do 6 1 « lrn 6 x(i)-xl(i) У - yl до to 1 7 return end Входные параметры: n — размерность пространства, в котором задана функция /; х—массив, в элементах которого размещаются значения координат начальной точки х(0); у — значение целевой функции/; g — массив, содержащий компоненты градиента/' целевой функции; al—начальное значение параметра a; eps—значение величины е, входящей в критерий окончания итерационного процесса; f—имя подпрограммы (subroutine) f(x, у), вычисляющей функцию y=f(x), когда х расположен в массиве х; gr—имя подпрограммы (subroutine) gr(x, g), вычисляющей компоненты вектора P = grad/(x(k^, если х^ расположен в массиве х; xl—вспомогательный рабочий массив, размерность которого совпадает с размерностью массива х. 246
Выходные параметры: х—массив, содержащий координаты точки минимума xmin; k —число совершенных итераций; у—значение /(xmin). Перед обращением к программе GRAD необходимо: 1) составить подпрограмму f(x, у) вычисления функции /(х); 2) составить подпрограмму gr(x, g) Для вычисления координат вектора grad/(x) и размещения их в массиве g; 3) описать в головной программе имена f и gr оператором external; 4) присвоить фактические значения параметрам n, al, eps, описать массивы х, g, xl; 5) присвоить начальные значения элементам массива х. Задание. Используя подпрограмму GRAD, минимизировать заданную целевую функцию. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к GRAD, и печать результатов. 2. Составить подпрограмму вычисления целевой функции 3. Составить подпрограмму вычисления градиента целевой функции f(x, у). 4. Провести вычисления на ЭВМ. Пример. Минимизировать функцию f(xu Jt2) = exp(*i+*2)+ + 2jt1-3.5x2. А В качестве начального приближения х(0) выберем точку (О, 0) и положим е=10~4. Программа, реализующая решение задачи, может иметь вид external f,gr dimension x(2),g(2),xl(2) с n - 2 eps - 0Ле-03 с с загрузка нулевого приближения х(1) - 0. х(2) - 0. с с начальное значение шага с al -.0.15 с с обращение к прогаиие GRAD, минимизирующей f(xl,x2,,,.,xn) с call GRAD (n.x.y.g.al.eps.f,gr,k,xl) с с печать результата 247
print l,x,y,k 1 format (2x,'точка минимума xl«',el3.6,' x2«'r el3.6/2x/ f(xl,x2)-\el3.6/ * 2x/количество итераций \i4) stop end subroutine f(xry) с Программа,вычисляющая значения f(xlrx2r...rxn) щ dimension x(2) у - ехр(х(1)"2 + х(2)"2) + 2.*х(1) - 3.5*х(2) return end с subroutine gr(x,g) с Программа вычисляет координаты градиента ' dimension x(2),g(2) ye - ехр(х(1)"2 + x(2)"2) a g(l) - ye*2.*x 1) + 2. 3(2) - ye*2.*x(2) - 3.5 return end В результате вычислений по программе получены следующие результаты: точка минимума xl« -0.445891E+00 х2= 0.7803ЮЕ+00 f(xlrx2)-0.l380l2E+0l количество итераций 34 Варианты заданий Минимизировать функцию /(х, y) = ax + by + ecx + спуска методом градиентного Номер варианта 1 2 Ъ, 4 5 6 7 8 9 • а 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 Ъ -1.4 -1.3 -1.2 -^1.1 -1.0 -0.9 -0.8 -0.7 -0.6 с 0.01 0.04 0.02 0.16 0.25 0.36 0.49 0.64 0.8 d 0.11 1 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 1 Номер варианта 1 16 17 18 19 20 21 22 23 1 24 а 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 Ъ 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 с 4.99 2.56 2.89 3.24 3.81 4.00 5.02 4.84 5.29 d 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 248
Продолжение таблицы Номер варианта 10 11 12 13 14 15 а 10.0 . 11.0 12.0 13.0 14.0 15.0 ь -0.5 -0.4 -0.3 -0.2 -0.1 -0.0 с 0.94 1.00 1.21 1.44 1.69 1.96 d 0.20 1 0.21 0.22 0.23 0.24 0.25 Номер варианта 25 26 27 28 29 30 а 25.0 26.0 27.0 28.0 29.0 30.0 Ъ 0.9 1.0 1.1 1.2 1.3 1.4 с 5.76 6.25 6.76 6.98 7.29 8.41 d 0.35 0.36 0.37 0.38 0.39 0.40 Лабораторная работа 39 РЕШЕНИЕ ЗАДАЧИ МИНИМИЗАЦИИ ФУНКЦИИ БЕЗ ОГРАНИЧЕНИЙ МЕТОДОМ СОПРЯЖЕННЫХ ГРАДИЕНТОВ В лабораторной работе 38 задача минимизации функции без ограничений решалась методом наискорейшего спуска, который, однако, как и другие градиентные методы, медленно сходится в тех случаях, когда поверхности уровня функции f(x) сильно вытянуты. Этот факт известен в литературе как «эффект оврагов». Суть эффекта в том, что небольшие изменения одних переменных приводят к резкому изменению значений функции — эта группа переменных характеризует «склон оврага», а по остальным переменным, задающим направление «дна оврага», функция меняется незначительно. На рис. 22 изображены линии уровця «овражной» функции двух переменных. Для овражных функций траектория градиентного метода, как видно из рис. 22, характеризуется довольно быстрым спуском на «дно оврага», и затем медленным зигзагообразным движением в точку минимума. Например, для минимизации «овражной» функции /(*i> х2)= -xfexp[l-xf-20.25(x1-x2)2] программе GRAD потребовалось совершить более 100 итераций. Спуск начинался из точки (0.1; 0.1) с начальным шагом а=1 и б=10~6. Такое число итераций очень велико, особенно если учесть, что минимум функции f(xl9 x2) находится в точке #1 (1, 1), т. е. совсем недалеко от начального приближения. Применение в таких случаях метода сопряженных градиентов позволяет существенно ускорить процедуру поиска минимума. Метод сопряженных градиентов обладает замечательным свойством: положительно определенная 249
квадратичная форма п переменных минимизируется методом сопряженных градиентов не более чем за п шагов. Метод успешно применяется для минимизации и неквадратичных функций п переменных, так как в окрестности экстремума любая гладкая функция мало отличается от квадратичной. Конечно, в этом случае для достижения точного минимума потребуется бесконечное число шагов. Здесь для минимизации функции нескольких переменных принят вариант метода сопряженных градиентов, предложенный Флетчером и Ривсом. Опишем алгоритм Флетчера—Ривса. 1. Вычисляем S0= — grad/(x0) в точке х0. 2. На к-м шаге (к=19 2, ...) решаем задачу минимизации по а функции f(xk + aSk), в результате чего определяем величину шага oik и точку xk+1=xk + akSk. 3. Вычисляем величины /(x* + i) и grad/(xfc+1). 4. Если ||grad/(xt+1)||<e, то точка xfc+1 — решение задачи, в противном случае определяем коэффициент Pfc по формуле р J (grad/(xt+1); grad/(x,+1)-grad/(x,)) ^ fc+^ [ О при k+lel. Здесь /—множество индексов /={0, и, 2и, Зи, ...}. Значения к, для которых Р* = 0, называют моментами обновления метода. Таким образом, обновление метода происходит через каждые п шагов. • 5. Вычисляем Sfc+1 по формуле Sfc+1 = -grad/(xfc+1)+PfcSfc- При обновлении процесс повторяют с п. 1, в противном случае—с п. 2. Описанный алгоритм реализован в виде подпрограммы GRADC: subroutine GRADC (nr*rf,g,epsfk) с Программа GRADC минимизирует функцию п переменных * с f(xl.x2,...vxn) методом сопряженных градиентов * с с п - размерность пространства^ <= 10 * с х - массив размерности п, содержит аргументы функции * с f - имя подпрограммы, вычисляющей значения функции * с g - имя подпрограммы, вычисляющей градиент функции * с eps - погрешность вычислений * с с Результат: * с х - координаты точки минимума * с к - количество итераций * 250 \
dimension x(l),p(10),x7(10) dimension xl(10),xp(10),s(10) dimension x2.(10),xl(10),pl(10) с gs = 0.6180339 ! золотое сечение с с обращение к программат f и gr вычисляющтм значение f(x) с и grad f в начальной точке с call g(xrp call f(xry k - 0 pn = 0. с do 101 j = lrn pn = pn + p( j)"2 101 s(j) = -p(j) с с начало очередной итерации с 1000 do 1 j = l,n 1 xl(j) = x(j) + s(j) call f(xlryi) с с проверка монотонности с if(yl.gt.y) go to 300 с 4 do 2 j = l,n 2 x2(j) = xl(j) + s(j) с call f(x2ry2) с if(y2.ge.yl) go to 301 с do 3 j = lrn x(j) - xl(j) 3 xl(j) = x2(j) у = yl У1 - У2 go to 4 с с начало одномерной минимизайии методом золотого сечения 300 b - 1. go to 302 301 b - 2. 302 a - 0. ар = b*gs al * b - ap do 6 j - lrn 6 с xpfj) - x(j) + ap;s(j) xl(j) - x(j) + al's(j) call f(xpryp) call f(xlfyl) 251
30 1f(yp.lt.yl) go to 10 b - ap ap - al УР - yl , al - b - (b - aj'gs do 31 j - l,n 31 xl(j) - x(j) + aTs(j) call f(xlryl) go to 20 с 10 a - al al - ap yl - УР , ap - a + (b - a)*gs do 32 j - lrn 32 xp(j) - x(j) + ap's(j) с call f(xpryp) 20 sp - 0. do 33 j - lrn 33 sp - sp + s(j)**2 sp - sgrt(sp) if(sp*(b - aj.gt.eps) go to 30 xO - (a + b)\5 с с вычисление очередного приближения с do 34 j = lrn 34 xl(j) - x(j) + xO's(j) call g(xlrpl) sn - 0. do 25 j - lrn 25 sn - sn + (xl(j) - x(j))"2 sn « sqrt(sn) с с проверка достижения точности с if(sn.lt.eps) go to 500 с с вычисление сопряженного направления с pnl - 0. do 35 j - lrn 35 pnl - pnl + pl(j)**2 sp - 0. do 36 j - l,n .36 sp - sp + pl(J)*(pl(j) - p(j)) с k - k + l ind - k - (k/n)*n bet - sp/pn с if(ind.eq.O) bet - 0. с pn « pnl
do 37 j = lrn s(j) - -pl(j) + befs(j) xj) - xl(j) 37 p(j) - pl(j) с с переход к очередной итерации с go to 1000 с 500 do 38 j - l,n 38 x(j) - xl(j) с return end Входные параметры: n — размерность пространства, в котором задана функция /(х); х — массив из п действительных чисел, содержащий начальное приближение х0; f—имя внешней подпрограммы (subroutine) f(x9 у), вычисляющей значение y=f(\), когда х расположен в массиве х; g—имя внешней подпрограммы (subroutine) g(x, p), вычисляющей значение gradf(x) и размещающей его в массиве р, когда х расположен в массиве х; eps—значение е из условия окончания итерационного процесса. Выходные параметры: х — массив из п чисел (он же входной), содержащий значение xmin; k — количество итераций. Перед обращением к программе GRADC необходимо: 1) составить подпрограмму f (x, у) вычисления целевой функции; 2) составить подпрограмму g(x, р) вычисления gradf(x); 3) описать имена f и g оператором external; 4) присвоить фактические значения параметрам n, eps и элементам массива х—начальное приближение х0. Задание. Используя программу GRADC, минимизировать заданную целевую функцию. Порядок выполнения лабораторной работы 1. Выбрать значение начального приближения для х. 2. Составить подпрограмму f (х, у) вычисления /(х). 3. Составить подпрограмму вычисления gradf(x). 4. Составить головную программу, содержащую описание массивов х, р, описание имен подпрограмм f (x, у) и g(x, р) оператором external, обращение к GRADC и печать результатов. 5. Провести вычисления на ЭВМ. Пример. Минимизировать функцию / (х) = — х \ ехр {1 — х \ — — 20.25(х1 — х2)2 (пример предложен Бруксом [42]). А Легко видеть, что минимум функции достигается в точке х1 = 1, х2 = \. Возьмем за нулевое приближение вектор хо = (0.1; 0.1) и вычислим минимум, положив б=10~4: grad/(x) = e1-^-20-25(^-^)2{-2x1(l-x1(x1 + 20.25(x1-x2))); -40.5х21(х1-х2)}. 253
Программа, реализующая вычисления, имеет вид external f,g / с dimension х(2),р(2) с п = 2 с с загрузка нулевого приближения с х(1) = 0.1 х(2) = 0.1 eps = 0.0001 с с обращение к программе GRADC, минимизирующей f(x) с call GRADC (n,x,f,g,eps,k) с print l,x,k с stop с 1 format(10x/точка минимума х(1)=',е12.5, 5х,'х(2) = \е12.5/1х,'кол.итер.г^2) end subroutine f(x,y) с Программа вычисляет значения функции f(x) * С С dimension x(l) ее = ехр(1. - х(1)"2 - 20.25*(х(1) - х(2))**2) у = - х(1)"2'ее return end subroutine g(x,p) с Программа вычисляет координаты градиента * dimension х(1)гр(1) с ее = ехр(1. - х(1)**2 - 20.25*(х(1) - х(2))"2) р(1) = - 2.'ее*х(1)*(1. - х(1)*(х(1) + 20.25* (х(1) - х(2)))) р(2) = - х(1)**2'ее*40.5*(х(1) - х(2)) с return end Вычисления по программе привели к следующим результатам: точка минимума х(1)= 0.99998Е+00 х(2)= 0.99992Е+00 кол.итераций 7 254
Варианты заданий Найти минимум функции двух переменных f(x, у). Номер варианта Л**у) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 х2 * *У х2 . —aictg**+Tan*g*+-+21,* v2 xv v2 —arctg2j/+yarctg^+—+21x2 Г JC2 JCV JC2 expj —arctg2x+yarctgx+—+21^2 exp<J —arctg2 ;; + — arctg^+—+ 21х2 — arctg x+80^ 2 — Ъху arctg х ехр<д:2+100^2} + д:+10^ (д: + е-у)2 + 10,9(^-е-х) exp{(x+e-y)2+10,9(^-e-x)} Г*2 + 5"|2 [~sin2x+3~| [_sin2jc+lj 90jc2 + 50 ^2 + 50 + 25j>2 ln2(l+x2) + 38^2-^ ln2(l+^2) + 27,4x2-2^ 31n(l+JC2) + 23 ^4 + 4j ln(l+x2)+0,34^2arctg2^+^ sh2x+931n2(l+^2)-^ 0,lsh2x+9,4^2+^shx exp{(^ + e-x)2 + 3,2(x-e-y)} У2 arctg2 y+x2—xy arctg ^ 100 ln2(l+sh2x)+141n2(l+^2)+sh(^) 14 hi\4m yshy+\4x2 + 0,2xy ln2(l+(x + e-y)2)+12,4^2 255
Продолжение таблицы Номер варианта 24 25 26 27 28 29 3Q Л*-у) \9,lx2 + \n2(\+(y-e-x)2) \9,2\п2(\+2у2)+ху xsh(\4x)+y2+ysh(\4x) 0,4sh2x+18,31n2(l+^2)+3exln(l+.v2) (3^ + e-2x)2 + 30(2x-e"3y)2 ~x2 + \Sy2 + 3x + 5y exshx+\9y2 + sin(xy) Лабораторная работа 40 МИНИМИЗАЦИЯ ФУНКЦИИ МЕТОДОМ НЕЛ ДЕР А —МИДА В лабораторных работах 38 и 39 оцисаны градиентные методы отыскания локального минимума функции нескольких переменных. В настоящей работе рассматривается один из методов минимизации, в котором в отличие от методов градиентного спуска не требуется вычислять градиент целевой функции. Методы минимизации, не требующие вычисления производных, называются методами поиска. Как правило, при решении задач нелинейного программирования без ограничений градиентные методы сходятся быстрее, чем методы поиска. Однако встречаются задачи, в которых вычисление частных производных сопряжено с некоторыми трудностями (например, очень громоздкие аналитические выражения для частщлх производных или невозможность получить их в явном виде). Правда, точные значения частных производных можно заменить их разностными аппроксимациями, но такие методы, как правило, «плохо работают» вблизи точки экстремума. Кроме того, может возникнуть необходимость минимизировать недиф- ференцируемые или даже разрывные функции. Для решения подобных задач и применяются методы поиска. В данной лабораторной работе для минимизации целевой функции используется метод Нелдера—Мида [42]. Основу стратегии Нелдера — Мида проще всего понять на примере минимизации в двумерном случае. Пусть требуется минимизировать функцию двух переменных f(x, у). В плоскости (х, у) выберем начальную точку (нулевое приближение) и построим равносторонний треугольник с вершиной в этой точке (рис. 23). 256
Вычислим значения функции в вершинах у^ А, В и С треугольника. Выберем точку с максимальным значением функции. Пусть, например, это точка А. Построим точку А', симметричную точке А относительно противолежащей стороны СВ треугольника. Теперь вычислим значение функции в точке А*. Из трех точек А', В, С выберем ту, в которой функция мак- * симальна, и опять найдем ее «зеркальное Рис. 23 изображение» относительно противолежащей стороны. Если после некоторого числа таких шагов функция перестанет уменьшаться, то следует уменьшить, например, в два раза сторону треугольника и продолжить процесс от вершины с наименьшим значением целевой функции. Процесс можно закончить, когда размеры треугольника станут настолько малыми, что все три его вершины можно будет считать неразличимыми. Если минимизируемая функция имеет «овражные» особенности (см. лабораторную работу 39), то описанный алгоритм неэффективен, так как не реагирует на «топографические» особенности исследуемой функции. Нелдер и Мид усовершенствовали рассматриваемый алгоритм. Основная идея усовершенствования состоит в деформации треугольника в зависимости от особенностей функции. Те стороны треугольника, которые ориентированы преимущественно вдоль «оврага», растягиваются, а те, которые ориентированы «поперек»,—сжимаются. Это позволяет повысить быстродействие алгоритма. Обобщение описанного алгоритма на многомерный случай не вызывает затруднений. В литературе этот метод часто называют методом деформируемого многогранника. Описанный алгоритм реализован программой NLDMIJ). Программа NLDMID содержит обращение к вспомогательным программам START и SUMR. Тексты этих программ имеют вид subroutine NLDMID(nn,xx,func,eps,fmin,xst) см*мммммм*мм*мм,ммммм*мммммм*мммм с Программа NLDMID минимизирует функцию нескольких * с переменных методом Нелдера-Мида * с с пп - количество переменных целевой функции * с хх - рабочий массив размерности пп * с func - имя внешней подпрограммы, вычисляющей * с значения целевой функции * с eps - погрешность вычисления координат точки * с минимума * с fmin - значение целевой функции в точке минимума * с xst - параметр, задающий размеры многогранника * с с Программа содержит обращение к вспомогательным * с программам START и SUMR смммммм.мм*мм* ммммммммммм » 9-187 257
external func dimension xl(20r20)rx(20)rsum(20)rxx(l) common /bll/ x,xl,nx,steprkl,sumrin step - xst nx « nn с do 333 1 - l.nn 333 x(l) = xx(l) alfa = 1. beta = 0.5 gama = 2. difer » 0. xnx - nx in * 1 call SUMR(func) kl - nx + 1 k2 - nx + 2 k3 - nx + 3 k4 - nx + 4 call START 25 do 3 i * lrkl do 4 j - lrnx 4 x(j) « xl(irj) in = i call SUMR(func) 3 continue с 28 sumh - sum(l) index « 1 do 7 i - 2rkl if(sum(i).le.sumh) go to 7 sumh - sum(i) index - i 7 continue с fmin - sum(l) kount = 1 do 8 i - 2rkl if(fmin.le.sum(i)) go to 8 fmin - sum(i) kount - i 8 continue с do 9 j - lrnx sum2 - 0. do 10 i - lrkl 10 sum2 - sum2 + xl{i,j) xl(k2rj) - l./xnx*(sum2 - xl(index,j)) xl(k3,j) - (1. + alfa)*xl(k2,j) - alfa*xl(index,j) 9 x(j) - xl(k3,j) с in - k3 call SUMR(func) if(sum(k3).lt.fmin) go to 11 if(index.eg.1) go to 38 sums - sum(l)
go to 39 38 sums - sum(2) с 39 do 12 i = l,kl if((index - i).eq.O) go to 12 if(sum(i).le.sums) go to 12 sums = sum(i) 12 continue с if(sum(k3).gt.sums) go to 13 go to 14 с 11 do 15 j « lrnx xl(k4,j) - (1. - gama)*xl(k2rj) + gama*xl(k3,j) 15 x(j) = xl(k4,j) e in - k4 call SUMR(func) tf(sum(k4).1t.fm1n) go to 16 go to 14 13 if(sum(k3).gt.sumh) go to 17 с do 18 j - lrnx 18 xl(index,j) - xl(k3rj) с 17 do 19 j = lrnx xl(k4,j) « beta*xl(index,j) + (1. - beta)'xl(k2,j) 19 x(j) - xl(k4,j) in « k4 call SUMR(func) if(sumh.gt.sum(k4)) go to 16 с do 20 j - lrnx do 20 i = lrkl 20 xl(i,j) « 0.5*(xl(1vj) + xl(kount.j)) с do 29 i - lrkl do 30 j = lrnx 30 x(j) - xl(i,j) in « i call SUMR(func) 29 . continue с go to 26 16 do 21 j - lrnx xl(index,j) = xl(k4,j) 21 x(j) - xl(index,j) с in - index call SUMR(func) go to 26 с 14 do 22 j = lrnx xl(index,j) « xl(k3rj) 22 x(j) = xl(indexfj) 259
in - index call SUMR(func) 26 do 228 j ■= lrnx 228 x(j) ^ xl(k2,j) in = k2 call SUMR(func) difer - 0. do 24 i - lrkl 24 difer - difer + (sum(i) - sum(k2))**2 difer « l./xnx*sqrt(difer) if(difer.ge.eps) go to 28 do 444 1 - lrnn 444 xx(l) - x(l) return end с subroutine START dimension a(20,20)rxl(20r20)fx(20),sum(20) common /bll/ xrxlvnxvstep,klrsumrin с vn « nx stepl - step/(vn*sqrt(2.)) * *(sqrt(vn + 1.) + vn - 1.) step2 = step/(vn*sqrt(2.)) •(sqrt(vn + 1.) - 1.) с do 1 j - lrnx 1 a(l.j) - 0 с do 2 1 - 2rkl do 2 j = lrnx a(i,j) - step2 1 - i - 1 a(irl) = stepl 2 continue с do 3 i - lrkl do 3 j - lrnx 3 xl(irj) = x(j) + a(i,j) Q return end subroutine SUMR(func) dimension xl(20,20),x(20),sum(20) common /bll/ xrxlrnxrstep,klrsumrin sum(in) « func(nx,x) return end Входные параметры: nn—количество переменных; xx—массив размерности nn, содержит координаты точки, перед обращением к программе содержит координаты начальной точки; func—имя внешней подпрограммы, вычисляющей значения целевой функции; eps — погрешность вычисления координат точки
минимума; xst—значение параметра, задающего размеры многогранника. Выходные параметры: fmin—значение целевой функции в точке минимума, хх—массив размерности п, содержит координаты точки минимума. Перед обращением к программе NLDMID необходимо: 1) составить подпрограмму-функцию, вычисляющую значения целевой функции; 2) описать размерность массива хх; 3) присвоить фактические значения параметрам nn, xx, xst, eps. Задание. Найти методом Нелдера—Мида экстремум заданной функции. Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию для вычисления значений целевой функции. 2. Составить головную программу, содержащую описание имени внешней подпрограммы в операторе external, описание массивов, обращение к NLDMID, печать результатов. 3. Провести вычисления на ЭВМ. Пример. Найти минимум функции Брукса f(X, y)=-X2Ql-xl-2025(Xl-X2y. Программа решения задачи может иметь следующий вид: external f dimension x(2) с с загрузка исходных данных х(1) - 0.1 х(2) - 0.1 п «2 eps - 0.0001 step - 0.5 с с обращение к программе NLDMID, минимизирующей функцию f с call NLDMID (nrxrfrepsrfminrstep) с с печать результатов с print *,' х - rrx print V fmin - \fmin с stop end function f(nfx) с Программа, вычисляющая целевую функцию * 261
dimension x(l) f - - x(l)"2'exp(l. - x(l)"2 - 20.25*(x(l) - x(2))"2) с return end Вычисления по программе привели к следующим результатам: х = 1.001461 1.001088 fmin - -9.999061Е-01 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Целевая функция ху\п(х2+у2) xy2z6(l-x-2y-3z) хА+уА-2х2-4ху-2у2 2,5*2-ЗА> + е0Л<*а+'а> ^ехр(2 + х + 0,2(х+^)2) 3 у2 х2 -+—+— + 2Z у х 4z х2у2\п(2х2 + 3у2) х2+уэ-1ху-40у + + 18х + 20 jcexp(l — х — 0,3(х—у)2) уехр(2+у + 0,3(х+у)2) , 2 3 у2 + Ъху + 9у3 + -+- х у Зх* + 2у*-3х2-6ху-у2 x2_y + Q0Mx>+y>) у3ехр(2+у + 0,3(х+у)2) 3 х2 z2 -+—+—+2у х z 4у min max min min min min min min min min min min min min min Номер варианта 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Целевая функция 1 х2 у2 -+—+—+z х у z 2 , 2 l l х2 + ху + 2у2+-+- х у х3+у2-1ху- -40х+18^ + 20 ехр(1-х-0,5(х-^)2) ;cV3(3-;>-4x-8z) 2 7 у2 + 4ху + 6х2+-+- х у 2х4 + 3у4-4х2-8ху-2у2 !Х2_9_ +е0,2(^+^) 2 2 x2y3z(3-z-4x-Sy) 3 z2 х2 -+-+— + 2у z х 4у х3у3\п(3х2 + 4у2) х2+у3-1ху+40х+\8у+\0 х3ехр(1-х-0,2(^-х)2) min min min min max min min min max min min min min хехр(1-2^-0,5(х-^)2) min x^z3(5-^-7x-9z) max
Лабораторная работа 41 РЕШЕНИЕ ЗАДАЧИ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ СИМПЛЕКС-МЕТОДОМ Общая форма задачи линейного программирования. В общем случае задача линейного программирования формулируется следующим образом: найти величины xl9 ..., хи, доставляющие минимум линейной функции f{x) = c1x1 + c2x2 + ... + cnxn (1) и удовлетворяющие ограничениям, которые могут быть только равенствами и неравенствами вида ailx1-\-...-\-ainxn^bb ак1хх +... + акпхп = Ьк, (2) allx1-\-...-\-alnxn^bl. Среди ограничений часто встречаются условия неотрицательности всех или части переменных xj>Q> J=l> 2> •••> s- (3) Хотя эти условия являются частным случаем представленных выше условий общего вида, на практике их обычно выделяют в особую группу. Функцию f(x) называют целевой функцией. Каноническая форма задачи линейного программирования. В канонической форме задача линейного программирования формулируется следующим образом: найти величины xl9 x29 •••, хН9 доставляющие минимум линейной функции f(x) = c1x1 + c2x2 + ... + cnxn (4) и удовлетворяющие ограничениям а11х1 + ... + а1пхп = Ь1, amiXi + - + amnxn = bm, (5) х^О, /=1, 2, ..., п. (6) Нетрудно показать, что общую задачу линейного программирования (1)—(3) можно привести к канонической форме (4)—(6). Для этого достаточно заметить, что любое ограничение в форме неравенства введением дополнительной неотрицательной переменной можно превратить , в ограничение в форме равенства. Например, условие а1х1-\-а2х2-\-... + апхп<,Ь эквивалентно двум условиям а1х1 + а2х2 + ... + апхп + хп + 1=Ь, хп + 1^0. Значит, неравенства, входящие в (2), можно записать в виде равенств, т. е. в канонической форме (5). Можно считать, что дополнительные 263
переменные входят в целевую функцию f(\) с нулевыми коэффициентами, т. е. f(x) = c1x1 + ... + cnxn + 0-xn + 1+0-xn + 2 + ... + 0-xn+r. Прежде чем описывать симплекс-метод в общем виде, рассмотрим следующую простую задачу линейного программирования для двух переменных: найти значения хи х2, которые удовлетворяют условиям г лг! + 2л:2^220, < 2хх+ л;2^260, (7) 4;q +5л;2 =$640, хх^0, х2^0 (8) и доставляют максимум функции f(xl9 x2) = Sx1 + \2x2. (9) Поскольку в задаче только две переменные, а условия для них записаны в виде неравенств первой степени, можно рассмотреть геометрическую интерпретацию задачи в плоскости координат хи х2. Условия (7), накладываемые на переменные хи х2, означают, что область допустимых значений хи х2 для каждого условия лежит в заштрихованной полуплоскости (рис. 24). Область изменения хи х2, удовлетворяющая всем трем условиям, лежит в выпуклом многоугольнике ОМ1М2М3МА., Л/\(0; ПО), М2(60; 80), ЛГ3(П0; 40), М4(130; 0) (рис.25). Рассмотрим теперь линии уровня функции /(*i, х2)—семейство параллельных прямых %х1 + 12х2 = с. Для больших с линии уровня расположены правее. Следовательно, максимум функции f(xl9 x2) = Sx1-\-l2x2 реализуется в точке [хи х2), лежащей на линии уровня функции f(xl9 x2) = c, которая рас- Рис. 24 264
положена на наибольшем расстоянии от нуля вправо. С другой стороны, мы ищем наибольшее значение функции f(xx, х2) в области изменения переменных ОМ! М2 М3 М4. Следовательно, оптимальное решение лежит на линии уровня 8*! +12х2 = с, пересекающей область ОМ1М2М3МА. в точке М2. Таким образом, точка (60; 80) является точкой оптимального решения; ^ = 60, лг2 = 80. Решим эту задачу иначе. Приведем задачу (7)—(8) к канонической форме. Для этого введем дополнительные переменные х3, jc4, *5 и запишем задачу в виде х1-\-2х2-\-х3 = 220, < 2х1-\- х2 + л;4 = 260, (10) 4x1 + 5x2 + *5 = 640; Xi^O, x2^0, х3>0, х4^0, х5^0; (11) f(xl9 х2, х3, х4, х5)= -8х1-12х2-0'Х3-0'Х4г-0х5. (12) Следует найти xl9 x2, х3, х4, х59 которые удовлетворяют условиям (9) и (10) и доставляют минимум функции f(xl9 x2, лг3, яг4, х5). Поиск оптимального решения начнем с выбора значений, удовлетворяющих условиям (10). Легче всего это сделать для х1=х2 = 0; тогда лг3 = 220, х4 = 260, лг5 = 640. Такое начальное приближение оптимального решения назовем опорным решением: х{^ = (У9 х™ = 0; х(31) = 220; x(41} = 260; x(51) = 640. Ему соответствует значение целевой функции /(1) = 0. Выразим из условия (10) ненулевые переменные х39 х4, х5 (назовем их базисными) через xl9 x2 (назовем их свободными): х3 = 220 — х1 — 2xl9 xAr = 26Q — 2x1—xl9 x5 = 640 — Ax1 — 5x2. (13) Целевая функция в переменных xl9 х2 такова: /= — 8;^ — 12лг2, видно, что, увеличивая xl9 х2, можно уменьшить значение целевой функции. Пусть, например, х2 = 0. Тогда максимальное допустимое значение х1 равно 130 (из условий х4^0, х^О). Получено новое опорное решение: х{2) = \30; х(22) = 0; л;(32' = 90; х(2) = 0, х(52)=120. Ему соответствует значение целевой функции f{2)= —1040</(1). Следовательно, второе опорное решение лучше. Рис. 25 265
Примем теперь нулевые переменные [х2 и х4) за свободные, а остальные (xl9 х3, х5)—за базисные. Из (10) получаем хх = 130 — х2/2 — л;4/2, лг3 = 90 —Злг2/2 + л;4/2, x5 = 120-3;t2 + 2;t4. (14) В новых свободных переменных целевая функция имеет вид /=_1040-8;t2 + 4;t4. (15) Таким образом, для уменьшения целевой функции нужно увеличить значение свободной переменной х2, оставляя лг4 = 0. Из (14) находим, что наибольшее допустимое значение лг2 = 40. Таким образом, новое опорное решение таково: лг^^ПО; лг(-3) = 40; 43) = 30; <3) = 0; х(53) = 0; /(3)=-1360</(2). Как и прежде, за свободные переменные выберем х4 и х5, а за базисные—xl9 х3, х2. Из (10) получаем: х1 = 1Ю—(5/6)х4. + х5/6, лг2 = 40 + (2/3)л;4 — jc5/3, л:3 = 30 —(l/2)x4 + x5/3. Целевая функция имеет вид /= — 1360 — (4/3)x4 + (8/3)x5. Уменьшаем целевую функцию, оставляя х5=0и положив х = 60. Новое опорное решение х<4> = 60; х(24) = 80; х^ = 0; х(44) = 60; х^ = 0; /(4) = -1440. Выбирая за новые свободные переменные х3 и х5, а за новые базисные—хи х2, х4, из (9) получаем: х1 = 60 + (5/3)х3—(2/3)х5, лг2 = 80 — (4/3)x3 + x5/3, x4 = 60 — 2х3 + х5. Запишем теперь целевую функцию: /= — 1440 + (8/3)лг3. Видно, что нельзя изменить значения х3 и х5, не увеличив значение целевой функции. Следовательно, последнее опорное решение оптимально. Как и при решении задачи геометрическим способом, получено оптимальное решение Xi=60, лг2 = 80, дающее максимальное значение функции f(xl9 x2) = Sx1 + l2x2 ,=1440. JC!=60 jc2 = 80 Описанный метод решения задачи—симплекс-метод. Как видно из решения примера, симплекс-метод состоит в построении последовательности опорных решений, уменьшающих целевую функцию. Изобразим опорные решения в плоскости xl5 х2, помечая точки цифрой, соответствующей номеру опорного решения (рис. 26). Таким образом, мы строили опорные решения симплекс-методом, переходя от начала координат к оптимальному решению по периметру многоугольника ОМ1М2М3М4, который был получен при решении задачи геометрическим способом. Из описания метода на примере видно, что алгоритм симплекс-метода носит итераци- Рис 26 онный характер. Один шаг метода состоит h Jj «\ \м. Д2_ "♦ к, 266
в построении очередного опорного решения. Опишем алгоритм симплекс-метода для общей канонической задачи линейного программирования (4)—(6). Допустимым решением назовем всякое решение системы (5), удовлетворяющее условиям (6). Допустимое решение, на котором целевая функция (4) принимает минимальное значение, назовем оптимальным. В зависимости от матрицы системы (5) и ограничений (6) возможны следующие случаи: 1) система (5) не имеет решений, т. е. несовместна. В этом случае задача линейного программирования неразрешима; 2) система не имеет допустимых решений и, значит, задача линейного программирования не имеет решения; 3) система (5) имеет единственное допустимое решение. В этом случае единственное решение системы (5) являемся оптимальным; 4) система (5) имеет бесконечно много допустимых решений, но целевая функция не ограничена снизу на этом множестве допустимых решений и, значит, задача линейного программирования неразрешима; 5) система (5) имеет бесконечное множество допустимых решений и целевая функция ограничена на множестве допустимых решений. В этом случае задача линейного программирования имеет оптимальное решение. Будем в дальнейшем считать, что задача (4) — (6) имеет оптимальное решение. Симплекс-метод состоит в последовательном построении таких опорных решений, что каждое следующее уменьшает целевую функцию и минимум достигается за конечное число шагов. Предположим, что предыдущее опорное решение уже найдено. Это означает, что переменные xl9 ..., хп удалось разделить на базисные xl9 х29 ..., хт и свободные хт + 1, ..., хп так, что базисные переменные выражаются через свободные по формулам *l=/7l+al,m + l*m + l + --- + aln*n> ••••••• (16) Хт— Рт + &т,т+1Хт + 1 + ••• + ат, пХп-> где /?i^0, /?2^0> •••> Лп^О- При нулевых значениях свободных переменных получим опорное решение Xi=Pl\ *2=Р2\ -; Хт=Рт', Хт + 1=0\ ...; Хп = О (17) и запишем целевую функцию через свободные переменные /=Po + P« + i^« + i + - + M«- (18) На опорном решении целевая функция принимает значение р0. Выясняем, является ли полученное опорное решение оптимальным. Если все pm + i, ..., Р„ неотрицательны, то полученное опорное решение оптимально, поскольку увеличение свободных переменных приводит к увеличению целевой функции. Если среди коэффициентов Pm + i, Pm + 2> •••> Ря есть хоть один отрицательный, 267
то полученное опорное решение не является оптимальным. Те свободные переменные, коэффициенты при которых в целевой функции отрицательны, можно увеличить и получить при этом лучшее опорное решение. Поскольку рассматривается случай, когда задача линейного программирования имеет оптимальное решение, перейти к очередному опорному решению можно следующим образом. Рассмотрим числа —Pi/oLin, 1^/^m. Выберем из них положительные, а среди положительных наименьшее. Пусть например, это —рт/ит„. Перейдем к новому опорному решению х1=Р1~Рт(*1п/У'тп> xjqv х2=Р2~Рт(*2п/(Х'тп, •••? хт- 1 =Рт- 1 ~Рт^т- 1и/ати? Хт= —рт/&тп> Хп = 0, Хт+х =0, ..., Х„-1 =0. На этом опорном решении целевая функция принимает значение, меньшее, чем р0: /=Ро~РпЛп/атп<Ро- Аналогично строим следующие опорные решения, пока не найдем оптимальное. Программы, реализующие симплекс-метод, обычно достаточ- чно сложны. Это связано с необходимостью программного исследования задачи линейного программирования в канонической постановке на разрешимость, автоматического выбора первого опорного решения, анализа целевой функции на каждом шаге вычислений. Для решения задач линейного программирования используется пакет стандартных программ MODSM, предназначенный для решения канонической задачи линейного программирования (4) — (6) при 6,^0, /=1,2, ..., т, симплекс-методом. Программа MODSM фактически представляет собой головную программу пакета программ, состоящего из 12 модулей. Приведем тексты всех модулей: subroutine MODSM (a,m,u,n,x,nb,ip,eps,xk,r,s,t) с,,, »„„„„„„„ „„„„„„„„„„„„„„„„„„****» с Программа M0DSM решает задачу линейного программи-* с рования, она является головной программой пакета * с программ, состоящего из 12 модулей, имена которых * с начинаются с sol * с с п - количество переменных целевой функции * с m - число, равное ml+2, где ml - количество уравнений * с в системе ограничений * с s - массив из т-2 чисел, содержащий правые части * с системы ограничений * с t - массив из п чисел, содержащий коэффициенты * с при неизвестных в целевой функции * с г - массив из (m-2)*n чисел, содержащий коэффициенты * с при неизвестных в системе ограничений * с eps - положительное число, играющее роль нуля в * с неравенствах вида х < 0, х > 0 * 268
a - рабочий массив из пГп чисел и - рабочий массив из пГт чисел хк - рабочий массив из т чисел 1р - признак решения задачи 1р - 1 находим максимум целевой функции 1р - 0 находим минимум целевой функции Результат: 1р - признак выхода ip - 1 - найдено оптимальное решение 1р - 2 - задача не имеет решения 1р - 3 - целевая функция не ограничена х - массив из m чисел, содержащий при ip - 1 -оптимальное решение nb - массив из m-2 чисел, содержащий при 1р - 1 номера переменных в массиве х, если какой-нибудь номер п1 больше 10е+6, то номер соответствующей переменной равен 10е+6 - ni, переменные, номеров которых нет в nb, имеют в оптимальном решении нулевые значения dimension a(l),u(l),x(l),nb(l),xk(l) dimension r(l),s(l),t(l) call SOLO0(r,s,t,a,x,m,n) 1f(1p - 1) 8,12,8 12 do 11 1- l,n ml - m*i - 1 a(mi) - - a(m1) 11 continue 8 call SOL01(u,m) ml - m-2 do 1 i « l,ml 1 nb(i) - Ю.е+S + l.le-3+i ni - 0 ne « 1 3 call SOL03(tmin,u,m,a,n,nb,k) go to 5 4 call SOL09(tmin,u,m,a,n,nb,k) go to 5 2 call SOL10(tmin,u,m,a,n,nb,k,eps) 5 if(tmin + eps) 7,13,13 13 go to (6,100,100),ne 6 if(x(m) + eps) 200,14,14 14 ne - 2 do 9 i - l,ml if(nb(i) - 10.e + 3) 9,9,15 269
15 ne - 3 9 continue go to(4r4r2)rne 7 call SOL04(u,m,afn,k,xk) call SOL05(x,xk,mrlrtetareps) if(teta + 5. - 10.e + 3) 16,300,300 16 call SOL06(x,xk,m,l,teta) call S0L07(u,m,xk,l) nb(l) = к ni = ni + 1 go to (3,4,2),ne 100 if(ip - 1) 17,18,17 17 x(m-l) - -x(m-l) с 18 ip = 1 go to 10 с 200 ip = 2 go to 10 с 300 ip = 3 с 10 return end с subroutine S0L00(rrsrtrarxrmrn) dimension r(l),s(l),t(l),a(l),x(l) 1 - m - 2 do 1 j - l,n mj « m*j a(mj) - 0. do 1 i - 1,1 kl = m*(j - 1) + i k2 - r(j - 1) + i a(kl) « r(k2) 1 a(mj) = a(mj) - r(k2) do 2 i - l,n , k3 - иГ1 - 1 2 a(k3) = t(i) x m-1) - 0. x{m) - 0. do 3 i - lrl x(1) = si) x(m) « x(m) - x(i) 3 continue return end с subroutine S0L0l(urm) dimension u(l) do 3 j - l,m 270
do 1 i - l,m 1 - m*(j - 1) + i u(l) - 0. if(i - J) 1.2,1 2 u(l)-- 1 1 continue 3 continue return end subroutine SOL02(urmrarnrjrdel) dimension u(l),a(l) del - 0. do 1 1 - lrm im - i*m 1j - m*(j - 1) + i del - del + u(im)*a(ij) 1 continue return end subroutine S0L03(tmin,u,m,a,n,nb,k) dimension u(l),a(l),nb(l) tmin - 0. ml - m - 2 do 1 j - l,n do 2 i - lrml if(j - nb(i)) 2rl,2 2 continue call SOL02(ufmfafnfjfdel) 1f(del - tmin) 3,3,1 3 tmin - del к - j 1 continue return end subroutine SOL04(u,m,a,n,k,xk) dimension u(l)ra(l),xk(l) do 1 1 - l,m xk(1) - 0 do 1 j - l,m 1j - m*(j - 1) + 1 jk - m*(k - 1) + j ~ xk(1) - xk(i) + u(1j)*a(jk) 1 continue return end subroutine SOL05(x,xk,m,l,teta,eps) dimension x(l),xk(l) teta - 10.e * 5 ml - m - 2 do 1 1 - l,ml 1f(xk(i)> eps) 1,2,2 271
2 г - x(i)/xk(i) if(r - teta) 3,3rl 3 teta - r 1 = i 1 continue return end subroutine S0L06(x,xk,m,lrteta) dimension x(l),xk(l) do 1 i = lrm if(i - 1) 2,3,2 3 x(i) = teta go to 1 2 x(i) - x(i) - teta*xk(i) 1 continue return end subroutine S0L07(u,m,xkf1) dimension u(l)rxk(l) ml = m - 2 do 1 j - 1,ml lj - m*(j - 1) + 1 u(lj) = u(lj)/xk(l) 1 continue do 2 i = l,m do 4 j - l,ml if(i - 1) 3,4,3 3 ij = m*(j - 1) -M lj = m*(j - 1) + 1 u(ij) - u(ij) - u(lj)>k(i) 4 continue 2 continue return end subroutine S0L08(u,m,a,n,j,del) dimension u(l),a(l) del = 0. do 1 i « l,m ml = m*i - 1 ij - m*(j - 1) + i del - del + u(mi)*a(ij) 1 continue return end subroutine SOL09(tmin,u,m,a,n,nb,k) dimension u(l),a(l),nb(l) tmin = 0. ml = m - 2 do 1 j = lrn do 2 i = lrml if(j - nb(i)) 2.1.2. 2 continue
с call S0L08(u,m,a,n,j,del) с 1f(del - tmin) 3r3rl 3 tmin - del к = j 1 continue return end с subroutine SOL10(tmin,urmrarnrnbrkreps) dimension u(l),a(l),nb(l) tmin = 0. ml - m - 2 do 1 j - lrn do 2 i = l,ml if(j - nb(i)) 2,1,2 2 continue с call S0L02(urmra,n,jrdel) c call S0L08(u,m,a,n,j,dell) с if(abs(dell) - eps) 3,3,1 3 if(del - tmin) 4r4,l 4 tmin = del к = j 1 continue return end Пользователю, как правило, достаточно знать правила обращения только к программе MODSM. Входные параметры: п — количество переменных; m — число, равное т/+2, где ml—число уравнений в системе ограничений; s — массив из m—2 чисел, содержащий правые части системы ограничений; t — одномерный массив из п чисел, содержащий коэффициенты при неизвестных в целевой функции; г — массив из (т — 7)хп чисел, содержащий коэффициенты при неизвестных в системе ограничений; ip — признак решения задачи (если ip=l, то находят максимум целевой функции, если ip = 0, то минимум); eps—положительное число, играющее роль нуля в неравенствах вида х<0, х>0; а — рабочий массив из тхп чисел; и — рабочий массив из т2 чисел; хк—рабочий массив из т чисел. Выходные параметры: ip—он же входной, признак окончания решения задачи (если ip=l, то найдено оптимальное решение; если ip = 2, то поставленная задача не имеет решения; если ip = 3, то целевая функция не ограничена); х—массив из т чисел, содержащий при ip=l оптимальное решение; nb—массив из m—2 чисел, содержащий при ip=l номера переменных в массиве х. Если x(l) = OLu *(2j=a2, ..., х(т)=ат, п(\)=пи nb(l)=n1, nb(2) = =п2, ..., nb(m—2)=nm-2, то оптимальное решение имеет вид лгИ1 = аь 273
x„2=a2, ..., ^^=0^,2. При этом f(xnt, х„2, ..., хт-2)= =<*„,-!. Возможно, что значение какого-нибудь nt будет больше 104, тогда номер соответствующей переменной равен 106 — щ. Если номера какой-либо переменной не оказалось в массиве nb, то значение этой переменной в оптимальном решении равно нулю. Перед обращением к программе MQDSM необходимо: 1) свести поставленную задачу к канонической задаче линейного программирования; 2) описать массивы а, и, xk, x, nb, г, s, t; 3) присвоить фактические значения параметрам m, n, ip, г, s, t. Задание. Используя программу MODSM (а, m, u, n, x, nb, ip, eps, xk, r, s, t), найти оптимальное решение основной задачи линейного программирования, если оно существует. Порядок выполнения лабораторной работы 1. Свести поставленную задачу к канонической форме. 2. Составить головную программу, содержащую описание массивов, ввод исходных данных, обращение к MODSM и печать результатов. При вводе элементов матрицы системы ограничений в массив г запись производить по столбцам. 3. Провести вычисления на ЭВМ. Пример. Найти максимальное значение линейной формы (целевой функции) f(x)=l0x1 — x2 — 9x3 — Sx4 при следующих ограничениях: — 2*!+ х2 +3лг3+х4 = 2, — 5х± + 2х2 + 3*4 = 5, 1х1 — 4х2 + х3+4лг4 ^ 1, Ъх1 + 2х2 + 5лг3 + 6лг4 ^ 10. А Сведем задачу к канонической форме. Поскольку в системе ограничений два неравенства, введем вспомогательные переменные по формулам: x5 = l— lxi+4x2—х3 — 4х4, х5^0, л;6 = 10 —Зл;1 — —2лг2 — 5лг3 ~ 6лг4, х6^0. В новых переменных задача принимает каноническую форму: найти минимум целевой функции /(х) = — 10х1+х2 + 9х3 + 8х4 + 0-х5 + 0-х6 при ограничениях — 2x1+X2 + 3x3 + X4 + 0-x5 + 0-x6 = 2, — 5*! + 2х2 + 0 • х3 + Злг4 + 0 • ;с5+0 • х6 = 5, Ix^— 4x2+x3 + 4x4+X5 + 0-jc6 = 1, 3xi + 2х2 + 5х3 + 6х4 + 0 • х5 + х6 = 10. Таким образом, при обращении к MODSM нужно положить ip=l; n = 6, m = 6, элементам массива г присвоить последовательно значения -2; -5; 7; 3; 1; 2; -4; 2; 3; 0; 1; 5; 1; 3; 4; 6; 0; 0; 1; 0; 0; 0; 0; 1, элементам массива s — значения 2; 5; 1; 10 и элементам массива t—следующие значения: 10; — 1; —9; —8; 0; 0. 274
Программа, реализующая решение задачи, может иметь вид dimension r(24),s(4),t(6),x(6),nb(4),a(36) dimension u(36),xk(6) с data r/-2., -5.r 7., 3.r 1., 2., -4.r 2.r 3.r 0.r l.r 5.r l.r 3.r 4., 6., 0.r 0., 1., 0.r 0., 0,, 0.r 1./ data s /2., 5., 1., 10./ data t/10.r -1..-9..-8., 0., 0./ ip= 1 обращение к программе MODSM call M0DSM(ar6rur6rxrnbripr .le-06 rxkrrrsrt) печать результатов вычислений print 102,(x(i)ri-l,4) print 103rnb print 104,ip print 105,x(5) 102 format(2x,6ell.4) 103 format 2x,4(5x,i2,4x)) 104 format(2xr' ip= \i2) 105 format(2x/ значение целевой функции \ell.4) stop end Вычисления по программе привели к следующим результатам: 0.1428Е+00 0.1142Е+01 0.1142Е+01 0.4285Е+00 12 4 6 ip- 1 . значение целевой функции -0.8857Е+01 Таким образом, оптимальное решение имеет вид: хх =0,142859, х2 = 1,1428, х3 = 0, х4 = 1,142. Минимальное значение целевой функции /(*!, *2, *з> х4) равно —8,857. Варианты заданий Найти минимум (максимум) целевой функции f(\) при заданных ограничениях Номер варианта 1 Экстремум min /м 7XJ + 15X2 + 2X3 + 30X4 Ограничения х1 — Ъх2 + 2хъ — Зх4 ^ 2, -2хх -4х2 + 5х3 + 2л4< 1, Зх1—х2-\-2х3—х4'^4, х1+3х2 + 2х3-4х4^\, 275
Продолжение таблицы Номер варианта 2 *> 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Экстремум min max max max min max min max max max max max max min max /w 6xj+4x2+12x3+10x4 3xj+4x2 + 3x3 + X4 2xj— x2 + 4x3 + x4 2х,+х2+4хз-Х4 — 5xj + 4x2 + 3x3 + 6x4 4x, + 10x2 + 9x3 + 3x4 10XJ + 12X2 + 8x3 + 10x4 Xj + x2 + 2x3 + 7x4 + 5x5 3xj — x2 + 8x3 + 2x4 — x5 + 9x6 Xl+X2+X3+X4+X5+X6 + + Xj ~\~ Xg ~T Xg "T X | q 5xj — 4x2 — 3x3 — 6x4 2x1+x2 + 4x3-x4 4x1 + 10x2 + 9x3 + 3x4 10xj + 12x2 + 8x3 +10x4 Xj + x2 + 2x3 + 7x4 + 5x5 Ограничения Xj^0 {j=\,2, 3,4) 2xj + 3x2+4x 3 + x4^ 3, 2xj + x2 +4x3 — 2x4 ^ 4, x2 + 2x3 + 3x4^6, x^O (y=l,2,3,4) 2x1+4x2 + 8x4<12, /' 7x, +2x2 + 2x3 + 6x4<8, 5x{ + 8x2+4x3 + 3x4 < 48 x1+2x2 + 3x3 + X4<7, -3x,+4x2-x3 + 3x4<15, 2x, — 5x2 + 2x3 + 2x4 < 2 4xj — x2 + 3x3 — x4.<17, Xj+2x2-2x3-x4=l, -3xj+x2 + 5x3^2 X,+21x2 + X3 + 2x4<3, — x, — 14x2 — 2x3 + 3x4^2, —x,—6x2 + x3—x4^l -Xj +x2 + 3x3-x4<2, x1+x2 + x3 + 3x4^3 2x,+x2 + 4x3+x4>8, Xj+x2 + x3 + 4x4^5 Xj+x2 + x4 + 5x5 = 10, х1+х2 + Хз + 2х4+4х5 = 5, x,+x3 + x5=9 — 6x,+9x2 + 3x3 —12x5—x6<12, -4x2 + 3x3-3x4 + x5-x6<5, 2x ,+8x2-5x3 + 6x4-8x5 + 4x6^20, — Xj—3x2—4x3 —8x4 + 4x6<10, 5x1+x2 + 2x3 + 4x4 + 9x5 + 5x6<24 2XJ + X2-X3 + 4X4-X5 + X6+8X7 + + 2x8 + 3x9-Xj o = 100, 2x2 + 3x4-x8<50, x3<36, x6<20, x8^l, x9<5 Xj+21x2 + X3 + 2x4<3, x, + 14x2 + 2x3-3x4< -2, —Xj— 6x2 + x3 + x4^l 4xj—x2 + 3x3—x4^17, x1+2x2-2x3-x4^l, 3xj—x2 —5x3<— 2 x1-x2-3x3 + x4^-2, x1-x2 + x3 + 3x4^3. 2xj+x2 + 4x3 + x4^8, x1+x2 + x3+4x4>5 x1+x2 + x4 + 5x5<10, Xj+x2+x3 + 2x4+4x5<5, 276
Продолжение таблицы Номер варианта 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Экстремум min max min min min max min min max max max min min max /w 4x! + 3x2 + x3 X!+3X2 + X3 3xj—2x2—x3 3x!+3x2 + 4x3 5x1+2x2 —3x3+x4 3xj — 5x2 — 2x3 + 4x4 2xj + x2 — 3x3 + x4 + 2x5 3 - Xj — 2x2 — 3x3 — 2x4 x1+2x2-x3+x4 x1+x2-x3+x4 x1+x2-x3+x6 x1+x2 + x3+x4 2x1+2x2—x3—x4 0,4xj + 0,2x2 + 0,5x3 + 0,8x4 Ограничения x1+x3 + x5<9 3xj—x2 —2x3^l, 2x!+4x2 — 5x3^3, —x1+2x2—x3^l 3x1+2x2—x3<5, Xj—4x2 —2x3<3, 2xj—5x2 + x3<2 x1+x2 + x3^5, 21x1 + 14x2 + 6x3^42, —Xj—2x2 + x3<4, 2xj—3x2+x3^—6. 4x1+x2 + 3x3^14, 2x1+x2 + x3'^\0, 2x^2x2 + 2x3^14, х^Зхг + Хз^Ю 2x1-x2 + x3+x4<5, x1-\-x2-x3-x4<i2, 5xj-8x2 + 2x3+4x4<3 2x^X3 + 3X4^ 17, 4x1+x2 + x4<12, x1+2x2 + 8x3—x4<6 Xj + x2 — 3x4 + 2x5 < 5, 2x2-3x3+X4 + x5<4, 3xj — x2 + 2x3 — 2x5 ^ 3 3xj +4x2 + 3x3 -x4 < - 3, -2x1-x2 + x3 + 2x4^1 2xj— Зх2 + Хз + х4<3, Xj+2x3-X4<3, 3x1+x2+x3<8 x1+x3-2x5 + x6<4, x2-2x5-x6<5, —x3 + 3x5—x6<7, x3 —x4—4xj+4x2^ —3 Xl+X3_2x5+X6^4» x2-2x5-x6<5, x3 + 3x5 + x6<7, x3-x4-4x5+4x6<3 3x1+2x2 + x3^8, Xj + 6x2 + 9x3 +13x4 ^ 1 x1-x2+2x3-x4<2, 2x1-\-x2 — 3x3 + x4<6, X!+X2 + X3+X4<7 x1 + 2x2 + 4x3 + 8x4 < 24, 3x1 + 5x2+x3<12, 6x1+3x3 + x4<35 277
Лабораторная работа 42 РЕШЕНИЕ ЗАДАЧИ ДИРИХЛЕ ДЛЯ УРАВНЕНИЯ ЛАПЛАСА МЕТОДОМ СЕТОК В настоящей лабораторной работе методом сеток требуется решить задачу Дирихле для уравнения Лапласа в прямоугольной области. Эта задача ставится следующим образом. Найти непрерывную функцию и(х, у), удовлетворяющую внутри прямоугольной области Q = {(х, У) | 0 =$ л; =$ я, O^y^b}, уравнению Лапласа дх2 ду2 и принимающую на границе области Q. заданные значения, т. е. и(0, y)=fi(y), уе[0,Ь]9 u{a, y)=f2(y), je[<U], и(х, 0)=f3(x), xe[0, a], u(x, b)=f4r(x), хе[0, я], где /ь /2, /3, /4—заданные функции. Будем считать, что и(х, у) непрерывна на границе области Q, т. е. Л(0)=/3(0), Л(Ь)=МЩ, fi{0)=f3{a), f2{b)=h{a). Выбрав шаги А, / по и у соответственно, строим сетку xt = ih, /=0, 1, ..., Л> У1=Я 7 = 0, 1, ..., т, где xn = nh = a, ym = ml=b. Вводя обозначения щ^ = и(хьу^ аппроксимируем частные д2и д2и производные —-^ и —— в каждом внутреннем узле сетки центральными разностными производными второго порядка d2u = ui+ltj-2ulj+ul.lj Q/h2\ дх2 h7 д 2 U _ UU j + ! — lUij + UU j _ ± + 0{l2) ду2 I2 и заменим уравнение Лапласа конечно-разностным уравнением ui + 1j-2uu+ui-1juij+1-2uij+uij.1_ h2 ^ /2 ' К } /=1, ..., и-1, у"=1, ..., /и-1. Погрешность замены дифференциального уравнения разностным составляет величину 0(h +/2). Уравнения (1) вместе со значениями utj в граничных узлах образуют систему линейных алгебраических уравнений относительно приближенных значений функции и (х, у) в узлах сетки (xi9 yj). Наиболее простой вид имеет эта система при h = l: Uij = {ut+ij + Ui-u + Uij+i + 4j-i)l4> (2) и«о=/з(4 uUm=h{xi\ Uoj=fi{yt)> Unj=fi{yi\ /=1, ..., w-1, у=1, ..., /и-1. 278
[а.м (HMJ) m '«*ц i-1 a x При получении сеточных уравне- t ний (2) была использована схема г узлов, изображенная на рис. 27. Набор узлов, используемых для аппрок- >+/ симации уравнения в точке, называ- j ется шаблоном. В данной работе j-i используется шаблон типа «крест». Численное решение задачи Ди- ' рихле для уравнения Лапласа в прямоугольнике состоит в нахождении приближенных значений utj искомой функции и(х, у) во внутренних узлах сетки. Для определения величин Uij требуется решить систему линейных алгебраических уравнений (2). В дайной лабораторной работе система (2) решается итерационным методом Гаусса—Зейделя, который состоит в построении последовательности итераций вида M(S+1)_I[ (5+1) , (5) , (5) . M(S+1)-| Uij —д lUi-lJ^Ui+l,j^Ui,j+l^UiJ-lJ ;+/ Рис. 27 (верхним индексом последовательность и С») обозначен номер итерации). При л-»оо сходится к точному решению системы (2). В качестве условия окончания итерационного процесса можно принять max\uf)-ufj+1)\<z, l^Kn-l, l^j^m-l. Однако этот критерий недостаточно надежен, поскольку итерационный процесс сходится медленно. На практике применяют более надежный критерий max|W5+1)-"S')l<e(l-v), ij где v=- max|w£. '-w;.y| (s-Dl max|w;.y — ufj ij Таким образом, погрешность приближенного решения, полученного методом сеток, складывается из двух погрешностей: погрешности аппроксимации дифференциального уравнения разностными; погрешности, возникающей в результате приближенного решения системы разностных уравнений (2). Известно, что описанная здесь разностная схема обладает свойством устойчивости и сходимости. Устойчивость схемы означает, что малые изменения в начальных данных приводят к малым изменениям решения разностной задачи. Только такие схемы имеет смысл применять в реальных вычислениях. Сходимость схемы означает, что при стремлении шага сетки к нулю (т. е. при h->0) решение разностной задачи стремится в некотором смысле к решению 279
исходной задачи. Таким образом, выбрав достаточно малый шаг А, можно как угодно точно решить исходную задачу. Описанный выше алгоритм решения задачи Дирихле реализован в виде подпрограммы (subroutine) LAPL (a, nn, b, mm, fl, f2, f3, f4, u, eps): subroutine LAPL (a,nn,brmm,fI.f2,f3,f4,u,eps) C* M*MM m.mmmmmmmh» mm.mmmmm с Программа LAPL решает задачу Дирихле для уравнения * с Лапласа в прямоугольнике [0,А]*[0,В] с а - значение А с пп - количество узлов по х на [0,A]r nn <= 101 с b - значение В с mm - количество узлов по у на [0,В], mm <= 101 с с fl,f2,f3,f4 с - имена программ, вычисляющих граничные условия * с при х = 0, х = а, у = 0, у = b соответственно * с и - массив размерности nn'mm, содержащий с значения с решения в узлах сетки * с eps - погрешеность итерационного процесса при решении * с линейной системы методом Зейделя с dimension u{101,101) . n = nn m = mm n = n - 1 m = m - 1 hy = b/m ! шаг по у hx = a/n ! шаг по х r2 = I0.e+10 t = (hx/hy)'¥2 с с вычисление решения в граничных узлах с do 1 j = lrmm У = hy'U - 1) u(l.j) - fl(y) 1 u(nn,j) = f2(y) do 7 i = l,nn x = hx*(i - 1) u(i,I) - f3(x) 7 u(i,mm) = f4(x) с с вычисление нулевого приближения с do 2 i = 2,п do 2 j = 2rm 2 u(i,j) = 1. с с решение линейной системы методом Гаусса-Зейделя с 280
с 3 rl = г2 г2 = 0. do 4 i = 2,n do A j = 2,m x = 0.54u(i-l,j) + u(i + lrj) + u(i,j-l)4 + u(i,j+l)U)/(t + 1) г - abs(x - u(i,j)) if(r2.gt.r) go to 4 r2 - г 4 u(i,j) - x te - eps*(l. - r2/rl) с if(r2.gt.te) go to 3 с return end Входные параметры: а—значение а, правый конец отрезка [0, а]; пп—количество шагов сетки по х; Ъ—значение Ь, правый конец отрезка [0, 6]; mm—количество шагов сетки по у; fl—имя внешней подпрограммы-функции, вычисляющей значение f\[y)\ f2—имя внещней подпрограммы-функции, вычисляющей значение fiiy)', f(3) — имя внешней подпрограммы-функции, вычисляющей значение /ъ(х)\ f4—имя внешней подпрограммы-функции, вычисляющей значение f4 (x); eps—значение е из условия окончания итерационного процесса Гаусса—Зейделя. Выходной параметр: и—двумерный массив из nn x mm действительных чисел, содержащий значение решения в узлах сеткц. Перед обращением к программе LAPL необходимо: 1) описать массив и (101, 101); 2) описать имена fl, f2, f3, f4 оператором external; 3) присвоить фактические значения параметрам a, b, nn, mm, eps. Задание. Используя подпрограмму LAPL, решить задачу Дирихле для уравнения Лапласа в прямоугольной области. Результат печатать в виде таблицы из mm-й строки и nn-го столбца. Порядок выполнения лабораторной работы 1. Составить подпрограммы-функции f 1 (у), f2(y), f3(x), f4(x), вычисления значений граничных функций fi(y), fi{y), /з(х), Ai*)- 2. Составить головную программу, содержащую описание имен fl, f2, f3, f4 и массива и, обращение к LAPL и печать результатов. 3. Произвести вычисления на ЭВМ. Пример. Решить на сетке из 11 узлов по х и 11 узлов по у задачу Дирихле для уравнения Лапласа: S+S=0' *б[0, 1], ,б[0, 1], 281
и(0,у) = 0, и(х,0) = 0, и(1,у)=у, уе[0, 1], и(х, 1)=х, *е[0, 1]. А Программа решения задачи может иметь следующий вид: dimension u(101,101),x(ll),y(.ll) external fl,f2,f3,f4 e - 0.0001 n = 11 m - 11 с с вычисление координат узлов сетки с do 1 i = 1r11 y(i) « 0.r(i - 1) 1 x(i) - 0.1'(i - 1) с с обращение к программе LAPL, решающей задачу Дирихле с call LAPL ( 1.. n, 1., m, fl, f2, f3, f4, u, e) с write(3,2) у ! печать заголовка write(3,4) ! таблицы с do 5 i - 1,11- ! печать результатов с write(3,3) x(1)r(u(1.j).j-l.ll) 5 continue stop с 2 format(6x,'y\3xfll(f5.3,2x)) 3 format(4x,f3.1,3x,ll(f5.3,2x)) 4 forraat(2x/x') end с function fl(y) с Подпрограмма-функция, вычисляющая граничные * с условия при х = 0 с *••• fl - 0. return end с function f2(y) с * ••••••••* с Подпрограмма-функция, вычисляющая граничные с условия при х - а • с*'* * f2 - у return end function f3(x) 282
с Подпрограмма-функция, вычисляющая граничные * с условия при у - О с * *••»•••»•„•••••••••••••• f3 - 0. return end с function f4(x) с„„,мммммммммммнм»мнммтммммнм»*». с Подпрограмма-функция, вычисляющая граничные • с условия при у = b с * ••* .*...•....»..*.....••*.**..*.••♦ f4 = х return end Вычисления по программе привели к следующим результатам: У .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1.0 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .100 .000 .010 .020 .030 .040 .050 .060 .070 .080 .090 .100 .200 .000 .020 .040 .060 .080 .100 .120 .140 .160 .180 .200 .300 .000 .030 .060 .090 .120 .150 .180 .210 .240 .270 .300 .400 .000 .040 .080 .120 .160 .200 .240 .280 .320 .360 .400 .500 .000 .050 .100 .150 .200 .250 .300 .350 .400 .450 .500 .600 .000 .060 .120 .180 .240 .300 .360 .420 .480 .540 .600 .700 .000 .070 .140 .210 .280 .350 .420 .490 .560 .630 .700 .800 .000 .080 .160 .240 .320 .400 .480 .560 .640 .720 .800 .900 .000 .090 .180 .270 .360 .450 .540 .630 .720 .810 .900 1.000 .000 .100 .200 .300 .400 .500 .600 .700 .800 .900 1.000 Варианты заданий Найти решение и(х,у) задачи Дирихле в квадрате со стороной 1 для уравнения Лапласа с краевыми условиями вида м(0, y)=fi(y) (O^y^l), м(1, y)=f2{y) (O^o^l), tt(jc,0)=/3(jc) (0<jc<1), u(x,l)=fA(x) (0<jc<1) Номер варианта 1 2 3 4 5 6 7 8 Му) у2 еу-еу2 -у2+1 0 е'+.у2(1-е)-1 У2 0 2е>>-(1+2е)у2-1 h(y) cos^-f (2—cosl)^ У У У У cosy+y{b —cosl) У -у /эМ хъ -х3+\ sinx-f 1 — -x3(l+sinl) sinx — x3sinl 0 x3 sinx — x3sinl -x3 + 1 AM x+1 x2 X X X 2x+\ x2 x-2 283
Продолжение таблицы Номер варианта 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Му) -\0у2 -Ъу+6 -1у2-5у+3 -ву2-4у+2 -5у2-Зу+\ -\9у2-\1у+\5 -2у-4у2 1 1 1 е->2 -у3 5у-у2 Ъ-1у 5-8д> у2 + 4у У2 У2 У 0 0 — sin у 1 ш -Щ2-ЪЪу+22 -1у2-2\у+\Ъ -бУ-18>>+10 -5у2-\5у+1 -\9у2- 57>>4-49 4-12>>-4>>2 У+1 У+1 еу е1"'2 1-73 4+5у-у2 1-6у \\-ly у2 + 4у+4 0-^)2 у2 + 2у у+е tg>> sin ^ sin(l— у) 1+ COSJ> /эМ 9x24-7x4-6 6x24-4x4-3 5x24- 3x4-2 4x24-2x4-1 18x24-16x4-15 x4-3x2 1 1 1 e*2 x2 x24-3x 4x-f3 6x-f5 x24-3x x2 x2 —x ex 0 0 sin л: X AM 9x2-15x-12 6x2-12x-9 5x2-llx-8 4x2-24x-21 18x2-24x-21 -6-9x-f 3x2 jc+1 x24-l ex e*2"1 x2-l x2 + 3x4-4 5x-4 7x-3 x24-3x4-5 (x-l? x24-x4-l ex4-l tg* sinx sin(x —1) x 4- cos x Лабораторная работа 43 РЕШЕНИЕ СМЕШАННОЙ ЗАДАЧИ ДЛЯ УРАВНЕНИЯ ГИПЕРБОЛИЧЕСКОГО ТИПА МЕТОДОМ СЕТОК Рассмотрим смешанную задачу для однородного уравнения колебаний струны. Задача состоит в отыскании функции и(х, t), удовлетворяющей при *>0 уравнению ^=c2g, 0<х<а, 0<Г<Г, (I) 284
начальным условиям ди u(x,0)=f(x), v-(x,0)=g{x), O^x^a, (2) и краевым условиям и(0, t) = \L±(t)9 u(a, t) = \i2(t), O^t^T. (3) Так как замена переменных t-+ct приводит уравнение (1) к виду д2и_д2и то в дальнейшем будем считать с=1. Для построения разностной схемы решения задачи (1) — (3) построим в области D = {(x, t)\0^x^a, O^t^T} сетку xt = ih9 i=0, 1, ..., n, a = h-n, tj=jx,j=0, 1, ..., т, тт=Ти аппроксимируем уравнение (1) в каждом внутреннем узле сетки на шаблоне типа «крест» (рис. 28). Используя для аппроксимации частных производных центральные разностные производные, получаем следующую разностную аппроксимацию уравнения (1): «i.j+i—2MijH"Mf.j-i_Mf+i.j —2м<|/-Ьц,-1>>/ (4) Здесь utj—приближенное значение функции и(х, t) в узле Полагая Х = х/И, получаем трехслойную разностную схему Ui,j+i=2(l-X2)uij + X2(ui+1j-ui-ltj)-uij-1, i=l, 2, ..., п. (5) Для простоты в данной лабораторной работе заданы нулевые граничные условия, т.е. |i1(r) = 0, ц2(*) = 0. Значит, в схеме (5) uoj = Q, unj = 0 для всех J. Схема (5) называется трехслойной потому, что связывает между собой значения ии функции и(х, t) на трех временных слоях с номерами j— 1, j, j+l. Схема (5) явная, т. е. позволяет в явном^ виде выразить utj через значения и с предыдущих двух слоев. Численное решение задачи состоит в. вычислении приближенных значений utj решения и(х, t) в узлах (xh tA при /=1, ..., л, 7=1, 2, ..., т. Алгоритм решения основан на том, что решение на каждом следующем слое (7 = 2, 3, 4, ..., п) можно получить пересчетом решений с двух предыдущих слоев (7 = 0, 1, 2, ..., п — 1) по формуле (5). На нулевом временном слое (7 = 0) решение известно из начального условия ui0=f(Xi). j га н км %л ющ рт Рис. 28 285
Для вычисления решения на первом слое (/=1) в данной лабораторной работе принят простейший способ, состоящий в том, что если положить g(x,o)*"(*'T);"M), (6) то un = ui0 + Tg(Xi), /=1, 2, ..., л. Теперь для вычисления решений на следующих слоях можно применять формулу (5). Решение на каждом следующем слое получается пересчетом решений с двух предыдущих слоев по формуле (5). Описанная выше схема аппроксимирует задачу (1) — (3) с точностью 0(x + h2). Невысокий порядок аппроксимации по т объясняется использованием слишком грубой аппроксимации для производной по t в формуле (6). Схема устойчива, если выполнено условие Куранта i<h. Это означает, что малые погрешности, возникающие, например, при вычислении решения на первом слое, не будут неограниченно возрастать при переходе к каждому новому временному слою. При выполнении условий Куранта схема обладает равномерной сходимостью, т. е. при А->0 решение разностной задачи равномерно стремится к решению исходной смешанной задачи (1) — (3). Недостаток схемы в том, что как только выбрана величина шага сетки h в направлении х, появляется ограничение на величину шага 1 по переменной г. Если необходимо произвести вычисления для большого значения величины Т, то может потребоваться большое количество шагов по переменной г. Указанный недостаток характерен для всех явных разностных схем. Для оценки погрешности решения обычно прибегают к методам сгущения сетки. Для решения смешанной задачи для волнового уравнения по явной разностной схеме (5) предназначена подпрограмма (subroutine) GIP3 (hx, ht, ul, u2, u3, n). Программа GIP3 вычисляет решение на каждом слое по значениям решения с двух предыдущих слоев: subroutine GIP3 (hxrht,ulru2ru3r1c) с Программа GIP3 решает смешанную задачу для * с гиперболического уравнения методом сеток по * с трехслойной схеме * с с hx - шаг по х * с ht - шаг по t * с ul - массив, содержащий решение на предыдущем временном* с слое * с и2 - массив, содержащий решение на текущем временном * с слое * с иЗ - рабочий массив * с к - число узлов сетки по х * с размерность массивов ul,u2,u3 равна п * с 286
с Результат: ' с и2 - содержит решение в узлахчя текущем слое, с ul - содеожит решение в узлах на Предыдущей слое dimension ul(l),u2(2),u3(l) n - n - 1 с „x вычисление параметра сетки для проверки условия Куранта с al - ht/hx If(al.gt.l) go to 3 с bl - аГ*2 al - 2.*(1. - bl) с с вычисление решения на очередном слое с do 1 i - 2,n u3(i) - al*u2(i) + bl*(u2(i+l) + u2(i-l)) - ul(1) 1 continue do 2 i - 2,n ul(1 - u2(1 u2(1) - u3(1 continue return 3 print V нарушено условие Куранта ' return end Входные параметры: hx—шаг сетки h по переменной х; ht—шаг сетки т по переменной t; к—количество узлов сетки по х, a = hn\ ul—массив из к действительных чисел, содержащий значение решений на (/—1) временном слое, 7=1,2,...; и2— массив из п действительных чисел, содержащий значение решений на 7-м временном слое, j=\, 2, ...; иЗ—рабочий массив из к действительных чисел. Выходные параметры: ul—массив из п действительных чисел, содержащий значение решения из j-м временном слое, 7=1,2,...; и2—массив из п действительных чисел, содержащий значение решения на (7+1)-м временном слое, у= 1, 2, .... Предусмотрена возможность циклического обращения к программе GIP3, т. е. перед первым обращением к программе необходимо присвоить начальное значение решения элементам массива и2, а элементам массива ul—значения решения на первом слое, вычисленные по формулам (6). При выходе из подпрограммы GIP3 в массиве и2 находится значение решения на новом временном слое, а в массиве ul—значение решения на предыдущем слое. Для вычислений с помощью программы GIP3 необходимо: 287
1) описать массивы ul, u2, u3; 2) присвоить фактические значения параметрам n, hx, ht (соблюдать условие Куранта!); 3) присвоить начальное значение решения элементам массива и вычисленное по формулам (6) значение решения на первом слое; 4) обратиться к GIP3 в цикле к—\ раз, если требуется найти решение на к-м слое по t(k ^2). Задание. Используя программу GIP3, решить смешанную задачу для однородного волнового уравнения с нулевыми граничными условиями в области D = {(x, t)\, O^x^l, 0^/^Г}. Результаты печатать на каждом временном слое. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую циклическое обращение к GIP3 с печатью результатов на каждом шаге (см. выше). 2. Составить подпрограмму-функцию, вычисляющую значение функции f(x) для начального значения и(х9 0). 3. Составить подпрограмму-функцию g(x), вычисляющую значения g(x) для задания начального значения — (х, 0). dt 4. Произвести вычисления на ЭВМ. Пример. Решись задачу о колебании струны единичной длины с закрепленными концами, начальное положение которой изображено на рис. 29. Начальные скорости равны нулю. Вычисления выполнить с шагом h по х, равным 0,1, с шагом т по /, равным 0,05, провести вычисления для 16 временных слоев с печатью результатов на каждом слое. Таким образом, задача имеет вид S=S. «[0,1], fe[0,F], u(x,0)=f(x), хе[0, а], — (х, 0)=g(x), xe[Q, а], и(0, t) = 0, и(1, t) = 0, /е[0, 0.8], . v \2х, хе[0, 0.5], fM = \2-2x, xe[0.5, 1],^ = °- А Строим сетку из 11 узлов по х и выполняем вычисления для 16 слоев по /. Программа, реализующая вычисления, имеет вид 288
dimension ul(ll),u2(ll),u3(ll) dimension хр(Ц) с с с с с с с с с с с с с с с с с с с с с п hx ht xp xp * 11 ! * 0.1 ! - 0.05 ! (i) - о. И) - 1. do 1 i = 2,10 x - (i - l)'hx xp(i) - x ul i) - f(x) ! u2(i) « ul(i) + ht*g(x) ! 1 continue задание граничных условий ul ul< u2 u2 u3 u3 [D " 0. ! 11) - 0. ! I) -0. ! II) - 0. * ! 1) - 0. ! И) - 0. ! write(3,5) xp ! t - 0. печать решения на нулевом слое write(3,3) t,ul t - ht печать решения на первом слое write(,3,3) t,u2 do 4 j - 1,15 количество узлов шаг по х - hx шаг по t - ht u(x,0) на 0 слое u(x,ht) на 1 сло< и и и и и ul [Ml O.ht) l.ht) 0.2ht) l,2ht) печать заголовка обращение к программе GIP3, вычисляющей решение на очередном временном слое call GIP3 ( hxr ht, ul t - t + ht печать решения на очередном слое 4 con write(3,3) t,u2 tinue , u2, u3r n) stop 187
3 format(lx,'t*\f4.2,lx,ll(f6.3,lx)) 5 format(8xrll(' x=\f3.1,lx)/) end function f(x) Подпрограмма-функция, вычисляющая решение при t=0 if(x.le.0.5) goto 1 f - 2. - 2.*x goto 2 1 f * 2.'x 2 return end function g(x) с >** ** * с Подпрограмма-функция, вычисляющая производную с решения при t - О д- 0. return end Вычисления по программе привели к t- .00 t= .05 t- .10 t- .15 t- .20 t- .25 t- .30 t- .35 t- .40 t- .45 t- .50 t- .55 t- .60 t- .65 t- .70 t= .75 t- .80 x= .0 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 x- .5 1.000 1.000 .900 .750 .612 .519 x= .1 .200 .200 .200 .200 .200 .200 .200 .197 .185 .155 .097 .006 -.105 -.208 -.273 -.281 -.241 x- .6 .800 .800 .800 .775 .700 .577 x= .2 .400 .400 .400 .400 .400 .398 .389 .360 .297 .195 .065 -.068 -.180 -.261 -.319 -.371 -.420 x- .7 .600 .600 .600 .600 .594 .566 следующим результатам x= .3 .600 .600 .600 .600 .594 .566 .498 .388 .253 .122 .020 -.057 -.131 -.223 -.338 -.455 -.548 x= .8 .400 .400 .400 .400 .400 .398 x= .4 .800 .800 .800 .775 .700 .577 .436 .315 .229 .160 .078 -.032 -.158 -.274 -.365 -.442 -.525 x- .9 .200 .200 .200 .200 .200 .200 x-1.0 .000 .000 .000 .000 .000 .000 29a
.454 .380 .274 .145 .024 -.070 -.145 -.227 -.333 -.454 -.570 .436 .315 .229 .160 .078 -.032 -.158 -.274 -.365 -.442 -.525 .498 .388 .253 .122 .020 -.057 -.131 -.223 -.338 -.455 -.548 .389 .360 .297 .195 .065 -.068 -.180 -.261 -.319 -.371 -.420 .200 .197 .185 .155 .097 .006 -.105 -.208 -.273 -.281 -.241 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 Варианты заданий д2и д2и Решить смешанную задачу для волнового уравнения —=- =—? с начальными dt1 dxz ди w(jc, 0)=f(x% — (x, 0)=g(x), O^x^l и нулевыми краевыми условиями и(0, 0 = и(1, 0 = 0 Номер варианта 1 2 3 4 5 6 7 8 9 10 gix) У С Jfx) А /1 \ lb /х У с 0 9W i I 1 X а 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,0 10,0 b 0,05 0,10 0,15 0,20 0,25 0,30 0,35 0,40 0,45 0,50 с 1,5 1,6 1,7 1,8 1,9 -2,0 -2,1 -2,2 -2,3 -2,4 d 0,05 0,10 0,15 0,20 0,25 0,30 0,35 0,40 0,45 0,50 е 0,45 0,50 0,55 0,60 0,65 0,70 0,75 0,80 0,85 0,90 Номер варианта 11 12 13 14 15 fix) х(х2-\) sin (я*)cos* sin (ял: ) jcsin(2(jc-l)) 4х3(;с-1) Six) 0 0 0 0 0 Номер варианта 16 17 18 19 20 fix) х2(х-\) (а:—1) sin2 а:. (х-1)1п(1+;с) sin(.xe*)sin(.x:— 1) 10х(;с3-1) *(*) о оо оо 291
Продолжение таблицы Номер варианта 21 22 23 24 25 26 27 28 29 30 У а . i fix) 'ТТЛ Z_J LL ? /? С J X £ [ gfx) / i \ l 1 x a 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,0 10,0 b 0,10 0,15 0,20 0,30 0,40 0,50 0,60 0,70 0,80 0,90 с 0,20 0,30 0,40 0,50 0,60 0,70 0,80 0,90 0,95 1,00 d -1,0 -3,0 -4,0 -5,0 -1,0 1,0 2,0 2,5 3,0 3,5 e 0,10 0,20 0,30 0,40 0,50 0,60 0,70 0,80 0,90 0,95 Лабораторная работа 44 РЕШЕНИЕ СМЕШАННОЙ ЗАДАЧИ ДЛЯ УРАВНЕНИЯ ПАРАБОЛИЧЕСКОГО ТИПА МЕТОДОМ СЕТОК Рассмотрим смешанную задачу для однородного уравнения теплопроводности. Задача состоит в отыскании функции и(х, t), удовлетворяющей в области D = {(x, f)|O<*<0> 0</^Г} уравнению ди , д2и /j х лЧ — = к —г fc = const>0), dt дх2 v ; О) начальному условию и{х, 0)=f(x) (2) и краевым условиям первого рода и(05 0 = М0> "(*> 0 = М0- ' (3) К задаче (1)—(3) приводит, в частности, задача о распространении тепла в однородном стержне длины а, на концах которого поддерживается заданный температурный режим. Краевые условия второго и третьего рода в данной лабораторной 292
работе не рассматриваются. Замена переменных t-+t/k приводит уравнение (1) к виду ди_д2и поэтому в дальнейшем будем считать к=\. Построим в области D = {(x, t)\0^x^a, O^t^T} равномерную прямоугольную сетку с шагом И в направлении х и шагом т—в направлении t (рис. 30). Обозначим узлы сетки через (х0, *0), ..., (xi9 tj), ..., а приближенные значения функции и(х, t) в этих узлах — ui}. Тогда xt = ih, / = 0, 1, ..., л, h = ajn; t,=jT, 7 = 0, 1, ..., т, х = Т/т. Аппроксимируем уравнения (1) на четырехточечном шаблоне, который изображен на рис. 30 жирными линиями. В результате получаем неявную двухслойную разностную схему: Ьщ+1.]-(1 + 2Ь)ич+ЬЩ-1.]=-Щ9]-1> (4) которая аппроксимирует уравнение (1) с погрешностью 0(x + h2). Здесь X = x/h2. Схема (4) аппроксимирует уравнение (1) только во внутренних узлах сетки, поэтому число уравнений в схеме (4) меньше числа неизвестных utj. Недостающие уравнения получают из краевых условий и<и = М0)> "п; = М'Д (5) Схема (4)—(5) неявная, поэтому значения щ. находят как решение системы линейных уравнений (4). Для решения системы (4) можно применять любой алгоритм решения систем линейных уравнений, однако система (4) обладает трехдиагональной матрицей и рациональнее всего решать ее методом прогонки (см. лабораторную работу 30). Таким образом, решив систему разностных уравнений, найдем значения функции и на временном слое у, если известно решение на временном слое j—l. Итак, алгоритм численного решения задачи имеет следующий вид. На нулевом временном слое 0 = 0) решение известно из начального условия щ0=/(х(). На каждом следующем слое искомая функция определяется как решение системы (4)—(5). Замечательным свойством неявной схемы (4) является ее устойчивость при любых значениях параметра X = x/h2 >0. Преимущества схемы (4) особенно ощутимы при сравнении с явной схемой, которая получается при аппроксимации уравнения (1) на шаблоне, изображенном на рис. 31. Явная схема оказывается устойчивой только при А,<1/2, т.е. при т^А2/2. Это означает, что t т j j-1 HI) ML Ы w 1-1 I it/ Рис. 30 293
щ (Lj+1) w N) t\ вычисления по явной схеме придется т\—,—i—,—,—i—i вести с очень малым шагом по т, что, конечно, может привести j+i I—I—у)—f'y//L .J—I к большим затратам машинного J I—II \,.А' 1—I времени. В неявной схеме вычисления на одном шаге требуют больше операций, чем в явной схеме, но зато величину шага т можно выбрать как угодно большой без риска нарушить устойчивость схемы. Все это позволяет значительно уменьшить машинное время, необходимое для решения задачи. Схема (4) обладает сходимостью. Это означает, что при А, т -+ О, решение разностной задачи (4)—(5) стремится к точному решению смешанной задачи (1)—(3). Для численного решения задачи (1)—(3) предназначена подпрограмма (subroutine) PARPR (hx, ht, n, u, p, q): H I 1*1 Рис. 31 subroutine PARPR (hx,ht,n,u,p,q) c*********************************************************** Программа PARPR решает смешанную задачу для уравнения теплопроводности на отрезке [0,1] hx - шаг сетки по х ht - шаг сетки по t п - число узлов сетки по х и - массив размерности п, содержащий текущее значение решения p,q - рабочие массивы размерности п Результат: и - массив, содержащий решение на очередном слое с*********************************************************** dimension u(l),p(l),q(l)M,v(l) b а ht/hx**2 ■ l.+2.*b p(l) - 0. q(l) - u(l) do 2 i « 2, n - 1 z » l./<a - b*p(i-l)) p(i) - b*z q(i) = (u(i) + b*q(i-l))*z continue 294
do 3 i - n-1,2,-1 u(i) - q(i) + p(i)*u(i+l) 3 continue с return end Программа PARPR решает систему (4) методом прогонки и вычисляет решение на каждом слое по значениям решения С предыдущего слоя. Входные параметры: hx—шаг сетки h по переменной •jc; ht—шаг сетки т по переменной t\ n — количество узлов сетки по jc; u—массив из п чисел, содержащий перед обращением к PARPR начальное значение решения в узлах первого слоя сетки; р, q — рабочие массивы из п чисел каждый. Выходные параметры: и—массив из п чисел (он же входной), содержащий значение решения в узлах очередного временного слоя сетки. Перед обращением к программе PARPR необходимо: 1) описать массивы u, p, q; 2) присвоить фактические значения параметрам hx, ht, n; 3) присвоить элементам и начальное значение решения в узлах первого слоя сетки. Задание. Используя программу PARPR, решить смешанную задачу с постоянными граничными условиями для однородного уравнения теплопроводности в области D = {(x, /)10 < х < 1, O^t^T}. Результаты печатать на каждом временном слое. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую обращение к подпрограмме PARPR. В головной программе предусмотреть: а) вычисление значений решения на нулевом временном слое по формуле ui0=f(xt); б) присвоение решению заданных граничных значений; в) печать результатов на каждом временном слое. 2. Составить подпрограмму-функцию для вычисления функции fix). 3. Провести вычисления на ЭВМ. Пример. Решить смешанную задачу: f=0;^[O5l],/6[O,1.28]; и(х, 0) = F(x), хе[0; I], и(0, *)=10, и(1, *) = 20, /е[0, 1.28] с шагом h по х, равным 0,1, с шагом т по /, равным 0,01. Здесь «=11. А Программа решения задачи имеет следующий вид: 295
dimension u(ll), p(ll), q(U), xp(ll) с с инициализация исходных данных задачи с п - 11 1 количество узлов hx - l./(n-l) 1 hx - шаг по х ht - 0.01 I ht - шаг по t хр(1> - 0. I узел х « 0 хр(11) » 1. I узел х « 1 и(1) - 10. t u(0,0) « 10 ц(11) - 20. 1 и(1,0) - 20 с с вычисление решения на нулевом временном слое о do 1 i - 2,п - 1 х - (i - l)*hx xp(i) - x u(i) - £(x) 1 continue с write(3,4) xp с t * 0. write(3,3) t,u k « 1 с с решение задачи для 128 шагов по t обращением к PARPR с do 2 j - 1,128 call PARPR (hx,ht,n,u,p,q) t - t + ht if (mod(j,k) .ne.0) goto 2 write(3,3) t,u k - 2*k 2 continue с stop с 3 format(lx,'t-',f4.2,lx,ll(f6.3,lx)) 4 format(8x,11(' x-',f3.1,lx)/) с end с function f(x) c*********************************************************** с Подпрограмма-функция, вычисляющая начальные * с условия * с*********************************************************** if(x - 0.5) 1,1,2 1 f * 10. - 20.*х go to 3 е 2 f - 40.*х - 20. 3 return end Вычисления по программе через 128 шагов привели к следующим результатам: 296
x* .0 x« .1 Xе .2 Xе .3 x= .4 t= .00 16.000 8.000 61000 4.000 2.000 t- .01 10.000 8.049 6.146 4.390 3.024 t- .02 10.000 8.158 6.425 4.970 4.095 t* .04 10.000 8.492 7.165 6.222 5.899 t* .08 10.000 9.215 8.598 8.305 8.470 t- .16 10.000 10.150 10.383 10.774 11.383 t- .32 10.000 10.809 11.637 12.500 13.413 t= .64 10.000 10.990 11.982 12.975 13.970 t-1.28 10.000 11.000 12.000 13.000 14.000 x- .5 x= .6 x= .7 x» .8 x" .9 x=1.0 .000 4.000 8.000 12.000 16.000 20.000 2.683 5.024 8.390 12.146 16.049 20.000 4.291 6.095 8.970 12.425 16.158 20.000 6.422 7.899 10.222 13.164 16.492 20.000 9.180 10.470 12.305 14.598 17.215 20.000 12.249 13.383 14.774 16.383 18.150 20.000 14.383 15.413 16.500 17.637 18.809 20.000 14.969 15.970 16.975 17.982 18.990 20.000 15.000 16.000 17.000 18.000 19.000 20.000 Варианты заданий _ ди д2и Решить смешанную задачу для уравнения теплопроводности — = —- с началь- dt дх2 ным условием и(х, 0)=f(x) и граничными условиями м(0, t) = a, "(1, 0 = ^ Номер варианта 1 2 3 4 5 6 7 8 fix) х(х-\) \+х2 х2(\-х) ln(l+jc) e_JC (х 2 + 0,5) cos (nx) х2 + х+\ cos л: а 0 1 0 0 1 0,5 1 1 b 1 0 2 0 In 2 1/е -1,5 3 cosl 1 Номер варианта 9 10 11 12 13 14 15 fix) xsinix— l) * sin (2 я*) i/(i+*2) хе " arctgx 1-х2 1/0+х) а 0 0 1 0 0 1 1 ъ 0 0 0,5 1/е я/4 0 0,5 Номер варианта 16 17 18 19 20 fix) У ь а 71 1 ! 1 1 1 1- 7 С 1 X а 1,2 1,4 1,6 1,8 2,0 b 3,5 4,5 5,5 6,5 8,0 с 0,15 0,35 0,55 0,75 0,95 d 297
Продолжение таблицы Номер варианта 21 22 • 23 24 25 26 27 28 29 30 /<*> У с а b У\ ь\ 0 h\ 1 ^^ л 1 1 ■ ' 1 0 d 1 х ±.А. с d /х а 9,0 11,0 13,0 15,0 17,0 11,1 7,0 5,0 3,0 1,0 ъ 4,0 6,0 8,0 10,0 12,0 14,5 15,5 17,0 18,0 19,5 с 21,00 23,00 25,00 27,00 29,00 0,10 0,20 0,30 0,40 0,50 d 0,05 0,35 0,55 0,75 0,95 0,35 0,45 0,55 0,65 0,75 Лабораторная работа 45 РЕШЕНИЕ СМЕШАННОЙ ЗАДАЧИ ДЛЯ УРАВНЕНИЯ УПРУГИХ КОЛЕБАНИЙ МЕТОДОМ СЕТОК Многие задачи динамической теории упругости сводятся к решению уравнения поперечных колебаний стержня 1 д2и 2 д*и л л „ 7>J?=-a j?> °<x<a> 0<t<T- 0) Для того чтобы полностью определить движение стержня, нужно уравнение (1) дополнить граничными и начальными условиями. Начальные условия задают начальное отклонение и начальную скорость стержня и имеют вид ди и(х, 0)=/(*), °Jt=g(x) (2) Граничные условия определяют режим движения концов стержня. Типичным граничным условием является условие «свободной опоры», согласно которому опоры препятствуют поперечному смещению стержня, но не создают изгибающий момент. 298
Эти условия записываются следующим образом: д2и д2и и(0, Г) = 0, ^ (0, *) = 0 и и(а, 0 = 0, ^ = 0. дх2 (3) В результате замены переменных х-+ x,Ja, t-+-t отрезок [я, Ь] переходит в отрезок [0, 1], а уравнение (1) принимает вид д2и__д4и J?~ Jx~*' Это Позволяет без ограничения общности считать, что в задаче (1)—(3) c=U а=\. Прежде чем построить разностную схему для решения задачи (1)—(3), введем две вспомогательные функции v(x, t) и w(x, t) по формулам ди д2и V=— И W=—-г dt дх2 и заменим уравнение (1) системой уравнений для функций v и w. Имеем (4) dv _ d2w dw_d2v Дополним схему (4) следующими начальными и граничными условиями: »(х, 0)=g(x)9 w(x, 0)=f"(x); (5) v(0, /) = 0, w(0, 0 = 0, v(l, 0 = 0, w(l, 0 = 0. (6) Если задача (4)—(6) решена, то решение задачи (1)—(3) находится по формуле т и(х, t)=f{x) + $v(x> t')dt'. (7) о Для построения разностной схемы задачи (4)—(6) построим в области Ь = {(х, /)/0<х<1, 0</<Г}. п сетку Xi = ih, / = 0, 1, ..., л, А=1/л, г tj=ji, 7 = 0, 1, ..., m, т = Т/т, систему уравнений (4) в каждом внутреннем у+/ узле сетки на шаблоне, изображенном у на рис. 32. Частные производные по времени будем аппроксимировать правыми разностными производными: dv /^/vii + l—vi dw _w{+1 — w{ /0 ~ —:— • (o) dt dt Рис. 32 / x 299
Частные производные по х будем аппроксимировать их полусуммой центральных разностных производных на слоях j и 7+1: дх2 (9) дх2 к2-2|_ h2 h2 J' lw_^ ]_ [v£j-2wi+1 + w№ W-i-2W + W+i"| x2~2|_ h2 h2 \ Используя формулы (8)—(9), получаем следующую разностную схему для аппроксимации системы уравнений (4): ,j+1-vj vj _(wi±i-2wi+i+wi}t)+(wi-l-2wi+wi+1) 2h2 wj+i-wj _(v£i-2vi+i+vi:i)+(vUl-2v{+vi+1) т 2h2 (10) Схема (10) относится к классу неявных, аппроксимирует решение исходной задачи с точностью 0(т2 + й2) и устойчива при любых соотношениях между х и h. Для построения алгоритма решения системы (10) введем двумерный вектор U/+1J и перепишем систему (10) в виде где At, Bt, С,—матрицы второго порядка и-1, (И) Л, = С, 0 — т L2A5 т lhx 0 . Bi = Го т L h1 т h1 0 векторы dt определяют по формулам ЧЯ- vt~Tk* (W-i-2w/+w/+1) 2h wi + TiT2 (vi-i-2vi+v{+1) 2h Итак, зная (из начальных условий) значения векторов z? на нулевом временном слое и решив систему (11), получим значения векторов z/ на 1-м временном слое, а по формулам (7)—значения функции и} на 1-м временном слое. Продвигаясь аналогичным образом на 2-й и последующие слои, получим решение задачи на всем промежутке [0, Т]. 300
Остановимся подробнее на алгоритме решения системы (11). Эта система аналогична системе (4) из лабораторной работы 30, только неизвестные здесь не числа, а векторы, и коэффициенты системы—матрицы. В лабораторной работе 30 система (4) решалась методом прогонки. Аналогичный алгоритм для системы (11) называется алгоритмом матричной прогонки. В методе матричной прогонки сначала определяется вспомогательный набор двумерных матриц Et и векторов f. по рекуррентным формулам Ео = 0, f0 = 0, fH^i-W-J-^.-C,^), ./=1, 2, ..., л-1. Этот этап вычислений называется прямым ходом прогонки. На втором этапе, который принято называть обратным ходом матричной прогонки, находятся искомые величины по формулам ж/+} = ^ж/+1 + Г£, / = л — 1, л-2, ..., 1. Описанный алгоритм решения смешанной задачи для уравнения упругих колебаний стержня реализован программой ELOS: subroutine ELOS (n,y,v,w,tau,ind) с„, •••••• „„,,,,,,, , с Программа ELOS решает граничную задачу для * с уравнения упругих колебаний методом сеток * с на отрезке [0,1] с с п - количество узлов сетки, п<* 100 • с у - массив размерности п, содержит значения * с решения в узлах сетки в начальный момент * с v - массив размерности п, содержит значения * с производной решения в начальный момент * с tau - шаг по переменной t * с ind - счетчик числа шагов по t • с с !!! перед обращением к программе ind~l !!! * с с Результат: • с у - массив, содержаний значение решения в узлах сетки * с в момент времени t - tau'ind • dimension e(404),f(202), y(l),v(l),w(l),d(202) с n - n -1 h - l./(n - 1) hh2 - h"2 301
th th2 tau/hh2 th/2. if(ind.gt.l) go to 100 do 1 j = 2rn - 1 W(j) = (y(j-l) - 2.'y(j) + y(j+l))/hh2 continue w(l wfn 0. 0. с инициализация начальных значений для прямого хода прогонки с 100 do 20 j - 1,4 20 continue ф) - 0. f(2) = 0. с do 2 j = 2,ri-l d(2\j-l) - v(j) - th2*(w(j-l) - 2.'w(j) + wj+1)) d(2\j ) « w(j) + Ш' v(j-l) - 2.*v(J) + v j+1)) 2 с с с с С С С continue прямой ход прогонки do 3 j - 2,n-l J2 - 24j - 1) J4 - 4*(j - 1) jm2 = j2 - 2 jm4 = j4 - 4 zll - 1. + th2*e(3+jm4) z22 = 1. - th2'e(2+jm4) zl2 = (-1. + 0.5*e(4+jm4))4h z21 - ( 1. - 0.5'e(l+jm4))4ti dlt - l./(zll'z22 - zl2'z21) yll = z22'dlt yl2 = -zl2'dlt y21 = -z21'dlt y22 - zll'dlt e(l+j4) = th2*yl2 e 2+j4) - -th2*yll e 3+j4) - th2'y22 e(4+j4) - -th2'y21 dl = d(2*j-l) - th24(2+jm2 d2 = d(2*j ) + th2*f(l+jra2 f(l+j2) - yll'dl + yl2'd2 f(2+j2) - y21'dl + yZ2'd2 302
с 3 continue с с инициализация начальных значений для обратного хода прогонки с п4 - (п - 2)4 п2 - (п - 2 *2 wll - е(1+п4) wl2 - е(2+п4) w21 - е(3+п4) w22 = е(4+п4) dlt = l./(wU*w22 - wl2'w21) pi = f(l+n2) p2 = f(2+n2) v(n) « 0. w(n) - 0. с с обратный ход прогонки с do 4 j - 1,п - 1 jj -.n - j J4 - (jj - 1)4 v(jj) - e(l+j4)*v(jj+l) + e(2+j4) •w(jj+l) + f(2\jj-l) w(jj) - e(3+j4)'v(jj+i) + e(4+j4) *w(jj+l) + f(2\jj) 4 continue с с построение решения с do 5 j - l,n y(j) - y(j) + v(j)4au 5 continue с ind - ind + 1 с return end Входные параметры: n—количество узлов сетки на [О, 1]; у—массив размерности п, содержит перед обращением к программе значения производной по t в начальный момент; v—массив размерности п, содержит перед обращением к программе значения производной по t в начальный момент; tau—шаг по t\ ind—счетчик числа шагов, перед обращением к программе равен 1. Выходные параметры: у—массив, содержащий значения решения в узлах сетки; v — массив, содержащий значения производной решения по t в узлах сетки. Задание. Решить смешанную задачу для уравнения упругих колебаний: %£=-% 0<*<1, 0<t<T, 303
u(x, 0)=f(x), yt(x, 0)=g(x), 0<x<l, n(0, /)=0, g(0, /) = 0, Ц1, f) = 0, g(l, /)^0, 0</<Г. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую присвоение начальных и граничных значений решения в узлах элементам соответствующих массивов, обращение к ELOS и печать результатов. 2. Проверить вычисления на ЭВМ. 3. Построить графики решения в различные моменты времени. Пример. Решить уравнение упругих колебаний стержня д2и д*и Л 1 л . 1 т-г=-^> 0<х<1, 0<*<1, дг дх* и(х, 0) = sinn;c, — (jc, 0) = 0, O^x^l, и(0, /) = 0, 0 (0, 0 = °' "0> 0 = °' j£(h ') = °> 0</<1. А Программа решения задачи может иметь следующий вид: dimension y(21),v(21),w(21) data pi/3.1415926/ с 10 с с с с ind = 1 п - 11 h = l./(n - 1) do 10 i = l,n y(1) « $1n(p14T(1 - 1)) v(i) « 0. continue tau * 0.1 t - 0. do 1 j - 1,10 t = t + tau call ELOS (nryrv»w,taurind) write(3,20) t do 2 i = l,n write(3,30) y(i) 304
2 continue 1 continue stop *30- format(2x,ell.4) 20 format(2x/ t=\ell.4) с end там: Вычисления по программе привели к следующим результа- t= Л000Е+00 .0000Е+00 .7014Е-01 Л334Е+00 Л836Е+00 .2159Е+00 .2270Е+00 .2159Е+00 Л836Е+00 Л334Е+00 .7014Е-01 Л042Е-06 t- .5000Е+00 .0000Е+00 .9982Е-01 Л899Е+00 .2613Е+00 .3072Е+00 .3230Е+00 .3072Е+00 .2613Е+00 Л899Е+00 .9982Е-01 Л042Е-06 t= .90CI0E+00 .ООООЕ+00 -Л2454Е+00 -.4667Е+00 -.6424Е+00 -.7552Е+00 -.7)940Е+00 -.7Б52Е+00 -.6424Е+00 -.4667ЕШ -.2454Е+00 Л042Е-06 t- .2000E+00 t .ООООЕ+00 -.2230Е+00 -.4241Е+00 -.5837Е+00 -.6862Е+00 -.7215Е+00 -.6862Е+00 -.5837Е+00 -.4241Е+00 -.2230Е+00 Л042Е-06 t= .6000Е+00 t .ООООЕ+00 .3212Е+00 .6110Е+00 .Й410Е+00 .9887Е+00 Л040Е+01 .9887Е+00 .8410Е+00 .6110Е+00 .3212Е+00 Л042Е-06 t= Л000Е+01 .ООООЕ+00 -.3410Е+00 -.6486Е+00 -.8927Е+00 -Л049Е+01 -ЛЮЗЕ+01 -Л049Е+01 -.8927Е+00 -.6486Е+00 -.3410Е+00 Л042Е-06 = .3000E+00 .0000Е+00 .3437Е+00 .6538Е+00 .8998Е+00 Л058Е+01 Л112Е+01 Л058Е+01 .8998Е+00 .6538Е+00 .3437Е+00 Л042Е-06 = .7000Е+00 .0000Е+00 .2943Е+00 .5599Е+00 .7706Е+00 .9059Е+00 .9525Е+00 .9059Е+00 .7706Е+00 .5599Е+00 .2943Е+00 Л042Е-06 t» .4000E+00 .0000Е+00 -Л988Е+00 -.3781Е+00 -.5204Е+00 -.6117Е+00 -.6432Е+00 -.6117Е+00 -.5204Е+00 -.3781Е+00 -Л988Е+00 .1042с-06 t- .еоооЕ+оо .0000Е+00 .3991Е-01 .7591Е-01 Л045Е+00 Л228Е+00 Л292Е+00 Л228Е+00 Л045Е+00 .7591Е-01 .3991Е-01 Л042Е-06
Варианты заданий д2и д4и Решить задачу для уравнения упругих колебаний -^- = с условиями: и(х9 0)=/(х), -^ (х, 0)=g(x), 0 < х < 1, и(0, 0 = "0, 0 = 0, —£ (0, 0 = -^ (1, 0 = 0, df. дх2 дх2 0<t<T. Номер варианта 1 2 3 4 5 6 7 8 9 10 /(*) *(*) У с L fix) Л / \ ) Ъ с 1 х Vi \. 9М 0 < i \ ' * а 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 Ъ 0,05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 с 1.5 1.6 1.7 1.8 1.9 -2.0 -2.1 -2.2 -2.3 -2.4 d 0,05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 е 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0,85 0.90 11 12 13 14 15 16 17 18 19 20 " /(*); g(x)=o х(х2-\) sin (яде) cosдс sin(rcj<r) sin (2 (х — 1)) х 4jc3(jc-1) х2(х-\) (jc—l)sin2;c (x-l)ln(l+x) sin(;cex)sin(jc—1) 10jc(jc3-1) 306
Продолжение таблицы Номер варианта 21 22 23 • 24 25 26 27 28 29 30 у\ d L к 0 У d f(x) /1 К. Ь с i ух А <7/W 1/ \ 0 1 1 \ а 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 Ь 0.10 0.15 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 с 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 0.95 1.00 d -1.0 -3.0 -4.0 -5.0 -1.0 1.0 2.0 2.5 3.0 3.5 / 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 0.95 Лабораторная работа 46 РЕШЕНИЕ ИНТЕГРАЛЬНОГО УРАВНЕНИЯ ФРЕДГОЛЬМА П РОДА Рассмотрим интегральное уравнение ъ и(х) — X J K(x, s)u(s)ds =f(x). 0) Здесь и(х) — неизвестная функция; ядро К(х, s) — функция, интегрируемая с квадратом в прямоугольнике [a, b\ x [а, 6]; свободный член f(x) — функция, интегрируемая с квадратом на промежутке [а, о], т. е. ъ ъ ъ \\\К(х, j)|2dxcfc<oo, J|/(x)|2djc<oo. а а а Это уравнение называется интегральным уравнением Фредгольма II рода. 307
Будем искать решение и(х) уравнения (1) в том же классе интегрируемых с квадратом функций, которому принадлежит свободный член/(.х), т. е. среди таких функций и(х), для которых справедливо неравенство }\u(x)\2dx<oo. а Интегральное уравнение (1) легко решается, если ядро интегрального уравнения вырожденно, т. е. если *(*,*)= £>(х)Р,(4 где OLi(x), Pi(x)—линейно независимые между собой достаточно гладкие функции. Решение интегрального уравнения с вырожденным ядром сводится к решению системы линейных уравнений. В самом деле, так как "М-Ч( .1 aiWPi(j))«(j)cb=/(4 (2) или л Ь и(х)-Х^ Mx)i h(s)u{s)ds=f(x), i=l a b то, обозначив йеизЬестнЫе интегралы J $t(s) u(s)ds = ct, получаем a u(x)=f(x) + \ t cMxY (3) i=l Подставив это выражение в исходное уравнение (2), получим линейную систему c«-JM4[/(J)+* I Ck*k(s)]ds = 0, i=l, 2, ...,m. (4) а *=1 Для интегралов от известных функций введем следующие обозначения: ъ ь J ft (5)0^(5)^ = 11», JPi(5)/(5)d5=/lf а а /=1, ..., m, к= 1, ..., т. Теперь систему (4) можно записать в компактном виде п ct-X £ aikCk=fi, i=l, 2, ..., т. 308
Решив эту систему, найдем неизвестные ct и получим выражение для решения и(х) в виде (3). ; Рассмотрим простой пример. Пусть 1 /» Х= —-, и(х) = -х-\— xsu(s)ds. 2 v ' 6 2 v ' J 0 Здесь f(x) = -x, K{x, s) = xs, т.е. ol1(x) = x, $1(s) = s. l Вынесем х из-под знака интеграла и обозначим с = J su (s) ds. о Тогда и(х) = -х+-сх. Подставим это выражение для и(х) в исходное уравнение. Имеем 1 5 , 1 -Х + -СХ 6 2 =-х+-х \s( -x+-cs)ds. 6 2 J \6 2 ) О Вычислим интеграл по 5: Так как хфО, с = ~, то и(х)=-х+--х = х, т.е. и(х) = х. Таким образом, решение интегрального уравнения с вырожденным ядром свелось в этом простейшем случае к решению одного линейного уравнения (из формулы (3) видно, что количество уравнений в линейной системе равно количеству слагаемых в разложении ядра, т. е. в нашем случае — одно уравнение). Если ядро интегрального уравнения не является вырожденным, но может быть заменено вырожденным с некоторой погрешностью, то можно применить описанный метод. И тогда, решив полученную линейную систему, найдем приближенное решение, которое в числе других погрешностей (например, от решения линейной системы) будет содержать погрешность, связанную с > заменой невырожденного ядра близким к нему вырожденным. В случае, если замена вырожденным ядром дает слишком большую погрешность, следует искать другой метод решения задачи. Одним из наиболее действенных методов решения интегральных уравнений является метод, основанный на замене интегралов конечными суммами. Этот метод также приводит к решению линейной системы. Рассмотрим сначала вариант такого метода на уже знакомом простейшем примере 1 XSU (s)ds. 309
1 Для вычисления интеграла $ su(s)ds используем квадратурную о формулу Симпсона (см. лабораторную работу 14) с тремя узлами на промежутке [0, 1]: х1=6, х2 = 0.5, х3 = 1. Имеем J/(x)dx^[/(0)+4/(0.5)+/(l)]. О Тогда 1 su(s)ds^- [su(s)\s=0 + 4su(s)\s=0.5 + о + su{s)\s=1]=-[2u{0.5) + u{l)]/6. Подставляя полученное выражение в исходное уравнение, получаем и{х)Цх+1-^{2и{0.5) + и(1)). (5) Обозначим w(0) = wl5 и(0.5) = и2, и(\) = иъ и запишем уравнение (5) в точках jci=0, лг2 = 0.5, хъ = \. Имеем с "1=0, J и2=--о.5 + -- — (2и2 + и3), т. е. для неизвестных значений ul9 и2, иъ получена линейная система. Отметим, что количество неизвестных в системе и количество уравнений в ней совпадают с количеством узлов в квадратурной формуле. Решение полученной системы легко найти: Wi=0, и2 = 0.5, м3 = 1. Подставив вычисленные значения в выражение (5), получим и{х)^-х-\—jc(1 + 1), т.е. и(х)^х. Как видим, это решение совпадает с точным, полученным выше. Опишем метод решения интегрального уравнения с применением квадратурных формул для произвольного интегрального уравнения Фредгольма II рода. 310
Пусть требуется решить уравнение ь и(х)-Х$К(х, s)u(s)ds=f(x). (1) а Выберем некоторую квадратурную формулу ь п \Ф(х)&х^ X А]Ф{х]) + Я{Ф). а 7=1 Здесь Xj—узлы квадратурной формулы; Aj—коэффициенты квадратурной формулы; Я(Ф) — остаточный член квадратурной формулы. Применив к интегралу по s приведенную выше квадратурную формулу, получим и{х)-Х t AjK{x, Sj) + R{K, Ф)=/{х). (6) 7=1 Введем следующие обозначения: w, = w (*,•), ft=f(xi)9 Kij = K(xi, Sj). Отбросив остаточный член квадратурной формулы, запишем уравнение (6) в узлах квадратурной формулы (щ = и(х()\). Имеем л щ-Х X AjKijUj=fi, /=1, 2, ..., п. (7) j=i Решением полученной аппроксимирующей линейной системы являются значения щ искомого решения в узлах xt. Теперь из (6) можно получить аналитическое выражение для приближенного решения и исходного уравнения: и u(x)=f(x) + X £ AtK(x, Xj)uj, 7=1 причем й(х() = щ, т. е. в узлах квадратурной формулы приближенное решение совпадает с точным решением линейной системы (7) (с точностью до погрешностей, связанных с записью и решением линейной системы). В настоящей лабораторной работе предлагается алгоритм, основанный на квадратурной формуле трапеций b№{x)dx^h£AMxj), a j=l где 0,5, У=1, j=n, 1, )Ф\,)Фп. 311 h = {b-a)/{n-l), Xj = a+(j-l)h, Aj=l
Рассмотрим случай Х=\. Применив квадратурную формулу трапеций к уравнению (1), получим систему линейных уравнений л Щ- X AjKij=fi9 /=1, 2, ..., п. 7=1 В развернутом виде эта система имеет очень простой вид с (l--K1Au1-hK12u2-...-hKlnun = hfl, -hK21u1-(l--K22ju2-...-hK2nun = hf2, -hKnlu1-hKn2u2-...-(l--Knn)un = hfn. Найдем решение ul9 u2, .♦., ип этой системы и запишем аналитическое выражение для приближенного решения и исходного уравнения u(x)=f(x)+l[K(a, х) + 2К(х29 x) + ... + 2K(xH-l9 x) + K{b9 jc)]. Оценку погрешности можно получить, если провести вычисления с шагом h и Л/2, как это было сделано при оценке погрешности квадратурных формул по Рунге (см. лабораторную работу 25). Описанный алгоритм реализован программой EQF2. Если ядро интегрального уравнения К(х, s) симметричное, т. е. К(х, s) = K(s, x)9 то аппроксимирующая линейная система имеет симметричную матрицу. В этом случае можно воспользоваться более эффективными методами решения системы, учитывающими особые свойства матрицы. Ниже приведены два варианта программы EQF2 и EQF2S. В случае симметричного ядра решение интегрального уравнения осуществляется программой EQF2S обращением матрицы системы методом квадратного корня с помощью программы MPSV (см. лабораторную работу 9). В случае несимметричного ядра систему решаем методом Гаусса с выбором главного элемента, обращением к программе SIMQ (см. лабораторную работу 7). Тексты программ MPSV и SIMQ и правила обращения к ним приведены в соответствующих лабораторных работах. subroutine EQF2 (a.b.n.ak.yj ,as,b$) с Программа EQF2 решает интеральное уравнение с Фредгольма второго рода 312
с с a,b - пределы интегрирования * с п - количество узлов, л< - 100 * с ак - имя подпрограммы-функции, вычисляющей ядро * с f - массив размерности л, содержащий правые части * с as * с bs * рабочие массивы размерности п*п и л,соответственно* с с Результат: ~ * с у - массив размерности п, содержащий решение * с * с !!!! Программа использует программу SIMQ решения * с линейной системы * dimension xk(100,100) dimension f(l),y(l),as(l),bs(l) h - (b-a)/(n - 1) do 1 i - l,n x - a + (1 - lPh bs(1) -f(1) do 1 j - l,n s - a + (J - l)*h xk(i,j) - - h*ak(x,s) 1f((j.eq.l).or.(j.eq.n)) xk(1,j) - xk(i,j)*0.5 if(l.eq.j) xk(i,j) - 1. + xk(i,j) continue do 2 i - l,n do 2 j - l,n k - (j - l)*n + i as(k) - xk(i,j) np - n*n call SIMQ (as,bs,n,ks) if(ks.ne.O) go to 4 do 3 i - l,n y(i) -b$(1) return print \'нет решения линейной системы ' stop end subroutine EQF2S (a.b.n.ak.y.f.as.bs) с Программа EQF2S предназначена для решения интег- с рального уравнения Фредгольма второго рода. с с а,Ь - концы промежутка интегрирования с п - число узлов сетки на [a,b], n <= 100 с ак - имя подпрограммы-функции, вычисляющей ядро с f - массив размерности пг содержащий правые части с as - рабочий массив размерности' п'п 313
с bs - рабочий массив размерности п * с с Результат: • с у - массив размерности п; содержаний значение решения* с в узлах сетки на [а,Ь] • dimension xk(l00,100),f(l),y(l),as(l),bs(l) h=(b-a)/(n-l) с do 1 i = l,n x = a + (i - 1 )*h bs(1) - f(1) do 1 j = l,n s = a + (j-l)'h xk(i,j) --h'ak(x,s) if((j.eq.l).or.(j.eq.n)) xk(i.j) = xk(:irj)*0.5 if(i.eq.j) xk(i,j) = 1. + xk(i,j) 1 continue с do 2 i = l,n do 2 j = l,n k = (j -Л)'п + i as(k) = xk(i,j) 2 continue call MPSV (as,nrks) if(ks.ne.O) go to 4 do 5 k = l,n ks - (k-l)'n + i y(i) - У(1) + as(ks)4)$(k) 5 continue return с 4 print *r ' линейная система не имеет решения ' с return end Входные параметры: a, b—пределы интегрирования; п—количество узлов, «^ 100; ак—имя подпрограммы-функции, вычисляющей значения ядра; f—массив размерности п, содержит правые части; as—рабочий массив размерности пхп; bs—рабочий массив размерности пхп. Выходные параметры: у—массив размерности л, содержит значения решения в узлах. Перед обращением к программе EQF2 или EQF2S необходимо: 1) описать массивы, описать оператором external имя внешней подпрограммы—функции, вычисляющей значения ядра; 2) присвоить элементам массива, содержащего значения правых частей в узлах сетки; 3) присвоить фактические значения параметрам а, Ь, п. 314
Задание. Решить с помощью программы EQF2 или EQF2S интегральное уравцение Фредгольма II рода. Построить график решения. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую вычисление значений правой части в узлах сетки и пересылку их в массив, содержащий значения правых частей, обращение к EQF2 или EQF2S и печать результатов: выберите модификацию EQF2 в зависимости от свойств ядра уравнения. 2. Провести вычисления на ЭВМ. 3. Построить график решения. Пример [47]. Решить уравнение я и(х) — - у ^—u(s)ds = 25 — 16 sin2 x. П 1_п 10,64 cos2 (-^)-1 Программа решения задачи может иметь следующий вид: external ak ! описание внешней п/п dimension f(37)ly(37)las(1369),bs(37) pi - 3.14159265 n - 37 h - pi/18 с с вычисление правых частей с do 1 i - l,n 1 f(i) - 25 - 16*sin(-pi + (i-l)'h)"2 a - - pi b - pi с с обращение к программе EQF2, решающей уравнение с call EQF2 (a.b.n.ak.y.f.as.bs) с write(3,*) ' x решение do 2 i = l,n x - -pi + (i-l)*h write(3,*) x,y(i) 2 continue stop end function ak(x,s) 315
с Подпрограмма-функция, вычисляющая ядро g - 0.3/3.141592 ak - g/(0.64*cos((x + s)*0.5)**2 - 1) return end Вычисления проводились на сетке с « = 37 и привели к следующим результатам: -8 -6 -5 -3 -1, 8, 1, 3, 5, 6. 8. X -3.141593 -2.967060 -2.792527 -2.617994 -2.443461 -2.268928 -2.094395 -1.919862 -1.745329 -1.570796 -1.396263 -1.221730 -1.047198 .726646Е-01 .981317Е-01 .235987Е-01 .490658Е-01 .745328Е-01 .940697Е-08 .745330Е-01 «490660Е-01 .235989Е-01 •981318Е-01 •726647Е-01 1.047198 1.221731 i.396264 1.570796 1.745329 1.919862 2.094395 2.268928 2.443461 2.617994 2.792527 2.967060 3.141593 решение 16.029420 15.575330 14.267860 12.264700 9.807468 7.192528 4.735293 2.732135 1.424667 9.705866Е-01 1.424667 2.732135 4.735295 7.192529 9.807467 12.264710 14.267860 15.575330 16.029420 15.575330 14.267860 12.264700 9.807464 7.192527 4.735289 2.732134 1.424666 9.705887Е-01 1.424667 2.732138 4.735295 7.192535 9.807467 12.264710 14:267870 15.575340 16.029410 316
Варианты заданий 1 Решить интегральное уравнение П рода J K(x, s)u(s) ds=f(x), xe[0, 1] о Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 К(ху s) 1 l+JC2 + 52sin5 1 1+cos2 (0,3 (*-.*)) 1 1 +sin2 (0,5 (*-.$)) arctg (x—s)2 x2 sin2 s+s2 sin2 x \+x2+s2 (x+s)2sin2 xs (x—s)2 cos2 xs /w JC2+1 e"x arctg* JC2+1 e"x arctg x x2+\ e_x arctg x JC2+1 e"x arctg jc *2+l e~* arctg jc x2+l e~x arctg л: x2 + l e"x arctg a: 317
Продолжение таблицы Номер варианта 22 23 24 25 26 27 28 29 30 /ф, j) Q-{x+s)2sin2xs sh (xs) + x252 sin (2xs) ch (xs)+(.x + .s)2 cos (2x5) /(*)'■ x2 + l e~x arctg л: x2+l e~* arctg л: x2 + l e~x arctg л: Лабораторная работа 47 РЕШЕНИЕ ИНТЕГРАЛЬНОГО УРА?НЕНИЯ ФРЕДГОЛЬМА I РОДА Уравнение ]K(x,s)u(s)ds=f{x) (1) а называется интегральным уравнением Фредгольма I рода. В этом уравнении К(х, s)—ядро, u(s) — неизбестная функция, f(x) — заданная функция. Существование решения уравнения (1) зависит от того, к каким классам прцнадлежат входящие в него функции К(х, s), f(x) и в классе каких функций отыскивается решение. В теории интегральных уравнений доказано, что если f(x) непрерывна на ъ [с, d\ а функция К(х, s) такова, что из равенства \К(х, s)u(s)ds = i \ a = 0 следует, что мш = 0, то решение уравнения (1) в классе непрерывных функции существует и единственно. Однако отыскание решения u(s) уравнения (1) по заданным функциям К(х, s), f(x) совсем непростая задача. Дело в том, что интегральное уравнение Фредгольма I рода относится к классу 318
некорректных задач. Задача называется некорректной, если сколь угодно малые изменения исходных данных задачи приводят к очень большим изменениям в конечном результате. Для уравнения (1) это означает, что небольшие изменения функции f\x) могут существенно изменить решение u(s). Чтобы понять причину столь необычных свойств уравнения (1), рассмотрим пример. Пусть u(s)—точное решение уравнения (1) при заданной функции f(x). Возьмем функцию z(s) = u(s\+10** cos cos, где ю— некоторый параметр. Функции u(s) и z\s) сильно отличаются (на 10 ) в равномерной метрике, т. е. sup \u(s)-z(s)\ = 10*. se [a, b] Функция z(s) является решением уравнения (1), в правой части которого стоит функция g(x), отличная от /(*). Установим, насколько отличаются функции g(x) и f(x). В результате несложных вычислений получаем sup \f(x)-g(x)\=-, хе [с, d] С со где С—не зависящая от ш константа. Так как ш—произвольный параметр, то его можно выбрать таким, чтобы разность между функциями f(x) и g(x) стала как угодно малой, например: sup \f{x)-g{x)\<l0-6. X<E[c,d) Итак, правые части в уравнении (1) будут отличаться на миллионные, тогда как решения могут отличаться на миллионы. Это свойство уравнения (1) создает значительные трудности при практическом использовании таких уравнений. Малые погрешности (например, экспериментальные или вычислительные) могут так сильно изменить решение, что оно не будет иметь ничего общего с истинным. На рис. 33 схематически изображены графики функций u(s) и z(s) для рассмотренного выше примера. Таким образом, решать некорректные задачи следует не обычными, а специальными методами. Такие методы называются методами регуляризации, а соответствующие алгоритмы—регуляризиру- ющими алгоритмами. Наиболее значительный вклад в этот раздел математики внес академик А. Н. Тихонов. Рис. 33 319
Основная идея методов регуляризации состоит в замене исходной некорректной задачи другой задачей, которая: корректна; ее решение может быть сделано как угодно близким к решению исходной некорректной задачи. Рассмотрим один из вариантов метода регуляризации для уравнения (1). Задача (1) эквивалентна вариационной задаче (о поставке вариационных задач см. лабораторную работу 31): среди гладких на отрезке [а, 6] функций найти ту, которая доставляет минимум функционалу ^М=Я№> s)u{s)ds-f(x)ydx. с а Эта задача также некорректна и обладает всеми свойствами задачи (1). Для ее регуляризации рассмотрим новый функционал М[м] = ЛГ[и] + (хО[>], (2) где ь Q[u] = $[p(x)(u')2 + q(x)u2]dx, р{х)>0, q(x)>0. а Функционал М называется сглаживающим функционалом, положительный параметр а — параметром регуляризации, а функционал £2 [и] — стабилизатором. В теории интегральных уравнений доказано, что: задача о минимизации функционала (2) корректна; наилучшее приближение к решению задачи (1) дает та функция, которая минимизирует функционал (2). Осталось выяснить, какую роль играет параметр регуляризации а и какое значение а следует выбирать при решении задачи. Если значение а очень мало, то слагаемое а в (2) практически не играет роли и, значит, решение может оказаться быстроосциллирующим (см. рис. 33). Если же а очень велико, то влияние первого слагаемого N\u\ ничтожно и Минимум функционала будет достигаться на функции, которая, во-первых, является сильно сглаженной и, во-вторых, близка к функции и(х) = 0. Простейший способ избежать этих нежелательных крайностей—это провести вычисления с несколькими а, например а=10-1, 10 ~ 2, ..., 10 ~ 7, и из полученных результатов выбрать наилучший, используя физические (или какие-нибудь иные) соображения. Существуют и регулярные методы выбора оптимального параметра регуляризации. Один из них называется обобщенным принципом невязки. Не будем здесь останавливаться на нем подробно, хотя в приложении приведена программа решения интегрального уравнения первого рода с выбором параметра 320
регуляризации по принципу обобщенной невязки. Все необходимые пояснения также приведены в приложении. Для численной минимизации функционала (2) построим его конечно-разностную аппроксимацию. Выберем на отрезке [я, 6] сетку {Si}"=i и на отрезке [с9 d] сетку {jc£}™=+i1: hx =—, hs = —-, Xi = c+(i-l)hX9 st = a+(i-l)hs. Воспользуемся квадратурной формулой трапеций для приближенного вычисления интеграла ]\jK(x9s)u(s)ds-f(x)ydx с а и формулой прямоугольников для вычисления интегралов ь ь \и2(х)&х и $(u'(x))2dx. а а Обозначим an = K(xi9 sx)/29 ain = K(xi9 sH)/29 /=1, 2, ..., m9 аи = К(х(9 Sj)9 i=29 ..., m9 j=29 ..., n-l, Uj = u(sj)9 fi=f(xt)9 /=1, ..., m9 y=l, ..., n. Тогда d b m n J[Jtf(x, s)u{s)ds-f(x)ydxz £ [1¥Л-/|]\ с a i = 1 j = 1 \2 }[«(*)]а^ЁиУч, bw^E ^^ 7=1 a 7=2 Конечно-разностную аппроксимацию функционала (2) запишем в виде *№ Е [ Е *u«A-/i]2A*+« I «Л+« Е fetiL. i=l 7=1 7=1 7=1 s Воспользовавшись необходимыми условиями экстремума по переменным иь w2, •••, wm ^М-0, *-1, 2, .... т, дик и обозначив т т *о=Л* Е д*°и» vj= Е а./А> i=l f = l ИМ5-1.Г-1-Д, IIM"-i = r, 11-187 321
iyHHV i систему уравнении (B+olC)U=V, C= ri + i/hf -i/as2 о -1/AS2 1 + 1/Л? -\\h\ 0 0 0 0 0 -№ 0 0 1 + 1/AS2 (3) Теперь задача отыскания регуляризированного решения сведена (как и для уравнения Фредгольма II рода) к решению системы линейных уравнений. Заметим, что матрица В плохо обусловлена. Добавление регуляризирующего слагаемого аС приводит к системе с матрицей (5+аС), которая при удачном выборе параметра регуляризации а, с одной стороны, хорошо обусловлена, а с другой стороны, регуляризированное решение w (a, s) является хорошим приближением искомого решения и (s) исходного интегрального уравнения. Описанный алгоритм реализован программой EQF1 [47]: subroutine EQF1 (akruOrarbrc,d,nrmrztan2rdlrh, т alfa,u,nu,ierr) с * с Программа EQF1 решает интегральное уравнение * с Фредгольма 1-го рода методом регуляризации по * с Тихонову , для минимизации функционала Тихонова * с использован метод сопряженных градиентов * с с ак - подпрограмма-функция, вычисляющая значения ядра * с иО - массив размерности т, содержаний значения правой * с части в узлах сетки на [c,d] • с а,Ь - концы промежутка интегрирования * с c,d - концы промежутка изменения правой части * с п - количество узлов в аппроксимации интеграла * с га - количество узлов сетки на [c,d] • с dl - квадрат погрешности правой части * с h - квадрат погрешности задания оператора * с и - рабочий массив размерности>- п*ш + 2*п + га • с alfa - значение параметра регуляризации * с пи - длина рабочего массива и * с ierr - признак выхода • с ierr - 0 - получено решение задачи • с ierr - 1 - короткий рабочий массив • с с Результат : • с z - вычисленное решение * с ап2 - невязка решения * с •••••••••••••••••••••••• »»»* external ak dimension uO(ra)ru(nu)rz(n) ima - 100 icont - 0 322
с ПО continue du - sqrt(dl) dh = sqrt(h) na - 1 ngrd - na + n'm ns - ngrd + n np * ns + n nul - np + m if(nul - l.gt.nu) go to 64 kl - 0 k2 - 0 nl - n + 1 hx - (b - a)/(n - 1.) hy - (d - c)/(m - 1.) dd - hx/hy ro - l./hx"2 if(icont.eq.l) go to 111 call pO(ak,u(na),a,b,c,d,n,m) kpr » n'ra 111 continue 13 continue call pzr(u(na),zruO,nrmriterfO.,0.r n,an2,alfa*dd,ro,z,u(ngrd),u(ns), u(np).ier) call pa(an2,z,nrdurdhrhxrhy,ro,an4) ierr - 0 go to 999 с 64 ierr - 1 go to 999 с 999 continue return end с subroutine pzr(arzOruOrnrmriterrdl2rangrdriraax,an2ralf ,4 * ro,zrgradrsru,ierr) с * •••••• ••„„„•„• с Программа pzr минимизирует функционал Тихонова * с методом сопряженных градиентов • с с а - массив размерности п*п, содержаний матрицу лнейной* с системы • с zO - начальное приближение решения * с иО - правая часть уравнения * с dl2 - константа для условия выхода по невязке * с ап2 - величина невязки * 323
с alf - значение параметра регуляризации ' с го - вес разности производных в стабилизаторе ' с с результат: щ с z - решение • с • ••••• •••• dimension zO(n),z(n),u(m),a(m,n),uO(m),grad(n),s(n) iter - О call pl(zO,zO,z,n,0.) call p3(a,z,u,n,m) call p4(grad,u,u0,a,n,m) call p8(grad,z,n,alf,ro) call pl(grad,grad,s,n,0.) call p6(s,s,n,rnorml) aim - l.e+18 continue call po(a,z,grad,u,s,aim,beta,n,m,alf,ro,ied) if(beta.eq.O) go to 14 beta - -beta call pl(z,s,z,n,beta) call p3(a,z,u,n,m) call p5(u,u0,m,an2) с с проверка достижения точности с if(an2.le.dl2) go to 10 iter - iter + 1 с вычисление градиента функционала с call p4(grad,u,u0,a,n,m call p8(grad,z,n,alf,ro с с вычисление нормы градиента call p6(grad,grad,n,rnorm) с с вычисление сопряженного направления с mm * rnorm/rnorml call pl(grad,s,s,n,rnm) с rnorml = rnorm - if(rnorml.le.angrd) go to 11 if(iter.ge.imax) go to 13 go to 7 324
10 continue ierr - 0 go to 999 11 continue ierr * 1 go to 999 13 continue ierr - 2 go. to 999 14 continue ierr - 3 999 continue return end subroutine p0(ak,arxlrx2rylry2,nrm) с * • • с Программа р0 сводит интегральное уравнение к с системе линейных уравнений с с ак - подпрограмма-функция, вычисляющая ядро с xl,x2 - пределы интегрирования по х с yl,y2 - пределы изменения переменной у с п - количество узлов в аппроксимации интеграла с m - количество узлов на промежутке [у1,у2] с а - массив, содержащий матрицу системы с ••••. dimension a(n) h - (х2 - xl)/(n - 1.) с do 1 1 - 1,п х * xl + h'(i - 1.) do 2 j - l,m У - yl + (y2 - yl)/(m , l.HJ - 1.) kk = (j - l)'m + i a(kk) - ak(y,xrh if(i.eq.l.or.i.eq.n) a(kk) = a(kk)'.5 2 continue 1 continue с return end Тексты остальных программ, используемых программой EQF1 и ее подпрограммами, приведены в приложении. Входные параметры: ак—имя внешней подпрограммы- функции, вычисляющей значения ядра; иО — массив размерности т, содержит значение правой части; a, b—пределы интегрирования по х; с, d—концы интервала изменения у; п—количество узлов на [а, Ь^ m—количество узлов на [с, d]; dl—квадрат погрешности правой 325
части; h—квадрат погрешности задания оператора A; alfa—значение параметра регуляризации; и—рабочий массив размерности ^пхт + 2п + т; пи—длина массива u; ierr — признак выхода: ierr = 0 — нормальное завершение, ierr = 1—короткий рабочий массив. Выходные параметры: z—значение экстремали в узлах; ап2—значение невязки. Перед обращением к программе EQF1 необходимо: 1) составить подпрограмму-функцию, вычисляющую значения ядра; 2) описать массивы и присвоить фактические значения входным параметрам подпрограммы. Задание. Решить интегральное уравнение Фредгольма первого рода методом регуляризации по Тихонову. Подобрать подходящее значение параметра регуляризации. Порядок выполнения лабораторной работы 1. Составить подпрограмму-функцию, вычисляющую значения ядра, описать ее имя в головной программе в операторе external. 2. Составить головную программу, содержащую обращение к EQF1 и печать результатов. 3. Провести вычисления на ЭВМ с различными малыми а. Исследовать зависимость погрешностей от значения а. Выбрать значение параметра регуляризации а, обеспечивающее удовлетворительный результат. Пример [47]. Для практического знакомства с методом регуляризации полезно обратиться к интегральному уравнению, точное решение которого известно, найти его численное решение и сравнить полученное решение с точным. Пусть в уравнении 1 I о 1 u(s)ds=f(x), xe[-2,2] l + lOO^-j) правая часть f(x) такова, что точным решением уравнения является функция и(х) = ехр< — ———л К сожалению, аналитическое выражение для fix) неизвестно, поэтому значения /(*,-) в узлах сетки на [ — 2,z] будем вычислять по формуле 1 /» 326
В приведенной ниже программе величины f{xt) вычисляются по формуле с помощью программ рО и рЗ и помещаются в массив иО. Затем с помощью программы EQF1 по заданным /(=/[хА находятся величины щ—приближенные значения решения и(х) в узлах сетки. Точные и приближенные значения решения выводятся на печать (или на экран). При выполнении данной лабораторной работы величины f{ вычислять не нужно, так как их числовые значения приведены в вариантах заданий. Программа решения задачи может иметь следующий вид: external ak dimension u0(26).z(26),u(10000).z0(26) с с загрузка исходных данных задачи с xl = х2 = yi - У2 - п - га = alfa 0. 1. -2. 2. 26 26 = 1.0е-7 с hx » (x2 - xl)/(n - 1.) с с обращение к программе рО, формирующей линейную систему с call p0(ak,u,xl,x2,yl,y2.n,m) с h = l.e-10 с с вычисление точного решения в узлах сетки с do 1 - 1,п х - xl + hx*(i - 1.) z0'(i) - ехр(-(х - 0.5)^2/0.06) . 1 continue с call p3(u,z0,u0,n,m) с dl = l.e-8 write(3,504) dl.h do 2 i - l,n 2 z(i) - 0. с с обращение к программе EQF1, решающей уравнение с call EQF1 (ak,u0,xl,x2,yl,y2,n,m,z,an2,dl, h,alfa,u,10000,ierr) с с печать результата с wn'te(3,*) rx точное решение приближенное решение' 327
do 3 i = l,n x - xl + hx'fi - 1) write(3.') x,zO(i),z(i) continue . write(3,503) ierr,an2,alfa stop 504 format(' . V погрешность правой ч^сти :\el6.9/ ' погрешность в операторе :г,е16.9) 503 forraat(' .'/' код завершения :'#i5/ * ' невязка :\е 16.9, • ' параметр регул.:',е 16.9) end function ak(x,y) с программа-функция, вычисляющая значение ядра * ак - 1./(1. + 100.'(х - у)"2) return end Вычисления по программе привели к следующим результатам: погрешность правой части : .100000000Е-07 погрешность в операторе : Л00000000Е-09 х точное решение приближенное решение 0.000000Е+00 4.000000Е-02 8.000000Е-02 1.200000Е-01 1.600000Е-01 .000000Е-01 .400000Е-01 .800000Е-01 .200000Е-01 .600000Е-01 .000000Е-01 .400000Е-01 .800000Е-01 .200000Е-01 .600000Е-01 .000000Е-01 .400000Е-01 .800000Е-01 .200000Е-01 .600000Е-01 8.000000Е-01 8.400000Е-01 8.800000Е-01 9.200000Е-01 9.600000Е-01 1.000000 1.550385Е-02 2.940276Е-02 5.286571Е-02 9.011518Е-02 1.456328Е-01 2.231301Е-01 3.241118Е-01 4.463434Е-01 5.827482Е-01 7.213241Е-01 8.464817Е-01 9.417645Е-01 9.933555Е-01 9.933555Е-01 9.417645Е-01 8.464818Е-01 7.213242Е-01 5.827482Е-01 4.463435Е-01 ;3.241118Е-01 2.231303Е-01 1.456329Е-01 9.011518Е-02 5.286576Е-02 2.940277Е-02 J.550385E-02 1..801784Е-02 2.769157Е-02 5.317118Е-02 9.179709Е-02 1.458571Е-01 2.193329Е-01 3.200008Е-01 4.478643Е-01 5.901006Е-01 7.299233Е-01 8.487070Е-01 9.342086Е-01 9.809381Е-01 9.881700Е-01 9.461424Е-01 8.540056Е-01 7.246150Е-01 5.810907Е-01 4.424539Е-01 3.233747Е-01 2.266857Е-01 1.490839Е-01 8.921376Е-02 4.926077Е-02 2.736060Е-02 2.073807Е-02 код завершения невязка : .189737000Е-09 параметр регул. Л00000000Е-06 328
Варианты заданий 1 Решить интегральное уравнение и(х)- JK(x, .у)м(,у)с1.у =/{*), правая часть задана своими значениями в 30 равноотстоящих точках */ = (/—1)/30; /=1, 2, ..., 30 хе[0, 1] Номер варианта 1 2 3 4 5 К(х, s) <»-(*-*)2 С ' е-<*-')* p-(^-.v)2 с ' р-м*)2 с Л98Е-02 Л13Е-01 .472Е-01 Л43Е + 00 .317Е + 00 .513Е + 00 L607E + 00 .526Е + 00 .334Е + 00 Л55Е + 00 .530Е-03 .301Е-02 125Е-01 .377Е-01 .830Е-01 Л34Е + 00 .159Е + 00 Л38Е + 00 .874Е-01 .407Е-01 Л56Е-03 .971Е-03 .440Е-02 Л45Е-01 .350Е-01 .616Е-01 .790Е-01 .739Е-01 .503Е-01 .249Е-01 .389Е-02 .202Е-01 .765Е-01 .212Е + 00 .413Е + 00 .649Е+00 .727Е+00 .607Е + 00 .380Е + 00 Л77Е + 00 .325Е-02 Л75Е-01 /Ы '-1. 2> ■ .367Е-02 Л89Е-01 .708Е-01 Л93Е + 00 .385Е + 00 .562Е + 00 .599Е + 00 .468Е + 00 .268Е + 00 Л12Е + 00 .980Е-03 .501Е-02 Л87Е-01 .507Е-01 Л01Е + 00 Л47Е + 00 Л57Е + 00 Л22Е + 00 .702Е-01 .294Е-01 .297Е-03 Л66Е-02 .679Е-02 .202Е-01 .438Е-01 .693Е-01 .800Е-01 .673Е-01 .412Е-01 Л83Е-01 .698Е-02 .326Е-01 Л11Е + 00 .278Е + 00 .511Е + 00 .696Е + 00 .707Е + 00 .536Ё + 00 .304Е + 00 Л29Е + 00 .590Е-02 .286Е-01 ., 30 .656Е-02 .304Е-01 Л02Е + 00 .252Е + 00 .452Е + 00 .594Е + 00 .572Е + 00 .402Е + 00 .207Е + 00 .779Е + 01 Л75Е-02 .805Е-02 .270Е-01 .660Е-01 Л18Е + 00 Л55Е + 00 Л49Е + 00 Л05Е + 00 .544Е-01 .205Е-01 .547Е-03 .275Е-02 Л01Е-01 -271Е —01 .529Е-01 .753Е-01 .783Е-01 .592Е-01 .326Е-01 Л30Е-01 Л21Е-01 .509Е-01 Л56Е + 00 .352Е + 00 .585Е + 00 .723Е + 00 .666Е + 00 .459Е + 00 .236Е + 00 .903Е-01 Л03Е-01 .452Е-01 329
Продолжение таблицы Номер варианта 5 6 7 8 9 К(х,з) е-(*-,)» Q-\XS\ e-\x-s\ е-"-'1 е-|х-,| /(*,), 1=1, 2, .... 30 .689Е-01 Л02Е + 00 Л45Е + 00 .200Е + 00 .268Е + 00 .364Е + 00 .433Е + 00 .524Е + 00 .614Е + 00 .696Е + 00 .765Е + 00 .814Е + 00 .838Е+00 .836Е + 00 .807Е+00 .755Е + 00 .683Е + 00 .598Е + 00 .507Е + 00 .416Е+00 .330Е + 00 .253Е + 00 .187Е + 00 Л34Е + 00 .534Е-01 .614Е-01 .704Е-01 .808Е-01 .928Е-01 Л07Ё + 00 Л22Е + 00 Л40Е+00 Л61Е + 00 Л85Е + 00 .212Е + 00 .244Е + 00 .280Е + 00 .312Е + 00 .369Е + 00 .423Е + 00 .477Е + 00 .517Е + 00 .534Е + 00 .524Е + 00 .489Е + 00 .437Е + 00 .382Е + 00 .332Е + 00 .290Е + 00 .252Е + 00 .220Е + 00 Л91Е + 00 Л67Е + 00 Л45Е + 00 Л40Е-01 Л61Е-01 Л85Е-01 .212Е-01 .243Е-01 .279Е-01 .320Е-01 .368Е-01 .422Е-01 .485Е-01 .556Е-01 .639Е-01 .733Е-01 .842Е-01 .966Е-01 Л11Е + 00 Л25Е+00 Л35Е + 00 Л39Е + 00 Л35Е+00 Л28Е + 00 Л14Е + 00 Л00Е+00 .871Е-01 .759Е-01 .661Е-01 .576Е-01 .502Е-01 .437Е-01 .381Е-01 .63 IE-02 .725Е-02 .832Е-02 .935Е-02 Л10Е-01 Л26Е-01 Л44Е-01 Л66Е-01 Л90Е-01 .218Е-01 .251Е-01 .288Е-01 .330Е-01 .379Е-01 .435Е-01 .500Е-01 .571Е-01 .640Е-01 .691Е-01 .710Е-01 .688Е-01 .628Е-01 .549Е-01 .479Е-01 .417Е-01 .363Е-01 .316Е-01 .276Е-01 .240Е-01 .209Е-01 .710Е-01 .815Е-01 .936Е-01 Л07Е + 00 Л23Е + 00 Л42Е + 00 Л63Е + 00 Л87Е + 00 .214Е + 00 .246Е + 00 .282Е + 00 .324Е + 00 .372Е + 00 .427Е + 00 .490Е + 00 .558Е + 00 .603Е+00 .623Е + 00 .621Е + 00 .600Е+00 .363Е + 00 .513Е + 00 .452Е + 00 .393Е + 00 330
Продолжение таблицы Номер варианта 9 10 11 12 13 14 К(х, з) е-1*-'1 1 \+(x-s)2 1 \+(x-s)2 1 \+(x-s)2 f[Xl), i=l, 2, .... 30 .343E+00 .299E + 00 .260E+00 .227E + 00 .197E + 00 .172E + 00 .750E-01 .860E-01 .988E-01 .113E+00 .130E + 00 .149E + 00 .171E + 00 .197E + 00 .226E+00 .259E+00 .298E + 00 .342E+00 .392E+00 .450E + 00 .517E + 00 .590E + 00 .650E + 00 .692E + 00 .715E+00 .717E+00 .696E + 00 .649E + 00 .576E + 00 .501E+00 .437E + 00 .381E + 00 .332E + 00 .289E + 00 .252E + 00 .219E + 00 .891E-01 .983E-01 .109E + 00 .121E + 00 .135E + 00 .152E + 00 .172E + 00 .194E + 00 .221E + 00 .253E + 00 .289E + 00 .221E + 00 .377E + 00 .427E + 00 .479E+00 .528E+00 .569E + 99 .597E + 00 .609E+00 .602E + 00 .577E+00 .539E + 00 .492E + 00 .440E + 00 .389E + 00 .342E + 00 .200E + 00 .261E + 00 .229E + 00 .20 IE+ 00 .234E-01 .258E-01 .285E-01 .318E-01 .355E-01 .399E-04 .450E-01 .510E-01 .580E-01 .662E-01 .757E-01 .866E-01 .988E-01 . 112E+00 . 125E+00 .138E+00 . 149E + 00 . 156E+00 .159E+00 . 157E + 00 . 151E+00 .141E+00 . 129E + 00 .115E+00 . 102E+00 .896E-01 .783E-01 .685E-01 .599E-01 .526E-01 .109E-01 .120E-01 .132E-01 .146E-01 .163E-01 .183E-01 .205E-01 .232E-01 .263E-01 .299E-01 .342E-01 .391E-01 .448E-01 .510E-01 .577E-01 .645E-01 .708E-01 .759E-01 .792E-01 .802E-01 .786E-01 .748E-01 .692E-01 .626E-01 .557E-01 .491E-01 .430E-01 .375E-01 .320E-01 .287E-01 .116E + 00 . 128E + 00 . 142E + 00 331
Продолжение таблицы Номер варианта 14 15 16 17 18 К(ху s) 1 \+(x-s)2 1 \+(x-s)2 1 \+(x-s)* 1 l+(*-*)4 1 \+(x-s)* /(*,), i = l, 2, .... 30 . 159E+00 .178E+00 .210E+00 .227E + 00 .258E + 00 .294E + 00 .335E+00 .384E+00 .437E + 00 .496E+00 .557E+00 .616E + 00 .667E + 00 .706E+00 .728E+00 .730E+00 .713E+00 .679E+00 .632E + 00 .577E+00 .518E+00 .459E + 00 .404E+00 .354E + 00 .310E + 00 .272E + 00 .239E + 00 .126E+00 . 139E+00 .154E+00 .171E + 00 . 191E + 00 .214E + 00 .242E + 00 .274E + 00 .311E + 00 .355E+00 .406E + 00 .463E + 00 .526E+00 .594E+00 .663E + 00 . 727E + 00 .782E + 00 .822E + 00 .843E+00 .841E+00 .818E + 00 .775E + 00 .717E+00 .651E+00 .581E + 00 .513E+00 .450E + 00 . 394E + 00 .345E+00 .302E+00 .171E-01 .214E-01 .272E-01 .315E-01 .458E-01 .607E-01 .813E-01 .110E+00 . 149E + 99 . 200E+00 .265E + 00 .338E + 00 .415E+00 .487E+00 .546E + 00 .589E+00 .615E+00 .629E + 00 .633E + 00 .630E+00 .620E + 00 . 597E + 00 .559E+00 . 503E + 00 .434E + 00 .357E + 00 .282E + 00 .215E+00 . 161E+00 . 119E + 00 .448E-02 .563E-02 .716E-02 .923E-02 .121E-01 .160E-01 .214E-01 .290E-01 .392E-01 .527E-01 .695E-01 .886E-01 . 109E+00 . 127E+00 . 143E + 00 . 154E + 00 . 161E+00 .164E + 00 .166E + 00 . 165E+00 .162E + 00 .156E + 00 . 146E+00 .131E + 00 .113E+00 .936E-01 .741E-01 .566E-01 .423E-01 .312E-01 . 189E - 02 .236E - 02 .297E - 02 .378E-02 .489E-02 .640E-02 .850E-02 .114E-01 .154E-01 .209E-01 .280E-01 .368E-01 .468E-01 .570E-01 .664E-01 .738E-01 .788E-01 .816E-01 .827E-01 .829E-01 .823E-01 332
Продолжение таблицы Номер варианта 18 19 20 21 22 23 K(xt s) 1 \+(x-s)4 1 \+(x-s)* 1 l+e"-j| 1 l+e"-j| /(*). »=i. 2' -. 30 .807E-01 .774E-01 .719E-01 .640E-01 .544E-01 .440E-01 .341E-01 .256E-01 .190E-01 .242E-01 .307E-01 .394E-01 .513E-01 .677E-01 .905E-01 . 122E+00 .165E + 00 .222E + 00 .294E+00 .376E + 00 .463E+00 .546E+00 .620E+00 .680E + 00 .725E+00 .755E + 00 .772E + 00 . 776E+00 .768E + 00 .744E+00 .702E+00 .643E+00 .570E + 00 .488E + 00 .404E + 00 .322E + 00 .249E+00 . 188E + 00 .140E+00 .243E-01 .306E-01 .390E-01 .504E-01 .660E-01 .875E-01 .117E + 00 . 158E + 00 .213E + 00 .283E+00 .367E + 00 .461E+00 . 558E+00 .652E + 00 .736E+00 . 805E+00 .855E + 00 .885E+00 . 898E+00 .895E + 00 .877E+00 .843E + 00 .791E + 00 .722E + 00 .638E + 00 .544E + 00 .445E + 00 .350E+00 .266E + 00 .199E+00 .491E-01 .557E-01 .631E-01 .714E-01 .806E-01 .907E-01 .102E + 00 .114E + 00 .128E + 00 . 142E+00 .158E + 00 .175E+00 .192E + 00 .211E + 00 .231E + 00 .251E + 00 .270E + 00 .284E + 00 .289E + 00 .286E + 00 .274E + 00 .256E+00 .236E + 00 .216E + 00 .197E+00 . 179E + 00 .162E+ 00 .146E+00 . 131E + 00 . 117E+00 .129E-01 .146E-01 .165E-01 .187E-01 .211E-01 .238E-01 .267E-01 .299E-01 .334E-01 .372E-01 .413E-01 .457E-01 .504E-01 .553E-01 .604E-01 .658E-01 .706E-01 .741E-01 .755E-01 .746E-01 .717E-01 .671E-01 .618E-01 .566E-01 .516E-01 .468E-01 .424E-01 .382E-01 .343E-01 .308E-01 . 585E - 02 .664E - 02 .754E - 02 333
Продолжение таблицы Номер варианта 23 24 25 26 27 К(х, s) 1 l-fe"-j| 1 l-fe"-j| 1 1+е1*-" f 1, |jc-j|<<M [0, |jc-j|>0,1 f 1, |*-j|<0,l [0, \x-s\>0,\ /(*,), i=l, 2, ..., 30 . 853E - 02 .964E - 02 .109E - 01 .122E-01 .137E-01 .154E-01 .172E-01 .191E-01 .212E-01 .235E-01 .258E-01 .283E-01 .309E-01 .336E-01 .359E-01 .376E-01 .382E-01 .375E-01 .355E-01 .328E-01 .301E-01 .275E-01 .251E-01 .228E-01 .206E-01 .185E-01 .166E-01 .648E-01 .734E-01 831E-01 . 938E-01 .106E-f 00 .119E-f 00 ЛЗЗЕ-fOO .149E-f00 .166E + 00 . 185E -f 00 .205E -f 00 .226E -f 00 .248E-f00 .272E-f00 .296E-f00 .312E-f00 .337E-f0O .345E-f00 .345E-f00 .338E-f00 .324E-f00 .305E-f00 .281E-f00 .257E-f00 .235E-f00 .213E-f00 .192E-f00 .173E+00 .156E-f00 .139E-f00 .688E-01 .781E-01 .884E-01 .lOOE-fOO .113E+00 .127E-f00 .143E-f00 .160E-f00 .179E-f00 .199E-f00 .221E-f00 .244E-f00 .269E-f00 .296E-f00 .323E-f00 .351E-f00 .374E-f00 .390E-f00 . 398E -f 00 .398E -f 00 .390E -f 00 .373E-f00 .346E-f00 .318E-f00 .290E-f00 .264E-f00 .239E-f00 .216E-f00 .195E-f00 .174E-f00 .OOOE-fOO .000E-f00 .000E-f00 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .366E-01 . 103E + 00 . 151E + 00 . 170E + 00 .158E-fOO .117E-f00 .544E-01 .373E-02 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .107E-01 .279E-01 .385E-01 .426E-01 .402E-01 .312E-01 334
Продолжение таблицы Номер варианта 27 28 29 30 К(ху s) f l, |jc-j|<0,1 [0, \x-s\>69\ fl, |jc-j|<0,1 [0, |jc-j|>0,1 f 1, |jc-j|<0,1 [0, |jc-j|>0,1 /(*,), /=1, 2, ..., 30 .156E-01 .115E-02 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO . OOOE+00 .OOOE-fOO .OOOE-fOO .109E-02 .601E-02 .134E-01 .206E-01 .248E-01 .234E-01 .136E-01 .111E-02 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO . 172E-01 .154E-f00 .165E+00 .154E-f00 .140E-fOO .124E-f00 .110E-fOO .957E-01 .265E-01 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE+00 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO . 120E-01 .ПЗЕ-fOO .136E-f00 .147E-f00 .157E+00 .166E+00 .175E-fOO .183E+00 .564E-01 .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO .OOOE-fOO Лабораторная работа 48 ИНТЕРВАЛЬНОЕ ОЦЕНИВАНИЕ ПАРАМЕТРОВ НОРМАЛЬНО РАСПРЕДЕЛЕННОЙ СЛУЧАЙНОЙ ВЕЛИЧИНЫ Если xl9 х2, ..., хп — выборочные значения случайной величины £, то состоятельной несмещенной оценкой математического ожидания MZ, служит выборочное среднее 335
1 x = - X x{. i = l Несмещенной и состоятельной оценкой дисперсии является величина •'-гЬ.^-^-глСЬ'-М1} Если £—нормально распределенная случайная величина, то нетрудно построить доверительные интервалы для оцениваемых параметров. 1. Доверительные интервалы для математического ожидания. а) Пусть дисперсия DE, известна. Если а—доверительная вероятность, то с вероятностью а математическое ожидание лежит в интервале (х — гау/щ]~п, х + еал/Т)^1п). Величина еа определяется из условия Ф(бв) = (1+а)/2. Здесь Ф(л:) — функция Лапласа, определяемая интегралом ф(*)= 1 e-z2/2dz. J — оо При большом числе измерений п этим методом можно строить доверительный интервал для математического ожидания М£ при любом распределении величины £, поскольку при больших п распределение величины х мало отличается от нормального. б) Если дисперсия DE, случайной величины £ неизвестна, то доверительный интервал для М£ имеет вид (*-'а(И-1)ч/^7Я ^+^(n-l)NAY/«)- Величина ta{m) определяется из условия 'а(т) О где sm(z)dz = ^, ,_ -m z2\-(m+l)/2 sm(z)= -i" / 11 + у/птГ(т/2)\ m — плотность распределения Стьюдента с m степенями свободы. При больших п (л>120) распределение Стьюдента мало отличается от нормального. 2. Доверительный интервал для дисперсии. Если М£, неизвестно, то дисперсия D£ нормально распределенной случайной величины 336
% с доверительной вероятностью а лежит в интервале \ Х(21+о«)/2(и-1)' Х<21-«)/2(«—О/ Здесь величины %i(m) определяются из условия Х62 (ш) f /7m(z)dz = e, о где с О при z<0, 0m (z) = < 1 lw l,n/2^"2)/2e"/2nPHz>Q Г(т/2)2т/2 * —плотность %2 распределения с т степенями свободы. Нахождение величины ta(m) и х2(т) при произвольных значениях их аргументов связано с громоздкими вычислениями. В данной лабораторной работе требуется построить 95%-ный доверительный интервал для математического ожидания и 90%-ный доверительный интервал для дисперсии. Таким образом, а = 0,95 при вычислении t^yrn) и а = 0,90 при вычислении X2i+a)/2(^)5 X2i-a)/2(m)- Для нахождения t0 95 (т) предназначена подпрограмма ST95(m, /): subroutine ST95(m,t) real a<14)/12.706, 4.303, 3.182, 2.776, 2.571, 2.247, 2.365, 2.306, 2.262, 2.228, 2.201, 2.179, 2.160, 2.145/ if(m.gt.14) go to 1 t = a(m) return с 1 t « 1.96 + 2.4/m + 3.0/m"2 return с end Входной параметр m—число степеней свободы. Выходной параметр t—значение t0t95(m) (m = m). Вычисления по программе ST95 производятся следующим образом: если т^14, то для вычисления t095(m) используют табличные значения tQt95(m), если т>14, вычисления производят по формулам tO95(m)=l.96 + 2A/m + 3.0/m2. Перед обращением к подпрограмме ST95 необходимо присвоить фактическое значение параметру т. 337
Для вычисления Xo.9s(w) и Xo.os{m) предназначена программа CHI90 (m, hi, h2) (напомним, что при оценке дисперсии доверительная вероятность а принята равной 0,9): subroutine CHI90 (m,hl,h2) real a(30) /0.3932е-2, 0.1026, 0.3518, 0.7107, 0.1454, 1.53530 , 2.1674, 2.7326, 3.3251, 3.9403, 4.57480 , 5.2260, 5.8920, 6.5710, 7.2610, 7.96200 , 8.6720, 9.3910, 10.117 , 10.851 , 11.591 , 12.3380, 13.091 , 13.848 , 14.611 , 15.379 , 16.1510, 16.928 , 17.708 , 18.492 / с real b(30) * /7.88 , 10.600, 12.84 , 14.86 , 16.75 , 18.548, 20.28 , 21.955, 23.59 , 25.188, 26.757, 28.300, 29.819, 31.318, 32.801, 34.267, 35.718, 37.156, 38.582, 39.996, 41.401, 42.795, 44.181, 45.558, 46.928, 48.289, 49.645, 50.993, 52.335, 53.672/ с if(m.gt.30) go to 1 h2 = b(m) hi = a(m) return с 1 с - 0.222222/m c$ - sqrt(c) hi - m*(l. - с - 1.645*cs) h2 - пГ(1. - с + 1.645*cs) с return end Входной параметр m—число степеней свободы. Выходные параметры: hi —значения величины Xo.os{m)l h2—значение величины %o.9s{m) (/w = m). Вычисления по программе CHI90 производятся следующим образом: если т^ЗО, то используют табличные значения величин Xotos{m) и %ot9s{m)> если w>30, то вычисления производят по следующим формулам: xg.o,M=m(i-^-1.645>^)3; X^H=-(l-^1.645^)3. Перед обращением к подпрограмме CHI90 необходимо присвоить фактическое значение параметру т. Задание. По данной выборке из нормального распределения построить 95%-ный доверительный интервал для математического ожидания и 90%-ный доверительный интервал для дисперсии. 338
Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую ввод исходных данных, обращение к подпрограммам ST95 и CHI90, вычисление доверительных интервалов, печать результатов. Провести вычисления на ЭВМ. Пример. Заданная выборка из нормального распределения представлена следующей таблицей: X N X N X N' 904,00 3 910,20 7 916,40 6 922,60 7 928,80 8 935,00 10 941,20 10 947,40 12 953,60 14 959,80 15 966,00 13 972,20 16 978,40 14 964,60 12 990,80 12 997,00 9 1003,20 8 1009,40 7 1015,60 5 1021,80 4 Здесь в верхней строке приведены 20 значений случайной величины, а в нижней—число N ее повторений в выборке. Построить 95%-ный доверительный интервал для математического ожидания и 90%-ный доверительный интервал для дисперсии. А Программа решения задачи может иметь вид open(unit=l,file«'fintoc.dat') п - О nk - 20 si - 0. s2 - 0. с с чтение данных из файла с do 2 j - l,nk read (1,*) xi,ni n - n + ni si - si + xi'ni 2 s2 - s2 + xi'*2*ni x - sl/n s2 = (s2 - (sl"2)/n)/(n - 1) с с обращение к программе ST95, вычисляющей с доверительный интервал для математического с ожидания с call ST95 (п - l,t) 339
t xl x2 fsqrt(s2/n) x - t x + t обращение к программе СН190, вычисляющей доверительный интервал для дисперсии call CHI90 (n-lrhlrh2) dl - (n - I)*s2/h2 d2 - (n - l)'s2/hl печать результатов вычислений print 3,xl,x2,dl,d2 close(l) stop 3 format(///5x,'доверительный интервал для мат.ожид.'/ 10х,'(\е12.5,\\е12.5/)\/6х, • 'доверительный интервал для дисперсии'/ 10х/(\е12.5,\\е12.5/)') end Программа предназначена для вычислений на ЭВМ типа IBM PC. Предполагается, что исходные данные:—заданная выборка из нормального распределения—находятся в файле с именем data.dat, куда они были записаны без указания формата. Каждая запись состоит из двух чисел, разделенных пробелом. Первое число—выборочное значение случайной величины, второе число—количество повторений этого значения в выборке. При вычислении на ЭВМ другой конфигурации следует внимательно проверить правила описания файлов. Вычисления по программе привели к следующим результатам: доверительный интервал для мат.ожидания (0.95983Е+03, 0.96823Е+03) доверительный интервал для дисперсии (0.82491Е+03, 0.92311Е+04) Варианты заданий Вариант 1 X N 0,3 1 0,35 1 0,4 1 0,45 1 0,5 1 Вариант 2 X N 1,2 1 1,4 1 1,6 1 1,8 1 2,0 1 Вариант 3 X N 2,7 1 5,6 1 3,6 1 4,0 1 4,9 1 Вариант 4 X N 4,8 1 5,6 1 6,4 1 7,2 1 8,0 1 Вариант 5 X N 19 1 22 1 25 1 28 1 32 1 Вариант 6 X N 14 1 17 1 19 1 22 1 24 1 340
Продолжение таблицы Вариант 1 X N 0,55 0,6 0,65 0,7 0,75 0,8 0,85 0,9 0,95 1,0 1,05 1,1 1,15 1,2 1,25 1,3 1,35 1,4 1,45 1 2 1 1 4 3 3 6 3 7 _, 2 4 Вариант 7 X N 19 1 12 1 14 1 16 1 18 1 19 1 21 2 23 1 25 4 27 1 28 5 30 4 32 5 34 8 36 5 37 3 39 7 41 6 43 4 45 1 46 1 48 1 50 3 52 1 Вариант 2 X ' N 2,2 2,4 2,6 2,8 3,0 3,2 3,4 3,6 3,8 4,0 4,2 4,4 4,6 4,8 5,0 5,2 5,4 5,6 5,8 1 2 1 3 6 1 4 1 5 1 6 4 2 2 1 2 2 1 1 Вариант 8 X N 7 8 10 11 12 13 15 16 17 18 20 21 22 23 25 26 27 28 30 31 32 33 35 36 3 3 2 3 2 1 7 5 6 6 2 6 2 2 1 1 1 Вариант 3 X N 5,4 5,8 6,3 6,7 6,75 7,65 8,1 8,5 9,0 9,4 9,9 10,3 10,8 11,2 11,7 12,1 12,6 13,0 13,5 1 4 2 1 1 3 3 8 2 6 4 2 4 1 3 1 1 1 1 Вариант 9 X N 24 28 32 36 40 44 48 52 56 60 64 68 72 76 81 85 89 93 97 101 105 110 ИЗ 117 3 1 6 3 4 4 8 7 9 5 6 4 3 4 3 1 1 1 Вариант 4 X N 8,8 9,6 10,4 11,2 12,0 12,8 12,6 14,4 15,2 16,0 16,8 17,6 18,4 19,2 20,0 20,8 21,6 22,4 23,2 1 4 1 2 9 2 6 2 3 4 9 4 5 1 2 1 1 1 1 Вариант 10 X N 43 50 57 64 72 79 86 93 100 108 115 122 129 136 144 151 158 165 172 180 187 194 201 208 7 6 5 7 9 7 5 7 4 3 8 2 2 2 2 2 Вариант 5 ЛГ N 35 38 41 44 48 51 54 57 60 64 67 70 73 76 80 83 86 89 92 1 1 5 3 2 2 7 6 5 4 7 5 5 7 4 1 3 1 1 Вариант 11 X 36 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 N 1 1 1 1 2 1 1 2 2 5 3 6 8 10 9 5 4 8 3 2 2 1 2 1 Вариант 6 26 29 31 34 36 39 41 44 46 49 51 53 56 58 61 63 66 68 71 1 1 1 1 6 4 6 4 10 7 8 8 Вариант 12 X N 36 42 48 54 60 66 72 78 84 90 96 102 108 114 121 127 133 139 145 151 157 163 169 175 2 8 8 8 8 10 5 3 6 6 3 3 3 1 1
Продолжение таблицы Вариант 13 X N 50 1 59 1 67 1 76 1 84 2 92 1 101 1 109 2 118 6 126 5 143 8 152 4 160 9 169 9 177 6 185 И 194 7 202 6 211 3 219 1 228 1 236 2 245 1 Вариант 19 X N 108 1 126 1 144 1 162 1 180 1 198 2 216 2 234 1 252 5 270 6 288 12 306 13 324 14 342 10 361 7 379 13 397 7 415 4 433 4 451 4 342 Вариант 14 X N 76 89 102 115 123 140 153 166 179 192 204 217 230 243 256 268 281 294 307 320 332 345 358 3 5 4 6 3 7 9 4 12 12 4 3 7 9 5 3 1 1 Вариант 20 X N 120 1 140 1 160 1 180 1 200 2 220 3 240 2 260 2 280 3 300 4 320 7 340 8 360 8 380 12 400 16 420 15 440 8 460 9 480 5 500 4 Вариант 15 X N 58 1 68 1 78 1 88 1 98 1 107 1 117 2 127 4 137 3 156 7 166 7 176 5 186 12 116 5 205 И 215 7 225 8 235 4 245 2 254 3 264 1 274 1 284 1 Вариант 21 X N 132 1 154 1 176 1 198 1 220 1 242 2 264 3 286 4 308 6 330 6 352 12 374 5 396 И 418 15 441 9 463 14 485 7 507 7 529 1 551 4 Вариант 16 X N 67 78 90 101 112 123 135 146 157 168 180 191 202 213 225 236 247 258 270 281 292 303 315 2 1 2 3 4 3 8 8 10 12 7 10 9 7 4 1 2 1 Вариант 22 X N 145 169 193 217 242 266 290 314 338 363 387 411 453 459 481 508 532 556 580 605 2 3 6 8 9 12 18 И 8 И 10 8 6 2 Вариант 17 X N 86 1 101 1 115 1 130 1 144 1 158 1 173 1 187 1 202 1 216 5 231 13 245 8 260 И 274 6 289 И 303 10 317 8 332 9 346 6 361 10 375 1 390 1 404 1 419 2 Вариант 23 X N 150 185 211 238 264 290 317 343 370 395 423 449 476 502 529 555 581 608 634 661 2 5 6 6 13 12 16 17 9 10 6 7 7 Вариант 18 X N 97 1 ИЗ 1 129 1 145 1 Г62 2 178 2 194 1 210 2 226 4 243 8 259 8 275 5 291 8 307 И 324 14 340 8 356 6 372 8 388 .6 405 5 421 5 453 1 437 3 486 1 Вариант 24 X N 172 201 230 250 288 316 345 374 403 432 460 489 518 547 576 604 633 662 691 720 2 1 4 6 8 10 18 8 9 12 16 9 7 5 5
Продолжение таблицы Вариант 19 X N 469 4 487 2 505 1 523 2 Вариант 20 X N 520 6 540 1 560 1 580 1 Вариант 21 X 573 573 595 617 639 N 6 6 5 1 1 Вариант 22 X N 629 3 653 3 665 3 667 1 701 1 Вариант 23 X 687 714 740 767 793 N 4 5 1 1 1 Вариант 24 X N 748 4 806 3 835 1 864 3 892 2 Вариант 25 X 187 218 250 281 312 343 375 406 437 468 500 531 562 593 625 656 687 718 750 781 812 843 875 896 N 1 1 1 1 1 1 4 1 И 8 8 12 16 10 12 12 7 11 8 7 4 2 1 1 Вариант 26 X 202 236 270 304 338 371 405 439 473 507 540 574 608 642 676 709 743 777 811 845 878 912 946 980 N 1 1 1 1 2 2 2 8 9 9 8 12 13 7 16 5 18 9 10 2 3 3 2 1 Вариант 27 X 235 274 313 352 392 431 470 509 548 588 627 666 705 744 784 823 862 901 940 980 1019 1058 1097 1136 N 2 И 3 8 9 15 16 14 12 14 9 И 7 4 2 1 5 Вариант 28 X 218 255 291 328 364 400 437 473 510 546 583 619 656 692 729 765 801 838 874 911 947 984 1020 1057 N 1 1 1 1 2 2 3 5 2 7 8 14 И 8 17 15 15 12 9 4 3 2 4 1 Вариант 29 X 252 294 336 378 420 462 504 546 588 630 672 714 756 798 841 883 925 967 1009 1051 1093 1135 1177 1219 N 3 4 8 И 12 14 17 8 14 10 14 9 6 6 8 3 3 1 Вариант 30 X 270 315 360 405 450 495 540 585 630 675 720 765 810 855 900 945 990 1035 1080 1125 1170 1215 1260 1305 N 5 7 6 10 14 16 13 11 12 12 7 16 8 5 6 3 1 3 Лабораторная работа 49 ЛИНЕЙНАЯ РЕГРЕССИЯ Пусть требуется исследовать зависимость у(х), причем величины у и х измеряются в одних и тех же экспериментах. Без ограничения общности можно считать, что величина х измеряется точно, в то время как измерение величины у содержит случайные погрешности. Это означает, что погрешность измерения величины х пренебрежимо мала по сравнению с погрешностью измерения 343
величины у. Таким образом, результаты эксперимента можно рассматривать как выборочные значения случайной величины ц(х)9 зависящей от х как от параметра. Регрессией называют зависимость условного математического ожидания этой величины от х, т.е. у(х) = М(ц\х). Задача регрессионного анализа состоит в восстановлении функциональной зависимости у{х) по результатам измерений (xh yt), /=1, 2, ..., п. Аппроксимируем искомую зависимость у(х) функцией f(x, al9 а2, ..., ак). Это означает, что результаты измерений можно представить в виде yi = f(xi9 дь ..., ак) + £>» где al9 ..., ак—неизвестные параметры регрессии; £,-—случайные величины, характеризующие погрешности эксперимента. Обычно предполагается, что £,-—это независимые нормально распределенные случайные величины с М^ = 0 и одинаковыми дисперсиями М£? = а2. Параметры al9 ..., ак следует выбрать такими, чтобы отклонение предложенной функциональной звисимости от результатов эксперимента было минимальным. Часто в качестве меры отклонения принимают величину Ф(а19 ..., ак)= X (/"(**, а19 ..., ak)-yt)2 и, следовательно, параметры яь ..., ак определяют методом наименьших квадратов. На практике регрессионный анализ состоит из трех этапов. На первом этапе выдвигают гипотезу о виде функции Дх, аи..., ак), на втором—по имеющимся данным находят оценки неизвестных параметров яь ..., ак. На третьем этапе проверяют согласие выдвинутой гипотезы с результатами измерений. Рассмотрим простейший случай линейной регрессии. Пусть выдвинута гипотеза о том, что функция / имеет вид f(x9 a0, а1) = а0 + а1х. Найдем оценки параметров а0 и ах методом наименьших квадратов. Для этого минимизируем функцию л Ф(я<ь *i) = Z ((во + *1*)-л)2. „ 5Ф ' 5Ф Приравнивая нулю производные — и —, получаем п п п п _ _i=l »=1 »'=1 i=l а° ; / - \2 ' i=i \«=1 / 344
«Езд-Е^Ел л / п «=1 М=1 *л Проверяя согласие построенной линии регрессии с результатами эксперимента, можно руководствоваться следующими соображениями. Идея любой регрессии состоит в том, чтобы часть изменений измеряемой величины связать с изменением внешних переменных (в данном случае только одна внешняя переменная х). Не предполагая, что у зависит от х, можно было бы за меру разброса результатов эксперимента принять п л величину 6Х= Yj (У£"~У)2> гДе У=-^,У*- Если прямая регрессии построена, то за меру разброса естественно принять сумму квадратов отклонений от линии регрессии, т.е. величину л £2= ЕО\'-Яо-Д1.Х;)2- i=i Если е2~8ь то эт0 значит, что аппроксимирующая функция выбрана неудачно, т. е. подходящую функцию регрессии следует искать не среди прямых, а, например, среди парабол или кривых другого вида. Для вычисления коэффициентов линейной регрессии и параметров разброса 8Х и е2 предназначена подпрограмма (subroutine) SRL (k, х, у, аО, al, el, e2): subroutine SRL (k,x,y,a0,al,el,e2) с Программа SRL вычисляет параметры линейной с регрессии с с к - количество измерений с ,-х - массив размерности к, содержит значения аргумента с у - массив размерности к, содержит значения функции с с Результат: с aO,al- параметры регрессии : у * аО + al*x с el - мера отклонения от линии регрессии с е2 - мера разброса dimension х(1),у(1) data Sl,s2,s3,s4/0.,0.,0.r0./ do 100 i - lrk si - si + x(i)*y(1) s2 - s2 + x(i) s3 - s3 + y(i s4 - s4 + x 1**2 345
100 continue aO * (s3*s4 - s2*sl)/(k*s4 - s2"2) al - (k'sl - s2*s3)/(k*s4 - s2"2) ys * s3/k с el - 0. e2 « 0. do 200 i = l,k el = el + (y(i) - ys)"2 e2 « e2 + (y(i) - aO - al*x(i))**2 200 continue el - sqrt(el) e2 - sqrt(e2) с return end Входные параметры: к—количество измерений; х — массив из к действительных чисел, содержащий значение аргумента х; у—массив из к действительных чисел, содержащий значения функции у(х). Выходные параметры: аО—значение параметра регрессии а0; al—значение параметра регрессии а±\ el—значение меры разброса ех результатов эксперимента; е2—значение меры е2 отклонений результатов эксперимента от линейной регрессии. Перед обращением к подпрограмме SRL (к, х, у, aO, al, el, e2) необходимо: 1) описать массивы х и у; 2) присвоить фактические значения параметрам к, х, у. Задание. Для приведенных в таблице результатов эксперимента определить параметры линейной регрессии. Исходные данные и результаты вычислений представить графически. Порядок выполнения лабораторной работы 1. Составить головную программу, содержащую описание массивов х, у, ввод исходных данных, обращение к SRL. 2. Провести вычисления на ЭВМ. Пример. Построить уравнение линейной регрессии по данным, приведенным в таблице: X У 0,1 3,5948 0,2 3,403 0,3 3,070 0,4 2,815 0,5 2,517 0,6 2,169 0,7 1,809 346
Продолжение таблицы X У X У 0,8 1,602 1,5 -0,457 0,9 1,180 1,6 -0,789 1,0 0,939 1,7 -1,163 1,1 0,691 1,8 -1,448 1,2 0,474 1,9 -1,950 1,3 0,018 2,0 -1,752 1,4 -0,136 ▲ Программа решения задачи может иметь следующий вид: dimension х(100),у(100) open(unit>lrfile«'data.dat') с с чтение данных из файла data.dat с пк - 20 read (l,*).(x(k),y(k),k«l,nk) с с обращение к программе SRL, вычисляющей параметры регресии с call SRL (20,xry,a0ral,el,e2) с print 100,a0,al,e2,el с close(l) stop с 100 format(2x,'a0 - \el3.6/ al * \el3.6/ * 2x/ мера откл. от регрессии 'rel3.6/ * 2х/ мера разброса ',е13.6) end Программа предназначена для вычислений на ПЭВМ типа IBM PC. При вычислениях на ЭВМ других типов необходимо проверить правила описания файлов, поскольку предполагается, что набор исходных данных размещен в файле data.dat. В Результате вычислений по программе получены следующие результаты: аО = 0.39556Е+01 al = -0.297726Е+01 мера откл. от регр. 0.320125Е+00 мера разброса 0.78912Е+01 ч Сравнение величин ех и е2 подтверждает удачный выбор линейной регрессии в качестве аппроксимирующей функции. 347
Варианты заданий Значения х, = /хО,1, /=1, 2, ..., 20, одинаковые для всех вариантов I 1 2 3 4 5 6 7 8 9 10 И 12 13 14 15 16 17 18 19 20 Вариант 1 5,998 5,820 5,754 5,828 5,627 5,597 5,693 5,469 5,413 5,526 5,344 5,304 5,352 5,301 5,424 4,996 5,080 5,256 5,090 5,053 Ввариант 2 6,030 6,072 6,297 6,428 6,425 6,473 6,592 6,815 6,786 6,925 7,116 7,053 7,224 7,439 7,302 7,426 7,797 7,871 7,929 8,060 Значения Вариант 3 5,85 5,619 5,569 5,426 5,237 5,025 4,988 5,037 4,586 4,575 4,445 4,353 3,933 3,899 3,793 3,473 3,551 3,171 3,330 3,044 У(=УЫ Вариант 4 6,310 6,308 6,546 6,855 7,073 7,770 7,225 7,739 7,995 8,963 8,247 8,472 8,627 8,936 9,082 9,976 9,363 9,679 9,846 10,013 Вариант 5 5,650 5,431 5,250 5,000 4,790 4,569 4,296 4,065 3,837 3,519 3,281 2,926 2,801 2,546 2,232 2,016 1,794 1,663 1,375 1,217 Вариант 6 6,323 6,523 6,646 7,256 7,487 7,827 8,133 8,402 8,581 9,014 9,049 9,571 9,891 10,073 10,406 10,821 11,151 11,232 11,655 11,952 i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вариант 7 3,88 3,86 3,84 3,91 3,71 3,49 3,51 3,68 3,74 3,47 3,60 3,51 - 3,48 3,30 3,23 3,26 3,14 3,17 2,96 2,81 Вариант 8 4,08 4,18 4,38 4,46 4,44 4,55 4,66 4,89 4,86 5,04 5,22 4,90 5,39 5,56 5,42 5,85 5,99 5,85 6,01 5,97 Значения Вариант 9 3,90 3,83 3,60 3,47 3,31 3,05 3,14 2,83 2,66 2,53 2,35 2,49 2,19 1,82 1,69 1,54 1,22 1,17 1,04 1,12 У1=УМ Вариант 10 4,03 4,23 4,49 4,71 5,00 5,26 5,36 5,87 5,67 5,89 6,16 6,65 6,39 6,81 7,08 7,24 7,61 7,64 8,03 7,92 Вариант 11 3,82 3,44 3,16 2,95 2,73 2,40 2,27 1,85 1,88 1,32 1,18 1,15 0,85 0,48 0,18 -0,01 -0,12 -0,60 -0,68 0,54 Вариант 12 4,27 4,45 4,84 5,14 5,55 5,85 6,18 6,38 6,72 7,04 7,26 7,70 7,78 8,33 8,62 8,78 9,06 9,56 9,71 10,14 348
04000--JON^^U)l4)^-04000--JON^^U)l4)^- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 н-н-ОООООООООООООООООО OOVO^sj^vjvJOs^^^WWH-SJOOWO U)-J40-J4040-Jl4)00l4)-J-J^00H-^O0N00l4) 40--J^On^^U)U)h-OV0400n--J^U)14)U)14)0 40^40<^^^U><-ft<-ftOO--Jt4)00--Jt4)<-ft.&.t4)U>0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0000^Jvj^SJV0>J00vJ^OWO00>J0\WtOO ^-JlsJ^0Nl4)404000^O^40^^U)U)H-O^- ЮООЫ^ЮЮЮ^ООЫЮОО^]^^УООО^ЫЫ OW^NJWiOOO\SJ^OOWS)VOb-h-yo^a\00 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (Л^^^ЫЫЫЫЮЮЮЮмммООООО O-J^h-00-J0nU)000n^14)400n^4040-J^^- OU>0040-^00^t4>Cn^(^iU>CnU>00^1t4>40t4>^ ON^crn^^^^U)UJU)l4)l4)l4)l4)^-^-^-000 ^---Jl4)l4)0N^H-40--J^-00--J^O00^^00^U) ^-0NU)H-00-JlsJO^l4)^l4)0NH-^40U)l4)OO 00 ари в н V© 00 « вв вв Ю 1 вв н ы ** 00 ари вв 00 вв 1 вв н в 00 вв •о вв ант £ в? Й я К Ж) 41 II 41 >< O4000--J0n^^U)14)^-O4000--J0n^^U)K)h- 40400^-U)U)l4)U)U»)l4)^^ON--JOOOO-J040VO U)On0^^0014)0-JU)^--JOnh-h-OOU)40^-14) ^U)U)U)U)U)U)U)U)U)l4)U)l4)l4)l4)l4)l4)l4)l4)l4) O40-J0n^^h-u>IsJK)40O000n0n^^U)h-h- OOOn400nOn40U)h-^U)^^^On^OnV014)40^ 1 1 1 1 1 1 1 1 00<-*<-*ts)t4)t4)0^-.^.<-HON40000<-*<-*00<-* h-On-J-J^00400n^Onh-40^-^^4014)^-^On ON^^^^^^^^^U)U)U)U»)U)U)l4)l4)l4)l4) 040*-JVOONCriU)*«J400NON^.OOCri^O*-Jt-riH-cri 'l 1 1 1 1 1 1 1 1 1 1 1 1 ЮЮЮЮн-н-н-н-ОООООООО^-^-^-^- 400N^U)40-JU>lsJOOON^l4)Ol4)l4)ONOO^ON CsOOh-^OOU)4040^400nOn--J40^-J-JV0^14) 0O*«J*«J*«JONONONCriCriCriCri^.^.U)U)U)U)l4)l4)l4) h--J^IsJOn^h-400n^h-^^40-J^^--JOn^ OOVOCriOO*«J^.l4)U)H-^.criONONH-ON*«JCriH-^U) 0 SB I BE H 00 « BE 00 « ВС BE H N- (SI 00 ари BE 00 « s Ё H ^4 0 € ВС ё н So s 8 к 4l II 4l ^
Продолжение таблицы i 1 2 3 4 5 6 7 8 9 10 И 12 13 14 15 16 17 18 19 20 Вариант 25 -2,09 -2,02 -2,13 -2,20 -2,15 -2,26 -2,17 -2,51 -2,41 -2,50 -2,63 -2,55 -2,54 -2,69 -2,89 -3,01 -2,83 -2,96 -2,92 -3,13 Вариант 26 -2,12 -2,00 -1,59 -1,61 -1,53 -1,74 -1,11 -1,10 -1,08 -0,96 -0,89 -0,72 -0,63 -0,67 -0,55 -0,33 -0,35 -0,07 -0,05 0,05 Значения Вариант 27 -2,30 -2,38 -2,37 -2,83 -3,02 -3,42 -3,02 -3,41 -3,42 -3,57 -3,57 -3,57 -3,81 -4,05 -4,29 -4,49 -4,50 -4,56 -4,97 -5,04 У1=У(*д Вариант 28 -1,77 -1,60 -1,47 -1,19 -1,00 -0,97 -0,64 -0,29 -0,17 -0,11 -0,05 0,37 0,60 0,78 1,01 1,19 1,46 1,46 1,81 2,06 Вариант 29 -2,45 -2,64 -2,69 -2,99 -3,33 -3,30 -3,73 -3,99 -4,37 -4,57 -4,77 -5,17 -5,23 -5,53 -5,68 -5,85 -6,23 -6,45 -6,55 -6,97 Вариант 30 -1,61 -1,53 -1,12 -0,98 -0,61 -0,01 -0,02 0,27 0,70 0,99 1,42 1,57 1,87 1,93 2,67 2,92 3,07 3,32 3,63 3,72 Лабораторная работа 50 АППРОКСИМАЦИЯ ФУНКЦИИ ПО МЕТОДУ НАИМЕНЬШИХ КВАДРАТОВ Очень часто, особенно при анализе эмпирических данных, возникает необходимость найти в явном виде функциональную зависимость между величинами х и у, которые получены в результате измерений. Как правило, общий вид этой функциональной зависимости известен, а некоторые числовые параметры закона неизвестны. Пусть, например, функция задана в виде (jc,-; yt), /=1, 2, ..., п. Задача состоит в аппроксимации неизвестной функциональной зависимости между х и у многочленом заданной степени п: РЛХ)= TpjxJ- 7 = 0 Для решения этой задачи воспользуемся методом наименьших квадратов. Согласно этому методу коэффициенты многочлена нужно выбрать такими, чтобы сумма квадратов отклонений найденного многочлена от заданных значений функции была 350
минимальной. Другими словами, коэффициенты Ро,Ри функцию ., рп должны минимизировать Ввод \ исходных данных 1 хь..:,хк,уь...,ук,к J Ф(Лъ/>ь ».,A)=Z (Л(*|)~ i=i Формирование матрицы нормальной системы обращением к АР2 Решение нормальной системы обращением к SIMQ Вычисление среднеквадратического отклонения Т Печать результатов Т,Ро,РьР2 Рис. 34 i=l\7=0 В точке минимума функции Ф ее производные дФ/dpj обращаются в нуль. Дифференцируя Ф и приравнивая нулю производные, получим так называемую нормальную систему метода наименьших квадратов: т = 0, 1, 2, ..., к. Это система линейных алгебраических уравнений относительно неизвестных р0, pl9 ..., рп. Можно показать, что определитель этой системы отличен от нуля, т. е. решение системы существует и единственно. Однако на практике описанную методику применяют только для нахождения многочленов, степень которых не выше четырех-пяти. При более высоких степенях нормальная система становится плохо обусловленной и погрешности определения коэффициентов велики. В данной лабораторной работе заданную табличную функцию требуется аппроксимировать многочленом второй степени Р2(х)—р0+р1х^р2х2. В этом случае нормальная система имеет вид 4i=l / \i=l / i=l 1 Ро Ро ixA+pJixA+pJixtYixfy, i=l и ее можно решить, например, методом Гаусса, описанным в лабораторной работе 7. Блок-схема алгоритма метода наименьших квадратов представлена на рис. 34. Для построения нормальной системы методы наименьших квадратов можно воспользоваться подпрограммой (subroutine) 351
AP2. Подпрограмма АР2 формирует матрицу для аппроксимации функции многочленом второй степени: с subroutine АР2 (k,y,x,a) с Программа АР2 формирует матрицу нормальной системы * с метода наименьших квадратов для аппроксимации * с функции многочленом второй степени * с с к - количество измерений * с у - массив размерности к, содержащий значения функции * с х - массив размерности kf содержащий значения аргумента* с с Результат: * с а - массив размерности 3*4, содержащий расширенную * с матрицу нормальной системы * dimension a(3,4),y(l),x(l) do 1 i - 1,3 do 1 j - 1,4 a(i.j) = 0. 1 continue do 2 i - l,k a(l,l) - a(l,l) + 1. a 1,2) - a 1,2) + x(i) a 1,3) - a(l,3) + x i)"2 a 2,3 = a 2,3 + x i "3 a(3,3) = a(3,3) + x(i] a 1.4) - a(l,4) + у a(2,4) = a(2,4) ♦ у . a(3,4) - a(3,4) + y(irx(i)"2 2 continue a(2,l) = a(l,2) a(2,2) - a(l,3) a(3,2) - a 2,3) a(3,l) - a(l,3) return end Входные параметры: k—количество точек в таблице значений функции; у — массив из к действительных чисел, содержащий значения функции уи i=l, 2, ..., к\ х — массиа из к действительных чисел, содержащий значения аргумента хь /=1,2, ..., к. Выходной параметр а—двумерный массив размерности 3x4, содержащий элементы расширенной матрицы нормальной системы (в первых трех столбцах располагаются коэффициенты системы, а в четвертом—столбец свободных членов). Перед обращением к подпрограмме АР2 необходимо: 1) ойисать массивы х, у, а; 2) присвоить фактические значения параметрам х, у, к. !!•> x(i) с 352
Когда нормальная система построена, ее можно решить с помощью подпрограммы SIMQ, описанной в лабораторной работе 7. Задание. Аппроксимировать табличную функцию многочленом второй степени, используя подпрограммы АР2 и SIMQ. Вычислить среднеквадратическое отклонение по формуле ф=(|1(^(^)-д'.)2)1/2- Напечатать коэффициенты многочлена Ро, Pi, Pi и значение Ф. Порядок выполнения лабораторной работы 1. Составить головную программу решения поставленной задачи. В голобнои программе необходимо: а) предусмотреть ввод таблицы значений (xi9 yt); б) с помощью программы АР2 сформировать расширенную матрицу коэффициентов нормальной системы; в) переслать элементы матрицы в соответствующие массивы для обращения к подпрограмме. SIMQ; г) вычислить среднеквадратическое отклонение; д) предусмотреть печать результатов. 2. Провести вычисления на ЭВМ. Пример. Аппроксимировать многочленом второй степени но методу наименьших квадратов функцию, заданную таблицей: *, 0,0 0,1 0,2 0,3 0,4 и 0,6670 0,7749 0,8945 1,0020 1,1248 xt 0,5 0,6 0,7 0,8 0,9 yt 1,2879 1,4389 1,6214 1,7901 2,0109 *i 1,0 1,1 1,2 1,3 1,4 yt 2,2066 2,4429 2,7011 2,9547 3,2257 Xi 1,5 1,6 1,7 1,8 1,9 yt 3,5048 3,8114 4,1245 4,4389 4,7892 Программа решения этой задачи может иметь следующий вид: dimension x(20),y(20),a(3,4),b(3),al(9) open(unit-l,file='fap2.dat') с do 1 i - 1,20 read(l,') x(i),y(i) 1 continue с с обращение к программе АР2, формирующей матрицу с нормальной системы call AP2 (20,у,х,а) do 2 i - 1,3 b(D - a(i,4) do 2 j - 1,3 12-187 353
jl - (i - П'3+j al(jl) = a(j,i) обращение к программе SIMQ, решающей линейную систему call SIMQ (alfbf3fkk) печать результатов print 100, b вычисление среднеквадратичного уклонения t « 0. do 3 i = 1,20 3 t = t+((b(3Px(i)+b(2)px(i)+b(l) - y(1))"2 t » sqrt(t) с print 105,t stop с 100 format(2x,' р0-\е13.6/ pl=\el3.6,' p2=\el3.6) 105 format(2xf'ср.кв.откл.ЧеП.б) с end А Программа предназначена для вычислений на ПЭВМ типа IBM PC. Исходные данные расположены в файле fap2.dat. Каждая запись файла—значения х{ и уи разделенные пробелом. При вычислении на ЭВМ других типов необходимо проверить правила описания файлов. Вычисления по программе привели к следующим результатам: р0= 0.68156Е+00 pi- 0.850738Е+00 р2- 0.68927Е+00 ср.кв.откл. 0.363493Е-01 Таким образом, если аппроксимировать табличную функцию многочленом Р2(х) = 0,68114+0,850474*+0,689622*2, то средне- квадратическое отклонение для заданной таблицы равно 0,0363953. Варианты заданий Значения х- = /х0,1, /=1, 2, ..., 20, одинаковые для всех вариантов 1 1 2 3 4 5 6 7 Вариант 1 2,05 1,94 1,92 1,87 1,77 1,88 1,71 Вариант 2 2,09 2,05 2,19 2,18 2,17 2,27 2,58 Значения Вариант 3 2,02 1,98 1,67 1,65 1,57 1,42 1,37 yt=y(*i) Вариант 4 1,99 2,03 2,20 2,39 2,19 2,61 2,35 Вариант 5 2,23 2,29 2,27 2,62 2,72 2,82 3,13 Вариант 6 2,07 2,17 2,21 2,31 2,10 2,09 2,12 354
Продолжение таблицы i 8 9 10 11 12 13 14 15 16 17 18 19 20 Вариант 1 1,60 1,56 1,40 1,50 1,26 0,99 0,97 0,91 0,71 0,43 0,54 0,19 0,01 Вариант 2 2,73 2,82 3,04 3,03 3,45 3,62 3,85 4,19 4,45 4,89 5,06 5,63 5,91 Значения Вариант 3 1,07 3,85 3,48 3,35 -0,30 -0,61 -1,20 -1,39 -1,76 -2,28 -2,81 -3,57 -4,06 yi=y(xi) Вариант 4 2,60 2,55 2,49 2,50 2,52 2,44 2,35 2,26 2,19 2,24 2,34 1,96 2,19 Вариант 5 3,49 3,82 3,95 4,22 4,48 5,06 5,50 5,68 6,19 6,42 7,04 7,57 8,10 Вариант 6 1,63 1,78 1,52 1,16 1,07 3,85 3,56 3,10 -0,25 -0,65 -1,06 -1,66 -2,01 i 1 2 3 4 5 6 7 8 9 10 И 12 13 14 15 16 17 18 19 20 Вариант 7 2,18 2,43 2,40 2,43 2,65 2,75 2,67 2,66 2,63 2,75 2,41 2,24 2,12 1,74 1,57 1,17 0,96 0,63 0,25 -0,01 Вариант 8 -0,10 -0,21 0,01 0,05 -0,13 -0,23 -0,21 -0,43 -0,57 -0,44 -0,44 -0,83 -0,78 -0,81 -1,06 -1,41 -1,40 -1,70 -1,96 -1,91 Значения Вариант 9 -0,16 0,01 0,10 0,16 0,05 0,35 0,19 0,50 0,74 1,03 1,06 1,49 1,79 2,03 2,22 2,50 2,88 3,21 3,63 3,90 )'i=y(xi) Вариант 10 2,09 2,31 2,72 2,77 2,78 2,97 3,00 3,51 3,43 3,58 3,58 3,54 3,82 3,90 3,77 3,81 4,00 3,97 4,08 4,08 Вариант 11 2,15 2,41 2,58 2,84 3,28 3,46 4,02 4,11 4,61 5,03 5,34 5,86 6,33 6,81 7,21 7,67 8,23 8,68 9,35 9,93 Вариант 12 0,10 -0,01 -0,19 -0,11 -0,31 -0,78 -0,64 -0,85 -1,18 -1,39 -1,79 -2,02 -2,48 -2,93 -3,26 -3,91 -4,41 -4,91 -5,30 -6,00 i 1 2 3 4 5 Значения У1=у(х() Вариант 13 0,17 0,07 0,17 0,05 0,12 Вариант 14 0,80 0,29 0,52 0,77 0,93 Вариант 15 0,04 0,47 0,78 1,01 1,19 Вариант 16 0,08 0,14 0,37 0,36 0,44 Вариант 17 -0,02 0,44 0,51 0,67 0,69 Вариант 18 0,14 0,23 0,44 0,54 0,72 355
Продолжение таблицы i 6 1 8 9 10 11 12 13 -14 15 16 17 18 19 20 / 1 2 3 4 5 6 7 8 9 10 И 12 13 14 14 15 17 18 19 20 Вариант 13 0,00 0,01 -0,05 -0,21 -0,50 -0,50 -0,86 -1,24 -1,47 -1,79 -2,25 -2,55 -3,18 -3,60 -3,93 Вариант 19 -1,86 -1,95 -2,12 -2,06 -2,15 -2,00 -2,12 -2,31 -2,29 -2,57 -2,56 -2,86 -2,85 -3,03 -3,25 -3,08 -3,29 -3,67 -3,70 -3,85 Вариант 14 1,20 1,20 1,35 1,39 1,48 1,52 1,71 1,72 1,87 1.86 1,89 2,04 1,73 2,04 2,03 Вариант 20 -1,65 -2,00 -1,87 -1,89 -1,75 -1,59 -1,44 -1,61 -1,00 -1,17 -0,87 -0,47 -0,33 -0,00 0,34 0,49 0,81 1,37 1,72 2,03 Значения Вариант 15 1,60 1,93 2,22 2,50 3,01 3,22 3,71 4,23 4,78 5,27 5,75 6,16 6,76 7,30 8,00 Значения Вариант 21 -1,89 -2,07 -2,30 -2,26 -2,34 -2,66 -2,88 -2,85 -3,16 -3,49 -3,88 -4,22 -4,45 -4,99 -5,36 -5,71 -6,51 -6,76 -7,35 -8,02 yi=y{*i) Вариант 16 0,48 0,27 0,39 0,50 0,48 0,69 0,50 0,31 0,37 0,43 0,33 0,31 0,09 0,08 0,03 У{=УЫ Вариант 22 -1,84 -1,98 -1,72 -1,58 -1,69 -1,59 -1,58 -1,64 -1,55 -1,35 -1,33 -1,47 -1,50 -1,65 -1,65 -1,87 -1,61 -1,86 -1,84 -1,91 Вариант 17 1,04 1,14 1,37 1,77 2,00 2,12 2,47 2,90 3,50 3,99 4,06 4,54 4,99 5,36 5,99 Вариант 23 -1,92 -1,60 -1,57 -1,41 -1,36 -0,97 -0,59 -0,71 -0,15 0,01 0,22 0,63 1,07 1,42 1,68 2,49 2,57 3,09 3,40 4,00 Вариант 18 0,76 0,37 0,64 0,57 0,44 0,41 . 0,30 -0,01 -0,03 -0,47 -0,68 -0,93 -1,28 -1,53 -1,93 Вариант 24 -1,90 -1,80 -1,82 -1,86 -1,83 -2,00 -2,01 -2,05 -2,46 -2,68 -2,85 -2,98 3,30 -3,40 -3,90 -4,37 -4,65 -5,00 -5,42 -6,13 / 1 2 3 Значения yl=y(xi) Вариант 25 -1,80 -1,66 -1,36 Вариант 26 -1,65 -1,64 -1,41 Вариант 27 -1,88 -1,69 -1,52 Вариант 28 -4,01 -4,06 -3,83 Вариант 29 -4,13 -4,11 -3,87 Вариант 30 -3,97 -4,07 -4,04 356
Продолжение таблицы i 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вариант 25 -1,41 -1,13 -0,82 -0,74 -0,76 -0,64 -0,46 -0,30 -0,27 -0,22 -0,11 -0,02 0,11 0,11 -0,02 0,03 0,01 Вариант 26 -0,91 -0,63 -0,34 -0,12 0,25 0,64 0,96 1,50 1,77 2,24 2,93 3,17 3,77 4,42 4,79 5,50 6,01 Значения Вариант 27 -1,55 -1,16 -1,27 -1,23 -1,36 -1,26 -1,47 -1,72 -1,76 -2,00 -2,03 -2,35 -2,46 -2,88 -3,27 -3,68 -3,98 У1=у(хд Вариант 28 -3,98 -4,36 -4,18 -4,16 -4,51 -4,53 -4,38 -4,76 -4,66 -4,82 -4,77 -5,12 -5,23 -5,40 -5,84 -5,86 -6,01 Вариант 29 -3,74 -3,85 -3,71 -3,53 -3,56 -3,19 -3.04 -2,83 -2,54 -2,41 -1,97 -1,78 -1,53 -1,04 -0,86 -0,48 0,09 Вариант 30 -4,30 -4,27 -4,54 -4,79 -5,07 -5,30 -5,51 -5,83 -6,06 -6,40 -6,83 -7,54 -7,68 -8,36 -8,91 -9,39 -9,98 Лабораторная работа 51 ОПРЕДЕЛЕНИЕ ПАРАМЕТРОВ СЛУЧАЙНЫХ ВЕЛИЧИН МЕТОДОМ МОНТЕ-КАРЛО Методами Монте-Карло обычно называют методы решения всевозможных задач, основанные на моделировании случайных величин на ЭВМ. Может показаться, что методами Монте-Карло решаются только задачи вероятностного характера, связанные со случайными событиями и величинами. На самом деле это не так! С помощью этих методов можно решать произвольные детерминированные задачи, не связанные со случайными явлениями. Оказалось, что многие классические задачи можно решить методами Монте-Карло с помощью очень простых программ. Это обстоятельство позволяет повысить эффективность цепочки алгоритм — программа — вычислительный эксперимент. Существует много способов «порождать» случайные числа с помощью ЭВМ. Важно понять, что для получения значений случайных величин с произвольной функцией распределения достаточно уметь находить значения какой-нибудь одной «стандартной» случайной величины, так как всегда можно подобрать такую функцию от этой случайной величины, которая имела 357
бы требуемый закон распределения. В качестве такой случайной величины обычно берут случайную величину, имеющую равномерное распределение на отрезке [0, 1 ]. Не останавливаясь на теоретических положениях, лежащих в основе алгоритмов получения случайных величин, приведем текст программы—генератора случайной величины, равномерно распределенной на отрезке [О, 1], взятой из [42]: function URAND (iy) . с Программа - функция URAND является генератором с случайных чисел, равномерно распределенных с на отрезке [0,1] с с iy - целая переменная, предназначенная для инициализа- с ции генератора, перед первым обращением к URAND с переменной iy следует присвоить произвольное це- с лочисленное значение с с Результат: с Значение функции URUND - случайное число из от- с резка [0,1] с с !!!!! Значение переменной iy не должно изменяться между с последовательными обращениями к URAND double precision halfm data m2/0/,itwo/2/ if(m2.ne.O) go to 20 m = 1 10 m2 = m m = itwo*m2 if(m.gt.m2)go to 10 halfm = m2 ia = 8'idint(halfm'datan(l.d0)/8.d0) + 5 ic = 2'idint(halfm'(0.5d0 - dsqrt(3.d0)/6.d0)) + 1 mic = (m2 - ic) + m2 s = 0.5/halfm 20 iy = iy'ia if(iy.lt.O) iy = (iy + m2) + m2 urand = float(1y)*s return end Эта программа предназначена для персональной ЭВМ, совместимой с IBM PC. 358
, If , 1г_1_, , It , , , ° Pi ^~?Г' ^Ti i Рис. 35 В языке ФОРТРАН для СМ ЭВМ и во многих других диалектах ФОРТРАНа генератор равномерно распределенной случайной величины оформлен как встроенная функция, но может быть вызван и как подпрограмма. Конечно, всякая программа на самом деле служит генератором не случайной, а «псевдослучайной» величины, многие свойства которой близки свойствам настоящей случайной величины. Так как в ЭВМ разрядная сетка конечна, то генерируемые программой URAND значения начнут через некоторое количество вызовов повторяться. Важно, чтобы этот период был достаточно велик. Для программы URAND этот период равен 231 —1. Целая переменная iy служит для инициализации программы URAND и при первом обращении к URAND переменной iy следует присвоить произвольное, не равное нулю целочисленное начальное значение. Вызывающая программа не должна изменять значение iy между последовательными вызовами URAND. Для решения задач методом Монте-Карло необходимо получать на ЭВМ последовательности выборочных значений случайной величины с заданным распределением. Такой процесс принято называть моделированием случайной величины. Рассмотрим на конкретных примерах, как моделируются наиболее часто встречающиеся случайные величины. Моделирование дискретных случайных величин. Пусть случайная величина г| задана распределением У\ У 2-У и , где Pj = P^=yjl y=l, 2, ..., N. Pi Pi-Pn Общий метод моделирования дискретной случайной величины основан на следующем, алгоритме. Так как £ А=1> то разобьем отрезок [0, 1 ] на части 1{ так, чтобы 11{ \ =pt (рис. 35). Будем случайно бросать на отрезок [0, 1] точку и, если она попала на интервал 7,, то случайной величине г| будем присваивать значение уу Вероятность попадания на интервал Ij равна />.. Значит, построенная случайная величина г| имеет заданное распределение. Ниже приведен текст программы DSCRT, предназначенной для моделирования дискретных случайных величин: 359
subroutine DSCRT (n,p,j,i) dimension p(n) с x = urand(i) J = 0 10 j = j + 1 x = x - p(j) с if (x .gt. 0.) go to 10 с return end Входные параметры: n—число различных значений дискретной случайной величины; р — массив размерности п, содержащий значения вероятностей р{\ i—целая переменная для инициализации программы URAND. Выходные параметры: j — случайное целое число из диапазона 1— л, указывает номер очередного значения случайной величины г|. Приведем пример использования программы DSCRT для моделирования случайной величины г|, имеющей распределение л р 7.5 0.1 12 0.2 14 0.3 -5.2 0.4 Программа, реализующая моделирование случайной величины, может иметь следующий вид: dimension у(4),р(4) data у / 7.5,12. ,14. ,-5.2 / data p / 0.1, 0.2, 0.3, 0.4 / i - 1 do'ioT-'ilioo call* DSCRT *(4 J p * j J1) yy - y(j) 10 continue В приведенной программе у у—случайная величина с заданным распределением. Очень часто приходится иметь дело со случайными величинами, имеющими биномиальное распределение. Напомним, что биномиальное распределение с параметрами пир задается формулой вида Р{ц=к} = СкПрк(1-Ру-к. 360
Приведем текст программы BINOM, предназначенной для моделирования случайной величины, имеющей биномиальное распределение: subroutine BINOM (n,p,k\i) q - 1. - p pq = p/q x = urand(i) k = 0 pt = q"n 10 x = x - pt if (x .It. 0.) go to 20 с pt = pf (n - k)'pq/(k + 1) k = k + 1 go to 10 с 20 continue return end Входные параметры: n, p — значения параметров распределения n и p\ i — целая переменная для инициализации программы URAND. Выходные параметры: к—значение случайной величины, имеющей биномиальное распределение. Программа, использующая BINOM для моделирования случайной величины, которая имеет биномиальное распределение с параметрами л = 5, /? = 0,3, может иметь следующий вид: 1 - р - 0.3 п - 5 do 10 1 - 1,1000 call#BIN0M#(n*p*k*1) 10 continue Для очень часто встречающегося распределения Пуассона Р{ц=к}=— е х предлагается программа PSSN, моделирующая случайную величину, имеющую распределение Пуассона с параметром %: subroutine PSSN (lamrkri) real lam x = urand(i) p = exp(-lam) 0 10 x = x 361
if (x .It . 0.) go to 20 к = к + 1 p = p*lam/k go to 10 с 20 return end Входные параметры: lam—переменная действительного типа, значение параметра распределения X; i — целая константа для инициализации URAND. Выходные параметры: к—значение целой случайной величины, имеющей распределение Пуассона с параметром X. Программа PSSN используется так же, как и приведенная выше программа BINOM. Моделирование непрерывных случайных величин. Всякая случайная величина ^ полностью определяется функцией распределения F,(x): F,(x) = P£<x). Остановимся только на моделировании абсолютно непрерывных случайных величин. Так принято называть случайные величины, имеющие всюду непрерывную функцию распределения F^(x). Обозначим F'1 функцию, обратную F^.(x). Такая функция определена на отрезке [0, 1], так как F^(x) монотонно возрастает. В теории вероятностей показывается, что если случайная величина а распределена равномерно на отрезке [0, 1], то случайная величина £> = F~1(a) имеет функцию распределения F^(x). Из этой формулы получаем естественный и в некотором смысле стандартный способ моделирования абсолютно непрерывной случайной величины с заданной функцией распределения ^(х): 1. По известной функции F(x) аналитически или численно строим обратную ей функцию ^_1(а). 2. Генерируем очередное значение случайной величины а, равномерно распределенной на отрезке [0, 1]. 3. По формуле x = F~1(ol) находим очередное значение случайной величины ^, имеющей функцию распределения F(x). В качестве примера приведем программу для моделирования случайной величины, имеющей показательное распределение с параметром X. - • Функция распределения в этом случае имеет вид F^ = { О, х<0. 362
Для такой функции легко найти обратную. Имеем Таким образом, программа моделирования имеет вид subroutine EXPDS (lam,x,i) real 1am a = urand(i) x = -alog(a)/lam return end Простота этой программы обманчива. Дело в том, что вычисление логарифма на ЭВМ требует большого числа арифметических операций и многократное обращение к программе EXPDS приводит к значительным затратам машинного времени. Отметим, что стандартный метод моделирования редко используется на практике, так как для больпганства важнейших распределений функции F" * (а) не выражаются через элементарные функции, а табулирование функции F"* (а) существенно усложняет решение задачи. Выход из положения состоит в том, чтобы строить алгоритмы моделирования, максимально учитывая особенности распределения моделируемой случайной величины. Остановимся на моделировании случайной величины, имеющей нормальное распределение. Пусть £19 £2, ,..., £,N — независимые случайные величины, равномерно распределенные на отрезке [О, 1], M£j = 0,5, D4=l/12. Составим из них нормированную величину П=К^-0,5)/У^12. 1=1 Согласно центральной предельной теореме при п -* оо случайная величина г| достаточно быстро стремится к стандартной нормально распределенной случайной величине'с математическим ожиданием, равным нулю, и дисперсией, равной 1. 12 На практике обычно берут «=12, так что Л=Х £i — 6. i=l Моделирование случайной величины ^ = N(a, а), имеющей нормальное распределение с параметрами я и а, основано на формуле £ = я + ат1, где r| = JV(0, 1). Этот алгоритм реализован в программе NORM, текст которой приведен ниже: 363
с subroutine NORM (a,sigma,x,1) s - 0. do 1 j - 1,12 x = urand(i) s - s + x 1 continue с s - s - 6. x - a + sigma*s return end Входные параметры: а — математическое ожидание моделируемой случайной величины, sigma—среднеквадратичное уклонение моделируемой случайной величины; i — целая константа для инициализации URAND. Выходные параметры: х—значение моделируемой случайной величины. Остановимся теперь на моделировании изотропного вектора. Случайный вектор со = (со15 со2, ю3) называется изотропным, если конец вектора со/1| со || распределен равномерно на поверхности сферы || со || = 1. Это определение легко обобщается на случай произвольного числа измерений. Не останавливаясь на алгоритме, приведем текст программы, осуществляющей моделирование изотропного вектора: subroutine VECTOR (xryrzri) х - 1. - 2.*urand(i) 10 gl - 1. - 2.*urand(i) g2' = 1. - 2.*urand(i) d - дГ*2 + g2"2 1f (d .gt. 1.) go to 10 с sq = sqrt((l. - x"2)/d) У - gl'sq z = g2*sq return end Входные параметры: i—целая константа для инициализации URAND. Выходные параметры: х, у, z—координаты трехмерного изотропного вектора. Цель лабораторной работы — оценка математического ожидания случайной величины £, которая является сложной функцией нескольких независимых случайных величин с заданными законами распределения. Чаще всего построить функцию F^(x) в явном виде невозможно, но величину М\ можно оценить методом Монте-Карло. Опишем кратко этот метод. Пусть М\ существует. Выберем N реализаций £15 £2, ..., ^N случайной величины £ и вычислим среднее арифметическое 364
Так как последовательность одинаково распределенных независимых случайных величин, у которых есть математическое ожидание, подчиняется закону больших чисел, то величина aN сходится по вероятности к математическому ожиданию при N-^co, т.е. Р Таким образом, при больших N величина aN^a. Для оценки погрешности предположим, что величина £ имеет дисперсию DJ;. Если величины £19 £2, ..., £л независимы в совокупности, то в силу центральной предельной теоремы случайная величина N распределена асимптотически нормально. Зададимся до- верительной вероятностью Р, например Р = 0,95. Для нормально распределенной случайной величины £,Р(|£| < 1,96) = 0,95. Таким образом, при больших N с вероятностью, близкой к единице, выполняется неравенство \aN-a\<l996y/DtlN. Однако, когда мы приступаем к нахождению величины М£, значение Щ, как правило, неизвестно. Но в большинстве задач величину Щ можно оценить эмпирически по формуле Таким образом, вычисления следует прекратить, если 1.96 ^Jd^/Nk г, где 8 — заданная точность. Задание. Найти 95%-ный доверительный интервал шириной 2е для математического ожидания случайной величины Ffe, r|, £, i|/, ю), где £, г|, £, i|/—случайные величины с известными законами распределения, со—изотропный случайный вектор. Случайная величина £ распределена нормально с параметрами а, а; случайная величина г| имеет показательное распределение с параметром X; случайная величина £■ имеет биномиальное распределение с параметрами пир; случайная величина \|/ распределена по закону Пуассона с параметром А,; изотропный вектор имеет координаты {юь ю2, ©з}- Порядок выполнения лабораторной работы 1. Составить головную программу, моделирующую случайные величины с заданными распределениями, вычисляющую заданную функцию смоделированных случайных параметров и вычисляющую 365
95%-ный доверительный интервал для ее математического ожидания. 2. Провести вычисления на ЭВМ. Пример. Пусть £, г|, £—случайные величины, причем £>— распределена нормально с параметрами Л, = 2,2, а = 2; г| — распределена показательно с параметром А, = 0,6, £—имеет биномиальное распределение с параметрами л = 4, /? = 0.4. Найти оценку математического ожидания случайной величины z = —. А Программа решения задачи может иметь следующий вид: real ksi с 10 с с с с *ps = 0.01 i = 1 n =0 s = 0. s2 - 0. n = n + 1 call NORM (1.2, 0.02, ksi, i) call EXPDS (1.0, eta, i) call BIN0M (2, 0.5, k, 1) dzeta = k z = (1. + ksi"2)/(eta + exp(-dzeta)) s = s + z s2 = s2 + z**2 if (n .eq. 1) go to 10 a = s/n dz = s2/n - a"2 if ( sqrt(dz/(1.96*n)) .gt. eps ) go to 10 print *,'n= ' ,n print *,'c вер 0.95 мат. ожидай, лежит в инт. (', a-eps,a+eps,')' stop end В результате вычислений на ЭВМ получен следующий результат: обьем выборки п= 31151 с вер. 0.95 мат.ожидан. лежит в инт. (2.781493, 2.801494) 366
Варианты заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 а 1 1 2 0.5 2 1 2 2 1 2 1.5 -2 -3 0 0 0 2 -2 2 2 -2 а 0.1 0.1 0.5 1 0.1 0.2 0.1 0.5 0.1 0.5 1.0 1.0 0.1 2 1.0 1.0 1.0 0.5 0.9 0.4 0.2 X 2 2 1 1 0.2 2 3 2 1 5 2 2 1 1 1 1 2 2 1.5 0.9 3 0.5 п 3 3 4 5 3 5 3 3 4 /> 0.1 0.1 0.5 0.2 0.4 0.4 0.8 0.8 0.5 F(£, ц, С, \|/, ©,, со2, со3) №2 + Л3)/0+0 sin2co1e-(0i (l+^/O+e2-) arctg£/(l+\|/2) ln(l+x|/)/(co2 + arctg^2) (cos£ + rO/K + co2) (е *—cos ©^/(е*+cos \|/) (е ~ *—cos со j )/(е*+cos co2) (со1+со2 + соЗ)/1п(^2 + ^2) sin(^ + esin((0l+(0i)) COS(T|+COS3£) sh(cos£)/(^2) ¥*-* lntcosxlz + e^2) й + Л)/0-еш?) COS(C0!+\|/2) й + еш')/(1+е2ш0 arctg£2/(l+arctgco2) ^2+л2+^2 (cos^)/(2 + tgV) (со8Л + У/(2 + 1ё20 е-Й+1/(1+Л)) cosxl/e10"' coscd^-*1'2 (©i + ^/arctgO+O sin(r|3+cosco2) sin^ + cos^/TTri) ^2 + Л2 + со2 vM»t+.s/e»i+<»i Vl^i^n Лабораторная работа 52 ВЫЧИСЛЕНИЕ ИНТЕГРАЛОВ МЕТОДОМ МОНТЕ-КАРЛО При вычислении однократных интегралов, как правило, приводилась оценка погрешностей на некотором классе функций. Например, для формулы трапеций эта погрешность на классе 367
функций, имеющих вторую производную, имеет вид Здесь [а, Ь] — промежуток интегрирования, п—число узлов интегрирования. Эта оценка называется гарантированной оценкой погрешности. При переходе к многомерным интегралам возникают две проблемы: во-первых, очень трудно получить замкнутые выражения для гарантированных оценок, и, во-вторых, даже если такая оценка получена, то для ряда классов функций она оказываете^ практически бесполезной, так как для достижения заданной гарантированной погрешности квадратурная формула должна содержать настолько • большое число y3jioB, что выполнить вычисления на ЭВМ практически невозможно. Для преодоления этих трудностей можно отказаться от строгой гарантированной оценки погрешности и ограничиться получением оценки погрешности лишь с определенной степенью достоверности. Одним из методов вычисления интеграла, при котором погрешность оценивается не гарантированно, а лишь с некоторой степенью достоверности, является метод Монте-Карло. Пусть требуется вычислить приближенное значение интеграла n/MJ-№)d*idx2...dxn, Q где Р=(хи х2, ••-, хп)—точка «-мерного пространства. Без ограничения общности можно считать, что область Л = {(*ь х2,—9 хп)\х(с:[0, 1], /=1, ..., п} — «-мерный единичный куб. Если Pj—последовательность случайных попарно независимых точек, равномерно распределенных в кубе Q, то случайные величины Sj=f{Pj) попарно независимы и одинаково распределены, причем M(j,)=fl...J/(P)d*1dx2...dx, Q ^(sj) = H...if(P)dx1...dxn-[\l..\f(P)dx1...dxn]2^D, Q т. е. математическое ожидание введенных величин совпадает с искомым значением интеграла. Рассмотрим случайную величину 1 N О л; = — / S ;. 368
В силу попарной независимости случайных величин Sj получаем 7=1 П Если точки Р7 независимы в совокупности, то на основании центральной предельной теоремы случайная величина (SN—I(f))/ /у/D/N распределена асимптотически нормально. Зададимся доверительной вероятностью р, например Р = 0,95. Для нормально распределенной случайной величины ^ Р(|^|< 1,96) = 0,95. Таким образом, при больших N с вероятностью, близкой к 0,95, выполняется неравенство \SN-IfJ)\<l996y/DiN. Величина D в правой части априори неизвестна, но ее можно оценить эмпирически по формуле D^-Ysf-t^Y s)2. N£i \Ni=i 7 Приведем схему алгоритма для вычисления интеграла методом Монте-Карло для выбранной доверительной вероятности р = 0,95. Последовательно для п = 1, 2, ... получаем координаты случайных точек Рп и вычисляем величины z„, Sn, dn, Dn, используя рекуррентные соотношения: zH = zn-1+f(PH)9 Sn = zjn, dn = dn-1+^{f{Pn)-Sn)\ D^dn-Jin-l). Начальные условия для рекуррентных формул имеют вид Z^S! =/(/>!), rfi=/>1=0. Параллельно вычисляем величину wn=\,96 Jl\fn. Вычисления прекращаем, если оказалось, что и>л^е. В этом случае полагаем, -что искомое значение интеграла I(f) = Sn и считаем, что с вероятностью 0,95 выполняется неравенство \I(J)-Sn\<*- 369
Описанный алгоритм реализован в виде подпрограммы INTMK(n, f, x, eps, res, i, к), которая предназначена для вычисления интеграла $$...$f(P)dx1...dxn по «-мерному единичному кубу: subroutine INTMK (n,f.x^ps.resj.k) с Программа INTMK вычисляет интеграл по п-мерному с единичноку кубу от функции f(xl,...,xn) методом с Монте-Карло с доверительной вероятностью 0.95 с с п - размерность пространства с f - имя подпрограммы-функции, вычисляющей f(x) с х - рабочий массив размерности п с eps - точность с i - целая переменная для инициализации генератора с случайных чисел URAND с к - обьем выборки с с Результат: с res - значение интеграла dimension x(l) к - 1 do 10 j - lrn x(j) - URAND (i) 10 continue s -f(x) sn - s dn - 0. v - 0. с 100 к - к + 1 do 20 j - l,n x(j) - URAND (i) 20 continue с z - f(x) s - s + z sn - s/k v - v + k/(k - l)'(z - sn)4 dn - v/(k - 1) w = 1.96*sqrt(dn/k) if(w.gt.eps) go to 100 res - sn return end 370
Входные параметры: п—размерность пространства; х—рабочий массив размерности n; f—имя подпрограммы-функции; eps—точность; i — целая переменная для инициирования генератора URAND. Выходные параметры: res — значение интеграла; к — объем выборки. Задание. Методом Монте-Карло вычислить интеграл $№$sm(x2+y2 + z2 + t2 + u2 + w2)dxdydzdtdvdw Q по единичному шестимерному кубу: П = {х^ [О, 1], je [0, 1],ze [0, 1],ие [0, 1], ие [0,1], we [0, 1]}. Программа, реализующая вычисления, может иметь следующий вид: external f dimension x(6) с eps - 0.01 i - 1 с с обращение к программе INTMK, вычисляющей интеграл с call INTMK (6,f,x,eps,res,i,lc) с с печать результатов с print * ' print * print * print * print * stop end объем выборки',k приближенное значение интеграла',res с доверительной вероятностью 0.95' значение интеграла лежит в интервале' res - eps, res + eps function f(x) dimension x(l) s = 0. do 1 j - 1,6 s = s + x(j)*x(j) 1 continue f = sin(s) return end В результате вычислений на ЭВМ получен следующий результат: 371
объем выборки 5168 приближенное значение интеграла 6.9500660Е-01 с доверительной вероятностью 0.95 значение интеграла лежит в интервале 6.85Q66QE-Q1 7.05066Е-01 Варианты заданий Все интегралы вычисляются по единичному кубу в /7-мерном пространстве, е = 0,01 Номер варианта Л*) Номер варианта 16 17 18 19 20 21 22 23 24 25 26 27 п 5 7 6 5 8 7 8 7 5 4 5 6 /(*) i't) [=1 / 1 i+ I *, 1 1+1 xf 1=1 л X cosx? i= l 1 1+2 £ х? i=l cosf X *< cosf X *i] In(2+ I *,J *l+*2+*3 5+X3+X4+X5 sin(xi+x2 + *3) (») arctg arcctgl X *? sin jc? cos* 2 1+ 5] sin2jc, arctg ft*.) <l,-) 1+arctgl X ^1 j sin| X *,1/(1+ Z COS JC? П ™(х?) *=1 arctg sin I И x,l cos( fl xt) arcctgl £ *<? 372
Продолжение таблицы Номер варианта 13 14 15 п 1 6 8 /W COsf X *<]/ C0S( X *«) Чй") Ч,?|"У(|+Д") 1 Номер варианта 28 29 30 п 8 7 4 Л*) л П (1 +cos х?) /=1 Jl+ism^x?) Xi + xj + xl 2 + * 1*2*3*4
ДОПОЛНЕНИЕ КРАТКОЕ ОПИСАНИЕ ЯЗЫКА ФОРТРАН В последние годы парк ЭВМ, эксплуатируемых в нашей стране, существенно расширился. Появились новые модели ЕС ЭВМ, СМ ЭВМ, многочисленные типы персональных компьютеров отечественного и зарубежного производства. Еще шире стал круг используемых операционных систем. В практику программирования вошли новые языки программирования: ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др. Однако язык ФОРТРАН продолжает оставаться основным языком программирования для проведения научно-технических расчетов. Практически каждая операционная система содержит компилятор языка ФОРТРАН. Большинство диалектов ФОРТРАНа совсем мало отличаются друг от друга, поэтому в данном пособии приводятся основные сведения о тех минимальных средствах ФОРТРАНа, которые составляют ядро всех версий ФОРТРАНа, используемых на ЕС ЭВМ, СМ ЭВМ и IBM—совместимых персональных компьютерах. 1. Основные элементы языка 1.1. Алфавит языка. Для записи конструкций языка можно использовать строго определенный набор основных символов, который называется алфавитом языка. Алфавит ФОРТРАНа делится на буквы, цифры и специальные символы. Буква — это один из следующих 26 символов: А, В, С, D, E, F, G, Н, I, J, К, L, M, N, О, Р, Q, R, S, T, U, V, W, X, Y, Z*>. Цифра—это один из следующих десяти символов: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. В рукописных текстах цифру 0 перечеркивают, чтобы отличить ее от буквы О. Специальный символ—это один из символов, приведенных в табл. 1. *] В большинстве современных операционных систем допустимо использование как прописных, так и строчных букв. , 374
Таблица 1. Специальные символы Символ 1 1 + * / Наименования символа пробел равно плюс минус звездочка косая черта Символ ( ) 1 » 1 & Наименование символа левая скобка правая скобка запятая точка апостроф амперсанд Для записи комментариев и текстовых констант могут быть использованы все отображаемые символы кода, используемого в данной операционной системе. Из символов языка образуются слова языка, которые можно разделить на две группы: служебные слова и слова пользователя. Служебные слова имеют фиксированное начертание и раз и навсегда заданный смысл. Слова пользователя выбираются программистом на основании правил, принятых в языке, и не должны по начертанию совпадать со служебными словами. Слова пользователя принято называть символическими именами или идентификаторами. Идентификаторы используют для обозначения переменных, массивов, функций и т. д. Идентификаторы представляют собой последовательность букв и цифр из алфавита, причем первым символом этой последовательности должна быть буква. В идентификаторе может быть не более шести символов. Пробелы в идентификаторах игнорируются. Основные служебные слова будут приводиться в процессе описания операторов ФОРТРАНа. 1.2. Типы величин. Обычно достаточно познакомиться с величинами трех типов: целого, вещественного и символьного. Эти величины используются в программах обычно в виде констант, переменных и массивов различной размерности. Значениями целых величин могут быть целые положительные числа, целые отрицательные числа и нуль. Целая величина может принимать значения от -2 147 483 647 до 2 147 483 647. Значениями вещественных величин являются десятичные дроби. Они могут быть положительными, отрицательными и равными нулю. Вещественная величина может принимать значения от «5,4-10"79 до «7,2-1075. Значениями, величин символьного типа являются наборы произвольных отображаемых символов. 1.3. Константы. Константа—это величина, которая, будучи однажды определена, не может измениться в процессе вычисления. Тип и значение константы полностью определяются ее написанием. Целые константы имеют вид обычных целых чисел и записываются последовательностью десятичных цифр, перед кото- 375
рыми может стоять знак « + » или « —». Например, целая константа +35 соответствует целому числу 35. Вещественные константы без порядка — это десятичные дроби, и, в частности, целые числа, записанные в виде десятичных дробей. В обычной записи десятичных дробей содержится запятая, которая отделяет целую часть от дробной. В ФОРТРАНе вместо запятой используется десятичная точка, которая является обязательным атрибутом вещественной константы * Она может стоять в начале, середине или конце константы. Знак константы (« + » или « —») записывается слева от нее, причем знак « + » может быть опущен. Например, числу 0,18 можно поставить в соответствие константу 0,18 или +0,18. Аналогично, константа 25. означает то же самое, что и 25,0. Если константа содержит много цифр, то ее удобно представлять в показательной форме. Например, число 3 500 000 можно записать в виде 3,5 10^. Для записи вещественных чисел в показательной форме в ФОРТРАНе предусмотрены вещественные константы с порядком. Вещественная константа с порядком записывается в виде К1ЕК2, где Ki—вещественная константа без порядка (часто называемая мантиссой); К2—целая константа, содержащая не более двух цифр и называемая порядком. Следует подчеркнуть, что при написании констант с порядком ни мантиссу, ни порядок нельзя опускать. Если мантисса или порядок положительные числа, то знак перед ними может быть опущен. Например, число 3,5 • 103 представляют следующие константы вещественного типа с порядком: +3,5Е6, 3,5Е + 06, 0,35Е7. Допускаются две формы записи символьных констант: а) в виде nlis, где s—последовательность символов, представляющая собой значение символьной константы; п — целая константа без знака, означающая число символов в последовательности s; H — признак символьной константы; б) в виде последовательности символов, заключенных в апострофы, т. е. У. Символьную константу, заключенную в апострофы, называют также литералом. Для представления апострофа в литерале необходимо записать подряд два апострофа. Пробел внутри s рассматривается как самостоятельный символ. 1.4. Переменные: Массивы. Величину, значение которой может изменяться в процессе работы программы, называют переменной. Различают простые переменные и переменные с индексами (массивы). Простая переменная обозначается идентификатором. Каждой простой переменной отводится ячейка в памяти, содержимое которой является значением этой переменной в каждый момент вычислительного процесса. Переменная с индексами представляется в виде a(il9 .... /„), где а — идентификатор; ik(k=l, ..., п) — индекс. Индекс представ- 376
ляет собой арифметическое выражение целого или вещественного типа (см. п. 1.5). Таким образом, переменная с индексами служит для компактного описания массива, т. е. упорядоченной последовательности величин, обозначенных одним идентификатором. Отдельные величины, образующие массив, называют элементами массива. Каждый элемент массива именуется идентификатором массива с конкретными значениями всех индексов. Число используемых индексов называют размерностью массива. Наименьшее значение индекса равно единице *\ Наибольшее значение каждого индекса устанавливается в операторе размерности или описания типа (см. ниже). Элементы массива располагаются в памяти в такой последовательности, что значение первого индекса возрастает наиболее быстро, а значение последнего—наиболее медленно. Например, если 1^КЗ, 1^J^2, то элементы A(I, J) двумерного массива А располагаются в следующем порядке: А(1, 1), А (2, 1), А(3, 1), А(1,2), А(2, 2), .А(3,2). Тип простой переменной или массива может быть задан одним из следующих способов: по умолчанию, с помощью оператора IMPLICIT, способом явного описания. В основу первого способа положено определение целого или вещественного типа по первому имени идентификатора: если первым символом идентификатора является одна из букв I, J, К, L, M, N, то переменная относится к целому типу; если первым символом является любая другая буква, то переменная относится к вещественному типу. Явное описание выполняют с помощью специальных операторов описания типа (см. п. 3.1). Описание типа оператором IMPLICIT здесь не рассматривается. 1.5. Арифметические выражения. Аналогом математических формул в ФОРТРАНе является арифметическое выражение. Арифметическое выражение состоит из констант, переменных и указателей функций, соединенных знаками арифметических операций. Для указания порядка выполнения арифметических операций можно использовать круглые скобки. Константы, переменные и функции, входящие в арифметические выражения, могут быть целого и вещественного типов. Знаками арифметических операций являются: + сложение, — вычитание, х умножение, / деление, ** возведение в степень. При написании арифметических выражений недопустима запись двух или нескольких идущих подряд знаков операций. Например, запись А* —В недопустима, тогда как запись А*( — В) есть арифметическое выражение. Необходимо помнить, что АВ — переменная, а А*В—произведение переменных А и В. Все арифметические операции имеют общепринятый в математике В некоторых версиях ФОРТРАНа это ограничение устранено. 377
смысл, за исключением нескольких особых случаев. В частности, при делении двух целых величин получается величина целого типа (при этом дробная часть отбрасывается: вычисляя 19/4, получаем 4); если Х<0, a Y—величина вещественного типа, то операция X**Y не имеет смысла. При вычислении значения арифметического выражения операции выполняются в строго установленном порядке с учетом скобок и правил старшинства операций. В первую очередь вычисляются значения указателя функции, затем выполняются операции возведения в степень, затем умножение и деление и в последнюю очередь сложение и вычитание. Выражение в скобках вычисляется до того, как его значение будет использовано для дальнейших вычислений. Если операции одного и того же уровня старшинства следуют непосредственно друг за другом, то они выполняются последовательно слева направо. Однако это правило не распространяется на операции возведения в степень, которые выполняются последовательно справа налево. Например, выражение В + ((А + В)*С) + А**2 будет вычисляться в следующем порядке; 1) А + В (результат обозначим через X); 2) Х*С (результат обозначим через Y); 3) B + Y (результат обозначим через W); 4) А**2 (результат обозначим через Z); 4) W + Z. В то же время вычисление выражения А*В/С*D*К происходит следующим образом: 1) А*В (результат обозначим через X); 2) Х/С (результат обозначим через Y); 3) Y*D (результат обозначим через Z); 4) Z*K. Значение арифметического выражения может относиться к целому или вещественному типам. Правила определения типа результата выполнения арифметических операций приведены в табл. 2. В таблице величины целого типа обозначены буквой Ц, а величины вещественного типа—буквой В. Таблица 2. Тип результата операции Ах В, где т —один из знаков + ,—,*,/, ** В А В ц в в в Ц в ц 1.6. Отношения. Отношение записывается в виде а а Ь, где а, Ъ—арифметические выражения; а—знак операции отношения. 378
Знаками операций отношения являются такие последовательности основных символов: .GT. (больше), .GE. (больше или равно), .LT. (меньше), .LE. (меньше или равно), .EQ. (равно) .NE. (неравно). Отношение истинно, если оно удовлетворяется для значений входящих в него арифметических выражений, в противном случае отношение ложное. 2. Операторы присваивания и управления Программа на ФОРТРАНе состоит из последовательности операторов. Операторы делятся на два класса: выполняемые и невыполняемые. Выполняемые операторы определяют действия, которые необходимо выполнить над обрабатываемыми данными. Невыполняемые операторы служат для описания свойств данных и отдельных элементов программных единиц. Каждый оператор программы может быть помечен некоторой целой константой без знака, называемой меткой. Метка оператора позволяет ссылаться на данный оператор в других операторах. Как правило, метками снабжают только выполняемые операторы программы. Из невыполняемых операторов обязательно помечаются только операторы форматов. Метки содержат не более пяти цифр и поэтому принимают значения от 1 до 99 999. 2.1. Арифметический оператор присваивания. Арифметический оператор присваивания имеет вид па = Ь где п—метка (может отсутствовать); а—переменная (простая или с индексами) целого или вещественного типа; b—арифметическое выражение, =—знак присваивания. Запись А = А+1. означает, что к текущему значению переменной А, хранящемуся в некоторой ячейке памяти, прибавляется константа 1. и результат помещается в ту же ячейку памяти. Тем самым текущее значение переменной величины А увеличилось на 1. Тип левой части а оператора присваивания может не совпадать с типом Ь. В этом случае значение правой части приводится к типу левой части в соответствии со следующими правилами: 1) если переменная а целого типа, а выражение Ъ—вещественного, то в качестве значения переменной а берется целая часть значения выражения Ь\ 2) если переменная а вещественного типа, а выражение Ъ—целого, то в качестве значения переменной а берется значение выражения Ь. 379
2.2. Оператор безусловного перехода. Обычно операторы программы выполняются последовательно один за другим. Однако в ФОРТРАНе существует возможность изменить порядок выполнения операторов. Одним из таких операторов является оператор безусловного перехода. Оператор безусловного перехода имеет вид п GO TO m где п — метка данного оператора (может отсутствовать); т — метка некоторого другого оператора. Действие оператора безусловного перехода заключается в передаче управления оператору, помеченному меткой т. Например, после выполнения оператора GOTO 10 будет выполняться оператор, помеченный меткой 10. 2.3. Условные операторы. Изменить порядок выполнения операторов можно с помощью условного арифметического оператора и условного логического оператора. Условный арифметический оператор имеет вид п IF (a)nl9 п2, пъ где п—метка оператора (может отсутствовать); а—арифметическое выражение целого или вещественного типа; ni9 n2, пъ—метки некоторых других операторов. Условный арифметический оператор выполняется следующим образом: вычисляется значение арифметического выражения а и управление передается оператору, помеченному меткой пг, п2 или п3, если значение арифметического выражения соответственно меньше нуля, равно нулю или больше нуля. В качестве примера рассмотрим фрагмент программы А = 3. IF (A+1.5) 11,12,13 После выполнения оператора IF управление будет передано оператору с меткой 13. Если 1 = 4, и J =—4, то оператор IF (I + J) 7,3,4 передаст управление оператору с меткой 3. Условный логический оператор имеет вид nl¥(s)b где п — метка (может отсутствовать); s — отношение (см. п. 1.7); Ь — непомеченный выполняемый оператор, отличный от оператора цикла и от условного оператора. При выполнении условного логического оператора происходит проверка входящего в него отношения. Если отношение истинно, то выполняется оператор Ъ, в противном случае выполняется оператор, следующий за данным условным логическим оператором. Например, если А = 7.0 и В = 3.0, то оператор IF (A.GT.B)GOT024 передаст управление оператору с меткой 24. При тех же значениях А и В в результате 380
выполнения оператора IF (A.LT.B)B = A значение В не изменится, так как оператор В = А выполняться не будет, а управление будет передано следующему оператору. 2.4. Вспомогательные операторы управления. Вспомогательные операторы управления относятся к числу выполняемых. Оператор продолжения имеет вид «CONTINUE где п—метка оператора (может отсутствовать). Этот оператор не выполняет никаких действий и обычно используется в качестве конечного оператора цикла (см. ниже). Оператор CONTINUE должен располагаться в программе среди выполняемых операторов. Оператор возврата имеет вид п RETURN где п — метка данного оператора (может отсутствовать). Оператор RETURN обеспечивает передачу управления в ту программу или подпрограмму, из которой было передано управление в данную программную единицу. Если данная программа является основной, то оператор возврата передает управление в операционную систему. Оператор останова имеет вид «STOP где п — метка данного оператора (может отсутствовать). Оператор останова используется только в основной программе и обеспечивает завершение выполнения основной программы. 2.5. Оператор цикла. Оператор цикла имеет вид nY>Om i=ml9 m2, тъ где п — метка данного оператора (может отсутствовать); т — метка некоторого выполняемого оператора, который называется конечным оператором цикла и размещается в программе после оператора цикла; i—простая целая переменная, называемая параметром цикла; т1—начальное значение параметра цикла; т2—конечное значение параметра цикла; т3—приращение параметра цикла! В качестве начального значения, конечного значения и приращения параметра цикла могут использоваться либо целые константы без знака, не равные нулю, либо простые переменные целого типа. К моменту выполнения оператора цикла значения этих переменных должны быть больше нуля. Если тъ отсутствует, то подразумевается, что т3 = 1. Оператор цикла является одним из наиболее мощных средств языка ФОРТРАН. Он позволяет организовать многократное выполнение фрагмента программы, который называют областью действия оператора цикла. В область действия оператора цикла 381
входит группа операторов, которая начинается начальным оператором цикла, т. е. оператором, расположенным непосредственно за оператором цикла, и заканчивается конечным оператором цикла. Область действия оператора цикла может состоять из одного оператора. Рассмотрим пример: DOl J=l, 10, 2 A(J) = J*0.1 Bm = A(J)**2 1 CONTINUE Здесь первый оператор — оператор цикла, второй—начальный оператор цикла, последний—конечный оператор цикла. Область действия цикла образуют второй, третий и четвертый операторы этого фрагмента. Оператор цикла выполняется следующим образом: величине i присваивается значение тх и управление передается начальному оператору цикла; после выполнения конечного оператора цикла к величине i прибавляется тъ\ если после этого значение параметра цикла i еще не стало больше га2, то управление снова передается начальному оператору цикла и весь процесс повторяется; если оказалось, что значение i больше т2, то управление передается оператору, следующему непосредственно за конечным оператором цикла; если с самого начала тх>т2, то цикл все-таки выполнится один раз. Рассмотрим правила использования оператора цикла. 1. Конечный оператор цикла не может быть оператором цикла, оператором перехода, условным оператором, оператором возврата и останова. Если возникает необходимость в такой конструкции, рекомендуется использовать оператор продолжения. 2. Величины, входящие в оператор цикла, не должны изменять свои значения внутри области действия оператора цикла. 3. В области действия некоторого (внешнего) оператора цикла могут содержаться другие (внутренние) опера- ^J торы цикла. В этом случае обязательно, чтобы все операторы из области действия внутреннего | 5 2 оператора цикла принадлежали также области ^)з действия внешнего оператора цикла. Один и тот ■=l же оператор может быть конечным оператором :г нескольких вложенных друг в друга циклов. ^V^ 4. Если некоторый оператор является конеч- J ным оператором нескольких вложенных друг ^? в друга циклов, то ему можно передавать -Г^М управление только из области действия самого внутреннего оператора цикла. 5. Вход в область действия оператора цикла Рис. 36 разрешается только через оператрр цикла. 382
Примеры допустимых и недопустимых передач управления в случае вложенных операторов цикла показаны на рис. 36. 6. Область действия оператора цикла может содержать указатели функций и операторы обращения к подпрограммам. 3. Операторы спецификаций К операторам спецификаций относятся невыполняемые операторы описания типа и оператор описания размеров массивов. В программных единицах операторы спецификаций должны предшествовать выполняемым операторам и определениям операторов-функций. 3.1. Операторы описания типа. Существуют два вида операторов типа: оператор неявного описания типа и операторы явного описания типа. Опишем только два оператора явного описания типа. Операторы явного описания типа позволяют определить не только тип отдельной переменной, массива или функции, но дают возможность описать массивы, а также устанавливать начальные значения для описываемых данных. Явный оператор типа имеет вид tai(*i)/*i/> a2{ki)lx2^ •••> an{K)l*nl где t—указатель типа; at (i=l, ...,«)—имя переменной, массива или функции типа t; kt (/= 1,...,«) — указатель размерности величины а{\ х{—начальное значение величины а{. Параметры (к() и /xj могут отсутствовать. В качестве указателя целого типа используется служебное слово INTEGER. Вещественный тип обозначается словом REAL. Указатели размерности используются только при описании массивов и имеют вид (м1;м2,...,мт) где т — размерность массива (га<7); М7- (у=1, 2, ..., т) — максимальное значение у-го индекса. В качестве максимальных значений индексов указываются целые константы без знака. В этом случае массив состоит из Мх х М2 х ... х Мт элементов. Начальные значения могут быть присвоены только переменным и массивам. Начальное значение переменной записывается в виде константы соответствующего типа. Начальное значение массива записывается в виде списка' констант соответствующего типа, разделенных запятыми. Константы могут быть целыми, вещественными и символьными. Каждой константе может предшествовать повторитель. Константа с повторителем имеет вид i*c где с—константа; /—повторитель (целое число без знака). Повторитель указывает, сколько раз константа должна повторить- 383
ся в списке. Например, запись 4*3.14 эквивалентна записи 3.14, 3.14, 3.14, 3.14. Соответствия между константами и элементами массива устанавливаются по порядку их следования в списке констант и в памяти ЭВМ (см. п. 1.4). Число констант в списке должно быть равно числу элементов в массиве. Приведем примеры: оператор INTEGER S (21)/3, 1, 4, 18*12/, I (10,20), R относит переменные S, I, R к целому типу; величина S является одномерным массивом, состоящим из 21 элемента. Эти элементы имеют следующие начальные значения: S(l) = 3, S(2)=l, S(3) = 4, S(4) = S (5) =... = S (21)= 12. Величина I является двумерным массивом, состоящим из 200 элементов. Максимальное значение первого индекса равно 10, второго — 20. Величина R—простая переменная. Оператор REAL D (15)/15* 3.5E + 2/, JK указывает, что величины D и JK — вещественного типа, величина JK — простая переменная, величина D — одномерный массив, состоящий из 15 элементов. Все элементы массива имеют следующие начальные значения: D(1) = 350.,D(2) = 350.,... D(15) = 350. 3.2. Оператор размеров. Если типы используемых переменных определяются по умолчанию, то размеры массива можно задать оператором размеров. Оператор размеров имеет вид DIMENSION а^к,), а2(к2), ..., ап{кп) где а{ (/=1, ..., п).—идентификатор массива; kt (/= 1, ..., п)—указатель размерности массива, он имеет ту же структуру, что и в операторе явного описания типа (см. п. 3.1). Например, оператор DIMENSION A(3, 2), J (40) устанавливает, что А—двумерный массив вещественного типа, максимальное значение первого индекса этого массива равно 3, а второго—2, J — одномерный массив целого типа, максимальное значение индекса этого массива равно 40. Допустимо совместное непротиворечивое использование операторов явного описания типа и размеров. Например, последовательность операторов REAL JM, KL DIMENSION JM(10) эквивалентна одному оператору REAL KL, JM(10). 4. Функции и подпрограммы Часто возникает необходимость проведения одних и тех же вычислений в различных частях программы. В ФОРТРАНе существует развитой аппарат, позволяющий оформить такой фрагмент программы в виде оператора-функции, подпрограммы- 384
функции или подпрограммы. При таком оформлении фрагмент записывается один раз, а в соответствующие места программы помещаются лишь обращения к этому фрагменту. Если соответствующий фрагмент оформлен в виде самостоятельной программной единицы, то к этому фрагменту возможно обращение из других программных единиц. 4.1. Встроенные функции. Наиболее часто используемые математические функции представлены в виде составной части языка и называются встроенными функциями. Конструкция вида / (-*l5 x2> •••' Хп) Называется указателем функции. Здесь/—имя функции, х{ (/=1, ..., п)—ее аргументы, которые принято называть фактическими параметрами. В качестве имен функций используются идентификаторы, а в качестве фактических параметров—константы, выражения, имена переменных, массивов, функции и подпрограмм т. Указатель функции, как и переменные, относится к определенному (целому или вещественному) типу. В табл. 3 приведен неполный перечень встроенных функций ФОРТРАНа. Указатель функции ALOG(X) ALOGIO(X) ЕХР(Х) SQRT(X) SIN(X COS(X) TAN(X) COTAN(X) Таблица З. Встроенные функции*} Функция у = In х y = lgx y = QX y=V* y = sipx y = COSX У = Чх >' = CtgX 1 Указатель функции 1 ARSIN(X) ARCOS(X) ATAN(X) ABS(X) SINH(X) COSH X) SIGH^, X2) Функция >> = arcsin.x j> = arccosjc j>=arctgjc У = \х\ y = shx y = chx j> = |*ilsignx2 Приведем пример использования встроенных функций ФОРТРАНа: Х=1.52 Y = EXP(SIN(X))+1 Y = SQRT(Y) Данная последовательность операторов присваивает переменной значение, равное y/l+esin1'52 4.2. Оператор-функция. Оператор-функция предназначен для определения подпрограммы, используемой только в той программной единице, в которой он определен и имеет вид +) Набор встроенных функций и имена некоторых из них могут меняться при переходе от одной операционной системы к другой. 13-187 385
где/—идентификатор функции; х—список формальных параметров; а — арифметическое выражение. Список формальных параметров имеет вид • 1' 2' *••' и Здесь xt (i = l, ..., п)—формальные параметры. Формальные параметры должны удовлетворять следующим требованиям. 1. В качестве формальных параметров можно использовать только простые переменные. 2. Все формальные параметры должны быть обозначены различными идентификаторами. 3. Вне оператора-функции идентификаторы формальных параметров можно использовать как простые переменные или формальные параметры другого оператора-функции. 4. Тип формальных параметров и оператора-функции устанавливается по умолчанию или явными операторами описания типа. В состав арифметического выражения а могут входить: формальные параметры, константы, простые переменные, не являющиеся формальными параметрами данного оператора-функции, а также указатели других функций. Однако оператор- функция не должен прямо или косвенно обращаться к самому себе. Например, оператор-функция F(X) = SQRT(X)+F(Z) недопустим, так как содержит обращение к самому себе. Обращение к оператору-функции можно осуществить, используя указатель функции в арифметическом выражении. При этом должны выполняться следующие условия: 1) к оператору-функции можно обращаться только в пределах той программной единицы, где оператор-функция определен; 2) фактические параметры в указателе функции по количеству, типу и порядку следования должны совпадать с формальными параметрами; 3) в качестве фактических параметров можно использовать константы, переменные и арифметические выражения. При вычислении значения оператора-функции формальные параметры, входящие в состав арифметического выражения, заменяются на соответствующие фактические параметры и значение арифметического выражения присваивается указателю функции. Пусть, например, имеется оператор-функция F (X, Y) = = 2. * X ** 2 + 3. * Y и арифметический оператор присваивания Z = F(1., 2.). Действие этого оператора эквивалентно следующему оператору: Z = 2. * 1. ** 2 + 3. ** 2. 4.3. Подпрограмма-функция. Подпрограмма-функция является самостоятельной программной единицей, обращение к которой возможно в любой другой программной единице. Подпрограмма- функция состоит из заголовка функции, последовательности операторов и оператора конца программной единицы. 386
Заголовок функции имеет вид t FUNCTION f(x) где t—указатель типа функции (может отсутствовать); /—идентификатор функции; х—список формальных параметров. Указатель типа описан в п. 1.2. Если указатель типа отсутствует, то тип функции устанавливается по умолчанию. Список формальных параметров имеет вид где xtr(i=l, 2,...,«)—формальный параметр. Список формальных параметров должен содержать хотя бы один такой параметр. Формальные параметры — это идентификаторы, которые используются внутри подпрограммы как имена простых переменных, массивов, функций и подпрограмм. Все формальные параметры одной подпрограммы должны быть обозначены различными идентификаторами. Формальные параметры не могут получать начальные значения в явных операторах описания типа. Оператор конца END является последним оператором любой программной единицы. Следует помнить, что END невыполня- емый оператор и не может служить для передачи управления из подпрограммы в вызывающую программу. Подпрограмма-функция выполняется при обращении к ней из другой программной единицы с помощью указателя функции. При обращении к подпрограмме-функции фактические параметры должны по количеству, типу и порядку следования соответствовать формальным параметрам: если формальный параметр—имя функции или подпрограммы, то соответствующий фактический параметр должен быть именем функции или подпрограммы; если формальный параметр—имя массива, то соответствующий фактический параметр должен быть именем массива или переменной с индексами; если формальный параметр—имя переменной, которая в подпрограмме не получает новых значений, то в качестве соответствующего фактического параметра могут быть использован^ константы, переменные и арифметические выражения. Если формальный параметр получает новые значеция, то в качестве соответствующего фактического параметра может использоваться только переменная. Следует помнить, что имя функции должно получить значение внутри подпрограммы-функции. В момент выхода из подпрограммы значение, присвоенное имени функции, берется в качестве значения функции. Выполнение подпрограммы-функции начинается с первого выполняемого оператора и заканчивается выполнением оператора RETURN. Подцрограмма-функция не должна содержать прямых или косвенных (через другие подпрограммы) обращений к самой себе. Последовательность операторов под- 387
программы-функции должна удовлетворять требованиям, предъявляемым к последовательности операторов в любой программной единице. Приведем пример использования подпрограммы-функции. Вызывающая программа REAL ISQ Y = ISQ(1.+A, 4) Подпрограмма-функция REAL FUNCTION ISQ (X, J) ISQ = SIN(1.0/X)**J RETURN END Обратим особое внимание на использование имени массива в качестве формального параметра. Если имя массива а использовано в качестве формального параметра, то такому массиву не отводится место в памяти, так как при обращении к подпрограмме формальный аргумент заменяется фактическим параметром— именем массива, полностью описанного в вызывающей программе. Для того чтобы указать, что формальный параметр — массив, его описывают внутри подпрограммы оператором DIMENSIONa (к), где а — формальный параметр (имя массива); к — указатель размерности, который в данном случае имеет вид (1, I,..., 1). Число единиц в указателе размерности совпадает с размерностью массива. Приведем пример. Вызывающая программа DIMENSION X(10,8) SUM = F(X, 5,6) Подпрограмма-функция FUNCTION F (A, N, М) DIMENSION A (1,1) s=o. DO l J = 1,N DO 1 1 = 1, M 1 S = S + A (J, I) F = S**2 RETURN END 4.4. Подпрограмма (SUBROUTINE). Если результаты вычислений, передаваемые в вызывающую программу, представляют собой несколько величин, то можно пользоваться подпрограммой (SUBROUTINE). 388
Подпрограмма начинается с заголовка, который имеет вид SUBROUTINE s (jc) где s — идентификатор процедуры; х — список формальных параметров. Список формальных параметров имеет вид (х ь х2, -^Хп) где xt— формальный параметр (i"=l, ...,«). Список формальных параметров может отсутствовать. Тогда заголовок процедуры имеет вид SUBROUTINE s В качестве формальных параметров можно использовать имена переменных, массивов, внешних функций и подпрограмм. Все формальные параметры данной подпрограммы должны иметь различные имена. Они не могут получать начальные значения в явных операторах описания типа. Обращение к подпрограмме производится с помощью оператора вызова подпрограммы, который имеет вид CALL s (x) где s — идентификатор процедуры; хи ..., хп—список фактических параметров. В качестве фактических параметров оператора подпрограммы могут использоваться константы, имена переменных, арифметические выражения, имена функций и подпрограмм. Если список формальных параметров подпрограммы s отсутствует, то оператор вызова подпрограммы записывается в форме CALL s где s — идентификатор подпрограммы. При обращении к подпрограмме ее формальные параметры заменяются фактическими параметрами, после чего подпрограмма выполняется. Фактические параметры должны по количеству, типу и порядку следования соответствовать формальным параметрам. Кроме того, фактические параметры должны удовлетворять требованиям, сформулированным для фактических параметров подпрограмм-функций в предыдущем пункте. Имя подпрограммы не имеет типа и внутри подпрограммы не может использоваться нигде, кроме как в заголовке подпрограммы. Выполнение подпрограммы начинается с первого выполняемого оператора и заканчивается оператором RETURN, который возвращает управление в программу, из которой была вызвана подпрограмма. При возврате в вызывающую программу управление передается оператору, непосредственно следующему за оператором вызова подпрограммы. Последним оператором подпрограммы должен быть оператор END. 389
Подпрограмма не должна содержать обращения к самой себе ни прямо, ни косвенно (через другие подпрограммы). Замечание об использовании массивов в качестве формальных параметров, приведенное в предыдущем пункте, целиком переносится на случай подпрограммы. Пусть подпрограмма ABC задана такой последовательностью операторов SUBROUTINE ABC(X, Y, Z) Z = 2.*X/Y RETURN END Приведем пример использования этой подпрограммы в вызывающей программе: CALL ABC (А (I), В (J), W) CALL ABC (AM + H * A (I), В (J) + SIN (W), Z) CALL ABC (SINZ, B(J) + A(3), С (8)) 4.5. Оператор внешних подпрограмм. Оператор внешних подпрограмм определяет в данной программной единице имена подпрограмм, используемых в качестве фактических аргументов при обращении к другим подпрограммам ц имеет вид EXTERNAL яь я2,...,я„ где at(i= 1,...,л)—имена внешних функций и имена подпрограмм, которые входят как фактические параметры в указатели вызываемых функций и подпрограмм. В программной единице оператор внешних подпрограмм должен предшествовать всем выполняемым операторам. Использование оператора внешних подпрограмм поясним на примере. Пусть задана подпрограмма-функция FUNCTION ABBA(X, PROG) ABBA = X +PROG (X) RETURN END Тогда последовательность операторов вызывающей программы EXTERNAL SIN, EXP А = АВВА (С, SIN) В = ABBA (X (2), EXP) 390
эквивалентна следующей: A = C + SIN(C) В = Х(2) + ЕХР(Х(2)) 5. Операторы ввода—вывода 5.1. Оператор вывода информации. Для обмена информацией с внешними устройствами служат операторы ввода—вывода. Внешними устройствами может быть экран дисплея, принтер, жесткий или гибкий диск, магнитная лента или какое-либо иное устройство. Набор операторов ввода—вывода незначительно изменяется при переходе от одной версии ФОРТРАНа к другой, поэтому здесь приводятся только простейшие варианты использования этих операторов. Операторы ввода—вывода указывают, значения каких переменных и в какой последовательности должны быть выведены на внешние устройства или считаны с них. Обмен информацией с внешними устройствами осуществляется порциями. Каждая такая порция называется записью, а совокупность связанных между собой записей принято называть файлом. Файлам на магнитных носителях можно давать имена. По имени легко можно найти файл с нужной информацией. Оператор вывода имеет две формы n WRITE (m, f)X или nWRITE(m,*)X где п — метка, помечающая данный оператор (может отсутствовать); m — номер устройства (канала), куда будет выводиться информация; f—метка оператора FORMAT, описывающего нужное программисту расположение информации в записях выходного файла; X—список переменных, значения которых нужно вывести на внешнее устройство. Знак * во второй форме оператора указывает на бесформатный вывод информации. При бесформатном выводе операционная система располагает данные в выходном файле по своим внутренним правилам. В качестве номера устройства используются, как правило, целые положительные константы. Для СМ ЭВМ этот параметр не может превосходить 15, а для ЕС ЭВМ—соответственно 99. В ФОРТРАНе MS DOS этот параметр может меняться гораздо в более широких пределах. В операционных системах для СМ ЭВМ и персональных компьютеров экран дисплея является важнейшим средством общения ЭВМ с пользователем, поэтому в ФОРТРАНе пред- 391
усмотрены специальные операторы вывода на экран дисплея. В операционных системах для СМ ЭВМ он имеет вид nTYPEf, X или nTYPE *, X В ФОРТРАНе MS DOS этот оператор тоже имеет две формы n PRINT f, X или n PRINT*, X Смысл входящих сюда элементов тот же, что и у оператора WRITE. Если у оператора WRITE вместо номера устройства m поставить знак *, то информация тоже будет поступать на экран дисплея. Итак, в ФОРТРАНе MS DOS оператор n WRITE (*,*)Х эквивалентен оператору n PRINT, X, а оператор n WRITE (*,10) X эквивалентен оператору n PRINT 10, X. Аналогичным образом связаны операторы WRITE и TYPE в операционных системах для СМ ЭВМ. В ФОРТРАНах для ЕС ЭВМ основным средством общения с программистом является устройство печати на, бумажной ленте. Этому устройству присвоен номер 7. Так что оператор n WRITE (7, 10) X указывает, что значения переменных, входящих в список X, будут распечатаны на бумажной ленте. Порядок размещения этих данных на бумаге определяется оператором FORMAT с меткой 10. Для вывода информации на бумагу используется и оператор PRINT, так что операторы n WRITE (7, 10) X и n PRINT 10, X эквивалентны в ФОРТРАНе для ЕС ЭВМ. Для вывода на печать простой переменной достаточно включить в список идентификатор этой переменной. Если в список включить идентификатор массива, то на печать будут выведены все элементы массива. Для вывода части массива в списке оператора WRITE (или соответственно операторов PRINT или TYPE) можно использовать неявную форму оператора цикла. Общая форма такого элемента списка имеет вид (ограничимся случаем двумерного массива) ((A(I, J), г1=т1,т2,тъ), г2 = типъпъ\ где ть п{—целые константы без знака или предварительно определенные простые целые переменные, принимающие только положительные значения; I, J — индексы массива; гь г2 — параметры неявного цикла. Параметры цикла могут принимать только следующие значения: r±=l9 r2 = J или гг=1 и г2 = 1. Применение неявного оператора цикла поясним на примере. При выводе на экран дисплея элементов матрицы 3x3 по 392
столбцам можно включить в список оператора WRITE следующий элемент: ((A(I,J), 1=1,3), J=l,3). Для вывода этой же матрицы по строкам нужно включить в список элемент ((A(I,J), J=l,3), 1 = 1,3). Если в список включен элемент (А(1), В(1), 1 = 1,7), то элементы массивов А и В будут выводиться в такой последовательности: А(1), В(1), А(2), В(2), ... и т. д. В списке оператора WRITE можно чередовать в произвольной последовательности имена переменных и элементы неявного цикла. В программе DIMENSION X(3), Y(7) WRITE (1, 10), А, В, X (Y(I), 1=1, 5, 2) на устройство 1 последовательно выводятся следующие значения: А, В, X(l), X(2), X(3), Y(l), Y(3), Y(5). 5.2. Операторы ввода информации. Ввод информации с внешних устройств осуществляется оператором READ, который имеет две формы: n READ (m, f) X или n READ (m, *) X где n — метка, помечающая данный оператор (может отсутствовать), m—номер устройства (канала), откуда будет выводиться информация, f—метка оператора FORMAT, описывающего расположение информации во входном файле, X—список переменных, значения которых нужно считать с внешнего устройства. Знак * во второй форме оператора READ указывает на бесформатный ввод информации. При бесформатном вводе подразумевается, что данные во входном файле размещены по тем же правилам, что и при бесформатном выводе. В качестве номера устройства используются, как правило, целые положительные констайты (см. п. 5.1). В операционных системах для СМ ЭВМ и персональных компьютеров клавиатура является важнейшим средством общения пользователя с ЭВМ, поэтому в ФОРТРАНе предусмотрены специальные сокращенные формы операторов чтения информации с клавиатуры. В операционной системе СМ ЭВМ этот оператор имеет вид 393
n ACCEPT f, X или n ACCEPT *, X В ФОРТРАНе MS DOS этот оператор также имеет две формы n READ f, X или n READ *, X Смысл элементов тот же, что и у полной формы оператора READ. Если в операторе READ вместо номера устройства m поставить знак *, то информация также будет считываться с клавиатуры. Итак, в ФОРТРАНе MS DOS оператор n READ *, X эквивалентен оператору n READ (*, f) X, а оператор n READ f, X эквивалентен оператору n READ (*, *) X. Аналогичным образом связаны операторы READ и ACCEPT в операционных системах для СМ ЭВМ. В ФОРТРАНах для ЕС ЭВМ также имеется краткая форма оператора READ. Эта краткая форма предназначена для ввода информации с устройства, которому присвоен номер 5. Обычно это устройство ввода с перфокарт. Таким образом, в ФОРТРАНе для ЕС ЭВМ вместо оператора n READ (5, f) X можно использовать оператор n READ f, X. 5.3. Связь между номерами устройств (каналов) и внешними устройствами. Связь между номерами устройств и внешними устройствами может устанавливаться внутри программы и вне ее. В системе MS DOS для персональных компьютеров и операционных систем для СМ ЭВМ реализованы оба способа. В ФОРТРАНах для ЕС ЭВМ эта связь может быть установлена только вне программы с помощью языка управления заданиями или другими внешними средствами. В ФОРТРАНе для MS DOS оператор OPEN приводит в соответствие номер устройства в операторах READ и WRITE с внешним устройством или файлом на нем. В простейших случаях этот оператор записывается в виде OPEN (UNIT = n, FILE = 'nm') где n — номер устройства, nm — имя устройства или имя файла на устройстве. Поясним работу оператора OPEN на нескольких примерах. Пусть, например, в программе встречаются операторы DIMENSION A(10) OPEN (UNIT = 3, FILE ='A:\RES. DAT) WRITE (3, *) A 394
В данном фрагменте программы массив из 10 чисел выводится в файл с именем RES. DAT. Этот файл помещается на дискете, которая вставлена в дисковод А. Если же эти данные необходимо распечатать на принтере, то оператор OPEN следует записать в виде OPEN (UNIT = 3, FILE = 'PRN) Для вывода той же информации на экран дисплея можно воспользоваться оператором OPEN (UNIT = 3, FILE = CON) Ввод информации осуществляется аналогичным образом. Предположим, что исходные значения величин XI и Х2 размещены в файле с именем INPUT. DAT, который находится на жестком диске С в директории NUM. Ввести эти данные в программу можно, например, следующими операторами: OPEN (UNIT=1, FILE = 'C:\NUM\INPUT.DAT') READ (1, *) XI, X2 Аналогично используется оператор OPEN в ФОРТРАНе для СМ ЭВМ. Если в процессе эксплуатации программы часто приходится изменять имена файлов или устройств, то использование оператора OPEN становится неудобным (каждое изменение в операторе OPEN требует новой компиляции программы и т. д.). В таких случаях связь между номерами устройств и внешними устройствами лучше устанавливать в процессе выполнения программы. Если в приведенном выше примере вместо оператора OPEN (UNIT = 3, FILE = A:\RES. DAT) написать OPEN (UNIT = 3, FILE = "), то перед выполнением оператора WRITE программа прервет вычисления и на экране появится сообщение File name missing or blank. Please enter name UNIT3? Имя файла отсутствует или пустое. Пожалуйста, введите имя для устройства 3?) При ответе PRN данные будут выведены на принтер, а при ответе A:\RES. DAT — на устройство А. Похожий механизм установления связей между внутренними и внешними устройствами реализован в операционных системах для СМ ЭВМ и ЕС ЭВМ. Подробнее с особенностями этих систем можно познакомиться по специальной литературе. 6. Оператор формата Как уже отмечалось ранее, операторы ввода—вывода указывают, какие переменные и в какой последовательности должны быть прочитаны с внешнего устройства или выведены на него. Операторы формата несут информацию о расположении данных внутри каждой записи файла. Оператор формата имеет вид n FORMAT (cu с2, ..-, О 395
где п — метка оператора FORMAT (обязательный атрибут оператора); сх (i=l, ..., п) — формат или группа форматов. В качестве разделителей форматов и групп форматов может использоваться только запятая или дробная черта. Дробная черта может предшествовать первому формату и следовать за последним форматом. В стандарт языка ФОРТРАН входит большое число разнообразных типов формата. Приведем описание только некоторых из них. 6.1. Символьный формат и формат типа X. Символьный формат имеет вид символьной константы, записанной либо с указателем длины, либо в форме литерала. В записи для вывода отводится место из п позиций, где п — длина символьной константы. При выводе в этих позициях записывается символьная константа, указанная в операторе формата. Формат типа X имеет вид тХ где т — целая константа без знака, означающая длину поля, отводимого для записи т пробелов. При выводе на печать первый выводимый символ предназначен для управления печатью. Этот символ, называемый управляющим символом печати, определяет, сколько строк должно быть пропущено перед печатью. В то же время управляющий символ не выводится на печать. Приведем значения, которые может принимать управляющий символ. Управляющий символ i_j 0 + 1 Наименование интервалов перед печатью Одна строка Две строки Интервал отсутствует Продвижение до первой строки следующей страницы Управляющий символ задается в операторе формата символьной константой. Например, PRINT 10 10 FORMAT (T, 10X, ТАБЛИЦА РЕЗУЛЬТАТОВ') При выполнении оператора PRINT 10 бумага на АЦПУ продвигается до первой строки следующей страницы и, начиная с 11-й позиции этой строки, будет напечатано ТАБЛИЦА РЕЗУЛЬТАТОВ. 6.2. Формат типа I. Для ввода (вывода) значений переменных целого типа служит формат типа I, имеющий вид I п 396
где п—целая константа без знака, указывающая, сколько позиций на экране дисплея, строке бумаги или в записи файла отводится для размещения целой величины. При вводе по формату I число, расположенное в п позициях записи (строки на экране дисплея), рассматривается как вводимое значение переменной. Числу может предшествовать знак « + » или « —». Если знак отсутствует, то число считается положительным. Пробелы интерпретируются как нули. Десятичная точка в записи числа, вводимого по формату I, недопустима. Приведем пример ввода исходных данных по формату I: READ 12, I, J, К, L, М, N 12 FORMAT (13, 17, 12, 313) После чтения записи j У54 |uji_i i2 »-*i-j|/^|i-ii-j2|/i-jj-j|2i-j /| I 3 И 7 I 2 I 3)3*3 I переменные получают следующие значения: I = 154, J = — 1200, К=14, L = 2, M = 100, N = 201. Аналогично, формат типа I работает при выводе. На строке под число отводится п позиций (первая позиция предназначена для знака « —», если число отрицательное). Если ширина отведенного поля превосходит количество цифр в числе, что число выводится в правую часть поля, а остальные позиции заполняются пробелами. Если п позиций недостаточны для размещения результата, то печатаются п символов *. Рассмотрим пример вывода данных целого типа. Пусть 1 = 14, J = — 324. После выполнения операторов PRINT 22, J, I 22 FORMAT ('l_j\ 'РЕЗУЛЬТАТ = ' ,I6,5X, 'ИТЕРАЦИЙ l_j, 14). на экране дисплея или на бумаге появится строка РЕЗУЛЬТАТ = шш -324l_jl_jl_ji_jшИТЕРАЦИЙl_jl_j 14 6.3. Формат типа F. Формат типа F предназначен для ввода (вывода) переменных вещественного типа и имеет вид Fn.m где п—число позиций для записи числа; т — число позиций для записи дробной части числа. При вводе значения по формату F оно может быть представлено в виде константы вещественного типа. При этом параметр т игнорируется. Если данное записано без десятичной точки, то ее положение определяется параметром т, который указывает количество позиций в дробной части числа. Пусть данные расположены в записи следующим образом: 397
II-I-/J. 16 U_Li_j |_, U Z 3 *t После выполнения оператора READ 17, А, В 17 FORMAT (F 10.4, F 4.1) переменные А и В получат следующие значения:. А = — 13.16, В =123.4. При выводе по формату типа F для размещения данных отводятся п позиций, из них т позиций отводятся Для размещения дробйой части числа, одна позиция—для размещения десятичной точки и одйа позиция—дли размещения знака числа (если число отрицательное). Целая часть числа может отсутствовать. В этом случае, если позволяет место, перед десятичной точкой печатается цифра 0. Если дробная часть числа содержит больше чем т цифр, то перед выводом число округляется. Если п позиций недостаточно для размещения числа, то выводятся п символов *. Пусть А= 168.388, В= — 12.8, С= 12458.6. Тогда после выполнения операторов PRINT 901, А, В, С 901 FORMAT (W, F6.2, 5Х, F8.3, 5Х, F6.2) будет напечатано 168.39i i> и к n i — 12.800i n i> i> n ,****** 6.4. Формат типа Е. Формат типа Е предназначен для ввода (вывода) переменных вещественного типа. Он удобен, если при составлении программы заранее неизвестно, каков может быть порядок вводимых и выводимых величин. Формат типа Е имеет вид Еп.т где п—целое число, указывающее, сколько позиций отводится под запись числа; т — число позиций, отводимых для записи дробной части числа. Для формата типа Е должно соблюдаться условие п^т + 1. Ввод по формату типа Е аналогичен вводу по формату типа Е. Последовательность символов, расположенных в п позициях записи, рассматривается как запись вещественной константы с порядком. Порядок указывает на степень числа 10 и может быть записан в виде целой константы со знаком, а также в виде буквы Е, за которой следует целая константа со знаком или без знака. Если данное содержит десятичную точку, то параметр т игнорируется. Пусть данные расположены в записи следующим образом: \^+12.J5-7 u-. i_ii_j |Uil_j-О.Ш£ +04 г Тг Н* Тг 398
В результате выполнения операторов READ 904, А, В 904 FORMAT (Е 12.5, Е 12.2) величины А и В будут иметь следующие значения: А =12.35 • 10"1, В=-0.138 104. При выводе по формату типа Е данное представляется в виде числа, состоящего из мантиссы и порядка. Выводимое число занимает на бумаге п позиций и имеет в общем случае вид l_jl_jl_j...l_j{34}0. XX ... XE{3n}YY где 0. XX ... X—мантисса; Зч — знак числа (если выводимое число отрицательное, то в этой позиции печатается знак « —», в противном случае—пробел); {3n}YY — порядок числа, Зч — знак порядка (если порядок отрицателен, то в этой позиции печатается знак « —», в противном случае —« + » или пробел. Если дробная часть числа содержит больше чем т цифр, то перед выводом число округляется. Пусть А = 12.345, В =—0.0346. После выполнения операторов PRINT 924, А, В 924 FORMAT ('l_T, 7Х, Е10.3, 5Х, Е12.5) будет напечатано i_ji_ji_ji_ji_ji_ji_ji_j0.123 Ei_j02i_ji_ji_ji_ji_j-0.346 00 Е—01. 7. Запись программы Программа на ФОРТРАНе представляет собой последовательность строк. Каждая строка разделена на позиции, которые нумеруются последовательно слева направо от 1 до 80. В каждой позиции записывается один символ. Позиции с первой по пятую отводятся для меток операторов. Любой оператор может иметь метку, но метка необходима тЬлько для тех операторов, на которые есть ссылка в программе. Два оператора в одной программной единице не должны иметь одинаковых меток. Операторы записываются в позициях с 7-й по 72-ю. Каждый оператор начинается с новой строки. Если оператор не помещается в одной строке, то его запись может быть продолжена в следующих строках, которые называются строками продолжения. В шестой позиции каждой строки продолжения должен быть записан любой символ, отличный от нуля и пробела. Для одного оператора допускается не более 19 строк продолжения. Если в первой позиции строки указана буква С, то данная строка воспринимается как комментарий. Комментарии не влияют на выполнение программы и могут располагаться в любом месте программы. В некоторых версиях ФОРТРАНа допустима запись программ в свободном формате.
ПРИЛОЖЕНИЕ Программа решения линейной системы с трехдиагональнои матрицей методом прогонки. subroutine PROGON (a.b.c.d.u.v.x.n) с * * с Программа PROGON решает линейную систему с трех- * с диагональной матрицей вида * с а(1)'х(1-1) - b(i)'x(i) + c(i)*x(i+l) = d(i) с методом прогонки * с с п - размерность системы * с а,Ь, с c,d - массивы размерности п, элементы расположенные на * с диагоналях матрицы и правые части системы * с u,v - рабочие массивы размерности п+1 * с с Результат: * с х - массив размерности п, содержащий решение системы * dimension а(1),b(1)гс(1),d(1),u(1)fv(1)гх(1) a(l) = 0. c(n) = 0. u(l) = 0. v(l) = 0. do 1 i = l,n 11 - i ♦ 1 z = l./(b(i) - a(i v(11) = c(i)'z u(il) = (a(l)'u(D continue nm = n - 1 nl = n + 1 x(n) = u(nl) do 2 j = l,nm 1 = nl - j im = i - 1 x(im) = v(1)*x(i) continue return end i)*v(1 - d(i + u( D) D)'z i) 400
Программа INTGRL subroutine INTGRL (a9btctdtiOtilti2tf,eps,rez) с f1(xfcfdflOt11t12) = float(iO) + float(ilV(x-c) + f1oat(f2)*(x-c)*(x-d) с n « 2 s = f(a)*f1-(afctdv10,11f12) + f(b)4i(blcldli0,illi2) г = 0. h - (b - a)/n с s2 = 0. do 1 j-lfn-l x = a + h*j s2 = s2 + fWflfx.c.d.KUl.lZ) 1 continue с 100 h2 = h/2 s4 = 0. с do 2 j-l,n x = a - h2 + h*j S4 = s4 + f(x)»f1(xfcfdf10f11f12) 2 continue rez - h2'(s + 2.*s2 + 4.'s4 )'0.3333333 del = abs(rez-r)/15. n = n*2 h = h2 s2 = s2 + s4 г = rez if (del.gt.eps) go to 100 с return end Программа обращения матрицы: •subroutine MINV (afnfd,ltm) с Программа MINV обращает матрицу размерности п с с а - массив размерности п*п, содержащий элементы С матрицы с п - размерность матрицы с 1,т - рабочие массивы размерности п с с Результат: с а - массив, содержащий обратную матрицу с d - опеделитель матицы dimension a(l),1(l),m(l) 401
d ~ 1.0 nk - - n do 80 к - l,n nk - nk + n l(k) - к m(k) - к kk - nk + к biga « a(kk) do 20 j - k,n iz « n'(j - 1) do 20 t - k,n ij - iz + i 10 if(abs(biga) - abs(a(ij))) 15,20,20 15 biga - a(ij) l(k) « i m(k) - j 20 continue j - l(k) if(j - k) 35,35,25 с 25 ki = к - n do 30 i - l,n ki - ki + n hold - - a(ki) ji - ki - к + j a(ki) = a(ji) 30 a(ji) - hold с 35 i = m(k) if(i - k) 45,45,38 с 38 jp - n'(i - 1) do 40 j - l,n jk - nk + j ji « jp + j hold « - a(jk) a(jk) ~ a(ji) 40 a(ji) - hold с 45 if(biga) 48,46,48 с 46 d - 0. return 48 do 55 i - l,n if(i - k) 50,55,50 с 50 ik « nk + i a(ik) - a(ik)/( - biga) 55 continue с do 65 i - l,n ik - nk + i hold - a(ik) ij - i - n 402
с do 65 j - lfn ij - ij + n if(i - k) 60r65r60 60 if(j - k) 62,65,62 62 kj = ij - i + к a(ij) - hold'a(kj) + a(ij) 65 continue с kj « к - n do 75 j = l,n kj « kj + n if(j - k) 70,75,70 с 70 a(kj) - a(kj)/biga 75 continue с d = d'biga a(kk) - KO/biga 80 continue к - n 100 к = к - 1 if(к) 150,150,105 105 i - l(k) if(i - k) 120,120,108 с 108 jq = n'(k - 1) jr - n*(1 - 1) do 110 j - l,n jk = jq + j hold - a(jk) ji e jr + j a(jk) - - a(ji) 110 a(ji) - hold с 120 j = m(k) if(j - k) 100,100,125 с 125 ki = к - n do 130 i = l,n ki = ki + n hold = a(ki) ji = ki - к + j a(ki) = - a(ji) 130 a(ji) = hold go to 100 150 return end Программа решения интегрального уравнения Фредгольма I рода методом регуляризации Тихонова с выбором параметра регуляризации по принципу обобщенной невязки 403
external ak dimension u0(41)rz(41)ru(10000),z0(41) с с загрузка исходных данных задачи с xl - х2 - yi - У2 - п - т - iter alfa cl 0. 1. -2. 2. 41 41 -1000 - 1.0е-5 - 1.001 hx - (x2 - xl)/(n - 1.) с с обращение к программе р0г формирующей линейную систему с call p0(ak,urxlrx2rylry2rnrm) с h - l.e-10 с с вычисление точного решения в узлах сетки с do 57 i - l.n х = xl + hx*(1 - 1.) z0(i) - exp(-(x - 0.5)"2/0.06) 57 continue с с печать точного решения с write(3,501) (z0(ii)rii - l,n) call p3(urz0ru0fnrm) dl - l.e-8 write(3,504) dlrh do 34 i - lrn 34 z(i) - 0. с с обращение к программе pzr решающей уравнение с call pz (akruOrxlrx2rylry2rnrmrzran2rdlr * h,cl,iter,alfa,u,20QQ,ierr) с с печать результата с write(3r502) (z(ii),ii«l,n) write(3,503) ierrran2ralfa с stop 404
с с 501 format('точное решение :'/lx,(6fl2.7)) 504 formatf' . V погрешность правой ч«сти :',е16.9/ * ' погрешность в операторе :',е!6.9) 502 format(' .'/' прибл.решение :'/lx,(6f12.7)) ■ 503 formate •'/' код завершения :\i5/ * ' невязка :',е 16.9, * ' параметр регул.:',е 16.9) - end function ak(x,y) с Программа-функция, вычисляющая значение ядра ак - 1./(1. + 100.'(х - у)'*2) return end с subroutine pz(ak,u0,a,b,c,d,n,m,z,an2,dlrh, * cl,1max,alfa,u,nu,1err) с Программа pz решает интегральное уравнение с Фредгольма 1-го рода методом регуляризации по с Тихонову с выбором параметра регуляризации в с соответствии с принципом обобщенной невязки с с Для минимизации функционала Тихонова использован с метод проекции сопряженных градиентов в первом с квадранте с с ак - подпрограмма-функция, вычисляющая ядро с и0 - массив размерности т, содержащий значения правой с части с а,Ь - концы промежутка интегрирования с c,d - концы промежутка изменения правой части с п - количество узлов в аппроксимации интеграла с m - количество узлов сетки на промежутке изменения с правых частей с dl - квадрат погрешности правой части с h - квадрат погрешности оператора с cl - признак режима вычислений С с! 1 - значение параметра регуляризации с фиксировано с cl 1 - выбираем alfa по принципу обощеяной с невязки с 1тах - наибольшее допустимое количество итераций при с решении уравнения для невязки методом хорд с и - рабочий массив размерности -п*т+2*п-нп с пи - длина рабочего массива и с ierr - принак выхода с ierr - 0 - решение найаено с ierr = i - применяла;1 к модификация метода хорд 405
с ierr -64 - короткий рабочий массив с ierr -65 - отрицательная обощенная невязка с ierr -66 - много шагов в методе хорд при решении с уравнения невязки С ierr -67 - не удалось решить уравнение невязки с ierr -68 - получили или задали alfa=0 с с Результат: с z - вычисленное решение с ап2 - значение невязки с alfa - значение параметра регуляризации dimension uO(m),u(nu),z(n) external ak ima - 100 icont - 0 с 110 continue du - sqrt(dl) dh - sqrt(h) na - 1 ngrd - na + n*m ns - ngrd + n np - ns + n nu2 - np + m ni - nuZ + m nul - ni + n с if(nul-l.gt.nu) go to 64 с kl - Q k2 - 0 nl - n + 1 hx - (b - a)/(n - 1. hy - (d - c)/(m - 1. dd - hx/hy ro - l./hx**2 eps - (cl - l.)*d1 с if(iconUeq.l) go to 111 с call pO(ak,u(na),a,b,c,d,n,m) с kpr - n*m с 111 continue с 13 continue с call psr(u(na),z,uO,n,m,iter,0.,0», * ima,an2ralfa*ddlrorzlu(nu2)lu(np)r • ufnsbufngrdbufni^ier) 406
call pa(an2,z,nfdu,dh,hxfhy,ro,ari4) 1f(cl.le.l.) go to 100 ifjalfa.eq.O.) go to 68 1f(an4.gt.eps) go to II kl - kl + 1 if(kl.eq.imax) go to 65 alfa - 2.'alfa go to 13 11 continue f0 - an4 xO - l./alfa alfa - alfa'2. x - l./alfa call psr(u(na),z,uO,n,m,iter,0.,0., * ima,an2,alfa*dd,ro,z,u(mi2),u(np), * u(ns),u(ngrd)ru(ni)rier) call pa(an2rzrnrdurdhrhxrhyrroran4) 14 continue 1f(abs(an4).le.eps) go to 100 1f(an4.le. - eps) go to 2 if(alfa.eq.O.O) go to 68 k2 - k2 + 1 1f(k2.eq.1max) go to 66 у - xO - f0/(an4 - fO)*(x - xO) xO - x x - у f0 - an4 alfa - l./x call psr(u(na),z,u0,n,m,1ter,0.,0., * 1ma,an2,a1fa*dd,ro,z,u(nu2),u(np), * u(ns)ru(ngrd)ru(n1),ier) call pa(an2,z,n,du,dh,hx,hy,ro,an4) go to 14 2 continue f - an4 23 continue у - xO + f*(x - x0)/(f - fO) alfa - l./y 407
call psr(u(na),z,uO,n,fli,iter,0.r0.r ima,an2,a1fa*dd,ro;z,u(nu2),u u(ns),u(ngrd)ru(ni),ier) call pa(an2,z,n,du,dh,hx,hy,ro,an4) if if if k2 - k2 +1 if(*2.eq.imax) go to 67 abs(an4).le.eps) go to 101 an4.1e. - eps) go to 37 alfa.eq.O.) go to 68 xO - у f0 - an4 go to 23 continue x - у f - an4 go to 23 icont - 1 go to 110 continue ierr - 64 go to 999 continue ierr - 65 go to 999 continue ierr * 66 go to 999 continue ierr - 67 go to 999 continue ierr - 68 go to 999 continue ierr - 0 go to 999 continue ierr - 1 continue return
end subroutine psr(a,z0,u0,n,m,iter,dl2,angrd,imax, * an2,alfrrorzrulullhlglzzrierr) с Программа psr минимизирует функционал Тихонова с сопряженных градиентов с проекцией в первом с квадранте ( неотрицательное решение ) с„„„,,„ ,„„,,„,,„„„„„„„„„„„„„„ ******* external pci2r рЗ, р5г р4г рб, p7r plr р9, р8 dimension uOfmbzOfnbzfnbufmbalmbhfnbulfm) dimension iplus(100),g(n) dimension zz(n) с iterbn - 0 iter - 0 iend - 0 jch - -1 с call pl(zO,zO,z,n,0.) call p3ja,z,u,n,m) call p5(u,u0,m,an2) call p9(as20van2,zvnvalf,ro) call p4(g,u,uOraln,m) call p8(grzrnralf,ro) call p2(h,0..n) 14 continue iter * iter + 1 13 ich - 0 * if(jch) 1,2,3 1 call pci2(iplus,l,n) do 4 i - lrn tf(z(1).gt.0..or.g(1).lt..O) go to 5 с iplus(i) - 0 z(D - 0. 5 continue с 4 continue idim - 0 do 15 i - l,n 15 idim - idim + iplus(i) ich « 1 go to 2 с 3 continue с iplus(iprim) - 0 z(ipriro) - 0 с 6 ich - 1 idim - idim 409
continue call p7(g,gliplusln,angri) iterbn - iterbn + 1 if(ich.eq.l) Iterbn - 1 if(angri.gt.angrd.and.iterbn.ne.idim + Land.iend.ne.l) go to 7 if(iend.eq.l.and.idim.eq.idimo) go to 99 iend - 1 - iend 1d1mo -idim if(iend.eq.O) go to 7 jch - - 1 go to 8 continue bt - 0. if(ich.eq.O) bt angrio - angri do 9 i - lrn h(1) - (bfh(i) angri/angrio + 9(1))*iplus(i) almax 1prim do 10 18 12 - l.e + - 0 i - l,n if(h(1).le..O) go to 11 al - z(i)/h(i) if(almax.lt.al) go to 12 almax * al iprim - 1 continue 11 10 continue continue call po call pi call p3 call p4i call p8i call p7( call p5 call ' a^^.uUh^lmax^l.n^m^lf^oJed) zrhrzrnr-al) arzrurnrm) g,u,uO,a,n,m) grzrnralfrro) grgriplusrnrangri) uruOrmran2) ran2rzrnralfrro) 20 p9(a$2 jch - 0 if(ied.eq.l) jch - 1 if/led.eq.2) go to 22 if(an2,le.dl2.or.iter.ge.imax) go to 20 if[as2.ge.as20) go to 21 as20 - as2 go to 14 continue 410
ierr = 1 go to 999 99 continue ierr = 0 go to 999 8 continue go to 13 21 continue ierr - 2 go to 999 22 continue ierr * 65 go to 999 999 continue return end subroutine pQ(ak#arxlrx2,ylry2fnrm) с Программа рО сводит интегральное уравнение к с системе линейных уравнений с с ак - подпрограмма-функция, вычисляющая ядро с xlrx2 - пределы интегрирования по х с у1,у2 - пределы изменения переменной у с п - количество узлов в аппроксимации интеграла с m - количество узлов на промежутке [yl,y2j с а - массив, содержащий матрицу системы dimension a(n) h - (х2 - xl)/(n - 1.) do I i = l,n х - xl + h'(i - 1.) do 2 j = lrm у - yl + (y2 - yl)/(m-l.)*(j-l.) kk = (j-l)'m + i a(kk) - ak(y,x)'h if(i.eq.l.or.i.eq.n) a(kk) » a(kk)*.5 2 continue 1 continue return end subroutine pl(brcrarnfp) dimension a(n),b(n),c(n) do 1 i = lrn a(1) - b(i) + p'c(i) return end subroutine p2(arrrn) 411
subroutine pa(an2,z,n,dl,dh,hx,hy,rofan4) dimension z(n) an2 - an2*hy an4 - an2 - dl"2 if(dh.eq.O.) go to 999 call p6(zrzrnrs) s - s*hx si - 0. do 1 1 - 2,n * - si - si + (z(i) - z(i-l))"2 1 continue si « sl*hx s - sqrt(s + ro'sl) an4 - an2 - (dl + dh*s)"2 999 continue return • end subroutine po(arzrgrurhralm,alrnrmralfrroried) external p6,p3 dimension a(m)rz(n)fg(n)ru(m)fh(n) h2 - 0. call p6(grh,n,gh) iffgh.lt.O.) go to 2 call p3(arhrurn,m) call p6(uru,m,ah2) if(alf,eq.O) go to3 do 4 i - 2rn 4 h2 - h2 + (h(i) - h(i-l))"2*ro + h(i)**2 h2 - h2 + h(l)"2 3 continue if(ah2+h2*alf.eq.0.0) go to 998 al - gh/(ah2 + h2*alf)\5 if(al.ge.alm) go to 1 ied - 0 go to 999 1 continue al - aim led - 1 go to 999 2 continue al = 0. ied = 2 go to 999 998 continue ied - 3 al - 0. go to 999 999 continue return end
1 с 4 999 с 1 subroutine p7(afbficfnfs) dimension a(n)fb(n)fic(n) s = 0. do 1 i = l,n s = s + a(i)*b(i)'ic(i) return end subroutine p9(as2ran2fzfnfa dimension z(n) s = 0. if(alf.eq.0.)go to 999 do 4 i = 2fn s = s + (z(i)-z(i - 1))"2' s = s + z(l)*'2 continue as2 = an2 + s*alf return end subroutine pci2(afrrn) dimension a(n) integer rfa do 1 i = lfn a(i) = r return end точное решение : .0155039 .1298122 .5134171 .9591895 .8464817 .3528661 .0694834 погрешность погрешность .0232740 .0342181 .1719732 .2231301 .6002455 .6872892 .9896374 1.0000000 .7707304 .6872892 .2835357 .2231301 .0492711 .0342181 правой части : .100000000E в операторе : .100000000E прибл.решение : .0211705 .1302288 .5146217 .9568823 .8457521 .3545625 .0684044 .0240816 .0328796 .1728097 .2243114 .6011341 .6878812 .9871944 .9975963 .7708284 .6878813 .2850612 .2243112 .0475955 .0328798 код завершения : 1 невязка : .151756400E-07 параметр lf.ro) ro + z(i)"2 .0492711 .2835359 .7707304 .9896374 .6002454 .1719732 .0232740 -07 -09 .0475953 .2850614 .7708285 .9871944 .6011341 .1728095 .0240817 регул.: .0694834 .3528661 .8464817 .9591894 .5134171 .1298121 .0155039 .0684041 .3545626 .8457524 .9568821 .5146219 .1302288 .0211705 .929897200E-06 .0959671 .4300947 .9105104 .9105104 .4300946 .0959671 .0957230 .4316412 .9088300 .9088297 .4316413 .0957231
ЛИТЕРАТУРА 1. Бахвалов Я. С. Численные методы. Ч. 1. М., 1973. 2. Бахвалов Н. С, Жидков Н. О., Кобельков Г. М. Численные методы. М., 1987. 3. Брич 3. С, Копелевич Д. В. и др. ФОРТРАН ЕС ЭВМ. М., 1978. 4. Бухтияров А. М., Маликова Ю. П., Фролов Г. Д. Практикум по программированию на ФОРТРАНе (ОС ЕС ЭВМ). М., 1979. 5. Васильев Ф. 77. Численные методы решения экстремальных задач. М., 1980. 6. Васильева А. Б., Тихонов А. Н. Интегральные уравнения. М., 1989. 7. Верлань А. Ф., Сизиков В. С. Интегральные уравнения: методы, алгоритмы, программы. Киев, 1986. 8. Воеводин В. В. Линейная алгебра. М., 1974. 9. Воеводин В. В. Вычислительные основы линейной алгебры. М., 1977. 10. Воеводин В. В., Кузнецов Ю. А. Матрицы и вычисления. М., 1984. 11. Воробьева Г. Н., Данилова А. Н. Практикум по численным методам. М., 1979. 12. Задирака В. К Теория вычисления преобразования Фурье. Киев, 1983. 13. Завьялов Ю. С, Квасов Б. И., Мирошниченко В. Л. Методы сплайн-функций. М., 1980. 14. Калиткин Н. Н. Численные методы. М., 1978. 15. Краснов М. Л. Интегральные уравнения. Введение в теорию. М., 1975. 16. Краснов М. Л., Киселев А. И., Макаренко Г. И. Интегральные уравнения. М., 1976. 17. Крылов В. И. Приближенное вычисление интегралов. М., 1968. 18. Крылов В. И., Шульгина Л. Т. Справочная книга по численному интегрированию. М., 1966. 19. Мак-Кракен Д., Дорн У. Численные методы и программирование на ФОРТРАНе. М., 1977. ', 20. Марчук Г. И., Агошков В. И. Введение в проекционно-сеточные методы. М., 1981. 21. Моисеев Н. Н., Иванилов Ю. П., Столярова Е. М. Методы оптимизации. М., 1978. 22. Ортега Джеймс, Пул У. Введение в численные методы решения дифференциальных уравнений. М., 1986. 23. Парлетт Б. Симметричная проблема собственных значений. Численные методы. М., 1983. 24. Ракитский Ю. В., Устинов С. М., Черноруцкий И. Г. Численные методы решения жестких систем. М., 1979. 25. Рихтмайер Р. Д., Мортон К. Разностные методы решения краевых задач. М., 1972. 26. Салтыков А. И., Макаренко Г. И. Программирование на языке ФОРТРАН. М., 1976. 27. Самарский А. А. Теория разностных схем. М., 1990. 28. Самарский А. А., Гулин А. В. Численные методы. М., 1989. 29. Сегерлинд Л. Применение методов конечных элементов. М., 1979. 415
30. Сборник научных программ на ФОРТРАНе. Вып. I, 2. М., 1974. 31. Соболь И. М. Методы Монте-Карло. М., 1985. 32. Современные численные методы решения дифференциальных уравнений. М., 1979. 33. Солодовников В. В., Дмитриев А. Н., Егупов Н. Д. Спектральные методы расчета и проектирования систем управления. М., 1986. 34. Справочник по специальным функциям/Под ред. А. Абрамовича и И. Стиган. М., 1979. 35. Стренг Г. Линейная алгебра и ее применение. М., 1980. 36. Тихонов А. Н., Арсенин В. А. Методы решения некорректных задач. М., 1986. 37. Тихонов А. Н., Костомаров Д. П. Рассказы о прикладной математике. М., 1979. 38. Тихонов А. Н., Самарский А. А. Уравнения математической физики. М., 1977. 39. Уилкинсон Дж. X., Райнш К. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. М., 1976. 40. Форсайт Дж., Моулер К. Численное решение систем линейных алгебраических уравнений. М., 1969. 41. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений. М., 1980. 42. Химмельблау Д. Прикладное нелинейное программирование. М., 1975. 43. Цлаф Л. Я. Вариационное исчисление и интегральные уравнения. М., 1970. 44. Чистяков В. П. Курс теории вероятностей. М., 1982. 45. Эльсгольц Л. Э. Дифференциальные уравнения и вариационное исчисление. М., 1965. 46. Тихонов А. Н., Гончарский А. В., Степанов В. В., Я гола А. Г. Регуляри- зирующие алгоритмы и априорная информация. М., 1990. 47. Фарлоу С. Уравнения с частными производными для научных работников и инженеров. М., 1985. Учебное издание Плис Александр Иванович Сливина Наталья Александровна ЛАБОРАТОРНЫЙ ПРАКТИКУМ ПО ВЫСШЕЙ МАТЕМАТИКЕ Редактор Ж. И. Яковлева. Художественный редактор В. И. Пономаренко. Технический редактор Л. А. Овчинникова. Корректор В. В. Кожуткина ИБ № 9354 ЛР № 010146 от 25.12.91. Изд. № ФМ-74. Сдано в набор 26.07.91. Подп. в печать 19.05.93. Формат 60 х 88/i6- Бум. офс. № 2. Гарнитура Тайме. Печать офсетная. Объем 25,48 усл. печ. л. 25,60 усл. кр.-отт. 23,82 уЧ;-изд. л. Тираж 5000 экз. Зак. № 2124. Издательство «Высшая школа», 101430, Москва, ГСП-4, Неглинная ул., д. 29/14. Набрано в ордена Октябрьской Революции и ордена Трудового Красного Знамени МПО «Первая Образцовая типография» Комитета РФ по печати 113054. Москва, Валовая, 28. Отпечатано в М i РФ по печати. 101898, с. № 187.