БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ А.Н. Чичко О.А. Сачек О.И. Чичко ИНФОРМАТИКА. ПРАКТИКУМ Допущено Министерством образования Республики Беларусь в качестве учебного пособия для студентов высших учебных заведений по техническим специальностям Минск БНТУ 2011 УДК 002.6(075.8) ББК 32.818я7 Ч 72 Рецензенты: кандидат технических наук, доцент, заведующий кафедрой программного обеспечения интеллектуальных и компьютерных систем, Гродненского государственного университета имени Янки Купалы В.Г. Родченко; кандидат физико-математических наук, профессор кафедры прикладной математики и информатики, Белорусского государственного педагогического университета имени Максима Танка А.И. Павловский Ч 72 Чичко, А.Н. Информатика. Практикум: учебное пособие / А.Н. Чичко, О.А. Сачек, О.И. Чичко. – Минск: БНТУ, 2011. – 399 с. ISBN 978-985-525-566-7. Настоящее учебное пособие содержит задачи с решениями, рассматрива- емые в рамках программы вузовского курса по информационным технологи- ям. В нем представлены пошаговые алгоритмы, блок-схемы и программы различных по уровню сложности математических задач. Отличительной чер- той издания является наличие подробных решений, а также большое количе- ство оригинальных примеров, позволяющих читателю самостоятельно осво- ить процесс разработки алгоритма и его реализацию в среде программирова- ния Turbo Pascal. Большое количество предлагаемых вариантов задач делает данное издание эффективным инструментом при организации индивидуаль- ной работы со студентами. Будет полезно студентам очной и заочной форм обучения, желающим быстро научиться разрабатывать алгоритмы и про- граммы, а также слушателям, проходящим курс переподготовки по дисци- плинам, связанным с информационными технологиями. УДК 002.6 (075.8) ББК 32.818 я7 ISBN 978-985-525-566-7 © Чичко А.Н., Сачек О.А., Чичко О.И., 2011 © БНТУ, 2010 3 ОГЛАВЛЕНИЕ ВВЕДЕНИЕ ............................................................................................. 8 1. ЗАДАЧИ ПО РАЗРАБОТКЕ АЛГОРИТМОВ И ПРОГРАММ .... 10 1.1. Линейные вычислительные процессы ..................................... 10 1.2. Циклические вычислительные процессы ................................ 11 1.3. Вычислительные процессы с использованием процедур ...... 16 1.4. Алгоритмы и программы табуляции функции ....................... 17 1.5. Алгоритмы и программы для обработки массивов ................ 23 1.6. Алгоритмы и программы для нахождения сумм и произведений функциональных выражений ............................... 37 1.7. Алгоритм и программа метода пузырьковой сортировки ..... 40 1.8. Алгоритмы и программы с использованием элементов теории множеств ............................................................ 44 2. ЗАДАЧИ ПОВЫШЕННОЙ СЛОЖНОСТИ ПО СОСТАВЛЕНИЮ АЛГОРИТМОВ И ПРОГРАММ .................. 61 2.1. Задачи с элементами теории множеств ................................... 61 2.2. Задачи табуляции функций нескольких переменных ............ 66 2.3. Задачи с использованием массивов различной размерности .................................................................... 74 2.4. Задачи по вычислению функциональных выражений с использованием сложных сумм и произведений ........................ 95 2.5. Задача по вычислению функции, заданной в интервале ..... 103 2.6. Задачи по нахождению суммы конечного и бесконечного функциональных рядов ....................................... 105 2.7. Задачи с использованием двойных сумм и произведений ... 111 2.8. Задача с использованием процедур и функций для двумерного массива ................................................................. 113 2.9. Задача с элементами линейного программирования ............ 117 3. ЧИСЛЕННЫЕ МЕТОДЫ РЕШЕНИЯ ЗАДАЧ НА ПЕРСОНАЛЬНОМ КОМПЬЮТЕРЕ ......................................... 124 3.1. Решение систем линейных уравнений ................................... 124 3.1.1. Задача с использованием матричного метода............. 124 3.1.2. Задача с использованием метода Крамера .................. 130 3.1.3. Задача с использованием метода Гаусса ..................... 134 4 3.2. Решение нелинейных уравнений ........................................... 138 3.2.1. Задача с использованием метода дихотомии ............. 138 3.2.2. Задача с использованием метода хорд ........................ 142 3.2.3. Задача с использованием метода касательных ........... 144 3.3. Аппроксимация табличных данных методом наименьших квадратов ................................................................... 148 3.4. Дифференцирование и интегрирование табулированных функций .............................................................. 153 3.5. Решение дифференциальных уравнений ............................... 160 3.5.1. Задача с использованием метода Эйлера .................... 160 3.5.2. Задача с использованием метода Рунге-Кутта ........... 163 4. ВЫЧИСЛИТЕЛЬНЫЕ ТЕХНОЛОГИИ РЕШЕНИЯ ЗАДАЧ В MS EXCEL ......................................................................... 174 4.1. Решение системы линейных уравнений матричным методом ....................................................................... 174 4.2. Решение нелинейных уравнений и систем ............................ 182 4.2.1. Задача решения нелинейного уравнения методом дихотомии ................................................................ 182 4.2.2. Задача решения нелинейного уравнения методом хорд ........................................................................... 188 4.2.3. Задача решения нелинейного уравнения методом касательных .............................................................. 192 4.2.4. Задача решения нелинейного уравнения методом простых итераций .................................................... 197 4.2.5. Задача решения нелинейного уравнения с помощью надстройки «Поиск решения» ........................... 199 4.3. Аппроксимация полиномами табулированных функций .... 203 4.4. Численное дифференцирование и интегрирование функций ............................................................ 219 4.5. Решение дифференциальных уравнений ............................... 227 4.5.1. Решение дифференциальных уравнений методом Рунге-Кутта .............................................................. 227 4.5.2. Решение дифференциального уравнения методом Эйлера ....................................................................... 231 4.5.3. Решение дифференциальных уравнений с частными производными методом конечных разностей .. 233 5 4.6. Решение задач оптимизации с использованием надстройки MS EXCEL «Поиск решения» .................................. 239 5. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ................... 243 5.1. Задачи по разработке алгоритмов и программ с использованием разветвляющихся процессов .......................... 243 5.2. Задачи по разработке алгоритмов и программ с использованием циклических процессов................................... 247 5.3. Задачи по разработке алгоритмов и программ для обработки матриц..................................................................... 248 5.4. Задачи по разработке алгоритмов и программ для вычислений сложных сумм ..................................................... 249 5.5. Задачи по разработке алгоритмов и программ для решения нелинейных уравнений ............................................ 253 5.6. Задачи по разработке алгоритмов и программ для аппроксимации табулированных функций ............................ 255 5.7. Задачи по разработке алгоритмов и программ для численного интегрирования и дифференцирования функции ........................................................................................... 259 5.8. Задачи по разработке алгоритмов и программ для численного решения дифференциальных уравнений ........... 260 5.9. Задачи по разработке технологии численного решения уравнений в частных производных в MS EXCEL ....................... 261 5.10. Задачи по разработке технологии решения системы линейных уравнений в MS EXCEL ............................... 264 5.11. Задачи по разработке технологии решения нелинейных уравнений в MS EXCEL ........................................... 270 5.12. Задачи по разработке технологии аппроксимации полиномов табулированных функций в MS EXCEL ................... 272 5.13. Задачи по разработке технологии численного дифференцирования функций в MS EXCEL ................................ 276 5.14. Задачи по разработке технологии интегрирования функций в MS EXCEL .................................................................... 279 5.15. Задачи по разработке технологии решения дифференциальных уравнений методом Рунге-Кутта в MS EXCEL .................................................................................... 283 5.16. Задачи по разработке технологии решения задачи оптимизации методом простых итераций в MS EXCEL ............. 285 6 РЕКОМЕНДУЕМЫЕ УЧЕБНЫЕ ПОСОБИЯ ДЛЯ СТУДЕНТОВ ............................................................................. 290 ПРИЛОЖЕНИЯ .................................................................................. 292 ПРИЛОЖЕНИЕ 1. КРАТКИЕ СВЕДЕНИЯ О ЯЗЫКЕ PASCAL .. 292 П 1.1. Алфавит языка Pascal .......................................................... 292 П 1.2. Элементарные конструкции ................................................ 292 П 1.3 Структура программы на языке Pascal ............................... 295 П 1.4. Типы данных ........................................................................ 296 П 1.5. Основные операторы языка Pascal ..................................... 301 П 1.6. Использование стандартных процедур и функций модулей Crt и Graph в языке Pascal ............................................... 309 П 1.7. Процедуры и функции пользователя ................................. 317 П 1.8. Интегрированная среда Turbo Pascal ................................. 328 П 1.9. Работа в интегрированной среде Turbo Pascal .................. 330 П 1.10. Правила и примеры построения схем алгоритмов ......... 334 П 1.11. Представление схем алгоритмов с помощью Microsoft Word ............................................................ 342 П 1.12. Представление схем алгоритмов с помощью программы Microsoft Visio ............................................................. 350 П 1.13. Пояснения к решению некоторых задач пособия ........... 352 ПРИЛОЖЕНИЕ 2 ............................................................................... 357 П 2.1. Основные теоретические сведения о численных методах решения систем линейных уравнений ........................... 357 П 2.1.1. Матричный метод .................................................. 357 П 2.1.2. Метод Крамера ....................................................... 361 П 2.1.3. Метод Гаусса .......................................................... 366 П 2.2. Основные теоретические сведения о численных методах решения нелинейных уравнений ............. 372 П 2.2.1. Метод дихотомии ................................................... 373 П 2.2.2. Методы Ньютона (метод хорд и метод касательных) ..................................... 375 П 2.2.3. Метод простых итераций ...................................... 379 П 2.3. Основные теоретические сведения о численных методах аппроксимации .......................................... 380 7 П 2.4. Основные теоретические сведения о численных методах дифференцирования табулированных функций .............................................................. 382 П 2.5. Основные теоретические сведения о численных методах интегрирования табулированных функций ................... 384 П 2.6. Основные теоретические сведения о численных методах решения обыкновенных дифференциальных уравнений ........................................................................................ 387 П 2.6.1. Метод Эйлера ......................................................... 388 П 2.6.2. Метод Рунге-Кутта ................................................ 390 П 2.7. Основные теоретические сведения о численных методах решения дифференциальных уравнений в частных производных .................................................................................... 394 8 ВВЕДЕНИЕ Современный уровень требований к инженерам технического профиля предполагает хорошее знание ими методов алгоритмиза- ции и решения сложных математических задач. Современный ин- женер должен уметь перевести техническую задачу в алгоритмиче- ское представление, на основе которого ее можно решить. Состав- ление алгоритма – самый сложный этап творчества, часто вызывающий трудности у студентов, изучающих курс информаци- онных технологий. Поэтому в данном учебном пособии рассмотре- на целая группа алгоритмов, начиная от простых и заканчивая сложными, которые связаны с компьютерными методами и техно- логиями. В качестве инструментария для реализации рассматривае- мых алгоритмов использованы MS Excel и Turbo Pascal. Несмотря на то, что по дисциплине «Информационные технологии» имеется большое количество учебной литературы, практикумы с подробны- ми решениями задач по информационным технологиям являются скорее исключением, чем правилом. Опыт работы авторов со сту- дентами показывает необходимость таких учебных пособий, кото- рые позволяют без помощи преподавателя научиться разрабатывать алгоритмы и решать задачи хотя бы на одном языке программиро- вания. Приобретя основные навыки по этим вопросам, обучающий- ся способен сложнейшие задачи осваивать самостоятельно. Отличительной чертой пособия является множество упражнений и задач с решениями, что позволяет студентам самостоятельно освоить многие вопросы информационных технологий. В пособии представлено около 50 вариантов различного класса математиче- ских задач, что будет полезным для преподавателя, так как позволя- ет наиболее эффективно организовать индивидуальную работу со студентами. Многие задачи рассмотрены настолько подробно, что становятся полезными для слушателей как дневного, так и заочной форм обучения. Учебное пособие может быть использовано для студентов, занимающихся в учреждениях, использующих дистан- ционную форму обучения по дисциплинам, связанным с информа- ционными технологиями. Учебное пособие состоит из пяти основных разделов, каждый из которых несет свою смысловую нагрузку. В первом разделе основ- ной акцент сделан на разработку простейших алгоритмов и про- 9 грамм, которые являются введением в процесс алгоритмизации. Во втором разделе представлены сложные математические задачи по составлению алгоритмов и программ, которые являются оригиналь- ными. В третьем и четвертом разделах рассмотрены численные ме- тоды решения задач на персональном компьютере (ПК) с использо- ванием языка программирования Pascal и возможностей MS Excel, причем подробные решения позволяют неподготовленному читате- лю освоить основные методы вычислений, используемые в при- кладной математике. В пятом разделе представлены индивидуаль- ные задания, которые могут быть использованы преподавателем в курсовом и дипломном проектировании. В приложениях пособия приведены краткие сведения, необхо- димые для освоения численных методов, разработки алгоритмов (правила и примеры построения, алгоритм процесса построения ал- горитмов с помощью MS Word и MS Visio) и программ (операторы, процедуры и функции языка Pascal, приемы работы в среде Turbo Pascal), дающие читателю математические основы для решения за- дач курса по информационным технологиям. 10 1. ЗАДАЧИ ПО РАЗРАБОТКЕ АЛГОРИТМОВ И ПРОГРАММ 1.1. Линейные вычислительные процессы Задача 1.1. Разработать схему алгоритма и программу для вы- числения площади треугольника S по заданным с клавиатуры зна- чениям стороны a и высоты h, проведенной к этой стороне. Значе- ние площади вывести на экран. Решение задачи Алгоритм решения задачи состоит в вычислении площади тре- угольника по введенным значениям стороны и высоты. Логика ал- горитма сводится к построению алгоритма с линейной структурой, в котором каждая последующая процедура выполняется после предыдущей. Вычисление площади треугольника производится по формуле 2 ha S . Разработанная схема алгоритма представлена на рис. 1.1. Изоб- раженные на рисунке символы пронумерованы. 1 Конец 2 3 4 5 Начало Ввод a, h S=ah/2 Вывод S Ввод данных Вывод данных в удобном виде Рис. 1.1 11 Обозначения схемы алгоритма S – значение площади треугольника Программа Program Prog1_1; Var a, h, S : Real; {описание переменных программы} Begin {начало раздела операторов программы} Write('Введите значение стороны а '); Readln(a); {чтение значения стороны а} Write('Введите значение высоты h '); Readln(h); {чтение значения высоты h} S := a*h/2; {вычисление площади} Writeln('Площадь треугольника S = ', S:7:2);{вывод на экран} End. {конец программы} Результат работы программы Введите значение стороны а 1.5 Введите значение высоты h 7.2 Площадь треугольника S = 5.40 1.2. Циклические вычислительные процессы Задача 1.2. Разработать схему алгоритма и программу вычисле- ния и вывода на экран значений площадей треугольников с различ- ными основаниями а и постоянной высотой h, проведенной к осно- ванию. Величина а принимает значения а = 1; 7 (1). Значение высо- ты h вводится с клавиатуры. Решение задачи Алгоритм решения задачи состоит в последовательном переборе значений а от 1 до 7 с шагом 1 при вычислении площади по форму- ле 2 ha S . Алгоритм решения задачи состоит из одного цикла и представлен на рис. 1.2 в двух вариантах: 1) с использованием парного символа «Граница цикла» (рис. 1.2, а); 12 2) с использованием символа «Подготовка» (рис. 1.2, б). 1 Конец 2 3 4 Начало Ввод h S=ah/2 6 5 A а=1,7 A Вывод a, S 7 1 Конец 2 3 4 Начало Ввод h S=ah/2 5 a=1,7 Вывод a, S 6 а б Рис. 1.2 Обозначения схем алгоритма S – значение площади треугольника. 13 Программа Program Prog1_2; Var h, S : Real; a : Byte; Begin {начало раздела операторов программы} Write('Введите значение высоты h '); Readln(h); {чтение значения высоты h} for a:=1 to 7 do {цикл для перебора значений основания а} begin {начало цикла} S := a*h/2; {вычисление площади S} Writeln('При a = ', a, ' S = ', S:7:2);{вывод результатов} end; {конец цикла}; End. {конец программы} Результат работы программы Введите значение высоты h 7.2 При а = 1 S = 3.60 При а = 2 S = 7.20 При а = 3 S = 10.80 При а = 4 S = 14.40 При а = 5 S = 18.00 При а = 6 S = 21.60 При а = 7 S = 25.20 Задача 1.3. Разработать схему алгоритма и программу вычисления и вывода на экран значений площадей треугольников по изменяю- щимся значениям сторон и высот. Значение стороны а изменяется по закону а = 1; 3 (1), высота h проведена к стороне a и изменяется по за- кону 1; 5 (0,8). Решение задачи В алгоритме этой задачи необходимо использовать два цикла. Для последовательного перебора значений а используется цикл от 1 до 3 с шагом 1, а для перебора значений h используется цикл от 1 до 5 с шагом 0,8 с предусловием h ≤ 5. На рис. 1.3 представлена схема алгоритма решения задачи с использованием различных символов цикла, а именно: цикл для перебора переменной h организован в виде разветвляющейся структуры, а для перебора переменной a – в 14 виде циклической структуры с использованием парного символа «Граница цикла». 1 Конец 2 3 4 Начало S=ah/2 5 A а=1,3 A h=1 h<5 6 7 8 да нет 9 h=h+0.8 Вывод a, h, S Рис. 1.3 15 Обозначения схем алгоритма S – значение площади треугольника. Программа Program Prog1_3; Var h, S : Real; a : Byte; Begin {начало раздела операторов программы} for a := 1 to 3 do Begin {начало цикла 1} h := 1; {начальное значение высоты h} While h <= 5 do {выполнять цикл пока h <= 5} Begin {начало цикла 2} S := a*h/2; {вычисление площади S} {вывод на экран} Writeln('При а = ', a, ' , h = ', h:7:2, ' S = ', S:7:2); h := h + 0.8; {приращение высоты h} end; {конец цикла 2} end; {конец цикла 1} End. {конец программы} Результат работы программы При a = 1 h = 1.00 S = 0.50 При a = 1 h = 1.80 S = 0.90 При a = 1 h = 2.60 S = 1.30 При a = 1 h = 3.40 S = 1.70 При a = 1 h = 4.20 S = 2.10 При a = 2 h = 1.00 S = 1.00 При a = 2 h = 1.80 S = 1.80 При a = 2 h = 2.60 S = 2.60 При a = 2 h = 3.40 S = 3.40 При a = 2 h = 4.20 S = 4.20 При a = 3 h = 1.00 S = 1.50 При a = 3 h = 1.80 S = 2.70 При a = 3 h = 2.60 S = 3.90 При a = 3 h = 3.40 S = 5.10 При a = 3 h = 4.20 S = 6.30 16 1.3. Вычислительные процессы с использованием процедур Задача 1.4. Разработать алгоритм и программу для вычисления и вывода на экран значений функции z = sin[cos4(x·y)]. Значения пе- ременных x и y вводятся с клавиатуры. Для решения задачи необхо- димо использовать подпрограмму (function). Решение задачи Общий алгоритм решения задачи и схема вычисления функции в подпрограмме (расшифровка символа «Предопределенный про- цесс») представлены на рис. 1.4, а и б соответственно. 1 2 3 Начало Ввод x1, y1 z1=Z(x1, y1) Конец Вывод z1 4 5 1 2 3 Начало Конец Z=sin(cos(xy)· cos(xy)·cos(xy)· cos(xy)) а б Рис. 1.4 17 Обозначения схемы алгоритма x1, y1 – фактические параметры, обозначающие значения пере- менных x и y соответственно, используемые для передачи значе- ний в функцию Z; Z(x1, y1) – вызов функции Z для вычисления значения z = = sin[cos4(x·y)]; z1 –возвращаемое значение функции Z. Программа Program Prog1_4; Var z1, x1, y1 : Real; Function Z(x, y : Real) : Real; Begin {начало функции z} z := sin(cos(x*y) * cos(x*y) * cos(x*y) * cos(x*y)); End; {конец функции z} Begin {начало основной программы} Write('Введите значения x, y '); Readln(x1, y1); {чтение значений переменных x1, y1} z1 := Z(x1, y1); {вычисление z1 с использованием функции z} Writeln('z =' , z1:7:2);{вывод на экран} end. {конец основной программы} Результат работы программы Введите значения x, y 1 –2 z = 0.03 1.4. Алгоритмы и программы табуляции функции Задача 1.5. Разработать алгоритм и программу для табуляции функции i t i ezy sin , где переменные zi, ti (i = 1; n) являются массивами. Число элементов массивов n вводить с клавиатуры. Зна- чения y выводить на экран. 18 Решение задачи Алгоритм процесса табуляции состоит в последовательном вычис- лении функции с заданным шагом по переменному аргументу. Требу- ется организация цикла от 1 до n для перебора значений массивов zi и ti. Схема алгоритма решения задачи представлена на рис. 1.5. 1 6 Начало Ввод N А I=1,N Y=sin(Z[I])+ +e T[I] А 2 3 4 5 Конец 7 Ввод Z[I],T[I] Вывод Y 8 Рис. 1.5 19 Программа Program Prog1_5; Var N, I : Byte; Z, T : array[1..20] of Real; Y, a : Real; Begin {начало раздела операторов программы} Write('Введите число элементов массивов (до 20) '); Readln(N); {чтение значения числа элементов массивов} Write('Введите значение коэффициента а '); Readln(a); {чтение значение коэффициента а} for I := 1 to N do Begin {начало цикла} Write('Введите ', I, '-е элементы массивов Z и T '); Readln(Z[I], T[I]);{чтение значений элементов массивов Z, T} Y := sin(Z[I]) * Exp(a*T[I]);{вычисление Y} Writeln('Y = ', Y:7:2); {вывод на экран значения Y} end; {конец цикла} End. {конец программы} Результат работы программы Введите число элементов массивов (до 20) 3 Введите значение коэффициента а 1.6 Введите 1-е элементы массивов Z и T 2.1 3.2 Y = 144.45 Введите 2-е элементы массивов Z и T 0.2 -1.5 Y = 0.02 Введите 3-е элементы массивов Z и T 1.4 -2.1 Y = 0.03 Обозначения схемы алгоритма Z[I] – zi элемент массива Z; T[I] – ti элемент массива T. Пошаговый словесный алгоритм Шаг 1. Ввести значения , N. Начало цикла – первая итерация 20 Шаг 2. Присвоить I = 1. Шаг 3. Ввести значения Z1, T1. Шаг 4. Вычислить значение 1)sin( 1 T eZY . Шаг 5. Вывести значение на экран. Вторая итерация цикла Шаг 6. Присвоить I = 2. Шаг 7. Ввести значения Z2, T2. Шаг 8. Вычислить значение 2)sin( 2 T eZY . Шаг 9. Вывести значение Y на экран. … N-я итерация цикла Шаг 10. Присвоить I = N. Шаг 11. Ввести значения ZN, TN. Шаг 12. Вычислить значение N T N eZY )sin( . Шаг 13. Вывести значение Y на экран. Конец цикла Задача 1.6. Разработать схему алгоритма и программу табу- ляции функции с ограниченной областью определения 23 3 sin)4(log xxy , если переменная x = –10; 100 (0,1). Значе- ния y выводить на экран. Если х не входит в область определения функции, то вывести сообщение о том, что при данном х нет значений. Решение задачи Алгоритм решения задачи состоит в вычислении для каждого значения х значений y с учетом области определения, а именно 0sin и 04 23 xx . Логика алгоритма требует организации цикла для изменения значений x и использования разветвляющихся про- цессов для учета области определения функции. Схема алгоритма решения задачи представлена на рис. 1.6 (перебор значений х орга- низован с использованием разветвляющейся структуры). 21 10 X<100 9 8 Начало A>0 и B>0 BAY 3 log 1 2 3 4 6 X = -10 Х = Х + 0.1 Конец 5 7 данет да нет Вывод X «При дан- ном Х нет значений» Вывод X, Y A=X3-4 B=sin(X2) Рис. 1.6 22 Пояснения к схеме алгоритма Обозначения: А – промежуточная переменная для вычисления условия x3 – 4; B – промежуточная переменная для вычисления условия sin x2. Символ 1. Начало алгоритма. Символ 2. Присвоение переменной Х первоначального значения –10. Символ 3. Проверка условия окончания цикла X 100. Если условие верно, то далее выполняется символ 4, если нет, то проис- ходит выход из цикла на символ 10. Символ 4. Вычисление значений промежуточных переменных A и B. Символ 5. Проверка условия принадлежности значения X обла- сти определения функции Y. Если условие верно, то далее выпол- няются символы 6, 7, если нет – символ 8. Символ 6. Вычисление значения Y . Символ 7. Вывод на экран значений X, Y. Символ 8. Вывод на экран значения X и сообщения «При данном Х нет значений». Символ 9. Приращение переменной X на шаг 0,1. Символ 10. Конец алгоритма. Программа Program Prog1_6; Var X, Y, A, B : Real; Begin {начало раздела операторов программы} X := -10; {начальное значение переменной Х} While X <= 100 do {выполнять цикл пока Х≤100} Begin {начало цикла} A := X*X*X - 4; B := Sin(X*X); {вычисление промежут. значений} If (A > 0) and (B >= 0) Then {проверка области определения} Begin Y := Ln(A)/Ln(3) +Sqrt(B); {вычисление Y} Writeln('X = ', X:5:1, ' Y = ', Y:7:2); {вывод на экран} end else Writeln('Х = ', X:5:1, ' При данном X нет значений '); X := X + 0.1; {приращение переменной Х} end; {конец цикла} End. {конец программы} 23 Фрагмент результата работы программы X = -10.0 При данном Х нет значений X = -9.9 При данном Х нет значений X = -9.8 При данном Х нет значений … X = 99.7 Y = 12.87 X = 99.8 Y = 13.53 X = 99.9 Y = 13.43 X = 100.0 При данном Х нет значений 1.5. Алгоритмы и программы для обработки массивов Задача 1.7. Разработать словесный алгоритм, схему алгоритма и программу нахождения максимального значения одномерного мас- сива A, состоящего из четырёх элементов: 30, 20, 40 и 50. Решение задачи Схема алгоритма решения задачи представлена на рис. 1.7. Программа Program Prog1_7; Var A : array [1..4] of Byte; Max, I : Byte; Begin {начало раздела операторов программы} {заполнение массива значениями} A[1] := 30; A[2] := 20; A[3] := 40; A[4] := 50; Max := A[1]; {первоначальное значение переменой максимума} for I := 2 to 4 do {цикл для перебора элементов массива А} If Max < A[I] Then Max := A[I]; {проверка условия на максимум} Writeln('Максимальный элемент массива = ', Max); {вывод на экран} End. {конец программы} Результат работы программы Максимальный элемент массива = 50 24 6 7 8 2 1 5 Начало Max=A[1] А I=2, 4 Max< A[I] Max=A[I] А Конец 4 3 данет Вывод Max Рис. 1.7 Пояснения к схеме алгоритма Обозначения: A[I] – ai элемент массива А; Max – значение максимального элемента массива A. 25 Символ 1. Начало алгоритма. Символ 2. Присвоение переменной Max значения первого эле- мента массива A[1]. Символ 3. Открытие цикла с параметром I = 2; 4 для перебора элементов массива A. Символ 4. Проверка условия на максимум. Если переменная Max меньше рассматриваемого в текущей итерации элемента массива A[I], то выполняется символ 5, иначе – символ 6. Символ 5. Присвоение переменной Max значения A[I]. Символ 6. Закрытие цикла с параметром I. Символ 7. Вывод на экран значения переменной Max. Символ 8. Конец алгоритма. Пошаговый словесный алгоритм Шаг 1. Присвоить переменной Max значение A[1] (Max = 30). Начало цикла Шаг 2. Присвоить I = 2 (первая итерация цикла). Шаг 3. Проверка условия на максимум: 30 < 20 (условие не вы- полняется). После первой итерации Max = 30. Шаг 4. Присвоить I = 3 (вторая итерация цикла). Шаг 5. Проверка условия на максимум: 30 < 40 (условие выпол- няется). Присвоить Max = 40. После второй итерации Max = 40. Шаг 6. Присвоить I = 4 (третья итерация цикла). Шаг 7. Проверка условия на максимум: 40 < 50 (условие выпол- няется). Присвоить Max = 50. После третьей итерации Max = 50. Конец цикла. Задача 1.8. Разработать схему алгоритма и программу нахожде- ния суммы индексов первого минимального элемента матрицы A для элементов aij, удовлетворяющих условию i + j > 10. Элементы 26 исходной матрицы А размером 10 × 20 являются вещественными числами и записаны в файле а.а. Решение задачи Решение задачи состоит в реализации двух циклов для перебора значений матрицы A и сохранении индексов минимального элемента. Следует обратить внимание, что его следует искать среди элементов, удовлетворяющих условию i + j > 10 и, значит, для задания начально- го значения переменной минимального элемента необходимо ис- пользовать элемент aij, удовлетворяющий этому условию, например, a10 20 (поскольку 10 + 20 > 10). Схема алгоритма решения задачи представлена на рис. 1.8. 3 6 7 2 1 4 5 Начало Ввод из файла a.a массива A A I=1, 10 B J=1, 20 условие верно? IMin=I JMin=J да IMin=10 JMin=20 нет I+J>10 и A[I, J]10) and (A[I,J]=10) and (Cos(X[I])=0) Then Writeln('Функция не определена') else begin {начало блока 1} If X[I]<-10 Then Z := Sin(X[I]) else If X[I] < 1 Then Z := cos(X[I]) else If X[I]<10 Then Z:= Ln(X[I]) else Z:=sin(X[I])/cos(X[I]); Writeln('Z = ', Z:7:2); {вывод значения Z на экран} end; {конец блока 1} end; {конец цикла} End. {конец программы} Результат работы программы Введите размер (число элементов) массива Х (до 20) 3 Введите 1-й элемент массива Х 6 Z = 1.79 Введите 2-й элемент массива Х 30 Z = -6.41 Введите 3-й элемент массива Х -10 Z = -0.84 30 10 12 8 16 15 14 13 Начало Ввод N A I=1, N Ввод X[I] X[I]<-10 Z = sin(X[I]) X[I]<1 Z =cos(X[I]) X[I]<10 A Конец 1 2 3 4 7 9 да да да нет нет нет Вывод Z условие верно? Проверка области определения функции z X[I]>10 и Cos(X[I])=0 Вывод «…» «Функция не определена» 6 нет да 11 5 Z =sin(X[I])/ cos(X[I]) Z = Ln(X[I]) Рис. 1.9 Пояснения к схеме алгоритма Обозначение: X[I] – xi элемент массива Х. Символ 1. Начало алгоритма. Символ 2. Ввод размера массива N. Символ 3. Открытие цикла с параметром I = 1; N для перебора значений массива X[I]. Символ 4. Ввод с клавиатуры элемента массива X[I]. 31 Символ 5. Проверка условия X[I] ≥ 10 и cos(X[I]) = 0 (условие то- го, что значение ])[cos( ])[sin( ])[tg( IX IX IX может быть вычислено). Если условие верно, то далее выполняется символ 6, если нет – символ 7. Символ 6. Вывод на экран сообщения «Функция не определена». Символ 7. Проверка условия X[I] < –10. Если условие верно, то далее выполняется символ 8, если нет – символ 9. Символ 8. Присвоение переменной Z значения sin(X[I]). Символ 9. Проверка условия принадлежности X[I] интервалу [–10; 1). Если условие верно, то далее выполняется символ 10, если нет – символ 11. Символ 10. Присвоение переменной Z значения cos(X[I]). Символ 11. Проверка условия принадлежности X[I] интервалу [1; 10). Если условие верно, то далее выполняется символ 12, если нет – символ 13. Символ 12. Присвоение переменной Z значения ln(X[I]). Символ 13. Присвоение переменной Z значения ])[(cos ])[(sin IX IX . Символ 14. Вывод на экран значения переменной Z. Символ 15. Закрытие цикла с параметром I. Символ 16. Конец алгоритма. Задача 1.10. Разработать схему алгоритма и программу для вы- числения значений элементов матрицы А размером 5 12, которые заданы формулой . если),ln( ; если ),sin( ji j i jiji aij Значения элементов массива aij вывести на экран. Решение задачи Алгоритм решения задачи состоит в организации двух циклов по i и j для вычисления в зависимости от условий значений элементов 32 двумерного массива aij. Схема алгоритма решения задачи представ- лена на рис. 1.10. 10 7 9 Начало A I = 1, 5 I < J A[I, J] = = Sin(I+J) A[I, J] = = Ln(I/J) B Конец 1 2 3 4 56 8 B J = 1, 12 A нет да Вывод A[I, J] Рис. 1.10 Пояснения к схеме алгоритма Обозначения: A[I, J] – aij элемент матрицы А. 33 Символ 1. Начало алгоритма. Символ 2. Открытие внешнего цикла с параметром I = 1; 5 для перебора строк матрицы A. Символ 3. Открытие внутреннего цикла с параметром J = 1; 12 для перебора столбцов матрицы A. Символ 4. Проверка условия I J. Если условие верно, то далее выполняется символ 5, если нет – то символ 6. Символ 5. Присвоение элементу A[I, J] значения sin(I + J). Символ 6. Присвоение элементу A[I, J] значения ln(I/J). Символ 7. Вывод на экран значения A[I, J]. Символ 8. Закрытие внутреннего цикла с параметром J. Символ 9. Закрытие внешнего цикла с параметром I. Символ 10. Конец алгоритма. Программа Program Prog1_10; Var I, J : Byte; A : array [1..5, 1..12] of Real; Begin {начало раздела операторов программы} for I:= 1 to 5 do Begin {начало цикла 1 - для перебора строк массива А} for J := 1 to 12 do Begin {начало цикла 2 - для перебора столбцов массива А} {вычисление значения элемента массива в зависимости от условия} If I <= J Then A[I, J] := sin(I + J) else A[I, J] := ln(I/J); Write(A[I, J]:7:2, ' ');{вывод элемента массива на экран} end; {конец цикла 2} Writeln; {переход на следующую строку} end; {конец цикла 1} End. {конец программы} Результат работы программы 0.91 0.14 -0.76 -0.96 -0.28 0.66 0.99 0.41 -0.54 -1.00 -0.54 0.42 0.69 -0.76 -0.96 -0.28 0.66 0.99 0.41 -0.54 -1.00 -0.54 0.42 0.99 1.10 0.41 -0.28 0.66 0.99 0.41 -0.54 -1.00 -0.54 0.42 0.99 0.65 1.39 0.69 0.29 0.99 0.41 -0.54 -1.00 -0.54 0.42 0.99 0.65 -0.29 1.61 0.92 0.51 0.22 -0.54 -1.00 -0.54 0.42 0.99 0.65 -0.29 -0.96 34 Задача 1.11. Разработать схему алгоритма и программу получе- ния из матрицы А10 10, заданной по закону aij = cos(i + j), двух одно- мерных массивов C и D. В массив C занести все неотрицательные элементы заштрихованной области матрицы А, а в массив D – отри- цательные элементы незаштрихованной области. Вывести на экран число элементов массивов С и D. Решение задачи Алгоритм решения задачи включает анализ двух условий: 0 , ija ij и .0 , ija ij Если выполняется первое условие, то элемент aij заносится в мас- сив С: ck = aij, если выполняется второе условие – то элемент aij зано- сится в массив D: dn = aij. Таким образом, логика алгоритма требует организации двух циклов для формирования и перебора значений aij и использования разветвляющихся процессов для их анализа. Схема алгоритма решения задачи представлена на рис. 1.11. 35 9 10 11 13 Начало A I = 1, 10 J>I и A[I,J]>0 B Конец 1 2 4 6 7 8 B J = 1, 10 A К = 0 N = 0 A[I,J]=cos(I+J) 3 5 данет Вывод K, N 12 K = K+1 C[К]=A[I, J] J= I) and (A[I, J] >= 0) Then {проверка условий} Begin {начало блока 1 – условия верны} K := K + 1; {увеличение индекса K на 1} C[K] := A[I, J]; {заполнение массива C} end {конец блока 1} else If (J < I) and (A[I, J] < 0) Then {проверка условий} Begin {начало блока 2–условия верны} N := N + 1; {увеличение индекса N на 1} D[N] := A[I, J]; {заполнение массива D} end; {конец блока 2} end; {конец циклов 1, 2} Writeln('Число элементов массива C = ', K); {вывод K} Writeln('Число элементов массива D = ', N); {вывод N} End. {конец программы} Результат работы программы Число элементов массива C = 30 Число элементов массива D = 20 1.6. Алгоритмы и программы для нахождения сумм и произведений функциональных выражений Задача 1.12. Разработать схему алгоритма и написать программу для вычисления значения 100 1 20 1 )cos( )1sin( i k i k A . Значение А вывести на экран. Решение задачи Алгоритм решения задачи сводится к последовательному вычис- лению знаменателя (суммирование), при этом следует обратить внимание на то, что он не должен быть равен нулю, а затем – чис- лителя (произведение). Схема алгоритма решения задачи представ- лена на рис. 1.12. 38 Начало1 A I = 1, 100 2 5 S = 0 S =S+Cos (I) 3 4 A Вычисление суммы (S) S=0 Вывод «...» «Значение A не определено» 11 12 13 Конец A = P/S Вывод А P = 1 B K = 1, 20 9 P = =Psin(K+1) 10 B 8 7 Вычисление произведения (P) 6 14 да нет Рис. 1.12 39 Пояснения к схеме алгоритма Обозначения: P – значение выражения произведения 20 1 )1sin( k k ; S – значение выражения суммы 100 1 )cos( i i . Символ 1. Начало алгоритма. Символ 2. Присвоение переменной S начального значения 0. Символ 3. Открытие цикла с параметром I = 1; 100 для вычисле- ния суммы. Символ 4. Вычисление переменной S по формуле с учетом накоплений сумм. Символ 5. Закрытие цикла с параметром I. Символ 6. Проверка условия равенства нулю значения S. Если верно, то выполняется символ 14, если нет – символ 7. Символ 7. Присвоение переменной P начального значения 1. Символ 8. Открытие цикла с параметром K = 1; 20 для вычисле- ния произведения. Символ 9. Вычисление переменной P по формуле с учетом накоплений произведений. Символ 10. Закрытие цикла с параметром K. Символ 11. Вычисление переменной A. Символ 12. Вывод на экран значения А. Символ 13. Конец алгоритма. Символ 14. Вывод на экран сообщения «Значение А не определено». Программа Program Prog1_12; Var K, I : Byte; P, S, A : Real; Begin {начало раздела операторов программы} S := 0; {начальное значение переменной S} for I := 1 to 100 do S := S + cos(I); {вычисление суммы в цикле} If S = 0 Then Writeln('Значение А не определено') 40 else begin {начало блока 1} P := 1; {начальное значение переменной P} for K := 1 to 20 do P:=P * sin(K+1);{вычисление произведения в цикле} A := P/S; {вычисление А} Writeln('A = ', A:15:12){вывод на экран значения А} end; {конец блока 1} End. {конец программы} Результат работы программы A=0.00002461930 1.7. Алгоритм и программа метода пузырьковой сортировки Задача 1.13. Разработать схему алгоритма и написать программу сортировки по возрастанию одномерного массива A, состоящего из пяти элементов: 10, 80, 45, 36, 71. Использовать метод пузырьковой сорти- ровки. Значения элементов отсортированного массива вывести на экран. Решение задачи Алгоритм пузырьковой сортировки заключается в повторяю- щихся проходах по сортируемому массиву. За каждый проход эле- менты последовательно сравниваются попарно, и, если порядок в паре неверный, их меняют местами. При первом проходе сравнива- ются первый и второй элементы, затем второй и третий и т. д., пока не будет достигнут последний элемент массива. Таким образом, наибольший элемент оказывается в конце массива, то есть «всплы- вает», как пузырёк в воде. При втором проходе производятся анало- гичные сравнения, которые останавливаются на предпоследнем элементе массива, и, таким образом, после второго прохода на предпоследнем месте окажется второй наибольший элемент и т. д. В нашем случае, поскольку массив состоит из пяти элементов, будет сделано четыре прохода, и на каждом проходе все элементы будут попарно сравниваться. Таким образом, при построении схемы алгоритма необходимо организовать два цикла A и B. Цикл B вво- дится для попарного сравнения элементов, цикл A – для задания числа проходов и номера последнего элемента для сравнения. Схе- ма алгоритма решения задачи представлена на рис. 1.13. 41 12 11 6 10 Начало A K=4, 1 B J=1, K A[J] > A[J+1] Tmp = A[J] A[J] =A[J+1] A[J+1]=Tmp B A Вывод A[J] Конец 1 2 3 4 7 8 да нет Задать элементы массива А 5 A=(10, 80, 45, 36, 71) Перемена местами элементов A[J] и A[J+1] C J=1, 5 9 C Вывод отсортированного массива А Рис. 1.13 42 Программа Program Prog1_13; Var A : array [1..5] of Byte; K, J, Tmp : Byte; Begin {начало раздела операторов программы} {заполнение массива А значениями} A[1] := 10; A[2] := 80; A[3] := 45; A[4] := 36; A[5] := 71; Write('Исходный массив'); for J := 1 to 5 do Write(A[J], ' '); {вывод исходного массива A} Writeln; {организация циклов 1, 2 для сравнения элементов массива А} for K := 4 downto 1 do for J := 1 to K do {проверка, если больший элемент находится перед меньшим} If A[J] > A[J + 1] Then Begin {начало блока 1} {перестановка местами элементов A[J] и A[J+1]} Tmp := A[J]; A[J] := A[J+1]; A[J+1] := Tmp; end; {конец блока 1, конец циклов 1, 2} Write(Отсортированный массив '); for J := 1 to 5 do Write(A[J], ' '); {вывод отсортиров. массива A} End. {конец программы} Результат работы программы Исходный массив 10 80 45 36 71 Отсортированный массив 10 36 45 71 80 Пояснения к схеме алгоритма Обозначения A[J], A[J + 1] – aj, aj + 1 элементы массива A; Tmp – переменная для временного хранения значения aj. Символ 1. Начало алгоритма. Символ 2. Заполнение массива A значениями. Символ 3. Открытие цикла с параметром K = 4; 1 для перебора элементов массива A. Символ 4. Открытие цикла с параметром J = 1; K для перебора элементов массива A. 43 Символ 5. Проверка условия A[J] > A[J + 1]. Если условие верно, то выполняется символ 6, если нет – символ 7. Символ 6. Перестановка местами элементов массива A[J] и A[J + 1] с помощью промежуточной переменной Tmp. Символ 7. Конец цикла с параметром J. Символ 8. Конец цикла с параметром K. Символы 9–11. Вывод на экран значений отсортированного массива A. Символ 12. Конец алгоритма. Пошаговый алгоритм вычислений Начало цикла А (K=4). Расположение элементов массива А: 10, 80, 45, 36, 71. Шаг 1. Цикл B (J = 1). Сравнение элементов A[1] = 10 и A[2] = 80. Условие A[1] > A[2] не выполняется, массив А остался без изменений. Шаг 2. Цикл B (J = 2). Сравнение элементов A[2] = 80 и A[3] = 45. Условие A[2] > A[3] выполняется. Элементы A[2] и A[3] меняются местами. Расположение элементов массива А: 10, 45, 80, 36, 71. Шаг 3. Цикл B (J = 3). Сравнение элементов A[3] = 80 и A[4] = 36. Условие A[3] > A[4] выполняется. Элементы A[3] и A[4] меняются местами. Расположение элементов массива А:= 10, 45, 36, 80, 71. Шаг 4. Цикл B (J = 4). Сравнение элементов A[4] = 80 и A[5] = 71. Условие A[4] > A[5] выполняется. Элементы A[4] и A[5] меняются местами. Цикл А (K=3) Расположение элементов массива А: 10, 45, 36, 71, 80. Шаг 5. Цикл B (J = 1). Сравнение элементов A[1] = 10 и A[2] = 45. Условие A[1] > A[2] не выполняется, массив А остался без изменений. 44 Шаг 6. Цикл B (J = 2). Сравнение элементов A[2] = 45 и A[3] = 36. Условие A[2] > A[3] выполняется. Элементы A[2] и A[3] меняются местами. Расположение элементов массива А: 10, 36, 45, 71, 80. Шаг 7. Цикл B (J = 3). Сравнение элементов A[3] = 45 и A[4] = 71. Условие A[3] > A[4] не выполняется, массив А остается без изменений. Цикл А (K=2). Шаг 8. Цикл B (J = 1). Сравнение элементов A[1] = 10 и A[2] = 36. Условие A[1] > A[2] не выполняется, массив А остался без изменений. Шаг 9. Цикл B (J = 2). Сравнение элементов A[2] = 36 и A[3] = 45. Условие A[2] > A[3] не выполняется массив А остался без изменений. Цикл А (K=1). Шаг 10. Цикл B (J = 1). Сравнение элементов A[1] = 10 и A[2] = 36. Условие A[1] > A[2] не выполняется, массив А остался без изменений. Конец цикла А. Расположение элементов массива А: 10, 36, 45, 71, 80. 1.8. Алгоритмы и программы с использованием элементов теории множеств Задача 1.14. Разработать схему алгоритма и программу вычис- ления выражения }min{}min{ }max{}max{ lk ji aa aa S , где элементы под- множеств вычисляются как am = sin(m), m = 1; 100, а индексы эле- ментов подмножеств как i = 1; 40, j = 15; 50, k = 40; 70, l = 60; 100. Значение S вывести на экран. 45 Решение задачи Обозначим области изменения элементов подмножеств, в которых определяются максимумы и минимумы, как 1 (ai), 2 (aj), 3 (ak), 4 (al). Тогда алгоритм решения задачи состоит в организации четырёх цик- лов по i, j, k, l для вычисления, в зависимости от условий, максималь- ного или минимального элемента соответствующих областей масси- ва A. Схема алгоритма решения задачи представлена на рис. 1.14. Начало A I = 1, 100 1 2 3 A[I] = sin(I) A 4 Формирование массива А Определение минимального элемента (MinK) области 3 массива А Определение минимального элемента (MinL) области 4 массива А 1 5 6 10 11 MinK=A[40] B K = 41, 70 9 7 8 MinK> A[K] B MinK=A[K] данет MinL=A[60] C L = 61,100 14 12 13 MinL> A[L] C MinL=A[L] нет да 17 28 29 27 Конец S=... Вывод S MinLMinK MaxJMaxIS 18 15 22 23 MaxI=A[1] D I = 2, 40 21 19 20 MaxI< A[I] D MaxI=A[I] данет MaxJ=A[15] E J = 16, 50 26 24 25 MaxJ< A[J] E MaxJ=A[J] данет Определение максимального элемента (MaxI) области 1 массива А Определение максимального элемента (MaxJ) области 2 массива А MinK+MinL =0 1 нет да Вывод «S не опреде- лено» 2 16 2 Рис. 1.14 46 Пояснения к схеме алгоритма Обозначения: A[I], A[J], A[K], A[L] – ai, aj, ak¸ al элементы массива А; MaxI, MaxJ – максимальные элементы областей 1 и 2; MinK, MinL – минимальные элементы областей 3 и 4. Символ 1. Начало алгоритма. Символ 2. Открытие цикла с параметром I = 1; 100 для перебора элементов массива A. Символ 3. Вычисление I-го элемента массива A. Символ 4. Конец цикла с параметром I. Символ 5. Присвоение переменной MinK начального значения A[40]. Символ 6. Открытие цикла с параметром K = 41; 70 для перебора элементов массива A. Символ 7. Проверка условия на минимум. Если переменная MinK больше рассматриваемого в текущей итерации элемента мас- сива A[K], то выполняется символ 8, если нет – символ 9. Символ 8. Присвоение переменной MinK значения A[K]. Символ 9. Закрытие цикла с параметром K. Символ 10. Присвоение переменной MinL начального значения A[60]. Символ 11. Открытие цикла с параметром L = 61; 100 для пере- бора элементов массива A. Символ 12. Проверка условия на минимум. Если переменная MinL больше рассматриваемого в текущей итерации элемента мас- сива A[L], то выполняется символ 13, если нет – символ 14. Символ 13. Присвоение переменной MinL значения A[L]. Символ 14. Закрытие цикла с параметром L. Символ 15. Проверка равенства выражения (MinK + MinL) нулю. Если верно, то выполняется символ 16, если нет – символ 17. Символ 16. Вывод на экран сообщения «S не определено». Символ 17. Присвоение переменной MaxI начального значения A[1]. Символ 18. Открытие цикла с параметром I = 2; 40 для перебора элементов массива A. Символ 19. Проверка условия на максимум. Если переменная MaxI меньше рассматриваемого в текущей итерации элемента мас- сива A[I], то выполняется символ 20, иначе – символ 21. Символ 20. Присвоение переменной MaxI значения A[I]. Символ 21. Закрытие цикла с параметром I. 47 Символ 22. Присвоение переменной MaxJ начального значения A[15]. Символ 23. Открытие цикла с параметром J = 16; 50 для перебора элементов массива A. Символ 24. Проверка условия на максимум. Если переменная MaxJ меньше рассматриваемого в текущей итерации элемента мас- сива A[J]), то выполняется символ 25, если нет – символ 26. Символ 25. Присвоение переменной MaxJ значения A[J]. Символ 26. Закрытие цикла с параметром J. Символ 27. Вычисление значения S. Символ 28. Вывод на экран значения S. Символ 29. Конец алгоритма. Программа Program Prog1_14; Var I, J, K, L : Byte; A : array [1..100] of Real; MaxI, MaxJ, MinK, MinL, S : Real; Begin {начало раздела операторов программы} for I := 1 to 100 do {цикл 1 - для перебора элементов массива А} A[I] := sin(I); {вычисление A[I]} MinK := A[40]; {первоначальное значение переменной MinK} for K := 41 to 70 do {цикл 4 - для перебора элементов области 3} if MinK > A[K] then MinK := A[K]; {проверка условия на минимум} MinL := A[60]; {первоначальное значение переменной MinL} for L := 61 to 100 do {цикл 5 - для перебора элементов области 4} If MinL > A[L] then MinL := A[L]; {проверка условия на минимум} If (MinK + MinL)=0 then Writeln('Выражение S не определено') else begin {начало блока 1} MaxI := A[1]; {первоначальное значение MaxI} for I:=2 to 40 do {цикл 2-для перебора элементов области 1} If MaxIK B[I, J]=1 данет B[I, J]=0 Конец Вывод A[I, J] 8 9 10 Формирование булевой матрицы B A[I,J]= =sin(I+J) Вывод матрицы B 5 Вычисление элемента A[I, J] Рис. 1.17 59 Пояснения к схеме алгоритма Обозначения: A[I, J] – aij элемент матрицы А; B[I, J] – bij элемент матрицы B. Символ 1. Начало алгоритма. Символ 2. Присвоение переменной K значения 0,3. Символ 3. Открытие цикла с параметром I = 1; 10 для перебора строк матрицы А. Символ 4. Открытие цикла с параметром J = 1; 10 для перебора столбцов матрицы А. Символ 5. Вычисление элемента матрицы A[I, J]. Символ 6. Проверка значения A[I, J]. Если значение больше поро- гового значения K, то выполняется символ 7, если нет – символ 8. Символ 7. Присвоение элементу матрицы B[I, J] значения 1. Символ 8. Присвоение элементу матрицы B[I, J] значения 0. Символ 9. Вывод на экран элемента A[I, J]. Символ 10. Вывод матрицы B. Вывод значений производится с организацией внешнего цикла для перебора строк и внутреннего цикла для перебора столбцов матрицы (табл. П 1.13), на схеме для упрощения это показано в одном символе. Символ 11. Конец алгоритма. Программа Program Prog1_17; Var K : Real; A, B : Array[1..10, 1..10] of Real; I, J : Byte; Begin {начало раздела операторов программы} K := 0.3 ; {пороговое значение} {формирование матриц А и B } for I := 1 to 10 do begin {начало цикла 1 - для перебора строк матрицы А} for J := 1 to 10 do begin {начало цикла 2 - для перебора столбцов матрицы А} A[I, J] := sin(I + J); вычисление элемента A[I, J]} If Abs(A[I, J]) > K then B[I, J] := 1 else B[I, J] := 0; Write(A[I, J]:4:1, ' '); {вывод элемента A[I, J]} end; {конец цикла 2} 60 Writeln; {переход на след. строку} end; {конец цикла 1} {вывод матрицы B} for I := 1 to 10 do begin {начало цикла 3 - для перебора строк матрицы А} for J := 1 to 10 do Write(B[I, J]:4:0, ' '); Writeln; {переход на след. строку} end; {конец цикла 3} End. {конец программы} Результат работы программы Исходная матрица 0.9 0.1 -0.8 -1.0 -0.3 0.7 1.0 0.4 -0.5 -1.0 0.1 -0.8 -1.0 -0.3 0.7 1.0 0.4 -0.5 -1.0 -0.5 -0.8 -1.0 -0.3 0.7 1.0 0.4 -0.5 -1.0 -0.5 0.4 -1.0 -0.3 0.7 1.0 0.4 -0.5 -1.0 -0.5 0.4 1.0 -0.3 0.7 1.0 0.4 -0.5 -1.0 -0.5 0.4 1.0 0.7 0.7 1.0 0.4 -0.5 -1.0 -0.5 0.4 1.0 0.7 -0.3 1.0 0.4 -0.5 -1.0 -0.5 0.4 1.0 0.7 -0.3 -1.0 0.4 -0.5 -1.0 -0.5 0.4 1.0 0.7 -0.3 -1.0 -0.8 -0.5 -1.0 -0.5 0.4 1.0 0.7 -0.3 -1.0 -0.8 0.1 -1.0 -0.5 0.4 1.0 0.7 -0.3 -1.0 -0.8 0.1 0.9 Полученная булева матрица 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 61 2. ЗАДАЧИ ПОВЫШЕННОЙ СЛОЖНОСТИ ПО СОСТАВЛЕНИЮ АЛГОРИТМОВ И ПРОГРАММ 2.1. Задачи с элементами теории множеств Задача 2.1. Разработать схему алгоритма и программу для опре- деления количества точек (x, y), удовлетворяющих системе нера- венств . ;2,15 ;5,4143 yxxy yx yx Все используемые точки (x, y) должны удовлетворять множе- ству, определяемому по правилам x = 1; 20 (0,1), y = 0; 10 (0,2). Чис- ло комбинаций точек вывести на экран. Решение задачи При решении задачи следует использовать табуляцию функции (п. 1.4). Схема алгоритма решения задачи представлена на рис. 2.1. Обозначение схемы алгоритма Count – число точек, удовлетворяющих системе неравенств. Программа Program Task2_1; Var X, Y : Real; Count : Integer; Begin {начало раздела операторов программы} Count := 0; X:=1; {начальные значения переменных Count, X} While X <= 20 do Begin {начало цикла 1 - для перебора значений Х} Y:=0; {начальное значение переменной Y} While Y <= 10 do Begin {начало цикла 2 - для перебора значений Y} {если X, Y удовлетворяют условию, Count увеличивается на 1} If (3*X+4*Y < 41.5) and (5*X-Y > 1.2) and (X*Y > X+Y) 62 Then Count:=Count + 1; Y:= Y + 0.2; {приращение переменной Y} end; {конец цикла 2} X:= X + 0.1; {приращение переменной X} end; {конец цикла 1} {вывод результата на экран} Writeln('Число комбинаций точек (x, y) равно ', Count); Readln; {ожидание нажатия клавиши Enter} End. {конец программы} 10 11 9 Начало Count=0 X=1 Y=0 Условие верно? Count= =Count+1 Y=Y+0.2 X=X+0.1 Конец 1 2 3 4 5 6 7 8 X<20 Y<10 да нет да нет нет да Вывод Count 3x+4y<41.5 5x-y>1.2 xy>x+y Рис. 2.1 63 Результат работы программы Число комбинаций точек (x, y) равно 2108 Задача 2.2. Разработать схему алгоритма и программу вычисле- ния и вывода на экран общего количества точек (x, y) Q, принад- лежащих одновременно двум окружностям, заданным системой не- равенств .)()( ;)()( 2 2 2 2 2 2 2 1 2 1 2 1 Rbyax Rbyax Q Аргументы х и y изменяются по законам x = 0; 200 (0,1), y = 0; 300 (0,2). С клавиатуры вводятся координаты центров кругов (a1, b1) и (a2, b2) и значения радиусов R1, R2. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.2. Обозначение схемы алгоритма Count – количество точек (x, y), принадлежащих первому и вто- рому кругу. Программа Program Task2_2; Uses Crt; R 1 R 2 (a 1 ; b 1 ) (a2; b2) Q 64 Var a1, a2, b1, b2, R1, R2, x, y : Real; Count : Word; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} {ввод данных} Write('Введите координаты центров кругов a1,a2,b1,b2: '); Readln(a1, a2, b1, b2); Write('Введите радиусы кругов R1, R2: '); Readln(R1, R2); {расчет} x:= 0; Count:= 0; {первоначальные значения переменных х, Count} While x <= 200 do Begin {начало цикла 1 – для перебора значений х} y:= 0; {первоначальное значение y} While y <= 300 do Begin {начало цикла 2 – для перебора значений y} {проверка условия принадлежности точки (x, y) кругам} If ((x-a1)*(x-a1) + (y-b1)*(y-b1) <= R1*R1) and ((x-a2)*(x-a2) + (y-b2)*(y-b2) <= R2*R2) Then Count:=Count+1; y:= y + 0.2; {приращение переменой y} end; {конец цикла 2} x:= x + 0.1; {приращение переменой x} end; {конец цикла 1} {вывод результата на экран} Write('Число точек, принадлежащих двум кругам = ', Count); Readln; {ожидание нажатия клавиши Enter} End. {конец программы} Результат работы программы Введите координаты центров кругов a1, a2, b1, b2: 1 2 3 4 Введите радиусы кругов R1, R2: 10 20 Число точек, принадлежащих двум кругам = 6130 65 12 11 10 9 8 2 3 1 4 5 6 Начало Ввод a1, a2, b1, b2, R1, R2 x<200 y=0 y<300 y=y+0.2 Конец x=0 Count=0 x=x+0.1 7 Count= =Count+1 да да нет нет да нет Вывод Count Q)y,x( (x-a1)2+(y-b1)2= 0 Then Z := Ln(X+Y)/Ln(3) + Sqrt(X-Y) Else Z := Cos(X+Y); {если условие выполняется, то вывод в файл} If (Z > 10) and (X > 31*Sqrt(Y)) Then Writeln(f, 'X = ',X,' Y = ',Y,' Z = ',Z:6:2); Y := Y + 2; {приращение переменной Y} End; {конец цикла 2} 72 End; {конец цикла 1} Close(f); {закрытие файла а.а} End. {конец программы} 10 7 11 12 14 Начало A X=1,200 Конец 1 2 3 X-Y>0 Z=cos(X+Y) A 4 5 6 8 9 Y=40 Y<100 Y=Y+2 Создание файла a.a да нет данет да нет YX Y)(Xlog Z 3 Вывод в файл a.a X, Y, Z Y31X и 10Z Закрытие файла a.a 13 Рис. 2.4 73 Обозначение схемы алгоритма X[I] – xi элемент массива X. Результат работы программы Файл а.а содержит: X = 197 Y = 40 Z = 17.51 X = 198 Y = 40 Z = 17.55 X = 199 Y = 40 Z = 17.59 X = 200 Y = 40 Z = 17.64 Задача 2.5. Разработать схему алгоритма и программу вычисле- ния значения функции 3)5sin(lg xy для x = 40,1; 50,2; 70,8, нахо- дящихся в файле а.а. Вывести на экран значения х и y. Если функ- ция y не имеет значения в силу области определения х, вывести со- общение «Значение y не определено». Решение задачи Схема алгоритма решения задачи представлена на рис. 2.5. Программа Program Task2_5; Var I : Integer; F : Text; X : Array [1..3] of Real; Y : Real; Begin {начало раздела операторов программы} Assign(F, 'a.a'); Reset(F); {открытие файла a.a} for I:=1 to 3 do Begin {начало цикла} Read(F, X[I]); {чтение значения X[I] из файла} If Sin(5*X[I])>0 Then {если Х принадлежит области определения} Begin Y := Sin(5*X[I])*Sin(5*X[I])*Sin(5*X[I]); Y:=Ln(Y)/Ln(10); {вычисление Y} Writeln('При X = ',X[I]:3:1,' Y = ',Y:5:2);{вывод Y на экран} End Else Writeln('При X = ',X[I]:3:1,' значение Y не определено'); 74 End; {конец цикла 1} Close(F); {закрытие файла a.a} Readln; {ожидание нажатия клавиши Enter} End. {конец программы} Результат работы программы При X = 40.1 значение Y не определено При X = 50.2 значение Y не определено При X = 70.8 Y = -0.22 2.3. Задачи с использованием массивов различной размерности Задача 2.6. Разработать схему алгоритма и программу вычисления выражения S = max{ai} + min{aj}, где i = 2, 4, 6, …, 100 – четные ин- дексы элементов массива А, j = 1, 3, 5, …, 99 – нечетные индексы элементов массива А. Элементы массива А формируется по закону ak = cos(k 2 + 2k + 30). Результат вычисления вывести на экран. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.6. Обозначения схемы алгоритма A[K] – ak элемент массива А; Max – значение максимального элемента среди четных элемен- тов массива A; Min – значение минимального элемента среди нечетных элемен- тов массива A. 75 10 9 11 7 8 4 Начало A I=1,3 1 2 sin(5X[I]) >0 Ввод из файла a.a X[I] 5 A Конец 3 6 Y= lg(sin5X[I])3 Открытие файла а.а данет Вывод X[I], Y Вывод Х[I] «...» Закрытие файла а.а Вывод сообщения «Значение Y не определено» Рис. 2.5 76 2 3 4 1 5 10 6 7 8 9 6 Начало A K=1,100 К нечетно? Конец A да нет S= Max+Min Max< A[K] Max=A[K] Min> A[K] Min=… Max=... Min=A[K] Вывод S 11 12 A[K]=cos(K2 +2·K+30) 13 дада нетнет Min=cos(12+1·2+30) Max = cos(22+2·2+30) Рис. 2.6 Программа Program Task2_6; Uses Crt; Var Min, Max, S : Real; K : Integer; A : Array[1..100] of Real; 77 Begin {начало раздела операторов программы} ClrScr; {очистка экрана} Min:=cos(1+2+30); {начальное значение переменной минимума} Max:=cos(2*2+2*2+30);{начальное значение переменной максимума} for K := 1 to 100 do begin {начало цикла} A[K]:=cos(K*K + 2*K + 30); {вычисление элемента A[K]} If odd(K) Then {проверка на нечетность} If Min>A[K] then Min:=A[K] {если нечетный элемент} Else If Max=2) and (I<=6) and (J>=2) and (J<=5)) or {проверка условия 2} ((I>=5) and (I<=7) and (J>=7) and (J<=8)) or {проверка условия 3} ((I>=1) and (I<=2) and (J>=8) and (J<=10)) then begin {если A[I,J] находится в заштрихов. области} K := K + 1; {число элементов массива B увел. на 1} B[K] := A[I, J]; Write(B[K], ' '); {вывод элемента B[K] на экран} end; end; {конец циклов 1,2} MinArr(B, K, Min); {вызов процедуры MinArr} Writeln; Writeln('Минимальный элемент = ',Min); {вывод на экран} Readln; {ожидание нажатия клавиши Enter} End. {конец основной программы} Обозначения схемы алгоритма A[I, J] – аij элемент матрицы А; B[K] – bk элемент одномерного массива B, который формируется из элементов заштрихованных областей матрицы А; K – счетчик элементов массива B; MinArr(B, K, Min) – процедура определения минимального эле- мента одномерного массива B, состоящего из K элементов, резуль- тат процедуры заносится в переменную Min. Результат работы программы Значения элементов массива заштрихованной области: 161 371 425 474 70 840 59 367 773 327 843 717 306 162 149 873 287 771 143 500 21 592 773 650 205 680 592 954 997 243 952 684. Минимальный элемент = 21 82 13 2 3 4 1 5 7 Начало B J=1,10 A 12 A[I, J]= ... A I=1,7 принадл. области? Проверка принадлежности индексов I и J области 1 или области 2 или области 3K=K+1 B[K]=A[I, J] Задание элементу массива A[I, J] случайного числа B Конец MinArr(B, K, Min) да нет 9 K=0 Вывод Min 6 11 Вывод B[K] 8 10 Рис. 2.8 83 Задача 2.9. Разработать схему алгоритма и программу для вы- числения элементов матрицы А размером 40 50, которые опреде- ляются как . ,остальных для )(lg 30; и 30 если ),cos( ;10 и 10 если ),sin( 2 jiji jiji jiij aij Найти сумму элементов матрицы, удовлетворяющих условию . );1ln(sincos 3 22 ijij ijij aa aa Значение суммы вывести на экран. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.9. Программа Program Task2_9; Var A : Array[1..40, 1..50] of Real; I, J : Integer; S, R1, R2 : Real; Begin {начало раздела операторов программы} S:= 0; {обнуление переменной суммы S} for I:=1 to 40 do {цикл 1–для перебора строк матрицы А} for J:=1 to 50 do {цикл 2–для перебора столбцов матрицы А} begin {начало циклов 1, 2} {вычисление элементов матрицы А} If (I<=10) and (J<=10) Then A[I, J]:= Sin(I*J) Else If (I>=30) and (J>=30) Then A[I, J]:= Cos(I+J) Else A[I, J]:= Ln(I+J)*Ln(I+J)/(Ln(10)*Ln(10)); R1:=Cos(A[I,J])*Cos(A[I, J]) - Ln(Sin(A[I,J]*Sin(A[I,J])+1)); R2:=A[I, J]-A[I, J]*A[I, J]*A[I, J]; {если условие выполняется, то элемент суммируется} 84 If (R1>0) and (R2>0) Then S:= S + A[I, J]; End; {конец циклов 1, 2} Writeln('Сумма элементов матрицы = ',S:7:3);{вывод суммы на экран} Readln; {ожидание нажатия клавиши Enter} End. {конец программы} Обозначения схемы алгоритма A[I, J] – aij элементы матрицы А; S – значение суммы элементов матрицы aij, удовлетворяющих заданному условию; R1, R2 – значения, необходимые для проверки заданного условия. 3 8 Начало A[I,J]= Sin(IJ) A I=1,40 I<10 и J<10 I>30 и J>30 A[I,J]= Cos(I+J) B J=1,50 1 2 4 5 67 9 данет данет A[I,J]= lg2(I+J) S=0 1 16 13 11 15 14 12 R1>0 и R2>0 B S=S+A[I,J] Конец A 10 R1=… R2=... 3 2 2 J]A[I,J]A[I,R2 1)J]A[I,ln(sin J]A[I,cosR1 Вывод S да нет 1 Рис. 2.9 85 Результат работы программы Сумма элементов матрицы = 52.590 Задача 2.10. Разработать схему алгоритма и программу вычис- ления элементов матрицы А размером 10 8. Элементы матрицы формируются по закону . и остальных для )20(sin ;41 ,51 если , 1 1 2 jin jin a j n i n ij Вывести значения матрицы на экран построчно. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.10. Программа Program Task2_10; Uses Crt; Var I, J, N : Byte; A : Array [1..20, 1..30] of Real; S, P : Real; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} {формирование матрицы А} for I:=1 to 10 do {цикл 1 – для перебора строк матрицы А} for J:=1 to 8 do {цикл 2 - для перебора столбцов матрицы А} If (I>=1) and (I<=5) and (J>=1) and (J<=4) Then Begin {начало блока 1 - расчет произведения} P:=1; {первоначальное значение произведения} for N := 1 to I do P := P * N*N; A[I, J]:= P; End Else {конец блока 1} Begin {начало блока 2-расчет суммы} S:=0; {первоначальное значение суммы} 86 for N := 1 to J do S := S + Sin(20+N); A[I, J]:=S; End; {конец блока 2, конец циклов 2, 1} {вывод матрицы на экран} for I:=1 to 10 do Begin {начало цикла 3} for J:=1 to 8 do Write(A[I, J]:8:1); {вывод строки матрицы А} Writeln; {переход на следующую строку} End; {конец цикла 3} Repeat Until KeyPressed;{ожидание нажатия любой клавиши} End. {конец программы} Результат работы программы 1.0 1.0 1.0 1.0 -1.1 -0.3 0.7 0.9 4.0 4.0 4.0 4.0 -1.1 -0.3 0.7 0.9 36.0 36.0 36.0 36.0 -1.1 -0.3 0.7 0.9 576.0 576.0 576.0 576.0 -1.1 -0.3 0.7 0.9 14400.0 14400.0 14400.0 14400.0 -1.1 -0.3 0.7 0.9 0.8 0.8 -0.0 -0.9 -1.1 -0.3 0.7 0.9 0.8 0.8 -0.0 -0.9 -1.1 -0.3 0.7 0.9 0.8 0.8 -0.0 -0.9 -1.1 -0.3 0.7 0.9 0.8 0.8 -0.0 -0.9 -1.1 -0.3 0.7 0.9 0.8 0.8 -0.0 -0.9 -1.1 -0.3 0.7 0.9 Обозначения схемы алгоритма A[I, J] – aij элементы матрицы А; S – значение суммы выражения j n n 1 )20(sin ; P – значение произведения i n n 1 2 . 87 Конец 18 Начало B J=1,8 1 Sin(A[I]) Then Else Begin {начало блока 1–если A[I] удовлетв. условию} K:= K + 1; {увеличение индекса K на 1} B[K]:= A[I]; {A[I] заносится в массив B} Write(B[K]:10:2, ‘ ’); {вывод элемента B[I] на экран} {после 5-го элемента- переход на след. строку} If K mod 5 = 0 Then Writeln; End; {конец блока 1} End; {конец цикла 1} Writeln; Writeln('Число элементов = ',K); {вывод числа элементов} Repeat Until KeyPressed; {ожидание нажатия любой клавиши} End. {конец программы} 89 10 нет 6 7 Начало A 1 3 4 A I=1,200 2 A[I]2> sin(A[I]) K=K+1 B[K]=A[I] K=0 A[I]=cos(I) 5 данет Вывод B[K] Формирование массива B Вывод массива B на экран Условие верно? Если остаток K при делении на 5 равен 0 Переход на след. строку 8да 11 12 21 Конец Вывод K 9 Рис. 2.11 90 Обозначения схемы алгоритма A[I] – ai элемент массива А; B[K] – bk элемент массива B; K – счетчик элементов массива B. Результат работы программы 0.54 0.28 0.75 0.00 0.84 0.14 0.66 0.41 0.42 0.65 0.15 0.83 0.77 0.27 0.56 0.53 0.30 0.74 0.02 0.85 0.12 0.67 0.39 0.44 0.63 0.17 0.82 0.78 0.25 0.57 0.51 0.32 0.73 0.04 0.86 0.10 0.69 0.38 0.46 0.62 0.19 0.81 0.79 0.23 0.58 0.49 0.33 0.72 0.06 0.87 0.08 0.70 0.36 0.47 0.61 0.21 0.80 0.80 0.22 0.60 0.48 0.35 0.71 0.08 0.88 0.07 0.71 0.34 0.49 Число элементов = 69 Задача 2.12. Разработать схему алгоритма и программу форми- рования файлов a.lst, b.lst, в которые записываются матрицы A, B, полученные по следующим правилам: b.lst. файл в записать 4 ;1 ,5 ;1 где ,cossin3 a.lst; файл в записать 2 ;1 ,3 ;1 где ),·(ln)·(cos 22 jijib jijijia ij ij Все положительные элементы массивов A, B записать в файл с.lst. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.12. 91 10 8 9 Начало B 1 3 4 5 A I=1,3 6 2 Создание файлов a.lst,b.lst, c.lst B J=1,2 A[I,J]>0 A 7 1 данет Вывод в файл a.lst A[I,J] Вывод в файл с.lst A[I,J] A[I,J]=cos2 (IJ)ln2(IJ) 20 19 16 18 17 15 14 13 12 11 D C I=1,5 D J=1,4 B[I,J]>0 C cosJ3sinI J]B[I, 1 данет Вывод в файл b.lst B[I,J] Вывод в файл с.lst B[I,J] Закрытие файлов Конец Рис. 2.12 92 Обозначения схемы алгоритма A[I, J] – aij элемент матрицы А; B[I, J] – bij элемент матрицы B. Программа Program Task2_12; Uses Crt; Var F1, F2, F3 : Text; I, J : Integer; A : Array [1..3, 1..2] of Real; B : Array [1..5, 1..4] of Real; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} {создание и открытие файлов} Assign(F1,'a.lst');Assign(F2,'b.lst');Assign(F3,'c.lst'); Rewrite(F1); Rewrite(F2); Rewrite(F3); {формирование матрицы A} for I:=1 to 3 do Begin {начало цикла 1} for J:=1 to 2 do Begin {начало цикла 2} {вычисление A[I,J]} A[I, J] := Cos(I*J)*Cos(I*J) * Ln(I*J)*Ln(I*J); {запись элемента A[I, J] в файл a.lst} Write(F1, A[I, J]:7:3, ' '); {запись положит. элемента А[I, J] в файл c.lst} If A[I, J] > 0 Then Write(F3, A[I, J]:7:3, ' '); end; {конец цикла 2} Writeln(F1); {переход на след. строку в файле a.lst} end; {конец цикла 1} {формирование матрицы B} for I:=1 to 5 do Begin {начало цикла 3} for J:=1 to 4 do Begin {начало цикла 4} B[I, J]:= 3*Sin(I)*Cos(J); {вычисление B[I, J]} {запись элемента B[I, J] в файл b.lst} Write(F2, B[I, J]:7:3, ' '); {запись положит. элемента B[I, J] в файл c.lst} If B[I, J] > 0 Then Write(F3, B[I, J]:7:3, ' '); end; {конец цикла 4} Writeln(F2); {переход на след. строку в файле b.lst} 93 end; {конец цикла 3} Close(F1); Close(F2); Close(F3);{закрытие файлов} End. {конец программы} Результат работы программы Файл а.lst: Файл b.lst: 0.000 0.083 0.083 0.821 1.183 2.960 1.364 -1.051 -2.499 -1.650 1.474 -1.135 -2.701 -1.783 0.229 -0.176 -0.419 -0.277 -1.227 0.945 2.248 1.484 -1.554 1.197 2.848 1.880 Файл с.lst: 0.083 0.083 0.821 1.183 2.960 1.364 1.474 0.229 0.945 2.248 1.484 1.197 2.848 1.880 Задача 2.13. Пусть дано неупорядоченное множество А с числом элементов множества 10 000, сгенерированное случайным образом. Значение каждого элемента является целым числом в диапазоне от 0 до 10 включительно. Разработать схему алгоритма определения числа упорядоченных подмножеств В = {2, 5}, которые включены в неупорядоченное множество А. Пояснения к задаче В приведенном множестве А А = {2, 4, 5, 4, 3, 4, 6, 7, 1, 2, 5, 1, 9, 4, 2, 1, 2, 5, 3, 1, 2, 2, 7, 2, 5} последовательность {2, 5} встречается три раза. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.13. 94 11 да нет Начало A I=1,10 000 A[I]=2 и A[I+1]=5 B Конец A[I]=... A B I=1,9 999 K=K+1 Вывод K K=0 Задание для элемента массива А случайного значения от 0 до 10 Формирование массива А Поиск последовательности {2, 5} в массиве А 1 3 2 4 5 6 7 8 9 10 Рис. 2.13 95 Обозначения схемы алгоритма A[I], A[I+1] – ai, ai+1 элементы массива А; K – число подмножеств B = {2, 5}. Программа Program Task2_13; Var A : Array [1..10000] of Byte; I, K : Integer; Begin {начало раздела операторов программы} for I :=1 to 10000 do A[I]:=Random(10); {формирование массива А} K := 0; for I :=1 to 9999 do {цикл - для перебора элементов массива А} {проверка является ли последовательность (I,I+1) заданной (2,5)} If (A[I] = 2) and (A[I + 1] = 5) then K := K + 1; Writeln('Число последовательностей = ',K); {вывод результата} End. {конец программы} Результат работы программы Число последовательностей = 92. 2.4. Задачи по вычислению функциональных выражений с использованием сложных сумм и произведений Задача 2.14. Построить схему алгоритма и программу вычисле- ния и вывода на экран значения суммы 10 1 20 1 30 1i j k kjieS . Решение задачи Схема алгоритма решения задачи представлена на рис. 2.14. Программа Program Task2_14; Var I, J, K : Byte; S : Real; 96 Begin {начало раздела операторов программы} S:= 0; {обнуление переменной суммы S} for I:=1 to 10 do for J:=1 to 20 do for K:=1 to 30 do S := S + Exp(-I-J-K); Writeln('Сумма = ', S:6:3); {вывод суммы на экран} Readln; {ожидание нажатия клавиши Enter} End. {конец программы} Результат работы программы Сумма = 0.197 11 10 8 1 Начало S=0 A I=1,10 B J=1, 20 C K=1, 30 S=S+e-I-J-K C B A Конец 2 3 4 5 6 7 9 Вывод S Рис. 2.14 Задача 2.15. Разработать схему алгоритма и программу вычис- ления сумм для каждого элемента массива X = {4,1; 5,3; 6,1; 7,2; 10,1} по формуле S(xi) = log2(3xi + 1) + log3(4xi + 1) + log4(5xi + 1) + + …+ log101(102xi + 1). Вывести значения сумм на экран. 97 Решение задачи Схема алгоритма решения задачи представлена на рис. 2.15. Программа Program Task2_15; Var I, J : Byte; X : Array[1..5] of Real; S : Real; Begin {начало раздела операторов программы} Write('Введите 5 значений: '); for I:=1 to 5 do Read(X[I]); {ввод значений массива X} for I:=1 to 5 do Begin {начало цикла 1 - для перебора значений массива Х} S:=0; {первоначальное значение переменной суммы S} {суммирование} For J:=2 to 101 do S := S + Ln((J+1)*X[I]+1)/Ln(J); Writeln('X= ',X[I]:5:1,' S= ',S:7:2);{вывод результатов на экран} End; {конец цикла 1} Readln; {ожидание нажатия клавиши Enter} End. {конец программы} Результат работы программы Введите 5 значений: 4.1 5.3 6.1 7.2 10.1 X= 4.1 S= 145.16 X= 5.3 S= 152.81 X= 6.1 S= 157.01 X= 7.2 S= 161.98 X= 10.1 S= 172.13 Обозначение схемы алгоритма X[I] – xi элемент массива X. Обозначения схемы алгоритма S1, S2 – значения предыдущего (Sn) и следующего (Sn+1) элемен- тов ряда; Sum – значение суммы членов ряда. 98 4 Начало A I=1,5 A Ввод X[I] 2 3 1 10 12 11 B I=1, 5 C J=2, 101 C S=0 B Конец S=S+ logj((J+1)X[I]+ 1) 5 6 7 8 9 Вывод X[I], S Формирование массива Х Вычисление суммы S при заданном X[I] Рис. 2.15 99 Задача 2.16. Разработать схему алгоритма и программу вычис- ления суммы членов ряда 1 )ln(sin 5,1 x x x S . Ограничиться числом членов ряда, для которых выполняется условие: разница между со- седними членами ряда меньше 0,001. Если sin x 0, то положить 5sinln xx . Значение суммы ряда вывести на экран. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.16. Программа Program Task2_16; Uses Crt; Var X : Integer; Sum, S1, S2 : Real; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} X:= 1; {начальное значение переменной Х} S2 := –1.5/(Ln(Sin(X))); Sum:= S2; Repeat {начало цикла 1} S1 := S2; {предыдущий элемент ряда S1} X := X + 1; {приращение переменной Х} {вычисление следующего элемента ряда S2} If Sin(X) > 0 Then S2 := – Exp(X*Ln(1.5))/Ln(Sin(X)) Else S2 := – Exp(X*Ln(1.5))/Exp(5*Ln(X)); Sum:= Sum + S2; {подсчет суммы ряда} Until Abs(S1 - S2) < 0.001; {конец цикла 1} Write('Сумма ряда = ',Sum:6:2); {вывод результата на экран} Repeat Until KeyPressed; {ожидание нажатия любой клавиши} End. {конец программы} 100 Результат работы программы Сумма ряда = 34.07 10 5 3 7 9 6 Начало SinX>0 Sum=Sum+ +S2 |S1-S2| <0.001 S1=S2 X=X+1 X=1 S2=… Sum=S2 Конец ln(sinX) 1.5- S2 X 1 2 4 8 5X 5.1 S2 X данет данет Вывод Sum ln(sinX) -1.5 S2 Рис. 2.16 Задача 2.17. Разработать схему алгоритма и программу решения квадратного уравнения ax2 + bx + c = 0 с параметрами a, b, c, кото- рые вычисляются по формулам: ; RR a Rn n 20 1 5,1sin 1 ;sin 30 1 50/ n R neb |;|ln||ln· babac R = 10, 100 (5). В случае, если есть решение (D = b2 – 4a·c > 0), вывести на экран корни урав- 101 нения и значение R, если решения нет, то вывести сообщение «Дей- ствительных корней нет» и значения R, a, b, c. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.17. Программа Program Task2_17; Var A, B, C, X1, X2, D : Real; N, R : Integer; Begin {начало раздела операторов программы} R := 10; {начальное значение параметра цикла 1} While R <= 100 do Begin {начало цикла 1} {вычисление параметра А} A := 1/(Sin(R)+1.5); for N := R to 20 do A := A - 1/Exp(N*Ln(R)); {вычисление параметра B} B := 1; for N := 1 to 30 do B := B*Sin(N); B := Exp(R/50) + B; C := A*B + Ln(Abs(A)) * Ln(Abs(B));{вычисление параметра С} D := B*B - 4*A*C; {вычисление дискриминанта} If D >= 0 Then {начало блока 1 - вычисление корней} Begin X1 := (-B + Sqrt(D))/(2*A); X2:= (-B - Sqrt(D))/(2*A); {вывод значений корней на экран} Writeln(' R= ',R:3,' X1 = ',X1:5:2,' X2 = ', X2:5:2); end {конец блока 1} Else Writeln(' R= ', R:3, ' Действительных корней нет. A= ', A:5:2, ' B= ', B:5:2, ' C= ', C:5:2); R := R + 5; {приращение параметра цикла 1} end; {конец цикла 1} Readln; {ожидание нажатия клавиши Enter} end. {конец программы} Обозначения схемы алгоритма X1, X2 – корни квадратного уравнения. 102 10 11 17 14 15 12 B=1 B N=1,30 B D>0 R=R+5 sinNBB B=… C=… D=... 4ACBD BlnAlnBAC BeB 2 R/50 X1=… X2=... )/2ADB(X2 )/2ADB(X1 8 9 13 16 3 2 1 Начало R=10 A=1/ (SinR+1.5) A N=R, 20 A Конец 4 5 6 7 R<100 NR 1 -AA 18 Вывод «...» Вывод R, X1, X2 да да нет нет Вычисление параметра А Вычисление параметра B «Действительных корней нет» R, A, B, C Решение квадратного уравнения Рис. 2.17 103 Результат работы программы R= 10 Действительных корней нет. A= 1.05 B= 1.22 C= 1.29 R= 15 X1 = -0.33 X2 = -2.57 R= 20 X1 = -0.19 X2 = -3.41 R= 25 Действительных корней нет. A= 0.73 B= 1.65 C= 1.05 R= 30 Действительных корней нет. A= 1.95 B= 1.82 C= 3.96 R= 35 Действительных корней нет. A= 0.93 B= 2.01 C= 1.83 R= 40 X1 = -0.16 X2 = -4.84 R= 45 X1 = -0.11 X2 = -5.67 R= 50 X1 = -1.07 X2 = -2.29 R= 55 Действительных корней нет. A= 2.00 B= 3.00 C= 6.77 R= 60 X1 = -1.05 X2 = -2.92 R= 65 X1 = -0.13 X2 = -8.41 R= 70 X1 = -0.16 X2 = -9.06 R= 75 X1 = -1.11 X2 = -3.87 R= 80 Действительных корней нет. A= 1.98 B= 4.95 C= 10.88 R= 85 X1 = -0.74 X2 = -6.50 R= 90 X1 = -0.16 X2 = -14.32 R= 95 X1 = -0.24 X2 = -14.36 R= 100 X1 = -1.21 X2 = -6.14 2.5. Задача по вычислению функции, заданной в интервале Задача 2.18. Разработать схему алгоритма и программу для вы- числения интервальной функции z для десяти значений xi, заданных массивом, которые вводятся с клавиатуры: ,11 ,)cossin ,310 5/3 2 a ii ii i xx (axx bx z если если если ,300 ;300100 ;100 i i i x x x где a и b – параметры, рассчитываемые как 30 1 )3cos( j ja , 100 1 ... 3 1 2 1 1b . На экран выводить значения интервальной функции z для каж- дого xi. 104 Решение задачи Схема алгоритма решения задачи представлена на рис. 2.18. Программа Program Task2_18; Uses Crt; Var X : Array[1..10] of Real; z, a, b : Real; I : Integer; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} Write('Введите массив из 10 чисел: '); for I:=1 to 10 do Read(X[I]); {ввод значений массива Х} a:=0; b:=1; for I:=1 to 30 do a := a + Cos(I+3);{вычисление параметра a} for I:=2 to 100 do b := b + 1/i; {вычисление параметра b} {для X[I] вычисление значения функции Z} for I := 1 to 10 do Begin {начало цикла} If X[I] < 100 Then Z:= 10*X[I]*X[I] + 3*b Else If X[I]>300 Then Z := 11*X[I]+Exp(a*Ln(X[I])) Else Z:= Sin(Exp(3/5*Ln(X[I]))*Cos(a*X[I])); Writeln('Z', I,'=', Z:10:3);{вывод на экран результатов} end; {конец цикла} Repeat Until KeyPressed;{ожидание нажатия любой клавиши} End. {конец программы} Результат работы программы Введите массив из 10 чисел: 1 150 250 350 10000 -235 0.02 -0.005 789 10 Z1= 25.562 Z2= 0.811 Z3= -0.973 Z4= 5596.076 Z5=235154.762 Z6=552265.562 Z7= 15.566 Z8= 15.562 Z9= 13598.539 Z10= 1015.562 105 Обозначение схемы алгоритма X[I] – xi элемент массива X. 7 8 Начало B 1 3 4 5 Ввод X[I] B I=1,30 6 2 a=a+ +cos(I+3) a=0 b=1 A I=1,10 A 9 C C I=2,100 b=b+1/I 10 11 Ввод массива Х Вычисление параметра a Вычисление параметра b 1 20 18 13 16 17 14 X[I]<100 Конец X[I]>300 12 D I=1,10 D 15 Z=11X[I]+ +X[I]a да да нет нет Вывод Z, I 19 1 Вычисление и вывод Z Z=10X[I]2+ +3b Z=sin(X[I]3/5 ·cos(aX[I])) Рис. 2.18 2.6. Задачи по нахождению суммы конечного и бесконечного функциональных рядов Задача 2.19. Разработать схему алгоритма и программу вычис- ления ряда x...xxxxS 1953 sin20sin6sin4sin2)( , если 106 переменная x может изменяться по закону x = 1; 3 (0,5). Вывести на экран значения сумм S для каждого значения x. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.19. Программа Program Task2_19; Uses Crt; Var J : Byte; P, S, X : Real; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} X:= 1; {начальное значение переменной Х} While X <= 3 do Begin {начало цикла 1 - для перебора значений Х} S:= 0; {начальное значение переменной суммы S} P := sin(X); for J := 1 to 10 do {цикл для суммирования членов ряда} Begin S := S + 2*J * P; {вычисление суммы} {вычисление произведения для элементов ряда} P := P * sin(X)*sin(X); End; Writeln('X = ',X:4:1,' S = ',S:6:2);{вывод результатов} X:= X + 0.5; {приращение переменной Х} end; {конец цикла 1} Repeat Until KeyPressed;{ожидание нажатия любой клавиши} End. {конец программы} Результат работы программы X = 1.0 S = 17.30 X = 1.5 S = 106.48 X = 2.0 S = 35.90 X = 2.5 S = 2.90 X = 3.0 S = 0.29 Обозначение схемы алгоритма 107 P – промежуточная переменная для вычисления значений эле- ментов ряда. 108 10 8 9 Начало A J=1,10 Конец 2 3 4 1 5 X=1 X < 3 S=0 P=sin(X) X=X+0.5 да нет Вывод X, S S=S+2J·P P=P·Sin2(X) A 6 7 Вычисление суммы десяти членов ряда Приращение переменной Х Вывод результатов Рис. 2.19 109 Задача 2.20. Разработать схему алгоритма и программу вычисления суммы членов ряда ) 1 )2(ln 1 ( 1 9 x xx S . Ограничиться числом чле- нов ряда, для которых выполняется условие Sn – Sn–1 < 0,01, где ) 1 )2(ln 1 ( 1 9 n x n xx S – сумма n членов ряда. Использовать функ- цию для вычисления члена ряда. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.20. Программа Program Task2_20; Var X : Integer; S1, S2, E : Real; {функция вычисления члена ряда} Function F(x :Integer) : Real; Begin {начало раздела операторов функции F} F:=1/Exp(9*Ln(x+2))+1/x; End; {конец функции F} Begin {начало раздела операторов основной программы} X:= 1; S2:= F(Х); {сумма, состоящая из 1-го члена ряда} Repeat {начало цикла} S1:= S2; {S1-сумма, состоящая из (X-1) членов ряда} X:= X + 1; {увеличение X на 1} S2:= S2 + F(X);{S2-сумма, состоящая из X членов ряда} E:= Abs(S2 - S1);{вычисление погрешности E} Until E < 0.01; {конец цикла-пока погрешность не станет < 0.01} Writeln('Сумма ряда = ', S2:5:3); {вывод результата на экран} Readln; {ожидание нажатия клавиши Enter} End. {конец основной программы} Результат работы программы Сумма ряда = 5.197 110 Обозначения схемы алгоритма S1 – значение суммы, состоящей из (X – 1) членов ряда; S2 – значение суммы, состоящей из X членов ряда; F(X) – вызов функции F для вычисления значения члена ряда в зависимости от значения Х; E – значение погрешности вычислений. 1 9 Начало S2=S2+ +F(X) E=|S2-S1| Конец 2 3 4 5 6 8 данет Вывод S2 E<0.01 S1=S2 X=X+1 7 Вычисление суммы, состоящей из первого члена ряда S2 - сумма X членов ряда Вычисление суммы членов ряда S2=F(X) X=1 S1 - сумма (X-1) членов ряда Вычисление погрешности Рис. 2.20 111 2.7. Задачи с использованием двойных сумм и произведений Задача 2.21. Разработать схему алгоритма и программу форми- рования матрицы A размером 20 20 по закону . если ,)sin(2 ; если ,)sin(2 1 1 1 1 i n j m i n j m ij jimn jimn a Пояснения: ; как так),12sin(2)11sin(2 )1sin(2)sin(2 2 1 2 1 1 1 21 ji nmna nn m 3 1 3 1 2 1 32 )2sin(2)1sin(2)sin(2 nn m nnmna ; как так ),23sin(2)13sin(2 )22sin(2)12sin(2)21sin(2)11sin(2 ji 2 1 2 1 3 1 23 )3sin(2)2sin(2)1sin(2)sin(2 nn m nnnmna .кактак ,)32sin(2)22sin(2)12sin(23)sin(12)21sin(2)11sin(2 ji Решение задачи Схема алгоритма решения задачи представлена на рис. 2.21. 112 Обозначения схемы алгоритма S – значение двойной суммы, вычисляемое по формуле i n j m m)(n 1 1 sin2 ; P – значение двойного произведения, вычисляемое по формуле i n j m mn 1 1 )sin(2 . 2 3 4 1 5 18 19 20 12 13 14 15 16 17 10 6 7 8 9 11 8 Начало S=0 P=1 A I=1,20 I>J B J=1,20 Конец C N=1,I D M=1,J D S=S+ +2sin(N+M) P=P· ·2sin(N+M) C E N=1,I F M=1,J F E A[I,J]=SA[I,J]=P B A данет Вычисление двойной суммы Вычисление двойного произведения Вычисление элемента А[I,J] Рис. 2.21 113 Программа Program Task2_21; Var A : Array[1..20, 1..20] of Real; I, J, N, M : Byte; S, P : Real; Begin {начало раздела операторов программы} for I := 1 to 20 do {цикл 1-для перебора строк матрицы А} for J := 1 to 20 do {цикл 2-для перебора столбцов матрицы А} Begin {начало циклов 1, 2} P:=1; S:=0; {начальные значения для произведения и суммы} If I > J Then Begin {начало блока 1, если I > J} {вычисление двойной суммы} for N := 1 to I do for M := 1 to J do S:= S + 2*Sin(N+M);{суммирование} A[I, J] := S; End Else {конец блока 1} Begin {начало блока 2, если I ≤ J } {вычисление двойного произведения} for N := 1 to I do for M := 1 to J do P := P * 2*Sin(N+M); A[I, J] := P; end; {конец блока 2} end; {конец цикла 2, 1} End. {конец программы} 2.8. Задача с использованием процедур и функций для двумерного массива Задача 2.22. Разработать схему алгоритма и программу форми- рования матрицы А размером 20 40, элементы которой формиру- ются по закону . если ,)()ln( ; если ,)(sin ; если ,1)(cos 30 11 10 1 4,3 jikji jikji jiji a k k ij 114 В программе создать процедуру, которая считает количество по- ложительных и отрицательных элементов. Результаты расчета вы- водятся на экран. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.22, а. Схема алгоритма процедуры подсчета положительных и отрица- тельных элементов Calc представлена на рис. 2.22, б. Программа Program Task2_22; Uses Crt; Type Mas = Array [1..20, 1..40] of Real; Var A : Mas; I, J, K, CP, CN : Integer; S,P : Real; {Процедура подсчета положительных (K1) и отрицательных (K2) элементов массива B} Procedure Calc(B :Mas; Var K1, K2 :Integer); Var I, J : Integer; Begin {начало раздела операторов процедуры Calc} K1 := 0; K2 := 0; for I := 1 to 20 do for J := 1 to 40 do If B[I, J] > 0 Then K1 := K1+1 {если B[I,J] положительный} {если B[I,J] отрицательный} Else If B[I, J] < 0 Then K2 := K2 + 1; end; {конец процедуры Calc} Begin {начало раздела операторов основной программы} ClrScr; {очистка экрана} for I:=1 to 20 do {цикл 1–для перебора строк матрицы А} for J:=1 to 40 do {цикл 2–для перебора столбцов матрицы А} Begin {начало цикла 1, 2} If I = J Then A[I, J] := Exp(3.4 * Ln(Abs(Cos(I+J)+1))) Else If I > J Then Begin {начало блока 1-суммирование} S := 0; for K := 11 to 30 do S := S + Ln(I+J)*(-K); 115 A[I, J] := S; End {конец блока 1} Else Begin {начало блока 2-произведение} P := 1; for K := 1 to 10 do P := P * Sin(I+J)*K; A[I, J] := P; end; {конец блока 2} end; {конец циклов 2, 1} Calc(A, CP, CN); {вызов процедуры Calc} {вывод результатов расчета на экран} Writeln('Положительных элементов в матрице = ',CP); Writeln('Отрицательных элементов в матрице = ',CN); Repeat Until KeyPressed;{ожидание нажатия любой клавиши} End. {конец основной программы} Результат работы программы Положительных элементов в матрице = 610 Отрицательных элементов в матрице = 190 Обозначения схемы алгоритма (рис. 2.22, а) A[I, J] – aij элемент матрицы A; S – значение суммы выражения 30 11 )()ln( k kji ; P – значение произведения 10 1k sin j)k(i ; CP, CN – число положительных и число отрицательных элемен- тов матрицы А. Обозначения схемы алгоритма процедуры Calc (см. рис. 2.22, б) B – массив, переданный в процедуру в качестве формального па- раметра; K1, K2 – число положительных и число отрицательных элемен- тов массива B. 116 15 17 18 19 10 11 21 Начало B 1 3 4 5 A I=1,20 7 2 B J=1,40 I=J A A[I,J]=|(cos (I+J)+1)|3.4 I>J C K=11,30 D K=1,10 S=0P=1 D Calc(A, CP, CN) Конец S=S+ln(I+ +J)·(-K) 12 13 14 16 20 8 9 A[I, J]=P C A[I, J]=S 6 данет данет Вывод CP, CN P=P·sin(I+ +J)·K Вычисление суммы Вычисление произведения Calc Начало K1=0 K2=0 A I=1, 20 B J=1,40 B[I,J]>0 Конец Calc K1=K1+1 B[I,J]<0 K2=K2+1 B A 1 2 3 4 5 6 7 8 9 10 11 да нет да нет а б Рис. 2.22 117 2.9. Задача с элементами линейного программирования Задача 2.23. Разработать схему алгоритма и программу для вы- числения максимального значения функции 32121 543 xxxxxF при дискретных значениях аргументов: x1 = 1; 100 (1), x2 = 10; 50 (0,4), x3 = 5; 30 (0,3). Область определения функции F задана огра- ничениями .26 ,5 ,354 3321 23121 1321 Qxxx Qxxxx Qxxx Значения ограничений Q1, Q2, Q3 вводятся с клавиатуры. Вычис- ление функции F оформить в виде подпрограммы (function). Вывести на экран максимум функции F и соответствующие ей значения пере- менных x1, x2, x3. Если при заданных ограничениях отсутствует об- ласть значений функции F, то вывести соответствующее сообщение. Решение задачи Схема алгоритма решения задачи представлена на рис. 2.23. Обозначения схемы алгоритма MaxF – максимальное значение функции F; ValF – значение функции F; X1Max, X2Max, X3Max – значения переменных x1, x2, x3, при ко- торых функция F принимает максимальное значение. 118 11 17 1918 21 12 13 14 10 2 3 4 1 5 6 7 8 9 15 16 Начало Ввод Q1,Q2 Q3 MaxF=0 X2=10 X3=5 Val1=… Val2=… Val3=... Условие верно? MaxF=ValF X3=X3+0.3 X2=X2+0.4 Конец X2<50 X3<30 MaxF< ValF X1Max=X1 X2Max=X2 X3Max=X3 MaxF>0 ValF=... 20 да нет да да нет да нет нет да Вывод «...» Вывод ... Val1=4X1+5X2-3X3 Val2=5X1-X2+X1·X3 Val3=-6X1-2X2·X3 Val10 Then {если возможен расчет значения функции} Begin Writeln('Максимальное значение функции F: ',MaxF:9:2); Writeln('при X1 = ',X1Max:3,' X2 = ',X2Max:4:1,' X3 = ',X3Max:4:1); end Else Writeln('При заданных ограничениях нет значений функции F.'); Repeat Until KeyPressed;{ожидание нажатия любой клавиши} End. {конец основной программы} Результат работы программы Введите значения ограничений Q1, Q2, Q3: 100 3 2.56 Максимальное значение функции F: 5651.80 при X1 = 1 X2 = 36.8 X3 = 29.9 Задача 2.24. Разработать схему алгоритма и программу для вы- числения интервальной функции: ,9,18если,)ln(ln ;9,1810,8если),(ln ;8,1010если)),(ln(cos ;101если,)2)(cos( 33 35 3/133/ xx xxax xxx xbxe z ax где 33 1 23 100 1 2 14; если ),(cos 14, если, 1 i i xi x i a )(sin3 ab . Значение x вводится с клавиатуры. Значение функции z выводит- ся на экран. При вычислении значения функции z необходимо учесть область определения функции. Если функция не определена, то вывести сообщение «Функция при заданном аргументе не опре- делена». 121 Решение задачи Схема алгоритма решения задачи представлена на рис. 2.24. 10 7 8 9 Начало х>14 A 1 3 4 5 Ввод х A I=1,100 B B I=1,33 6 2 а=0 a=a+ +cos3(I2) a=a+1/I2 данет b=sin3(a) 18 12 24 25 19 23 17 15 22 13 16 x>1 и x<10 Конец 21 x>10 и x<10.8 x>10.8 и x<18.9 и xa>0 z=ln[ln(x)] (xa)ln xz 3 3 z=x5+ +cos3(ln(x)) z=eax/3+ +(cos(x3b)+ +2)1/3 x>18.9 и ln(x)>0 да нет да нет да нет данет Вывод «Функция не опре- делена» Вывод z Вывод z Вывод z Вывод z 14 20 11 Вычисление параметра а Вычисление параметра b Вычисление функции z Рис. 2.24 122 Программа Program Task2_24; Uses Crt; Var a, b, x, z : Real; I : Integer; Begin {начало раздела операторов программы} ClrScr; {очистка экрана} Write('Введите число: '); Readln(x); {ввод х} {вычисление параметра а} a:= 0; If x >= 14 Then for I := 1 to 100 do a := a + 1/(I*I) Else for I := 1 to 33 do a:=a+Cos(I*I)*Cos(I*I)*Cos(I*I); b:= sin(a)*sin(a)*sin(a); {вычисление параметра b} {вычисление значения функции z} If (x>1) and (x<10) Then Begin {начало блока 1} z:= Exp(a*x/3) + Exp(1/3*Ln(Cos(x*x*x*b)+2));{вычисление z} Writeln('Значение функции равно ',z:10:3);{вывод z на экран} end {конец блока 1} Else If (x>=10) and (x<10.8) Then Begin {начало блока 2} z:=Exp(5*Ln(x))+cos(ln(x))*cos(ln(x))*cos(ln(x));{вычисление z} Writeln('Значение функции равно ',z:10:3); {вывод z} end {конец блока 2} Else If (x>=10.8) and (x<18.9) and (x*a>0) Then Begin {начало блока 3} {вычисление z} z:= Exp(1.5*Ln(x)) + Ln(x*a)*Ln(x*a)*Ln(x*a); Writeln('Значение функции равно ',z:10:3);{вывод z} end {конец блока 3} Else If (x>=18.9) and (Ln(x)>0) Then Begin {начало блока 4} z:= Ln(Ln(x)); {вычисление z} Writeln('Значение функции равно ',z:10:3);{вывод z} end {конец блока 4} Else Writeln('Функция при заданном аргументе не определена.'); Readln; {ожидание нажатия клавиши Enter} End. {конец программы} Результат работы программы Введите число: 1 Функция при заданном аргументе не определена. Введите число: 100 123 Значение функции равно 1.527 Введите число: 9 Значение функции равно 13159.802 Введите число: 10.75 Значение функции равно 143562.559 Введите число: 15 Значение функции равно 90.853 124 3. ЧИСЛЕННЫЕ МЕТОДЫ РЕШЕНИЯ ЗАДАЧ НА ПЕРСОНАЛЬНОМ КОМПЬЮТЕРЕ В разделе рассмотрены численные методы решения математиче- ских задач. Краткие теоретические сведения о численных методах, используемых при решении задач этого раздела, приведены в прил. 2. 3.1. Решение систем линейных уравнений 3.1.1. Задача с использованием матричного метода Задача 3.1. Разработать схему алгоритма и программу решения системы линейных уравнений матричным методом: . ; ; 3333232131 2323222121 1313212111 cxaxaxa cxaxaxa cxaxaxa Коэффициенты системы уравнений a11, a12, …, a33 формировать по закону aij = cos(i + j), свободные члены – по закону ci = sin(i), i, j = 1, 3 (1). Результаты решения системы вывести на экран. Решение задачи Формульный аппарат матричного метода описан в прил. 2. В со- ответствии с постановкой задачи сформируем систему линейных уравнений: ).3sin()33cos()23cos()13cos( );2sin()32cos()22cos()12cos( );1sin()31cos()21cos()11cos( 321 321 321 xxx xxx xxx Схема алгоритма основной программы представлена на рис. 3.1а, схема алгоритма процедуры вычисления определителя союзной матрицы DetSM – на рис. 3.1б. Согласно этим схемам ниже пред- ставлен текст программы. 125 7 11 98 17 16 15 13 14 12 1 2 3 4 Начало A[I,J]=cos(I+J) C[I]=sin(I) Det=0 X[I]=0 TmpS[I,J]= X[I]=... Конец 5 да нет Вывод X[I] Вычисление определителя матрицы А с использованием функций Koef, DetSM Det=Koef(1,1)·A[1, 1]·DetSM(1,1,A)+ Koef(1,2)·A[1, 2]·DetSM(1,2,A)+ Koef(1,3)·A[1, 3]·DetSM(1,3,A) Вывод «Система не имеет решения» Вычисление обратной матрицы с использованием функций Koef, DetSM ObrM[J, I]=Koef(I,J)· ·DetSM(I,J,A)/Det TmpS[I,J]=ObrM[J,I]·C[J] X[I]=X[I]+TmpS[I,J] I=1,3 J=1,3 I=1,3 J=1,3 Формирование коэффициентов системы 1 6 10 I=1,3 J=1,3 Вычисление обратных матриц ObrM Вычисление и вывод корней системы 1 Det=... ObrM[J,I]=... Рис. 3.1а 126 8 12 11 10 12 1 2 3 4 6 DetSM Начало A I=1, 3 B IS=0 5 I=I1 IS = IS+1 JS=0 да нет B J=1, 3 J=J1 JS = JS+1 SMatr[IS,JS]= Matr1[I, J] A нет да DetSM=... DetSM Конец 7 9 Вычисление определителя союзной матрицы Рис. 3.1б Пояснения к схеме алгоритма (см. рис. 3.1а) Обозначения: Det – определитель матрицы А; ObrM – матрица, обратная для матрицы А; X – массив корней системы уравнений; TmpS – массив значений промежуточных слагаемых для вычис- ления корней системы; DetSM – процедура вычисления определителя союзной матрицы. 127 Символ 1. Начало алгоритма. Символы 2–5. Формирование коэффициентов и свободных чле- нов системы. Символ 6. Вычисление определителя матрицы А. В этом символе происходит вызов функций Koef и DetSM. Символ 7. Проверка условия равенства определителя нулю. Если условие верно, то далее выполняются символы 9–17, если нет – сим- вол 8. Символ 8. Вывод на экран сообщения о том, что система не име- ет решения. Символы 9–11. Формирование обратной матрицы в двух циклах с па- раметрами I, J. В символе 11 происходит вызов функций Koef и DetSM. Символы 12–16. Вычисление корней системы X[I] в двух циклах с параметрами I, J. В символе 13 производится первоначальное об- нуление X[I]. В символах 14–15 в цикле с параметром J производит- ся вычисление X[I] суммированием TmpS[I, J]. TmpS[I, J] – это про- изведение элемента ObrM[J, I] обратной матрицы и значения сво- бодного члена системы C[J]. В символе 16 производится вывод значения корня X[I] на экран. Символ 17. Конец алгоритма. Пояснения к схеме алгоритма (см. рис. 3.1б) Обозначения: Matr1 – исходная матрица коэффициентов системы, переданная в процедуру DetSM в качестве формального параметра; I1, J1 – номера строки и столбца исходной матрицы Matr1, для которых формируется союзная матрица; SMatr – союзная матрица; DetSM – определитель союзной матрицы; I, J – параметры циклов, используемые для перебора строк и столбцов матрицы Matr1; IS, JS – значения номеров строк и столбцов союзной матрицы SMatr; Koef (I,J) – функция вычисления значения (–1)I + J. Символ 1. Начало алгоритма. Символ 2. Обнуление номера строки союзной матрицы SMatr (IS). Символ 3. Открытие цикла с параметром I = 1; 3 для перебора строк матрицы Matr1. 128 Символ 4. Проверка условия равенства номера строки матрицы Matr1 (I) номеру вычеркиваемой строки (I1). Если условие верно, то выполняется символ 5, если нет – символ 10. Символ 5. Значение номера строки союзной матрицы SMatr (IS) увеличивается на 1. Переменная номера столбца союзной матрицы SMatr (JS) обнуляется. Символ 6. Открытие цикла с параметром J = 1, 3 для перебора столбцов матрицы Matr1. Символ 7. Проверка условия равенства номера столбца матрицы Matr1 (J) номеру вычеркиваемого столбца (J1). Если условие верно, то выполняется символ 8, если нет – символ 9. Символ 8. Увеличение значения переменой JS на 1. В массив со- юзной матрицы SMatr заносится значение элемента матрицы Matr1[I, J]. Символ 9. Закрытие цикла с параметром J. Символ 10. Закрытие цикла с параметром I. Символ 11. Вычисление определителя союзной матрицы SMatr. Символ 12. Конец алгоритма. Программа Program SLAU_Matr; Uses Crt; Type TMatr3=Array [1..3, 1..3] of Real; {тип матрицы коэффициентов} Var I, J : Byte; Det, DetS : Real; A, TmpS, ObrM : TMatr3; C, X : Array [1..3] of Real; {Функция определения значения коэффициента} Function Koef(I1, J1 : Byte) : ShortInt; begin {начало раздела операторов функции Koef} {проверка на четность суммы (I1 + J1)} If ((I1 + J1) mod 2) = 0 Then Koef := 1 else Koef := -1; end; {конец функции Koef} {Функция для вычисления определителя союзной матрицы Входные данные: Matr1 - исходная матрица, I1, J1 - номера строки и столбца исходной матрицы Matr1, для которых формируется союзная матрица 129 Выходные данные: DetSM - определитель союзной матрицы} Function DetSM(I1, J1 : Byte; Matr1 : TMatr3) : Real; Var IS, JS, I, J : Byte; SMatr : Array [1..2, 1..2] of Real; {союзная матрица} begin {начало раздела операторов функции DetSM} IS := 0; {обнуление номера строки матрицы SMatr} for I:=1 to 3 do {начало цикла 1-перебор строк матрицы Matr1} If I=I1 then {вычеркиваем I1-тую строку матрицы Matr1} else begin {начало блока 1} IS:=IS + 1; {увеличение номера строки матрицы SMatr} JS:=0; {обнуление номера столбца матрицы SMatr} for J:=1 to 3 do {начало цикла 2 – перебор столбцов Matr1} If J=J1 then {вычеркиваем J1-ый столбец матрицы Matr1} else begin {начало блока 2} JS:=JS + 1;{увелич. номера столбца матрицы SMatr} {формирование союзной матрицы} SMatr[IS,JS]:=Matr1[I,J]; end; {конец блока 2, конец цикла 2} end; {конец блока 1, конец цикла 1} {определитель союзной матрицы} DetSM := SMatr[1,1]*SMatr[2,2] - SMatr[1,2]*SMatr[2,1]; end; {конец функции DetSMatr} Begin {начало раздела операторов основной программы} ClrScr; {очистка экрана} {формирование коэффициентов системы уравнений} for I:=1 to 3 do {начало цикла 1 - для перебора строк матрицы A} begin for J:=1 to 3 do {цикл 2 - для перебора столбцов матрицы А} A[I, J] := Cos(I+J); {вычисление элемента A[I, J]} C[I] := Sin(I); end; {конец цикла 1} {вычисление определителя матрицы коэффициентов} Det := Koef(1, 1)*A[1,1] * DetSM(1, 1, A) + Koef(1, 2)*A[1, 2]* DetSM(1, 2, A) + Koef(1, 3)*A[1, 3]* DetSM(1, 3, A); If Det=0 then Writeln('Система не имеет решения.') else begin {начало блока 1- матрица коэф-тов не вырожденная} {формирование обратной матрицы} for I:=1 to 3 do for J:=1 to 3 do ObrM[J, I] := Koef(I, J) * DetSM(I, J, A)/Det; {вычисление корней системы} for I:=1 to 3 do {начало цикла 3-перебор корней X[I]} begin X[I] := 0; {обнуление I-го корня} for J:=1 to 3 do {начало цикла 4} 130 begin TmpS[I,J]:=ObrM[I,J]*C[J]; {промежуточная сумма} X[I]:=X[I] + TmpS[I, J]; {вычисление I-го корня} end; {конец цикла 4} Writeln('X[', I, '] = ', X[I]:8:4); {вывод I-го корня} end; {конец цикла 3} end; {конец блока 1} Repeat Until KeyPressed;{ожидание нажатия любой клавиши} End. {конец программы} Результат работы программы X[1] = -0.6875 X[2] = -0.9375 X[3] = 0.0625 3.1.2. Задача с использованием метода Крамера Задача 3.2. Разработать схему алгоритма и программу решения системы линейных уравнений с тремя неизвестными 3333232131 2323222121 1313212111 ; ; cxaxaxa cxaxaxa cxaxaxa методом Крамера. Коэффициенты и свободные члены вводить из файла. Результаты решения системы вывести на экран. Решение задачи Формульный аппарат метода Крамера описан в прил. 2. Схема алгоритма основной программы представлена на рис. 3.2. Схема алгоритма процедуры вычисления определителя союзной матрицы DetSM представлена на рис. 3.1а. Согласно этим схемам ниже пред- ставлен текст программы. 131 10 9 16 15 14 13 12 11 1 2 4 6 Начало Det=0 TmpA=A TmpA[J,I]= C[J] Конец 5 7 8 Det=DetM(A) Ввод из файла A[I, J] X[I]=DetM( TmpA)/Det да нет Вывод «...» Вывод X[I] I=1,3 J=1,3 3 I=1,3 Ввод из файла С[I] I=1,3 J=1,3 Формирование коэффициентов системы Вычисление опреде- лителя матрицы А с использованием функции DetM Вычисление и вывод корней системы Сообщение «Система не имеет решения» Рис. 3.2 132 Пояснения к схеме алгоритма Обозначения: Det – определитель матрицы А (для вычисления вызывается функция DetM); X – массив корней системы уравнений; TmpA – промежуточная матрица, получаемая из исходной заме- ной столбца матрицы на столбец свободных членов; Koef (I, J) – функция вычисления значения (–1)I + J; DetM(A), DetM(TmpA) – вызовы функции DetM для вычисления определителей матриц А и TmpA. Символ 1. Начало алгоритма. Символы 2–4. Ввод из файла коэффициентов A[I, J] системы в двух циклах с параметрами I, J . Символы 5, 6. Ввод значений свободных членов C[I] системы в цикле с параметром I. Символ 7. Вычисление определителя матрицы А (переменная Det). В этом символе происходит вызов функции DetM. Символ 8. Проверка условия равенства определителя нулю. Если условие верно, то далее выполняется символ 9, если нет – символы 10– 16. Символ 9. Вывод на экран сообщения о том, что система не име- ет решения. Символы 10. Открытие внешнего цикла с параметром I. Символ 11. Присвоение элементам матрицы TmpA значений эле- ментов матрицы А. Символы 12–13. Производится замена I-го столбца матри- цы TmpA столбцом свободных членов C[J] в цикле с параметром J. Символ 14. Вычисление корня X[I]. В этом символе происходит вызов функции DetM. Символ 15. Вывод значения корня X[I] на экран. Символ 16. Конец алгоритма. Программа Program SLAU_Kramer; Uses Crt; Type 133 {тип матрицы коэффициентов системы уравнений} TMatr3 = Array [1..3, 1..3] of Real; Var I, J : Byte; Det, TmpDet : Real; A, TmpA : TMatr3; C, X : Array [1..3] of Real; F : Text; {Функция определения значения коэффициента} Function Koef(I1, J1 : Byte) : ShortInt; Begin {начало раздела операторов функции Koef} {проверка на четность суммы (I1 + J1)} If ((I1 + J1) mod 2) = 0 Then Koef := 1 else Koef := -1; end; {конец функции Koef} {Функция для вычисления определителя союзной матрицы} Function DetSM(I1, J1 : Byte; Matr1 : TMatr3) : Real; begin {начало раздела операторов функции DetSM} {текст функции DetSM приведен в разделе 3.1.1} end; {конец функции DetSM} {Функция вычисления определителя матрицы Входные данные: Matr1 - матрица Выходные данные: DetMatr - определитель матрицы Matr1} Function DetM(Matr1 : TMatr3) : Real; Begin {начало раздела операторов функции DetM} DetM := Koef(1, 1)*Matr1[1, 1]*DetSM(1, 1, Matr1) + Koef(1, 2)*Matr1[1, 2]*DetSM(1, 2, Matr1) + Koef(1, 3)*Matr1[1, 3]*DetSM(1, 3, Matr1); end; {конец функции DetM} Begin {начало раздела операторов основной программы} ClrScr; {очистка экрана} {чтение из файла коэффициентов системы уравнений} Assign(F, ‘koef.txt’); Reset(F); {открытие файла koef.txt} for I:=1 to 3 do begin {начало цикла 1 – для перебора строк матрицы А} {чтение I-й строки матрицы А} for J:=1 to 3 do Read(F, A[I, J]); Readln(F); {переход на след. строку в файле} end; {конец цикла 1} {чтение из файла значений свободных членов} for I:= 1 to 3 do Read(F, C[I]); Close(F); {закрытие файла koef.txt} {расчет} Det := DetM(A); {вычисление определителя матрицы А} If Det=0 then Writeln('Система не имеет решения.') 134 else begin {начало блока 1 - если матрица А не вырожденная} Writeln('Корни системы уравнений:'); for I:=1 to 3 do begin {начало цикла 2 - для перебора корней системы} {формирование коэф-тов I-й промежуточн. матрицы} TmpA := A; {замена I-го столбца свободными членами} for J:=1 to 3 do TmpA[J,I]:=C[J]; X[I] := DetM(TmpA)/Det; {вычисление I-го корня} Writeln('X[', I, '] = ', X[I]:8:4);{вывод корня} end; {конец цикла 6} end; {конец блока 1} Repeat Until KeyPressed; {ожидание нажатия любой клавиши} End. {конец программы} Результат работы программы Файл koef.txt 7 4 3 6 4 5 4 -2 10 12 6 -1 Корни системы уравнений: X[1] = 2.9811 X[2] = -1.0849 X[3] = -1.5094 3.1.3. Задача с использованием метода Гаусса Задача 3.3. Разработать схему алгоритма и программу решения системы линейных уравнений с тремя неизвестными 11024 ;6546 ;12347 321 321 321 xxx xxx xxx методом Гаусса. Значения коэффициентов уравнений вводить с помощью клавиа- туры. Результаты решения системы вывести на экран. 135 Решение задачи Формульный аппарат метода Гаусса описан в прил. 2. Схема ал- горитма процедуры Gauss представлена на рис. 3.3. Согласно этой схеме представлен текст программы. Начало 1 A K=1, Count-1 в каждой итерации цикла рассматривают- ся определ. строки массива коэф-тов Koef Поиск максимально- го коэффициента (MaxK), номера его строки (NumbLine) и столбца (NumbCol) в массиве Koef Перемещение максимального коэффициента на первое место Деление К-й строки массива Коef на максимальный коэффициент - Koef[K, K] Присваивание начальных значений массиву корней системы X[I]=0 в цикле, I=1, …, Count C K=Count, 1 Цикл для нахождения корней X[K] Sum=... Формирование сум- мы коэффициентов справа от «=» в цикле с параметром J=K, …, Count X[K]=(Koef[K, Count+1]+Sum)/ Koef[K, K] C B I=K+1, Count цикл для перебора номеров строк Koef от K+1 до Count Koef[I, J]=Koef[I,J]- Koef[I,K]* Koef[K,J] вычитание производится в цикле с параметром J=Count+1,K B Перемена местами значений Х, учиты- вая предыдущ. пере- мены мест столбцов (с помощью массива NumbX) Конец 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A 16 Прямой ход Обратный ход Рис. 3.3 136 Обозначения схемы алгоритма Koef – массив коэффициентов системы уравнений; Count – число строк массива Koef (число уравнений системы); X[I] – массив значений корней системы уравнений, I = 1, …, Count; NumbX[I] – массив порядковых номеров значений переменных массива X, а именно, NumbX[1] – содержит индекс переменной X[1], NumbX[2] – индекс X[2]. Например, NumbX[1] = 3 означает, что зна- чение переменной X[NumbX[1]] соответствует х3. Программа Program SLAU_Gauss; Uses Crt; Type Tablica = Array [1..3, 1..4] of Real; Colonka = Array [1..3] of Real; Var Count : Integer; A : Tablica; X : Colonka; flag : Boolean; I, J : Integer; {Функция вычисления корней системы уравнений методом Гаусса Входные данные: Koef – матрица коэффициентов системы, Count – число уравнений системы. Выходные данные: X – массив значений корней системы flag_virogdena – флаг вырожденной матрицы} Procedure Gauss(Koef : Tablica; Count : Byte; Var X: Colonka; Var flag_virogdena : Boolean); Var I, J, K, NumbLine, NumbCol, TmpNmb : Integer; Sum, MaxK : Real; Temp : Array [1..4] of Real; NumbX : Array[1..3] of integer; Begin {начало раздела операторов процедуры Gauss} flag_virogdena:=false; {начальное значения флага} {начальное сохранение порядка следования переменных Х} for I:=1 to Count do NumbX[I]:= I; {прямой ход решения} for K:=1 to Count-1 do Begin {начало цикла 1 - для перебора массивов Koef} {поиск максимума массива Koef} MaxK:= Koef[K, K]; {первоначальное значение максимума} 137 NumbLine:= K; {первонач. присвоение номеру строки максимума} NumbCol:= K; {первонач. присвоение номеру столбца максимума} for I:=K to Count do for J:=K to Count do If Abs(Koef[I, J]) > Abs(MaxK) Then Begin {начало блока 1} MaxK:= Koef[I, J]; NumbLine:= I; NumbCol:= J; end; {конец блока 1} If MaxK=0 Then flag_virogdena:=true; {матрица вырожденная} If not(flag_virogdena) Then {если матрица невырожденная} Begin {начало блока 2} {перемена местами K-й строки и строки NumbLine} for J:=K to Count+1 do Begin {начало цикла 2-для перебора значений по столбцам} Temp[J]:= Koef[NumbLine, J]; Koef[NumbLine, J]:= Koef[K, J]; Koef[K, J]:= Temp[J]; end; {конец цикла 2} {перемена местами K-го столбца и столбца NumbCol} for I:=1 to Count do Begin {начало цикла 3-для перебора значений по строкам} Temp[I]:= Koef[I, NumbCol]; Koef[I, NumbCol]:= Koef[I, K]; Koef[I, K]:= Temp[I]; end; {конец цикла 3} {уточнение порядка следования переменных} TmpNmb:= NumbX[NumbCol]; NumbX[NumbCol]:= NumbX[K]; NumbX[K]:= TmpNmb; {деление К-й строки на 1-й коэф-т строки Koef[K,1]} for I:=Count+1 downto K do Koef[K, I]:=Koef[K, I]/Koef[K, K]; {исключение переменной К+1-го уравнения} for I:=K+1 to Count do for J:=Count+1 downto K do Koef[I, J]:= Koef[I, J]-Koef[I, K]*Koef[K, J]; end; {конец блока 2} end; {конец цикла 1 - прямого хода} {обратный ход} for I:=1 to Count do X[I]:= 0; {начальные значения X[I]} If Koef[Count, Count]=0 Then flag_virogdena:= True; for K:=Count downto 1 do Begin {начало цикла 4 - для перебора строк массива Koef} Sum:=0; {первоначальное обнуление суммы} {вычисление суммы коэффициентов справа от "="} for J:=K to Count do Sum:= Sum - Koef[K, J]*X[J]; {вычисление значения переменной Х} If Koef[K, K] <> 0 Then 138 X[K]:=(Koef[K, Count+1] + Sum)/Koef[K, K] Else X[K]:= 0; end; {конец цикла 4} {перемена местами Х, учитывая предыдущие перемены столбцов} for I:=1 to Count do Temp[I]:= X[I]; for I:=1 to Count do X[NumbX[I]]:= Temp[I]; end; {конец процедуры Gauss} Begin {начало раздела операторов основной программы} ClrScr; for I:=1 to 3 do Begin {начало цикла 1 - для перебора строк матрицы А} {ввод коэффициентов I-го уравнения} Write(‘Введите коэффициенты ’, I,’-го уравнения: ’); for J:=1 to 4 do Read(a[I, J]); Readln; {переход на след. строку} end; {конец цикла 1} Gauss(a, 3, X, flag);{вызов процедуры Gauss для вычисления решения} {вывод результатов} If not flag then for I:=1 to 3 do Writeln('x',I,'=', x[I]:7:4) Else Writeln(‘Система не имеет решения.’) Readln; {ожидание нажатия клавиши Enter} End. {конец основной программы} Результат работы программы Введите коэффициенты 1-го уравнения: 7 4 3 12 Введите коэффициенты 2-го уравнения: 6 4 5 6 Введите коэффициенты 3-го уравнения: 4 -2 10 -1 x1 = 2.9811 x2 = -1.0849 x3 = -1.5094 3.2. Решение нелинейных уравнений Краткие теоретические сведения о методах решения нелинейных уравнений (методы дихотомии, хорд и касательных) изложены в прил. 2. 3.2.1. Задача с использованием метода дихотомии Задача 3.4. Разработать схему алгоритма и программу решения нелинейного уравнения xexf x sin10)( на отрезке [–10, 4] мето- 139 дом дихотомии с погрешностью не более 0,005. В процессе решения построить график, выбрать отрезок для уточнения корня. Решение задачи Определим интервалы, на которых функция f(x) меняет знак, для чего проведем табуляцию функции на отрезке [–10, 4] с произволь- ным шагом. x –10 –9 –8 –7 –6 –5 –4 –3 f(x) –5,44 4,12 9,89 6,57 –2,79 –9,58 –7,54 1,46 x –2 –1 0 1 2 3 4 f(x) 9,23 8,78 1 –5,69 –1,7 18,67 62,16 Из таблицы видно, что на отрезках [–10, –9], [–7, –6], [–4, –3], [0, 1], [2, 3] меняется знак функции, значит, на этих отрезках есть корни уравнения. Определим корень уравнения на отрезке [0, 1]. На рис. 3.4, а представлен график функции нелинейного уравнения y = xex sin10 на отрезке [–10, 4]. Схема алгоритма решения задачи представлена на рис. 3.4, б. Программа Program Dihotom; Uses Crt; Var Xn, Xk, e, X : Real; {функция вычисления значения нелинейного уравнения} Function F(X : Real) : Real; Begin {начало раздела операторов функции F} F:= Exp(X) - 10*Sin(X); end; {конец функции F} Begin {начало раздела операторов программы} ClrScr; {очистка экрана} Xn:= 0; Xk:= 1; {задание границ отрезка} e:= 0.005; {значение погрешности вычисления} While Abs(Xk - Xn)/2 > e do Begin {начало цикла} X:= (Xn+Xk)/2; {новое значение границы отрезка} {проверка меняет ли функция знак на отрезке [Xn, X]} If F(X)*F(Xk) <= 0 Then Xn:= X {отрезок для анализа [X,Xk]} Else Xk:= X;{отрезок для анализа [Xn,X]} 140 Writeln('X =', X:8:5, ' F(X) = ', F(X):5:3, ' Xn =', Xn:8:5, ' Xk =', Xk:8:5); {вывод результатов} end; {конец цикла} Repeat Until KeyPressed; {ожидание нажатия любой клавиши} end. {конец программы} Результат работы программы X = 0.50000 F(X) = -3.146 Xn = 0.00000 Xk = 0.50000 X = 0.25000 F(X) = -1.190 Xn = 0.00000 Xk = 0.25000 X = 0.12500 F(X) = -0.114 Xn = 0.00000 Xk = 0.12500 X = 0.06250 F(X) = 0.440 Xn = 0.06250 Xk = 0.12500 X = 0.09375 F(X) = 0.162 Xn = 0.09375 Xk = 0.12500 X = 0.10938 F(X) = 0.024 Xn = 0.10938 Xk = 0.12500 X = 0.11719 F(X) = -0.045 Xn = 0.10938 Xk = 0.11719 Пояснения к схеме алгоритма Обозначения: Xn, Xk – значения левой и правой границ отрезка, на котором производится поиск корней нелинейного уравнения; e – значение погрешности; F(X), F(Xk) – функция, которая вычисляет значение нелинейного уравнения xexf x sin10)( в точках Х, Xk. Символ 1. Начало алгоритма. Символ 2. Присвоение переменным границ отрезка (Xn, Xk) и пе- ременной погрешности вычислений (e) начальных значений. Символ 3. Проверка условия окончания вычислений: величина отрезка, на котором производится поиск корня, больше величины 2∙e. Если условие верно, выполняется символ 4, иначе – символ 9. Символ 4. Вычисление нового приближения к корню уравнения (Х). Символ 5. Проверка знаков функции на концах отрезка [X, Xk]. Если выражение F(X)∙F(Xk) < 0, то на этом отрезке функция меняет знак и имеется корень; в этом случае выполняется символ 6. Если выражение F(X)∙F(Xk) ≥ 0, то функция на концах отрезка имеет одинаковый знак и, значит, корня на этом отрезке нет; в этом случае выполняется символ 7. Символ 6. Присвоение переменной начала отрезка (Xn) значения Х. Символ 7. Присвоение переменной конца отрезка (Xk) значения Х. Символ 8. Вывод результатов на экран. Символ 9. Конец алгоритма. 141 -20 -10 0 10 20 30 40 50 60 70 -12 -10 -8 -6 -4 -2 0 2 4 6 X Y а 9 7 6 1 Начало Xn=0 Xk=1 e=0.005 |Xn-Xk|/2 > e X=(Xn+Xk)/2 F(X)· F(Xk)<0 Xn=XXk=X Конец 2 3 4 5 8 Вывод X, F(X), Xn, Xk нет да данет Вычисление новой точки Определение отрезка для поиска корня - знаки функции на границах отрезка должны быть различны Проверка условия окончания вычислений б Рис. 3.4 142 3.2.2. Задача с использованием метода хорд Задача 3.5. Разработать схему алгоритма и программу решения нелинейного уравнения xexf x sin10)( на отрезке [0, 1] мето- дом хорд с погрешностью не более 0,005. Решение задачи Схема алгоритма решения задачи представлена на рис. 3.5. 2 3 1 4 Начало Вывод Xn, Xk, F(X) Xn=0 Xk=1 e=0.005 X=Xn X=… Конец 8 F(X)· F(Xk)<0 Xn=XXk=X данет 5 67 Вычисление новой точки X = (Xk·F(Xn)- -Xn·F(Xk)/(F(Xn)-F(Xk)) |X1-X| 1; с1 = tg(1 + 5) + 1 2. 175 Алгоритм решения Решим систему линейных уравнений (4.3) с помощью матрич- ных операций. Для этого представим коэффициенты системы ли- нейных уравнений (4.3) в виде матрицы коэффициентов А4 4, а сво- бодные члены линейных уравнений (4.3) – в виде вектора С4 1. Кор- ни системы уравнений (4.3) х1, х2, х3, х4 будут представлены как вектор неизвестных Х4 1. При формировании матрицы коэффициентов А4 4 и вектора сво- бодных членов уравнений С4 1 можно использовать дополнитель- ные матрицы А1 и А2. Дополнительные матрицы А1 и А2 формиру- ются соответственно из индексов строк и столбцов матрицы А раз- мером 4 4. Шаг 1. Вначале сформируем матрицу А4 4, элементы которой найдем из соотношения (4.1) с помощью встроенной логической функции ЕСЛИ(), используя дополнительные матрицы А1 и А2. Для этого создадим дополнительные матрицы А1 и А2 и активизируем ле- вую верхнюю ячейку из диапазона ячеек, который будет занимать матрица А4 4. Затем в строке меню выберем команду Вставка функции и в открывшемся окошке Мастер функций выберем логическую функцию ЕСЛИ() (рис. 4.1). Любую встроенную функцию можно вы- брать в разделе Категория из списка Полного алфавитного перечня. Рис. 4.1 176 Шаг 2. В диалоговом окне функции ЕСЛИ() заполним поля Ло- гическое_выражение, Значение_если_истина и Значение_если_ложь. Запишем в них условие (4.1), используя адреса левых верхних ячеек дополнительных матриц А1 и А2 (рис. 4.2). Ввод формулы завер- шим, нажав клавишу ОК. Рис. 4.2 Шаг 3. Скопируем полученное соотношение во все ячейки фор- мируемой матрицы А4 4 или с помощью операции копирования, или перетаскивая маркер заполнения (рис. 4.3). Рис. 4.3 Шаг 4. Сформируем вектор С4 1, элементы которого вычислим по соотношению (4.2) с помощью встроенных математических функций. Для этого в строке меню выберем команду Вставка функции и в открывшемся окошке Мастер функций выберем мате- матическую функцию TAN() (рис. 4.4). В открывшемся диалоговом 177 окне функции TAN() в поле Число запишем аргумент тангенса (i+5) (рис. 4.5). В данном случае за i возьмем верхнюю ячейку первого столбца матрицы А4 4. Завершим ввод функции tg, нажав ОК. Ещё раз зайдем в ячейку с формулой и дополним её слагаемым i2, при- менив ссылку на верхнюю ячейку первого столбца матрицы А4×4. Скопируем полученное соотношение во все ячейки формируемой матрицы-вектора С4 1, используя данные первого столбца матрицы А4 4 (рис. 4.6). Рис. 4.4 Рис. 4.5 178 Рис. 4.6 Шаг 5. Систему уравнений (4.3) можно записать в матричном ви- де: АХ = С. Чтобы найти вектор Х4 1, необходимо обе части получен- ного уравнения умножить на матрицу 1 44A , обратную матрице А4 4: АХА–1 = СА–1. Умножение матрицы А на обратную ей матрицу А–1 приводит к получению единичной матрицы: Х = СА–1. Чтобы найти матрицу 1 44A , используем функцию массива МОБР(). Для этого выделим группу ячеек, в которых должна разместиться обратная матрица (рис. 4.7), и активизируем последовательно команды Вставка функции → МОБР (рис. 4.8). Зайдя в диалоговое окно МОБР(), внесем координаты матрицы А4 4 в поле Массив (рис. 4.9). Для завершения действия с функцией МОБР() нажимаем одновре- менно комбинацию клавиш Ctrl+Shift+Enter (рис. 4.10). Рис. 4.7 179 Рис. 4.8 Рис. 4.9 Рис. 4.10 180 Шаг 6. Найдем вектор неизвестных Х, умножив обратную мат- рицу А–1 на вектор С: Х = СА–1. Для этого выделим группу ячеек, в которых должен разместиться вектор неизвестных (рис. 4.11), и ак- тивизируем последовательно команды Вставка функции → МУМНОЖ (рис. 4.12). В диалоговом окне функции МУМНОЖ с помощью блока выбора значений выделим последовательно матри- цу А–1 и матрицу-вектор С и заполним поля Массив1 и Массив2 или просто запишем их координаты (рис. 4.13). Рис. 4.11 Рис. 4.12 181 Рис. 4.13 Завершаем действие с функцией МУМНОЖ, нажав одновремен- но комбинацию клавиш Ctrl+Shift+Enter (рис. 4.14). Рис. 4.14 В результате решения системы линейных уравнений (4.3) с по- мощью матричных операций получены значения неизвестных: х1 = –22,46, х2 = 23,9, х3 = –10,74, х4 = 26,94 (см. рис. 4.14). Шаг 7. Проверим правильность решения системы линейных уравнений (4.3) с помощью подстановки, т. е. запишем каждое уравнение и системы в ячейки, указывая координаты ячеек с соот- ветствующими значениями элементов матрицы А4 4 a11, a12, …, a44 и элементов матрицы-вектора Х4 1 х1, х2, х3, х4 (рис. 4.15). 182 В результате проведенной проверки получен вектор свободных членов системы уравнений (4.3), аналогичный вектору С4 1, т. е. си- стема уравнений (4.3) решена правильно (см. рис. 4.15). Рис. 4.15 4.2. Решение нелинейных уравнений и систем 4.2.1. Задача решения нелинейного уравнения методом дихотомии Задача 4.2. Решить нелинейное уравнение 10)( 32 xexf x на отрезке [1, 4] методом дихотомии с точностью 0,01. Проиллюстриро- вать графически положение корня в плоскости XY. Алгоритм решения Обозначим отрезок, на котором будет производиться поиск кор- ня, как [a, b]. Суть метода состоит в циклическом выполнении двух операций: 1) уточнение отрезка существования корня уравнения (выбор половины отрезка [a, b], который содержит корень уравнения); 2) выбор нового отрезка до тех пор, пока допустимая погреш- ность вычисления корня не станет меньшей либо равной заданной точности (0,01). 183 Предварительное табулирование. Найдем значения функции 10)( 32 xexf x на отрезке [1, 4], используя шаг изменения пе- ременной х, равный 0,2, т. е. проведем предварительное табулирование уравнения (рис. 4.16). Как видно из рисунка, заданная функция ме- няет знак на отрезке [1, 4] и, значит, можно найти корень функции f(x) на этом отрезке. Построим график функции f(x) с помощью функции «Мастер диаграмм». Для этого выделим диапазон данных B4 : C19, активи- зируем функцию «Мастер диаграмм», выберем тип «Точечная диа- грамма со значениями, соединенными сглаживающими линиями без маркеров», зададим значения Х, имена рядам данных и нажимаем кнопку «Готово». В результате появится график табулированной функции f(x) на отрезке [1, 4] (рис. 4.17). Рис. 4.16 184 b=4 a=1 -50 -40 -30 -20 -10 0 10 20 0 0,5 1 1,5 2 2,5 3 3,5 4 4,5 X Y Рис. 4.17 Алгоритм нахождения корня Для поиска корня уравнения используются итерационные вы- числения – деление выбранного отрезка пополам. Шаг 1. Первая итерация (результаты представлены на рис. 4.18): – вводим номер итерации (i = 1) (B4); – вводим значения границ отрезка (a1 = 1 и b1 = 4) (C4, D4); – вычисляем значение координаты середины отрезка – х1 = (a1 + + b1)/2 (E4); – вычисляем f(a1), f(b1), f(х1) (F4, G4, H4); – вычисляем значение точности по формуле |b1 – a1|/2 (I4). Рис. 4.18 Шаг 2. Вторая итерация (результаты представлены на рис. 4.21): – вводим номер итерации (i = 2) (B5); – определяем левую границу нового отрезка a2 (С5) по алгорит- му: если f(a1) f(х1) < 0, то a2 = a1, иначе а2 = х1 – для этого для ячейки С6 в строке формул вводится формула с использованием функции ЕCЛИ(), а именно, = ЕСЛИ(F4*H4<0;C4;E4) или с помощью диало- гового окна (рис. 4.19); 185 – определяем правую границу нового отрезка b2 (D5) по алго- ритму: если f(a1) f(х1) < 0, то b2 = х1, иначе b2 = b1. Для этого анало- гично предыдущему пункту для ячейки D5 в строке формул вводит- ся формула с использованием функции ЕCЛИ(), а именно: =ЕСЛИ(F4*H4<0;E4;D4), или с помощью диалогового окна (рис. 4.20); – вычисляем значения х2, f(a2), f(b2), f(х2), точность второй итера- ции, для этого выделяем диапазон E4 : I4 и растягиваем его на один ряд вниз, в результате в ячейках E5 : I5 появятся значения второй итерации (рис. 4.21). Рис. 4.19 186 Рис. 4.20 Рис. 4.21 Шаг 3. Итерации вычислений продолжаем до тех пор, пока не будет получена заданная точность (0,01). Для этого необходимо вы- делить диапазон B5 : I5 (рис. 4.22) и скопировать или растянуть его в нижние строки до тех пор, пока значение точности не станет меньше заданного значения (0,01) (рис. 4.23). Из рис. 4.23 видно, что на десятой итерации значение точности станет равным 0,006 < 0,01 и, следовательно, корень уравнения равен х = 2,365 (ячейка Е12). Рис. 4.22 187 Рис. 4.23 В табл. 4.1 приведена иллюстрация решения задачи. Таблица 4.1 Итерация Приближение к корню График функции 1 2 3 Первая итерация x1 = 2,5 x1=2,5 b=4a=1-50 -40 -30 -20 -10 0 10 20 0 0,5 1 1,5 2 2,5 3 3,5 4 4,5 X Y Окончание табл. 4.1 1 2 3 Вторая итерация x2 = 1,75 a=1 x2=1,75 b=2,5-4 -2 0 2 4 6 8 10 12 0 0,5 1 1,5 2 2,5 3 X Y Пятая итерация x5 = 2,406 a=2,313 x5=2,406 b=2,5 -3 -2 -1 0 1 2,3 2,35 2,4 2,45 2,5 2,55 X Y 188 Девятая итерация x9 = 2,365 a=2,359 x9=2,365 b=2,371-0,1 -0,05 0 0,05 0,1 0,15 2,358 2,36 2,362 2,364 2,366 2,368 2,37 2,372 X Y 4.2.2. Задача решения нелинейного уравнения методом хорд Задача 4.3. Разработать алгоритм решения нелинейного уравне- ния 010)( 32 xexf x на отрезке [1, 4] методом хорд с точно- стью 0,01. Алгоритм решения Предварительное табулирование. Найдем значения функции 10)( 32 xexf x на отрезке [1, 4], используя шаг изменения переменной х, равный 0,2 (см. рис. 4.16). Построим график функ- ции (см. рис. 4.17). Алгоритм нахождения корня уравнения Шаг 1. Первая итерация (результаты представлены на рис. 4.26): – вводим номер итерации (i = 1) (B4); – вводим значения границ отрезка (a1 = 1 и b1 = 4) (C4, D4); – вычисляем значения функции на границах отрезка – f(a1), f(b1), (E4, F4) (рис. 4.24); Рис. 4.24 189 – вычисляем приближение корня x1 на отрезке [a1; b1] по форму- ле )()( )()( 11 1111 1 bfaf bfaafb x (H4) (рис. 4.25); Рис. 4.25 – вычисляем значение функции в точке x1 – f(x1) (G4) (рис. 4.26). Рис. 4.26 Шаг 2. Вторая итерация (результаты представлены на рис. 4.30): – вводим номер итерации (i = 2) (B5); – определяем левую границу нового отрезка a2 (C5) по алгорит- му: если f(a1) f(x1) < 0, то a2 = a1, иначе а2 = x1 – для этого для ячейки C5 в строке формул вводится формула с использованием функции ЕCЛИ(), а именно: =ЕСЛИ(C4*G4<0;C4;H4), или с помощью диало- гового окна (рис. 4.27); 190 Рис. 4.27 – определяем правую границу нового отрезка b2 (D5) по алго- ритму: если f(a1) f(х1) < 0, то b2 = x1, иначе b2 = b1 – аналогично предыдущему пункту (рис. 4.28); значения границ отрезка на второй итерации приведены на рис. 4.29; Рис. 4.28 Рис. 4.29 191 – вычисляем значения функции на границах отрезка f(a2), f(b2) (E5, F5); – вычисляем приближение корня x2 на отрезке [a2; b2] по форму- ле )()( )()( 22 2222 2 bfaf bfaafb x (H5); – вычисляем значения функции в точке x2 – f(x2) (G5); – вычисляем значение погрешности по формуле 12 xx (I5) (рис. 4.30). Рис. 4.30 Шаг 3. Итерации вычислений продолжаем до тех пор, пока не бу- дет получено значение точности, меньшее заданного. Для этого выде- ляем диапазон B5 : I5. Растягиваем его вниз до тех пор, пока значение точности (столбец I) не станет меньше заданного (0,01) (рис. 4.31). Рис. 4.31 Таким образом, из рисунка видно, что для поиска корня уравне- ния с заданной точностью достаточно восьми итераций и значение корня на заданном отрезке составляет 2,362 (значение x8). Иллюстрация решения приведена на рис. 4.32. Как видно из ри- сунка, проведенная хорда для каждой итерации стремится к иско- мому корню уравнения. 192 x2=1,931 x1=0,558 x3=2,147 x4=2,260 x5=2,316 x6=2,343 -50 -40 -30 -20 -10 0 10 20 1 1,5 2 2,5 3 3,5 4 X Y Функция f(x) Хорда 1-й итерации Хорда 2-й итерации Хорда 3-й итерации Хорда 4-й итерации Хорда 5-й итерации Хорда 6-й итерации Рис. 4.32 4.2.3. Задача решения нелинейного уравнения методом касательных Задача 4.4. Разработать алгоритм решения нелинейного уравне- ния 01032 xex на отрезке [1, 4] методом касательных с точ- ностью 0,01. Положение корня в плоскости XY проиллюстрировать графически. Алгоритм решения Предварительное табулирование. Найдем значения функции 10)( 32 xexf x на отрезке [1, 4], используя шаг изменения переменной х, равный 0,2 (см. рис. 4.16). Построим график функ- ции (см. рис. 4.17). Найдем первую и вторую производные функ- ции f(x) по формулам 22 3 2 1 )( xexf x , (4.4) xexf x 6 4 1 )( 2 . (4.5) 193 В дальнейшем при вычислении производных будем использо- вать полученные формулы. Алгоритм нахождения корня уравнения Шаг 1. Первая итерация (результаты представлены на рис. 4.35): – вводим номер итерации (i = 1) (B4); – вводим значения границ отрезка (a1 = 1 и b1 = 4) (C4, D4); – вычисляем значения функции на границах отрезка f(a1), f(b1) (E4, F4); – вычисляем значение второй производной в точке a1: )( 1af по формуле (4.5) (G4) (рис. 4.33); Рис. 4.33 – вычисляем приближение корня x1 на отрезке [a1; b1]; для этого необходимо оценить выражение )()( 1afaf : если 0)()( 1afaf , то касательная проводится к точке а и приближение x1 вычисляется по формуле )( )( 1 af af ax ; если 0)()( 1afaf , то касательная прово- дится к точке b и приближение x1 вычисляется по формуле )( )( 1 bf bf bx ; )(bf , )(af – это значения производной в точке b и a (G4), ко- торые определяются по формуле (4.4) с использованием функции ЕCЛИ(), а именно: для ячейки H4 вводится формула =ЕСЛИ(E4*G4>0;C4-E4/(EXP(C4/2)/2 – 3*C4*C4);D4-F4/(EXP(D4/2)/2 – – 3*D4*D4)) или с помощью диалогового окна (рис. 4.34); 194 Рис. 4.34 – вычисляем значение функции в точке x1: )( 1xf (I4). (рис. 4.35). Рис. 4.35 Шаг 2. Вторая итерация (результаты представлены на рис. 4.40): – вводим номер итерации (i = 2) (B5); – определяем левую границу нового отрезка a2 (C5): если f(a1) f(x1) < 0, то a2 = a1, иначе а2 = x1 – для этого для ячейки C5 в строке формул вводится формула с использованием функции ЕCЛИ(), а именно, =ЕСЛИ(E4*I4<0;C4;H4), или с помощью диало- гового окна (рис. 4.36); – определяем правую границу нового отрезка b2 (D6): если f(a1) f(х1) < 0, то b2 = x1, иначе b2 = b1 – аналогично предыдущему пункту в строке формул вводится формула с использованием функ- ции ЕCЛИ(), а именно, =ЕСЛИ(E4*I4<0;H4;D4), или с помощью диалогового окна (рис. 4.37); в результате получим значения, пред- ставленные на рис. 4.38; 195 Рис. 4.36 Рис. 4.37 Рис. 4.38 196 – вычисляем значения функции на границах отрезка f(a2), f(b2) (E5, F5); значение второй производной в точке a2: )( 2af (G5), приближение корня x2 на отрезке [a2; b2] (H5); значение функции в точке х2: f(x2) (I5) – для этого выделяем диапазон E4 : I4 и растяги- ваем маркер заполнения вниз на одну строку (рис. 4.39); Рис. 4.39 – вычисляем значение точности по формуле 12 xx (J5) (рис. 4.40). Рис. 4.40 Шаг 3. Итерации вычислений продолжаем до тех пор, пока не будет достигнута заданная точность. Для этого выделяем диапазон B5 : J5 и растягиваем его вниз до тех пор, пока значение точности (столбец J) не станет меньше заданной (0,01) (рис. 4.41). Рис. 4.41 197 Таким образом, как видно из рис. 4.41, для поиска корня доста- точно четырех итераций и значение x = 2,367. Графическая иллюстрация решения представлена на рис. 4.42. x3=2,367 x2=2,477 x1=2,948 -55 -45 -35 -25 -15 -5 5 15 1 1,5 2 2,5 3 3,5 4 X Y Функция f(x) Касательная 1-й итерации Касательная 2-й итерации Касательная 3-й итерации Рис. 4.42 Как видно из рисунка, проведение касательной на каждой итера- ции сужает рассматриваемый отрезок и каждое новое приближение корня приближается к искомому значению. 4.2.4. Задача решения нелинейного уравнения методом простых итераций Задача 4.5. Разработать алгоритм решения нелинейного уравне- ния 01032 xex на отрезке [1, 4] методом простых итераций с погрешностью 0,01. Алгоритм решения Представим исходное уравнение в следующем виде: 3 2 10xex . Поскольку выполняются следующие два условия: 1) функция 3 2 10)( xex для всех ]4 ,1[x удовлетворяет усло- вию 3 243 21 10)(10 exe , следовательно, 6,2)(26,2 x ; 198 2) производная 1 )10(6 )( 3 22 2 x x e e x , то можно использовать метод простых итераций, по которому следу- ющее приближения корня xi+1 вычисляется по формуле )(1 ii xx . Шаг 1. Первая итерация: – введем номер итерации (i = 1) (B3); – введем начальное приближение к корню уравнения (x1 = 1) (C3) (рис. 4.43). Рис. 4.43 Шаг 2. Вторая итерация: – введем номер итерации (i = 2) (B4); – вычислим следующее приближение к корню уравнения ( 3 2 12 10)( 1xexx ) (C4) (рис. 4.44); – вычислим точность приближения по формуле 12 xx (D4) (рис. 4.45). Рис. 4.44 Рис. 4.45 Шаг 3. Повторяем действия шага 2, пока не будет достигнута за- данная точность. Для этого необходимо выделить диапазон ячеек B4 : D4 (рис. 4.46) и растянуть маркер заполнения вниз (рис. 4.47). 199 Рис. 4.46 Рис. 4.47 Таким образом, как видно из рис. 4.47, для поиска корня доста- точно четырех итераций и значение корня x = 2,366. 4.2.5. Задача решения нелинейного уравнения с помощью надстройки «Поиск решения» В этом разделе будут использованы возможности надстройки MS EXCEL Поиск решения. Они доступны с помощью команды Сервис - Поиск решения… Если этой команды в меню нет, ее необходимо установить. Для этого необходимо проделать следую- щее: 1. Выбрать пункт меню Сервис Надстройки… 2. Установить в окне «Доступные надстройки» флажок для надстройки Поиск решения. 3. Далее возможны три ситуации: – надстройка установлена в MS EXCEL, но не включена; в этом случае после нажатия кнопки ОК надстройка будет включена в MS EXCEL; – надстройка не установлена в MS EXCEL, но находится в стан- дартных установочных каталогах Microsoft Office; в этом случае после нажатия кнопки ОК надстройка будет установлена и включе- на в состав MS EXCEL; – надстройка не установлена в MS EXCEL, и ее нет в стандарт- ных установочных каталогах Microsoft Office; в этом случае после нажатия кнопки ОК необходимо указать путь к установочному ка- талогу MS EXCEL на диске или другом носителе. Можно также установить надстройку с помощью обращения к пункту Установка и удаление программ на панели управления Windows, для этого необходимо выбрать действие Изменить для 200 программы MS EXCEL или Microsoft Office и затем, следуя ин- струкциям в окне пошаговой установки, установить надстройку По- иск решения, указав для нее опцию запускать с моего компьютера всегда. Алгоритм работы с надстройкой Поиск решения В диалоговом окне Поиск решения есть три основных параметра: 1. «Установить целевую ячейку»; 2. «Изменяя ячейки»; 3. «Ограничения». Сначала нужно заполнить поле Установить целевую ячейку. Це- левая ячейка связана с другими ячейками этого рабочего листа с помощью формул, в ней происходит оптимизация результата. Мож- но выбрать поиск наименьшего или наибольшего значения для це- левой ячейки или же установить конкретное значение. Второй важный параметр — это параметр Изменяя ячейки. Из- меняемые ячейки — это те ячейки, значения в которых будут изме- няться для того, чтобы оптимизировать результат в целевой ячейке. Для поиска решения можно указать до 200 изменяемых ячеек. К изменяемым ячейкам предъявляются два основных требования. Они не должны содержать формул, и изменение их значений должно отражаться на изменении результата в целевой ячейке. Другими словами, целевая ячейка зависима от изменяемых ячеек. Третий параметр, который нужно вводить для функции Поиск решения, – это ограничения. В качестве ограничений можно ука- зать, например, диапазон изменения данных в изменяемых ячейках. Задача 4.6. Разработать алгоритм решения нелинейного уравне- ния 010)( 32 xexf x на отрезке [–10, 4] с помощью надстройки MS EXCEL Поиск решения. Алгоритм решения Предварительное табулирование. Построим табулированную функцию 10)( 32 xexf x , используя шаг изменения перемен- ной х, равный 1 (рис. 4.48). 201 Рис. 4.48 Выделим диапазоны ячеек (значения x и y), на которых знак y меняется на противоположный, например, выделяем диапазон B3 : C4, поскольку при изменении х от –10 до –9, y изменяется от –5,44 до 4,12, т. е. y меняет знак (см. рис. 4.48). Алгоритм нахождения корней уравнения Шаг 1. Скопируем первые строки выделенных диапазонов, а именно: B3 :C 3 (x = –10, y = –5,44017), B6 : C6 (x = –7, y = 6,570778), B9 : C9 (x = –4, y = –7,54971), B13 : C13 (x = 0, y = 1), B15 : C15 (x = 2, y = –1,70392), отдельно (рис. 4.49). Шаг 2. Запуск поиска корней уравнения с помощью функции По- иск решения для каждого выделенного диапазона ячеек (на шаге 2). Для этого необходимо выбрать пункт меню Сервис – Поиск решения… Появится диалоговое окно (рис. 4.50), в котором необходимо: – в качестве целевой ячейки установить ячейку $F$3 – значение y; – выбрать пункт с величиной, равной значению 0, т. е. значение х бу- дет изменяться таким образом, чтобы значение y стало равным нулю; – в поле Изменяя ячейки выбрать ячейку $E$3 – значение х; – в поле списка Ограничения добавить ограничения на изменения ячейки $E$3 – значение х должно быть больше –10, но меньше –9. 202 Рис. 4.49 Рис. 4.50 После нажатия кнопки Выполнить будет выполнен поиск реше- ния с заданными условиями. Затем после подтверждения в диалого- вом окне Результаты поиска решения в ячейке E3 появится значе- ние х, при котором значение y (ячейка F3) будет удовлетворять за- данному условию (в нашем случае это 0) с заданной погрешностью. Погрешность можно задать, используя кнопку «Параметры» диало- гового окна Поиск решения. После выполнения поиска решения для первого диапазона ячеек будут найдены следующие значения (диа- пазон результатов поиска E3 : F3) (рис. 4.51). Шаг 3. Аналогично выполним пункт меню Поиск решения для каждого диапазона ячеек, на котором y меняет знак. Результаты по- иска для всех диапазонов представлены на рис. 4.52. Таким обра- 203 зом, данное уравнение на заданном отрезке имеет пять корней: –9,42479; –6,283; –3,1459; 0,112097; 2,1345. Рис. 4.51 Рис. 4.52 4.3. Аппроксимация полиномами табулированных функций Задача 4.7. По заданной таблице входных значений x, y (табл. 4.2) построить полином вида y = a0 + a1x + a2x 2 + a3x 3 и определить его коэффициенты. Таблица 4.2 x 0 1 2 3 4 5 6 7 8 9 10 y 3 8 20 78 163 348 503 962 1243 2064 2843 x 11 12 13 14 15 16 17 18 19 20 y 3798 5100 6308 7899 9738 11843 14232 17200 19934 23283 x 21 22 23 24 25 26 27 28 29 30 y 26988 31067 35538 40419 45728 51483 57702 64403 71604 79323 Построить графики по вычисленным значениям аппроксимаци- онного полинома и сравнить их с табулированными значениями функции. 204 Алгоритм решения Этап 1. Сформируем систему для нахождения аппроксимацион- ного полинома: n i n i iiiiii n i n i iiiiii n i n i iiiiii n i n i iiii yxxaxaxaxa yxxaxaxaxa yxxaxaxaxa yxaxaxaa 1 1 36 3 5 2 4 1 3 0 1 1 25 3 4 2 3 1 2 0 1 1 4 3 3 2 2 10 1 1 3 3 2 210 ,)( ,)( ,)( ,)( (4.6) где n = 30. Этап 2. Преобразуем систему (4.6) к следующему виду: n i ii n i i n i i n i i n i i n i ii n i i n i i n i i n i i n i ii n i i n i i n i i n i i n i i n i i n i i n i i n i yxxaxaxaxa yxxaxaxaxa yxxaxaxaxa yxaxaxaa 1 3 1 6 3 1 5 2 1 4 1 1 3 0 1 2 1 5 3 1 4 2 1 3 1 1 2 0 11 4 3 1 3 2 1 2 1 1 0 11 3 3 1 2 2 1 1 1 0 . , ,) , (4.7) Этап 3. Введем обозначения для вычисления сумм систе- мы (4.7): n i ixt 1 1 , n i ixt 1 2 2 , n i ixt 1 3 3 , n i ixt 1 4 4 , n i ixt 1 5 5 , n i ixt 1 6 6 , n i iyс 1 0 , n i ii yxс 1 1 , n i ii yxс 1 2 2 , n i ii yxс 1 3 3 и сфор- мируем новую систему: 205 . , , , 363524130 253423120 143322110 03322110 ctatatata ctatatata ctatatata ctatatana (4.8) Этап 4. Вычислить значения введенных переменных t1, t2, …, t6, c0, c1, c2, c3 для системы (4.8) в MS EXCEL можно двумя способами. Первый способ заключается в последовательном перемножении и суммировании значений переменных в ячейках. Результаты вычис- лений значений промежуточных переменных системы (4.8) приве- дены в табл. 4.3. Таблица 4.3 n i ix t 1 1 n i ix t 1 2 2 n i ix t 1 3 3 n i ix t 1 4 4 n i ix t 1 5 5 n i ix t 1 6 6 n i iy c 1 0 n i ii yx c 1 1 n i ii yx c 1 2 2 n i ii yx c 1 3 3 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 3 0 0 0 1 1 1 1 1 1 8 8 8 8 2 4 8 16 32 64 20 40 80 160 3 9 27 81 243 729 78 234 702 2106 4 16 64 256 1024 4096 163 652 2608 10432 5 25 125 625 3125 15625 348 1740 8700 43500 6 36 216 1296 7776 46656 503 3018 18108 108648 7 49 343 2401 16807 117649 962 6734 47138 329966 8 64 512 4096 32768 262144 1243 9944 79552 636416 9 81 729 6561 59049 531441 2064 18576 167184 1504656 10 100 1000 10000 100000 1000000 2843 28430 284300 2843000 11 121 1331 14641 161051 1771561 3798 41778 459558 5055138 12 144 1728 20736 248832 2985984 5100 61200 734400 8812800 13 169 2197 28561 371293 4826809 6308 82004 1066052 13858676 14 196 2744 38416 537824 7529536 7899 110586 1548204 21674856 15 225 3375 50625 759375 11390625 9738 146070 2191050 32865750 16 256 4096 65536 1048576 16777216 11843 189488 3031808 48508928 17 289 4913 83521 1419857 24137569 14232 241944 4113048 69921816 18 324 5832 104976 1889568 34012224 17200 309600 5572800 100310400 Окончание табл. 4.3 1 2 3 4 5 6 7 8 9 10 19 361 6859 130321 2476099 47045881 19934 378746 7196174 136727306 206 20 400 8000 160000 3200000 64000000 23283 465660 9313200 186264000 21 441 9261 194481 4084101 85766121 26988 566748 11901708 249935868 22 484 10648 234256 5153632 113379904 31067 683474 15036428 330801416 23 529 12167 279841 6436343 148035889 35538 817374 18799602 432390846 24 576 13824 331776 7962624 191102976 40419 970056 23281344 558752256 25 625 15625 390625 9765625 244140625 45728 1143200 28580000 714500000 26 676 17576 456976 11881376 308915776 51483 1338558 34802508 904865208 27 729 19683 531441 14348907 387420489 57702 1557954 42064758 1135748466 28 784 21952 614656 17210368 481890304 64403 1803284 50491952 1413774656 29 841 24389 707281 20511149 594823321 71604 2076516 60218964 1746349956 30 900 27000 810000 24300000 729000000 79323 2379690 71390700 2141721000 Суммы 465 9455 216225 5273999 133987425 3500931215 631825 15433306 392402638 10258318234 Второй способ вычисления промежуточных переменных заклю- чается в использовании встроенных математических функций СУММ(), СУММКВ() и СУММПРОИЗВ(). Распишем последова- тельность шагов вычисления переменных. Шаг 1. На первом шаге вычислим параметр n i ixt 1 1 , используя математическую функцию СУММ(А2 : А32), где А2 – адрес первой ячейки столбца со значениями x, А32 – адрес конечной ячейки столбца со значениями x. Шаг 2. На втором шаге вычислим параметр n i ixt 1 2 2 , используя математическую функцию СУММКВ(А2 : А32) (рис. 4.53, 4.54). Шаг 3. На третьем шаге вычислим параметр n i ixt 1 3 3 , используя математическую функцию СУММПРОИЗВ() (рис. 4.55, 4.56). Шаг 4. На четвертом шаге вычислим параметр n i ixt 1 4 4 , также используя математическую функцию СУММПРОИЗВ(), но в от- крывшемся диалоговом окне функции заполняем уже четыре поля координатами массива t4 (рис. 4.57, 4.58). 207 Рис. 4.53 Рис. 4.54 Рис. 4.55 208 Рис. 4.56 Рис. 4.57 Рис. 4.58 Шаг 5. На пятом шаге вычислим параметр n i ixt 1 5 5 , опять ис- пользуя математическую функцию СУММПРОИЗВ(). Использование 209 этой функции обусловлено тем, что она позволяет перемножать и затем складывать указанные компоненты. Это же можно было де- лать, комбинируя различные функции, но, несмотря на кажущуюся «громоздкость» функции СУММПРОИЗВ, она оптимально подходит для требуемой операции, так как при внесении координат массивов удобно пользоваться технологией копирования (рис. 4.59, 4.60). Рис. 4.59 Рис. 4.60 Шаг 6. На шестом шаге вычислим параметр n i ixt 1 6 6 , исполь- зуя математическую функцию СУММПРОИЗВ() (рис. 4.61, 4.62). 210 Рис. 4.61 Рис. 4.62 Шаг 7. На седьмом шаге вычислим параметр n i iyс 1 0 , исполь- зуя математическую функцию СУММ(В2 : В32), где В2 – адрес первой ячейки столбца со значениями y, В32 – адрес конечной ячейки столбца со значениями y. Шаг 8. Используя математическую функцию СУММПРОИЗВ(), вычислим параметр n i ii yxс 1 1 (рис. 4.63, 4.64). 211 Рис. 4.63 Рис. 4.64 Шаг 9. Используя математическую функцию СУММПРОИЗВ(), вычислим параметр n i ii yxс 1 2 2 (рис. 4.65, 4.66). 212 Рис. 4.65 Рис. 4.66 Шаг 10. Используя математическую функцию СУММПРОИЗВ(), вычислим параметр n i ii yxс 1 3 3 (рис. 4.67, 4.68). 213 Рис. 4.67 Рис. 4.68 Этап 5. В результате проведенных вычислений и замены пере- менных t1, t2, …, t6, c0, c1, c2, c3 в системе уравнений (4.8) на их зна- чения, получаем систему уравнений 214 .4102583182335009312151339874255273999216225 ;39240263813398742552739992162259455 ;1543330652739992162259455465 ;631825216225945546530 3210 3210 3210 3210 aaaa aaaa aaaa aaaa (4.9) Этап 6. Решим систему линейных уравнений (4.9) с помощью матричных операций в MS EXCEL. Шаг 1. На первом шаге представим коэффициенты системы ли- нейных уравнений (4.9) в виде матрицы коэффициентов Т размером 4 4, а свободные члены линейных уравнений (4.7) – в виде матри- цы-вектора С размером 4 1 (рис. 4.69). Значения а0, а1, а2, а3 будут представлены как вектор неизвестных А4 1. Таким образом, система уравнений (4.9) будет записана в матричном виде: АТ = С. Чтобы найти вектор А4 1, необходимо умножить обе части полученного уравнения на матрицу 144T , обратную матрице Т4 4: АТТ –1 = СТ–1. В результате получим соотношение А = СТ–1. Рис. 4.69 Шаг 2. На втором шаге найдем обратную матрицу 144T , исполь- зуя функцию возвращения обратной матрицы МОБР(). Для этого выделим диапазон ячеек, в которых должна разместиться обратная матрица, и последовательно активизируем команды Вставка функ- ции → МОБР (рис. 4.70). Зайдя в диалоговое окно МОБР(), запол- ним поле Массив, задав координаты матрицы Т4 4 (рис. 4.71). Для завершения действия с функцией МОБР() нажимаем одновременно комбинацию клавиш Ctrl + Shi ft + Enter (рис. 4.72). 215 Рис. 4.70 Рис. 4.71 Рис. 4.72 216 Шаг 3. Найдем вектор неизвестных А, умножив матрицу Т–1 на вектор С: А = СТ–1. Для этого выделим группу ячеек, в которых должен разместиться вектор неизвестных, и активизируем последо- вательно команды Вставка функции → МУМНОЖ (рис. 4.73). Рис. 4.73 Заполним поля Массив1 и Массив2, задав координаты матрицы Т–1 и вектора С (рис. 4.74). Рис. 4.74 217 Завершаем действие с функцией МУМНОЖ(), нажав одновре- менно комбинацию клавиш Ctrl +Shift+Enter. В результате на листе EXCEL получаем столбец со значениями элементов вектора неиз- вестных А размером 4 1 (рис. 4.75), т. е. при решении системы ли- нейных уравнений (4.9) получен полином следующего вида: y = a0 + a1x + a2x 2 + a3x 3, где a0 = –7,71, a1 = –2,39, a2 = –1,09, a3 = 2,98. Рис. 4.75 Этап 7. Для построения функций у и урасч, используем табличные (см. табл. 4.2) и расчетные данные. Расчетные данные величины урасч получаются путем прямой подстановки значений х в формулу поли- нома y = –7,71 – 2,39x – 1,09x2 + 2,98x3. Это можно сделать с помо- щью операторов MS EXCEL. Полученные значения урасч представле- ны в табл. 4.4. Таблица 4.4 x 0 1 2 3 4 5 6 урасч -7,71 -8,21 6,99 55,77 156,01 325,59 582,39 x 7 8 9 10 11 12 13 14 урасч 944,29 1429,17 2054,91 2839,39 3800,49 4956,09 6324,07 7922,31 x 15 16 17 18 19 20 21 22 урасч 9768,69 11881,09 14277,39 16975,47 19993,21 23348,49 27059,19 31143,19 x 23 24 25 26 27 28 29 30 урасч 35618,37 40502,61 45813,79 51569,79 57788,49 64487,77 71685,51 79399,59 218 Этап 8. По данным табл. 4.2 и 4.4 построим графики зависимо- сти у от х ( ) ) и урасч от х (•) (рис. 4.76). Рис. 4.76 На рис. 4.77 представлена часть диаграммы (см. рис. 4.76), на ко- торой хорошо видно различие между заданными у и полученными урасч величинами. Тем не менее ход рядов у и урасч аналогичен (рис. 4.76), а значения у и урасч достаточно близки (см. табл. 4.2 и 4.4). -10 40 90 140 190 240 290 340 0 1 2 3 4 5 6х у Рис. 4.77 219 4.4. Численное дифференцирование и интегрирование функций Задача 4.8. Провести численное дифференцирование функции y = cos(2x), заданной таблично на участке [–2π, 2π] с шагом 0,25, предварительно её протабулировав. Построить графики исходной и дифференциальной функций. При дифференцировании исполь- зовать формулы для левой, правой и центральной разностей (П 2.11)–(П 2.13). Алгоритм решения Шаг 1. Зададим начальное значение аргумента х = –6,28. Введем ряд значений Х с шагом 0,25. Вычислим соответствующие значения Y. В результате проведенных действий будет получена таблица зна- чений Х и Y, представленная на рис. 4.78. Шаг 2. Вычислим табличные значения производной по формуле центральных разностей (П 2.11) (рис. 4.79). Рис. 4.78 Рис. 4.79 220 Шаг 3. Вычислим табличные значения производной по формуле левых разностей (П 2.12) (рис. 4.80). Шаг 4. Вычислим табличные значения производной по формуле правых разностей (П 2.13) (рис. 4.81). Рис. 4.80 Рис. 4.81 Шаг 5. Используя функцию Мастер диаграмм, построим следу- ющие графические зависимости: y1 = f(x), y2 = f2(x), y3 = f3(x), y4 = f4(x), где f2(x), f3(x), f4(x) – табличные функции, полученные на основе формул центральной, левой и правой разностей соответственно. Графики исходной (кривая 1) и дифференциальных функций, полу- ченных на основе формул для центральной (кривая 2), левой (кри- вая 3), правой (кривая 4) разностей представлены на рис. 4.82. 221 Рис. 4.82 Задача 4.9. Изменив формулу функции y = cos2x на y = cos4x, численно определить вторую, третью и четвертую производные, используя формулу центральных разностей. Построить графики функции y = cos4x и вышеперечисленных производных. Определить значения сумм 1 1 ' 1 )( n i ixfS , 22 1 '' 1 '' 2 ))(cos()( n i i n i i xfxfS , 33 1 ''' 1 ''' 3 ))(cos()( n i i n i i xfxfS , 44 1 '''' 1 '''' 4 ))(cos()( n i i n i i xfxfS , где f′(xi), f′′(xi), f′′′(xi), f′′′′(xi) – производные первого, второго, третьего и четвертого порядка, вычисленные по формуле центральных разностей. Алгоритм решения Шаг 1. Используя значение аргумента Х из задачи 4.8, вычислим значения Y. В результате проведенных действий будет получена таблица значений, представленная на рис. 4.83. Шаг 2. Вычислим табличные значения производной y′ по фор- муле центральных разностей (П 2.11) (рис. 4.84). 222 Рис. 4.83 Рис. 4.84 Шаг 3. Вычислим табличные значения производных y′′ (рис. 4.85), y′′′ (рис. 4.86) и y′′′′ (рис. 4.87) по формуле центральных разностей (П 2.11). Рис. 4.85 Рис. 4.86 223 Рис. 4.87 Шаг 4. Используя функцию Мастер диаграмм, построим следу- ющие графические зависимости: y1 = f(x), y2 = y′ = f2(y), y3 = y′′ = f3(y′), y4 = y′′′ = f4(y′′), y5 = y′′′′ = f5(y′′′), где f2(y), f3(y′), f4(y′′), f5(y′′′) – табличные функции, полученные на основе формулы центральной разности. Графики исходной (кри- вая 1) и дифференциальных функций первого (кривая 2), второго (кривая 3), третьего (кривая 4) и четвертого (кривая 5) порядков, полученных на основе формулы для центральной разностей, пред- ставлены на рис. 4.88. 224 Рис. 4.88 Шаг 5. Найдем значения сумм 1 1 ' 1 )( n i ixfS , 22 1 '' 1 '' 2 ))(cos()( n i i n i i xfxfS , 225 33 1 ''' 1 ''' 3 ))(cos()( n i i n i i xfxfS , 44 1 '''' 1 '''' 4 ))(cos()( n i i n i i xfxfS с помощью встроенных функций EXCEL (рис. 4.89). В результате получим S1 = 0,345; S2 = 15,204; S3 = –19,734; S4 = –7,404. Рис. 4.89 Задача 4.10. Используя метод трапеций, вычислить значение ин- теграла (шаг интегрирования равен 0,01) 2 1 2dxxS . 226 Алгоритм решения Шаг 1. Распишем квадратурную сумму для вычисляемого инте- грала в соответствии с формулой суммирования интеграла по мето- ду трапеций: nх х nxfnhxfhxfxf h dxxf 0 )1(2...2 2 000 ; (4.11) 222 2 1 2 29901,012...01,0121 2 01,0 dxxS . Шаг 2. Построим табулированную подынтегральную функцию y = x2, используя шаг 0,01. В соответствии с формулой трапеций (4.11) на концах табулированной функции принять f(x0) = 1, f(xn) = 2. Значения f(x0+h), f(x0+2h), …, f(x0+(n–1)h) требуется умножить на 2. В результате получим столбец Si (рис. 4.90). Шаг 3. Вычислим n i iSS 1 1 и 1 2 01,0 SS , где S1 – численное значение интеграла (рис. 4.90). Шаг 4. С целью проверки полученного численного значения ин- теграла (S = 2,33) определим его аналитическое значение: 33,2 3 7 3 1 3 2 3 33 2 1 32 1 2 xdxxS . Численное значение интеграла (S = 2,33) и его аналитическое значение совпали. 227 Рис. 4.90 Рис. 4.91 4.5. Решение дифференциальных уравнений 4.5.1. Решение дифференциальных уравнений методом Рунге-Кутта Задача 4.11. Решить дифференциальное уравнение xeyy 2 на отрезке [0, 2] методом Рунге-Кутта четвертого порядка. Началь- ное условие Коши y(0) = 1. 228 Алгоритм решения Шаг 1. Распишем формулы для вычисления коэффициентов и значения уравнения. Для i-й итерации коэффициенты k1, k2, k3, k4 вычисляются с ис- пользованием значений xi, yi: ;2),(1 ix iii eyyxfk ;) 2 (2) 2 , 2 ( 2112 h x iii i e kh y kh y h xfk 222 3 ) 2 (2) 2 , 2 ( h x iii i e kh y kh y h xfk ; hx iii iekhykhyhxfk )(2),( 334 . Для i + 1 итерации значение 43211 22 6 kkkk h yy ii . Шаг изменения переменной х (xi+1 – xi) установить равным 0,1 (ячейка D1). Шаг 2. Первая итерация (результаты представлены на рис. 4.97). Используя начальные значения x1 = 0 и y1 = 1, вычислить значения коэффициентов k1, k2, k3, k4 и значение y2 по формулам, приведенным выше. Для этого необходимо сделать следующее (рис. 4.92–4.97): – ввести значение шага для переменной х в ячейку D1, ссылку на которую в формулах следует сделать абсолютной (обозначить ее $D$1), таким образом при копировании формул ссылка на эту ячей- ку не сместится; – ввести начальные значения x, y (B4, B9) (рис. 4.92); – вычислить коэффициент k1 (B5) (рис. 4.93); – вычислить коэффициент k2 (B6) (рис. 4.94); – вычислить коэффициент k3 (B7) (рис. 4.95); – вычислить коэффициент k4 (B8) (рис. 4.96); – вычислить значение y для следующей итерации (C9) (рис. 4.97). 229 Рис. 4.92 Рис. 4.93 Рис. 4.94 Рис. 4.95 Рис. 4.96 Рис. 4.97 Шаг 3. Вторая итерация (результаты представлены на рис. 4.101): – ввести значение x для второй итерации, получаемой по формуле x2 = x1 + h = 1 + 0,1 = 1,1 (C4) (рис. 4.98); 230 – вычислить коэффициенты k1, k2, k3, k4 , для этого необходимо выделить формулы, находящиеся в ячейках диапазона B5 : B8 (рис. 4.99) и скопировать их в соседние ячейки C5 : C8 (рис. 4.100); – вычислить значение y для следующей итерации, для этого необходимо скопировать формулу из ячейки B9 в ячейку C9 (рис. 4.101). Рис. 4.98 Рис. 4.99 Рис. 4.100 Рис. 4.101 Шаг 4. Повторять действия, описанные в шаге 3, пока x не станет равен 2. Для этого необходимо: 231 – вычислить значения х и коэффициентов k1, k2, k3, k4, для этого необходимо выделить формулы, записанные в ячейках С3 : С8, и растянуть маркер заполнения вправо, пока значение х не достигнет значения 2; – вычислить значения y для всех итераций, для чего скопировать формулу ячейки С9 в ячейки D9 : W9. Результаты вычислений представлены на рис. 4.102. Рис. 4.102 4.5.2. Решение дифференциального уравнения методом Эйлера Задача 4.12. Решить дифференциальное уравнение xeyy 2 на отрезке [0, 2] методом Эйлера. Начальное условие Коши y(0) = 1. Алгоритм решения Шаг 1. Распишем формулы для вычисления коэффициентов и значения уравнения. Для i + 1 итерации значение ),(1 yxhfyy ii . Шаг изменения переменной х (xi+1 – xi) установить равным 0,1 (ячейка B1). Шаг 2. Первая итерация: – ввести значение шага для переменной х в ячейку B1, ссылку на которую в формулах следует сделать абсолютной (обозначить ее $B$1), таким образом при копировании формул ссылка на эту ячей- ку не сместится; – ввести начальные значения x, y (B4, B5) (рис. 4.103). 232 Шаг 3. Вторая итерация: – ввести значение x2, получаемое по формуле x2 = x1 + h = 1 + 0,1 = 1,1 (C4) (рис. 4.104); Рис. 4.103 Рис. 4.104 – вычислить значение y для следующей итерации (C5) по форму- ле )2( 1112 x eyhyy (рис. 4.105). Шаг 4. Повторять действия, описанные в шаге 3, пока x не станет равен 2. Для этого необходимо выделить диапазон ячеек C3 : C5 (рис. 4.106) и растянуть маркер заполнения вправо. Результаты вы- числений приведены на рис. 4.107. Рис. 4.105 Рис. 4.106 Рис. 4.107 233 4.5.3. Решение дифференциальных уравнений с частными производными методом конечных разностей Задача 4.13. Провести моделирование температурного поля се- чения детали на основе уравнения теплопроводности при заданных начальных и граничных условиях 2 2 2 2 y T x T a t T . Конфигура- ция сечения отливки представлена на рис. 4.108. Темно-серым цве- том представлено сечение отливки, белым – форма, светло-серым – окружающая среда. 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 500 500 20 20 20 20 20 20 20 20 20 500 500 500 500 20 20 20 20 20 20 20 20 20 500 500 20 20 20 20 20 20 20 500 500 500 500 500 500 500 500 20 20 20 20 20 500 500 500 500 500 500 20 20 20 20 20 20 500 500 20 20 500 500 20 20 20 20 20 20 500 500 20 20 500 500 20 20 20 20 20 500 500 500 500 500 500 500 500 20 20 20 20 20 20 500 500 500 500 20 20 20 20 20 20 20 20 500 500 500 500 20 20 20 20 20 20 20 20 20 500 500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 Рис. 4.108 Заданы теплофизические параметры для разных типов клеток: – для клеток формы: теплоемкость c = 519 Дж/К, теплопровод- ность l = 44,4 Вт/(м К), плотность r = 1600 кг/м3, начальная темпера- тура t = 20 С; – для клеток отливки: теплоемкость c = 343 Дж/К, теплопровод- ность l = 110 Вт/(м К), плотность r = 8900 кг/м3, начальная темпера- тура t = 500 С. Шаг по пространству равен 0,002 м и шаг по времени – 0,0005 с. 234 Алгоритм решения Шаг 1. В виде исходного условия необходимо использовать уравнение теплообмена для двумерной системы: 2 2 2 2 y T x T a t T . Численное решение уравнения теплопроводности записывается в конечно-разностном представлении в виде 2 ,1,1,,1,1 , 1 , 4 x TTTTT taTT n ji n ji n ji n ji n jin ji n ji , (4.12) где jiT , – температура клетки i-й строки и j-го столбца по осям x, y соответственно; n, n + 1 – переменные временного слоя; а – коэффициент температуроводности: c a , где – теплопроводность, с – теплоемкость, – плотность материала клетки. Шаг 2. Создать объект моделирования. Для этого необходимо вы- делить диапазон ячеек A2 : L15, заполнить клетки цифрами, как по- казано на рис. 4.109, выделить границы клеток диапазона с помощью кнопки Границы на панели Форматирование. 235 Рис. 4.109 Шаг 3. Ввести температурную шкалу в представленном на рис. 4.110 виде. В соответствии с этой шкалой клетки отливки бу- дут окрашены в тот или иной цвет в зависимости от значения тем- пературы клетки. Рис. 4.110 Шаг 4. Сделать первоначальную заливку обеъкта моделирова- ния. Для этого необходимо: – выделить диапазоны ячеек A1 : A15, A1 : L1, L1 : L15, A15 : L15 – область окружающей среды и сделать заливку зеленым цветом с помощью инструмента Цвет заливки на панели Фор- матирование; – выделить диапазон B2 : K14 и сделать заливку фиолетовым цветом. В результате первоначальной заливки изображение детали будет иметь вид, представленный на рис. 4.111. Шаг 5. Ввести исходные данные, а именно значения теплопро- водности, теплоемкости, плотности, шагов по времени и простран- ству. Вычислить значение коэффициентов а для формы и отливки (см. рис. 4.111). 236 Рис. 4.111 Шаг 6. Для того чтобы выделить клетки отливки цветом, в зави- симости от температуры клетки в соответствии с температурной шкалой, необходимо применить условное форматирование. Для этого необходимо выделить диапазон A2 : L15 и выбрать пункт меню Формат Условное форматирование… Появится диалоговое окно «Условное форматирование» (рис. 4.112), в котором необходимо задать три следующих условия: – первое условие: если значение клетки находится в интервале между 125 и 250, то клетку закрашивать желтым цветом, для зада- ния цвета клетки надо нажать кнопку Формат и затем на вкладке Вид выделить цвет заливки ячейки, для ввода следующего условия нажать кнопку А также>>; – второе условие: если значение клетки находится в интервале между 251 и 375, то клетку закрашивать оранжевым цветом; – третье условие: если значение клетки находится в интервале между 375 и 500, то клетку закрашивать красным цветом. Рис. 4.112 237 Таким образом, если значение клетки не входит ни в один из описанных интервалов, т. е. значение температуры меньше 125, то она остается фиолетовой. После выполнения условного форматирования изображение де- тали примет вид, представленный на рис. 4.113. Рис. 4.113 Шаг 7. Скопировать изображение получившейся детали ниже, новое изображение будет начинаться с ячейки А18. Шаг 8. Вычислить температуру клеток формы в следующий мо- мент времени, т. е. через 0,0005 с, для этого необходимо: – ввести в ячейку B19 формулу (4.12) для вычисления темпера- туры в следующий момент времени для формы, используя коэффи- циент а для формы (ячейка О6) (рис. 4.114); в качестве значения n jiT , использовать значение ячейки B2, n jiT ,1 – ячейку С2, n jiT ,1 – ячейку A2, njiT 1, – ячейку B3, n jiT 1, – ячейку B1; при вводе форму- лы необходимо обратить внимание на то, что адреса ячеек О6 (ко- эффициент а), O8 (шаг по времени), O9 (шаг по пространству) необходимо вводить как абсолютные ссылки; – выделить ячейку и скопировать ее на все ячейки формы, в ре- зультате температурное поле детали будет иметь вид, представлен- ный на рис. 4.114. Шаг 9. Вычислить температуру клеток отливки в следующий момент времени, для этого необходимо: – для вычисления температуры в следующий момент времени для отливки ввести в ячейку F20 формулу (4.12), используя коэф- фициент а для отливки (ячейка P6) (рис. 4.115); при вводе формулы 238 адреса ячеек P6 (коэффициент а), O8 (шаг по времени), O9 (шаг по пространству) необходимо вводить как абсолютные ссылки; – выделить ячейку и скопировать ее на все ячейки отливки, в ре- зультате температурное поле детали через 0,0005 с будет иметь вид, представленный на рис. 4.115. Рис. 4.114 Рис. 4.115 Шаг 10. Для вычисления температуры клеток отливки и детали через 2·0,0005 = 0,001 с необходимо вставить копию изображения последнего температурного поля детали ниже – новое изображение 239 будет начинаться с ячейки А35. Температурное поле формы и от- ливки через 0,001 с будет иметь вид, представленный на рис. 4.116. Рис. 4.116 Таким образом, для получения температурного поля детали че- рез 0,0005 n c необходимо скопировать изображение n раз. Напри- мер, на рис. 4.117 показано температурное поле формы и отливки через 0,0005·40 = 0,02 c (изображение скопировано 40 раз). Рис. 4.117 4.6. Решение задач оптимизации с использованием надстройки MS EXCEL «Поиск решения» Задача 4.14. Разработать алгоритм и определить с помощью приложения MS EXCEL комбинацию значений переменных х1, x2, x3, изменяющихся в заданных интервалах, для системы нелинейных уравнений 240 ,80ln5cos4sin6 ,50lncos30sin5 ,40ln350sin4 3321 2321 1321 Fxxx Fxxx Fxxx F1(x1, x2, x3) = 0, F2(x1, x2, x3) = 0, F3(x1, x2, x3) = 0. Функционал цели выбрать на основе условия min23 2 2 2 1 FFFF . Предположить следующие интервалы изменения переменных: x1 = [–10; 10], x2 = [10; 40], x3 = [0; 50]. Алгоритм решения Сущность решения задачи состоит в том, что строится функцио- нал вида min23 2 2 2 1 FFFF . При этом функции, входящие в него, являются уравнениями системы F1(x1, x2, x3) = 0, F2(x1, x2, x3) = 0, F3(x1, x2, x3) = 0. Решение ищется таким образом, чтобы минимизировать функционал. Шаг 1. Ввести интервалы изменения значений переменных x1, x2, x3 (рис. 4.118). Шаг 2. Задать начальные значения переменных x1, x2, x3 для поис- ка (ячейки F2, F3, F4) – это минимальные значения интервалов пе- ременных (рис. 4.119). Рис. 4.118 Рис. 4.119 Шаг 3. Ввести обозначения для F1, F2, F3: 241 .80ln5cos4sin6 ,50lncos30sin5 ,40ln350sin4 3213 3212 3211 xxxF xxxF xxxF Шаг 4. Ввести формулы для вычисления критериев F1, F2, F3 (ячейки F5, F6, F7) (рис. 4.120) и критерия F (ячейка F8) (рис. 4.121). Рис. 4.120 Рис. 4.121 Шаг 5. Запуск поиска решения. Для этого надо выбрать пункт меню Сервис Поиск решения… Появится диалоговое окно, в ко- тором необходимо (рис. 4.122): – в качестве целевой ячейки установить ячейку $F$8 – значение F; – выбрать пункт равной минимальному значению, т. е. значения x1, x2, x3 будут изменяться таким образом, чтобы значение F приняло минимальное значение; – в поле Изменяя ячейки выбрать ячейку $F$2 : $F$4 – значения x1, x2, x3; 242 – в поле списка Ограничения добавить ограничения на изменение ячейки $F$2 – значение х1 должно входить в интервал изменения (должно быть больше минимального значения интервала, но мень- ше максимального), аналогично добавить ограничения на ячейки $F$3 (значение х2) и $F$4 (значение х3). Границы интервалов пере- менных находятся в ячейках С2 : D4. Рис. 4.122 После нажатия кнопки Выполнить будет выполнен поиск мини- мального значения F с заданными условиями. Затем после подтвер- ждения в диалоговом окне Результаты поиска решения в ячейках F2, F3, F4 появятся значения x1, x2, x3, при которых F (ячейка F8) принимает минимальное значение (рис. 4.123). Таким образом, ми- нимальное значение F составляет 3178,004. Рис. 4.123 243 5. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ Оформление заданий Курсовой проект состоит из следующих частей: 1) постановка задачи; 2) алгоритм решения задачи с пояснениями; 3) программа решения задачи с комментариями; 4) результаты расчетов (можно частично); 5) графики и рисунки, если необходимо; 6) выводы. 5.1. Задачи по разработке алгоритмов и программ с использованием разветвляющихся процессов Постановка задачи. Разработать алгоритм и программу для вычисления функции Z(x), заданной интервально на различных промежутках. Если функция Z(x) не определена при каких-либо значениях x, то в программе необходимо предусмотреть вывод сообщения «При x = … функция не определена» и вывести зна- чение x. Общий вид задания функции если ,0 если),( ... если),( если),( если),( )( 2 1 0 xf xf xf xf xZ N . ; ; ; ; 1 21 10 0 N NN xx xxx xxx xxx xx Функция )(xfi представлена в табл. 5.1, а варианты заданий – в табл. 5.2. Значения a, b, c, d вычисляются по формулам ,sin 3 1 n j ja 3 1ln 1n j j b , 3 1 3 )( n j jjc , cbad , где n – номер варианта. 244 Таблица 5.1 Индекс i-й функции )(xfi 0 )tg()(cos)(sin2 4,32 xdcxbxeax 1 47 8 ln 101 1 )cos( dxcxxbe bax 2 xaxdcbxax )(lnlnln 34/3 3 bxcxbxgaxxd )7(/)7()(t/)cos()ln( 4 10/13)ln( dxcxaxxb 5 )cos()(ln 34324,34 xcxdbxax 6 )1/(ln)70()50ln( 3344 xxdxbxace x 7 )(ln)(ctg)sin(cos 243 xdxdxbxa 8 )cos())(tgln())ln(sin()tg( 3 xdxcxbxa 9 4/3223 )(sin)(tg)cos(/ xdcxcxexa bx 10 4)ln( 5 1 )cos( axdx x bxae x 11 dxxcxxbax /)(ln)sin()cos(ln 334 12 dxcxbxbxxaa 32 )7(/)7()(tg/)(cos)ln( 13 )cos(/)(tg)ln( 35/4 xdxcxbxxa 14 )(tg)sin()(ln 3423 xdcxbxxa 15 )2/()ln()()5ln( 3334 dxdcxcxxbae x 16 )2(ln)(ctg)4sin()/1(cos 233 xdcxxbxa 17 )cos())(tgln()sin(ln/)(cos 2/24/3 dxxcxbbdxa 18 dcx xxcebxbax 25 )(sin)cos( 245 Окончание табл. 5.1 Индекс i-й функции )(xfi 19 )sin()ln()cos( 2 3 2 dx x cx axaxe bx 20 )ln()(ln33 ca xcdxxbax 21 )ln( )7()ln(/)cos()ln( 7/2 2 cx e cdxbxax cx xb 22 d x ba x e dxcxxa ))(tgln()(cos 32/ 23 xdcxebax bx ln))(cos(ln 352 24 )7/()(cos)ln( 3243/ xdxbbaxae cx 25 )ln( )(tg )()sin(ln 32 /8/3 dx x dcxbebxa xb Таблица 5.2 Номер варианта Комбинация интервальной функции Z(x) Формула для вычисления ограничений Z(x) 0 86420 ,,,, fffff 2010ixi 1 97531 ,,,, fffff 103ixi 2 1411852 ,,,, fffff 2,14ixi 3 25151174 ,,,, fffff 805ixi 4 1612840 ,,,, fffff 997ixi 5 1713951 ,,,, fffff 306ixi 6 1816141210 ,,,, fffff 117ixi 7 1918171615 ,,,, fffff 123ixi 8 2524232120 ,,,, fffff 12ixi 9 22181260 ,,,, fffff 346ixi 246 Окончание табл. 5.2 Номер варианта Комбинация интервальной функции Z(x) Формула для вычисления ограничений Z(x) 10 2419852 ,,,, fffff 229ixi 11 2320872 ,,,, fffff 65ixi 12 18161421 ,,,, fffff 92ixi 13 2521171411 ,,,, fffff 457ixi 14 2322201610 ,,,, fffff 1411ixi 15 1312760 ,,,, fffff 10021ixi 16 18141383 ,,,, fffff 2715ixi 17 212015109 ,,,, fffff 113ixi 18 2419975 ,,,, fffff 2ixi 19 23211864 ,,,, fffff 6312ixi 20 251816142 ,,,, fffff 97ixi 21 2010543 ,,,, fffff 4125ixi 22 242019109 ,,,, fffff 292ixi 23 13121050 ,,,, fffff 7813ixi 24 1817432 ,,,, fffff 428ixi 25 242216136 ,,,, fffff 553ixi Таким образом, студент, выполняющий 4-й вариант, должен раз- работать алгоритм и программу для вычисления функции Z(x): ,0 , , , , , )( 16 12 8 4 0 f f f f f xZ , , , , , , 16 1612 128 84 40 0 xx xxx xxx xxx xxx xx ,1399167 ,1599127 ,439987 ,719947 ,999907 16 12 8 4 0 x x x x x 247 где xdcxbxef ax tgcossin2 4,320 , 10 1 3 4 )ln( dxcxaxxbf , xdxcxbxaf cos))(tgln()ln(sintg 38 , dxcxbxbxxaaf 3212 )7(/)7()(tg/)(cos)ln( , xdcxxbxaf 2lnctg)4sin()/1(cos 23316 . Значения параметров вычисляются как ,sin 7 1j ja 7 1ln 1 j j b , 7 1 3 )( j jjc , cbad . 5.2. Задачи по разработке алгоритмов и программ с использованием циклических процессов Постановка задачи. Разработать алгоритм и программу вычис- ления функции С(x1, x2, x3, x4), зависящей от четырех переменных x1, x2, x3, x4, которые изменяются по различным законам. Значения пе- ременных x1, x2, x3, x4 задаются на основе формул x1 = 5n; 25n (0,5n); x2 = n + 1; n + 10 (0,1n); x3 = 8 + n; n 2; n2 + 3; n2 + 0,4; x4 = n – 1; (n – 2) 2; n + 0,8; n + 20; где n – вариант задания. Вид функции С(x1, x2, x3, x4) выбирается из табл. 5.1 (i – вариант) при условии a = 1, b = 1, c = 1, d = 1, где каждое из слагаемых зави- сит от своей переменной. В программе необходимо предусмотреть вычисление значений С(x1, x2, x3, x4) для всех комбинаций x1, x2, x3, x4. Обязательно предусмотреть полный перебор x1, x2, x3, x4. Вы- числить сумму всех С(x1, x2, x3, x4) и вывести ее на монитор. В про- 248 грамме организовать вывод x1, x2, x3, x4, для которых выполняется условие –(20n + 1) С(x1, x2, x3, x4) (20n 2 + 1). Таким образом, для 4-го варианта необходимо написать про- грамму по вычислению функции С(x1, x2, x3, x4) = 10/1 4 3 321 )ln( xxxx , где x1 = 5·4; 25·4 (0,5·4) = 20; 100 (2); x2 = 4 + 1; 4 + 10 (0,1·4) = 5; 14 (0,4); x3 = 8 + 4; 16; 16 + 3; 16 + 0,4 = 12; 16; 19; 16,4; x4 = 4 – 1; (4 – 1) 2; 4 + 0,8; 4 + 20 = 3; 9; 4,8; 24. Таким образом, переменные 1x и 2x заданы с равномерными ша- гами 2 и 0,4, а 3x и 4x – массивами из четырех значений. Вывод С(x1, x2, x3, x4) при условии –(20·4 + 1) С(x1, x2, x3, x4) (20·4 2 + 1). Внимание. Если значение функции С(x1, x2, x3, x4) не определено при какой либо комбинации x1, x2, x3, x4, то на экран монитора выве- сти x1, x2, x3, x4, при которых С(x1, x2, x3, x4) не определена, и вывести фразу «C – не определена». 5.3. Задачи по разработке алгоритмов и программ для обработки матриц Постановка задачи. Разработать алгоритм и программу для нахождения максимального и минимального элементов матрицы Z размером 30 × 30 и их индексов (i, j). Экстремальные значения Z следует искать среди элементов, для которых выполняются условия .5010 ;3,03,0 ji zij 249 Элементы матрицы zij формируются исходя из условий ),cos( ),sin( 1n n ij f f z если если , , ji ji где n – номер варианта; nf , 1nf – функции, взятые из табл. 5.1 в соответствии с вариан- том n. Функция nf зависит от x, a, b, c, d (см. табл. 5.1), которые опре- деляются как x = n(i + j), a = n·i, b = n(i + 1), c = n·j, d = n(j + 1), где n – номер варианта. Если значение nf (x) не определено при заданных x, a, b, c, d , то zij = 0. Таким образом, для 4-го варианта задача конкретизируется сле- дующим образом. Разработать алгоритм и программу нахождения максимального и минимального элементов матрицы Z: , если)),cos()(cos(ln , если),)ln(sin( 34324.34 10 1 3 jixcxdbxax jidxcxaxxbzij x = 4(i + j), a = 4i, b = 4(i + 1), c = 4j, d = 4(j + 1). В программе организовать вывод максимального и минимально- го элементов, а также их индексов i и j в файл a.lst. 5.4. Задачи по разработке алгоритмов и программ для вычислений сложных сумм Постановка задачи. Разработать алгоритм и программу вычис- ления функции Z(x) = sin[S F(x)] в интервале x [–100, 100] с шагом x = 0,5. Величина S определяется как сумма, заданная в табл. 5.3, а 12 iiyi . Функция F(x) берется из табл. 5.1 в соответствии с вариантом задания. Значения a, b, c, d определяют как a = nx, 250 b = (n + 1)x, c = cos(nx), d = sin(nx). В программе организовать вывод x, Z(x) в соответствии с условиями, накладываемыми на Z(x). Если выполняется условие 1: cos(n) < Z(x) < sin(n + 1), то x и Z(x) выводят- ся в файл An.lst (n – вариант задания). Если выполняется условие 2: cos(n2) < Z(x) < sin(n2 + 1), то x и Z(x) выводятся в файл Bn.lst. Если выполняются одновременно оба условия, то вывод x и Z(x) произ- водится в файл Сn.lst. Если не выполняется ни одно из условий, то вывод x и Z(x) происходит в файл Dn.lst. При выводе можно огра- ничиться двадцатью значениями x и Z(x) в каждом из файлов. Таким образом, для 4-го варианта необходимо вычислить функ- цию 10 1 3)ln(sin)( dxcxaxxbSxZ , где a = 4x, b = 5x, c = cos(4x), d = sin(4x). Величина S определена как 10 1 2 20 1 10 1 )2( i ii i i i i yyyyS , где 1 2 iiyi . Определить Z(x) в интервале x = –100; 100 (0,5). Запись Z(x), x в файлы по условиям cos(4) < Z(x) < sin(5) An.lst; cos(16) < Z(x) < sin(18) Bn.lst; cos(4) < Z(x) < sin(5) и cos(4) < Z(x) < sin(5) Cn.lst; невыполнение условий Dn.lst. Если функция Z(x) не определена для данного x, то принять Z(x) = 1. Таблица 5.3 Вариант Вид функции Вариант Вид функции 0 100 1 10 1 42 )(/)sin( i i iii yyy 14 25 1 10 1 4 ))(cos()ln( i i ii yy 1 50 1 30 1 )30/)(/()) 2 1 ln(( i i i i i y y y 15 30 1 40 1 3)sin()cos( i i ji yy 2 100 1 30 1 272 )(/)sin( i i iiii yyyy 16 10 1 10 1 2))(cos(/)ln(( i i iiii yyyy 3 100 1 20 1 2 10 1 )()/1cos( i i ji j i yyy 17 70 1 30 1 25 15 3/2 ))ln(5cos()( i j i iji yyy 4 10 1 40 1 2 20 1 )2( i i ii i ii yyyy 18 40 1 10 1 23 3 2 20 1 5 )( )( i i iii i j j yyy yy 5 40 1 10 1 23 3 2 20 1 5 )( )( i i iii i j j yyy yy 19 100 1 10 1 45/4 ))(tg18(/)(cos i i iii yyy 6 30 1 10 1 2422 )ln()5(cos)(sin i i iiii yyyy 20 22 1 30 1 43 1 53 ))sin()(cos()( i i i iiii yyyy 2 4 9 Окончание таблицы 5.3 Вариант Вид функции Вариант Вид функции 7 30 1 50 1 2 )( i j ijj yyy 21 100 1 10 1 42 )( i i j jj y yy 8 35 1 10 1 2 15 2 5 )(/)sin(( i i ji j ii yyyy 22 10 1 25 1 2 10 1 343 ))(/()( i i i i i iiii y y yyyy 9 10 1 45 10 3/22 50 1 )cos()( i i iij j yyy 23 40 1 45 30 3 20 10 10 1 2/)( i i i i i i ii yyyy 10 40 1 10 1 23 20 1 )()( i i iii j ij yyyyy 24 15 1 10 1 4)cos()ln( i i ii yy 11 10 1 10 1 15 1 )) 30 1 (( i i iii j j yyyy 25 20 1 30 1 2 ) 1 ()ln( i i ii i yy y 12 10 1 30 1 2 20 1 )()( i i ii j ij yyyy 26 70 1 15 1 3 )( i i y ii ieyy 13 20 1 40 10 42 )cos(/)sin( i i iii yyy 2 5 0 253 5.5. Задачи по разработке алгоритмов и программ для решения нелинейных уравнений Постановка задачи. Разработать алгоритм и программу для ре- шения нелинейного уравнения (табл. 5.4) с параметрами методом дихотомии. С помощью программы вычислить все корни уравнений в соответствии с указанным вариантом и заданной точностью 410 . Параметр a задать самостоятельно методом перебора. Определить для каких значений параметра a уравнение имеет 1, 2, 3, 4, 5 действительных корней. Таблица 5.4 Номер варианта Уравнение 0 0)tg()(cos)(sin2 4,32 axaaxaxe ax 1 0ln 101 1 )cos( 4 7 8 aaxaxxae ax 2 0)(lnlnln 34/3 axaxaaxax 3 0)7(/)7()(tg/)cos()ln( aaxaxaxaxxa 4 0)ln( 10/13 aaxaxaxxa 5 0)cos()(ln 34324.34 axaxaaxax 6 0)1/()ln( )70()50ln( 33 44 axxa xaxaae x 7 0)(ln)(tg)sin(cos 243 axaxaaxaxa 8 0)cos())(tgln()ln(sin)tg( 3 axaxaxaxa 9 0)(sin)(tg)cos(/ 4/3223 axaaxaxexa ax 10 0)ln( 5 1 )cos( 4 aaxax x axae x 11 0/)(ln)sin()cos(ln 334 aaxxaxxaax 254 Окончание табл. 5.4 Номер варианта Уравнение 12 0)7(/)7()(tg/)(cos)ln( 32 aaxaxaxaxxaa 13 0)cos(/)(tg)ln( 35/4 axaxaxaxxa 14 0)(tg)sin()(ln 3423 axaaxaxxa 15 0)2/()ln( )()5ln( 3 334 aaxa axaxxaae x 16 0)(ln)(tg)sin(cos 233 aaxaaxaaxaxa 17 0)cos())(tgln( )sin(ln)/(cos 2/ 24/3 axxa xaaaxa a 18 0)(sin)cos( 25 axxaeaxaax aax 19 0)sin()ln()cos( 2 3 2 aax x ax axaxe ax 20 0)ln()(ln33 axaxaxaax aa 21 0 )ln( )7()ln(/)cos()ln( 7/2 2 a ax e a axaxax ax xa 22 0))(tgln()(cos 32/ a x e axaxxa a x aa 23 0ln))(cos(ln 352 axaaxeaax ax 24 0)7/()(cos)ln( 3243/ aaxaxaaaxae ax 25 0 )ln( )(tg )()sin(ln 32 /3 a ax x aaxaeaxa xa 255 Результатом решения задачи должны быть все решения уравне- ния F(x, a) = 0 в зависимости от параметра a. Пример оформления результатов решения уравнения F(x, a) = 0 представлен в табл. 5.5. Таблица 5.5 Параметр a Корни уравнения F(x,a) = 0 Число корней уравнения a1 x11 1 a2 x21, x22 2 a3 x31, x32, x33 3 a4 x41, x42, x43, x44 4 a5 x51, x52, x53, x54, x53 5 Эта таблица должна иллюстрировать количество корней уравне- ния для F(x, а) = 0 (ограничиться пятью корнями при заданном па- раметре а). Построить график функции F(x, а) от x для параметра a, соответствующего наибольшему количеству корней, найденных в задании. Если заданное число корней (5) не удалось найти, то сле- дует объяснить почему. 5.6. Задачи по разработке алгоритмов и программ для аппроксимации табулированных функций Постановка задачи. Разработать алгоритм и программу для выбора аппроксимирующего многочлена вида n mxAxAxAAy ... 2 210 для табулированных функций y1, y2, …, y6. Значения переменных x для построения многочлена yi = f(x) (исходные данные) представлены в табл. 5.6, варианты заданий – в табл. 5.7. Таблица 5.6 Номер наблюдения x 1y 2y 3y 4y 5y 6y 1 2 3 4 5 6 7 8 1 0,1 2,57 0,15 2,98 3,19 6,54 7,26 2 0,3 3,87 -0,01 3,45 1,59 6,63 7,95 3 0,5 5,67 0,46 3,84 0,4 6,83 8,77 4 0,7 8,39 1,71 3,87 0,22 7,34 9,72 5 0,9 12,9 3,94 3,24 1,95 8,44 10,78 6 1,1 20,47 7,4 1,73 6,84 10,48 12,45 Окончание табл. 5.6 256 1 2 3 4 5 6 7 8 7 1,3 32,84 12,41 -0,67 16,58 13,71 14,74 8 1,5 52,17 19,47 -3,78 33,4 18,7 18,18 9 1,7 81,1 29,21 -7,07 60,08 25,87 23,36 10 1,9 122,68 42,49 -9,62 100,1 35,76 30,99 11 2,1 180,44 60,43 -10,04 157,67 48,93 41,97 12 2,3 268,38 84,42 -6,39 237,83 65,97 57,38 13 2,5 360,93 116,18 3,89 346,5 87,52 78,45 14 2,7 493,01 157,8 24,08 490,6 114,23 106,65 15 2,9 660 211,78 58,21 678,09 146,8 143,64 16 3,1 867,76 281,04 111,19 918,06 185,93 191,28 17 3,3 1122,64 369 188,86 1220,08 232,35 251,71 18 3,5 1431,43 479,59 298,07 1597,9 286,78 327,27 19 3,7 1801,46 617,3 446,74 2062,29 349,99 420,58 20 3,9 2240,52 787,21 643,99 2628,34 422,73 534,52 21 4,1 2756,88 995,04 900,13 3311,95 505,74 672,24 22 4,3 3359,35 1247,17 1226,83 4130,59 599,78 837,2 23 4,5 4057,19 1550,71 1637,14 5103,4 705,6 1033,14 24 4,7 4860,21 1913,5 2145,58 6251,27 823,94 1264,13 25 4,9 5778,7 2344,18 2768,2 7596,91 955,52 1534,54 26 5,1 6823,5 2852,21 3532,71 9164,91 1101,05 1849,11 27 5,3 8005,85 3447,91 4428,49 10980,87 1261,21 2212,91 28 5,5 9337,7 4142,52 5506,72 13076,4 1436,67 2631,36 29 5,7 10831,38 4948,19 6780,41 15479,26 1628,06 3110,26 30 5,9 12499,79 5878,09 8274,53 18223,42 1835,97 3665,8 31 6,1 14356,37 6946,36 10016,04 21344,1 2060,97 4274,55 32 6,3 16415,09 8768,24 12033,99 24878,92 2303,59 4973,5 33 6,5 18690,45 9560,03 14359,59 28867,9 2564,29 5760,63 34 6,7 21197,51 11139,19 17026,29 33353,59 2843,52 6641,98 35 6,9 23951,86 12924,34 20069,86 38381,12 3141,65 7627,6 36 7,1 26969,66 14935,29 23528,45 43998,25 3459 8725,62 37 7,3 30267,6 17193,14 27442,7 50255,62 3795,83 9945,22 38 7,5 33862,96 19720,24 31855,77 57806,5 4152,36 11296,05 39 7,7 37773,55 22540,29 36813,46 64907,16 4528,7 12788,24 40 7,9 42017,77 25678,32 42364,27 73416,84 4924,93 14432,44 Таблица 5.7 Номер варианта Вид функции Степени аппроксимирующего многочлена 1 2 3 0 )(1 xfy 3, 5, 7 1 )(2 xfy 2, 4, 6 2 )(3 xfy 2, 3, 4 Окончание табл. 5.7 257 1 2 3 3 )(4 xfy 3, 4, 7 4 )(5 xfy 3, 4, 6 5 )(6 xfy 2, 3, 5 6 )( 12 yfy 2, 7, 8 7 )( 13 yfy 3, 5, 6 8 )( 14 yfy 3, 7, 8 9 )( 15 yfy 2, 5, 6 10 )( 16 yfy 3, 4, 5 11 )( 23 yfy 3, 4, 7 12 )( 24 yfy 3, 6, 7 13 )( 25 yfy 2, 3, 6 14 )( 26 yfy 2, 4, 5 15 )( 34 yfy 3, 4, 6 16 )( 35 yfy 3, 5, 7 17 )( 36 yfy 2, 4, 6 18 )( 45 yfy 2, 3, 4 19 )( 46 yfy 3, 4, 7 20 )( 56 yfy 3, 5, 7 21 )(ln 2 xfy 2, 4, 6 22 )(ln 3 xfy 2, 3, 4 23 )(ln 4 xfy 3, 4, 7 24 )(ln 5 xfy 2, 3, 4 25 )(ln 6 xfy 3, 4, 7 При построении многочлена для функции f(x) = ln y необходимо данные iy линеаризовать, прологарифмировав данные столбца. При разработке алгоритма и программы можно пользоваться программой для решения системы линейных уравнений (п. 3.1). При этом каждый студент решает свою систему линейных уравне- 258 ний, которую необходимо составить на основе данных табл. 5.6 и 5.5. Например, для расчета коэффициентов полинома 6-й степени 6543210 ,,,,,, AAAAAAA необходимо решить систему уравнений вида , , , , , , 566554433221100 466554433221100 366554433221100 266554433221100 166554433221100 066554433221100 CAtAtAtAtAtAtAt CAtAtAtAtAtAtAt CAtAtAtAtAtAtAt CAtAtAtAtAtAtAt CAtAtAtAtAtAtAt CAtAtAtAtAtAtAt где 400t , 40 1 1 i ixt , 40 1 2 2 i ixt , 40 1 3 3 i ixt , 40 1 4 4 i ixt , 40 1 5 5 i ixt , 40 1 6 6 i ixt , 40 1 0 i iyC , 40 1 1 i ii yxC , 40 1 2 2 i ii yxC , 40 1 3 3 i ii yxC , 40 1 4 4 i ii yxC , 40 1 5 5 i ii yxC . Результаты решения задачи должны включать найденные коэф- фициенты полиномов iA и построение графика )(xfyi вместе с исходными данными. Для трех различных полиномов (степень по- линома, см. табл. 5.6) рассчитать среднеквадратическое отклонение 40 1 2))(( 1 i iyxy n , где iy – табулированное значение; y(x) – аппроксимированный многочлен, по которому нужно оценить близость полинома к исходным данным (см. табл. 5.5). Сделать выводы о лучшей степени аппроксимации функции. Таким образом, студент, выполняющий 4-й вариант, должен по- строить полиномы вида 259 6 6 5 5 4 4 3 3 2 2105 4 4 3 3 2 2105 3 3 2 2105 , , xAxAxAxAxAxAAy xAxAxAxAAy xAxAxAAy и вычислить среднеквадратическое отклонение для каждого поли- нома. 5.7. Задачи по разработке алгоритмов и программдля численного интегрирования и дифференцирования функции Постановка задачи. Разработать алгоритм и программу для численного дифференцирования и интегрирования функции )(xfi . Варианты функции представлены в табл. 5.1 (a = 1, b = 1, c = 1, d = 1). Пределы интегрирования функции равны 2Hx , 10Kx . При построении программы воспользоваться формулами прил. 2. Студенты, выполняющие четный вариант, при выполнении инте- грирования реализуют метод Симпсона, нечетный вариант – метод трапеций. По разработанной программе рассчитать значение инте- грала для различных шагов разбиения. Построить зависимость или таблицу значений интеграла от шагов разбиения. Таким образом, студент, выполняющий вариант 4, должен вы- числить дифференциальную кривую dx df , воспользовавшись фор- мулой x xfxxf dx xdf )()()( , где x – шаг аргумента (выбирается самостоятельно, например x1 = 0,1; x2 = 0,01; x3 = 0,001). Так, для 4-го варианта 10/13)ln()( xxxxxf . Пример оформления результатов дифференцирования представлен в табл. 5.8. 260 Таблица 5.8 i 12 xx 23 xx 34 xx … 1nn xx if )()( 12 xfxf … dx dfi )/())()(( 1212 xxxfxf … Написать алгоритм и программу вычисления интеграла 10 2 10/13 ]ln[ dxxxxxS , воспользовавшись формулой Симпсона (4 – четный вариант). По- строить график зависимости S (значение интеграла) = )( ixf ( ix – шаг разбиения). Сделать выводы. Предложить варианты расчета ин- теграла с заданной точностью 610 . В отчет необходимо вклю- чить следующие результаты: дифференциальная кривая, значение интеграла для разных шагов разбиения. 5.8. Задачи по разработке алгоритмов и программ для численного решения дифференциальных уравнений Постановка задачи. Разработать алгоритм и программу для ре- шения дифференциального уравнения вида ),( yxfy методом Рунге-Кутта. Варианты функций f(x, y) представлены в табл. 5.1 и должны быть сформулированы по правилу a = b = c = d = y. Граничные условия выбрать с учетом формул 25 1 0 n x , 2 25 1n xn , 25 4 0 n y , ,53 ,203 n n k ,10 ,10 n n где n – вариант заданий. Уравнение решается на отрезке [ nxx ,0 ] при разбиении его на k (шаг) равных частей . Точность вычислений 510 . 261 Исследовать влияние числа разбиений k на вид решения )(xyi . Таким образом, студенты, решающие 4-й вариант, должны напи- сать программу по решению уравнения yyxyxyxxyy 10/13)ln( , на участке 2,0 25 14 0x , 2,22 25 14 nx для начального зна- чения 25 44 0y при k = 3·4 + 20 = 32. В отчете необходимо представить постановку задачи, алгоритм, программу и результаты, содержащие табулированную функцию y = f(x) для трех различных шагов разбиения. Для выбора первого шага (k) воспользоваться вышеприведенной формулой. Два других шага выбрать самостоятельно. Построить графики y = f(x) для участка [x0, xn] для различных шагов разбиения. 5.9. Задачи по разработке технологии численного решения уравнений в частных производных в MS EXCEL Постановка задачи. Разработать алгоритм и программу для ре- шения уравнения 2 2 2 2 y T x T q t T , где T(t, x, y) – температура в момент t для координат области x, y; q – коэффициент температуропроводности. Вид двухмерной плоскости задается на основе рис. 5.1. В прямоугольной области среды располагаются две отливки прямоугольной формы из разных металлов. Размеры прямоугольни- ков, области расположения отливок, начальные значения темпера- туры клеток областей (отливок и среды), коэффициент температу- ропроводности выбираются по данным, представленным в табл. 5.9. В табл. 5.9 значения a и b – это высота и ширина области среды, a1 262 и b1 – это высота и ширина отливки 1, a2 и b2 – это высота и ширина отливки 2 (размерность значений – число клеток в MS EXCEL), q1, q2, q – коэффициенты температуропроводности соответственно от- ливки 1, отливки 2, области среды. Начальная температура отлив- ки 1 вычисляется по формуле nT 503001 ; начальная температура отливки 2 2 2 700 nT ; начальная температура области среды nT 10 , где n – номер варианта. b1 а1 T1 T2 b2 a2 T T T b a Отливка 1 Отливка 2 Среда Рис. 5.1 Рассчитать температурное поле охлаждения отливок для трех случаев: – для заданных коэффициентов температуропроводности (q1, q2, q3); – коэффициенты температуропроводности повышены на 50 %; – коэффициенты температуропроводности повышены на 75 %. Таблица 5.9 263 Номер варианта, n a1 b1 a2 b2 a b q1 q2 q 1 8 25 16 10 20 50 30 45 70 2 10 30 18 8 21 49 31 44 69 3 10 40 17 6 22 48 32 43 68 4 12 32 20 12 23 47 33 42 67 5 14 33 19 10 24 46 34 41 66 6 10 35 21 14 25 45 35 40 65 7 15 37 23 15 26 44 36 39 64 8 8 38 24 13 27 43 37 38 63 9 12 39 26 12 28 42 38 37 62 10 10 25 25 11 29 40 39 3 61 11 11 26 28 10 30 40 40 34 60 12 7 27 15 8 20 41 41 35 59 13 10 28 16 7 21 42 42 33 58 14 12 29 19 10 22 43 43 32 57 15 13 30 21 9 23 44 44 31 56 16 14 25 20 8 24 45 45 30 55 17 12 26 23 6 25 46 46 50 54 18 8 27 17 6 26 47 47 49 53 19 9 28 25 10 27 48 48 48 52 20 10 22 26 13 28 49 49 47 51 21 14 19 25 10 29 50 50 46 50 22 12 25 27 8 30 49 51 45 70 23 7 15 13 6 20 48 52 44 69 24 6 30 14 5 21 47 53 43 68 25 10 22 16 7 22 46 54 42 67 Так, например, для варианта 2 (n = 2) условия задачи будут зада- ваться следующим образом. Шаг 1. Определение размеров прямоугольников и коэффициен- тов температуропроводности из табл. 5.9: a1 = 10 клеток, b1 = 30 клеток, a2 = 18 клеток, b2 = 8 клеток, a = 21 клетка, b = 49 клеток, q1 = 31, q2 = 44, q = 69. Шаг 2. Определение начальных температур отливок и области среды по формулам С 4002503001T , С7042700700 222 nT , 264 C.12210T Шаг 3. Построение в MS EXCEL клеточной структуры среды и отливки. Для того чтобы среда отображалась во весь экран без про- крутки, необходимо уменьшить ширину столбцов, для этого нужно выделить столбцы, которые необходимо уменьшить, выбрать Фор- мат – Столбец – Ширина и в появившемся диалоговом окне задать ширину столбцов, например, 2. Для корректного отображения тем- пературы в клетках необходимо уменьшить шрифт. Вид получен- ной клеточной структуры представлен на рис. 5.2. Рис. 5.2 5.10. Задачи по разработке технологии решения системы линейных уравнений в MS EXCEL Постановка задачи. Разработать алгоритм решения системы ли- нейных уравнений с пятью неизвестными в MS EXCEL, если коэф- фициенты системы вычисляются по закону, заданному в табл. 5.10. Например, для 1-го варианта коэффициенты вычисляются как аij= )2sin( 2 jiji , )10(tg3 ici , где i = 1; 5 (1), j = 1; 5 (1), (1 – шаг изменения переменной). Система линейных уравнений после вычисления коэффициентов должна иметь вид 265 . xxxx cxaxaxaxaxa cxaxaxaxaxa caaaaxa cxaxaxaxaxa cxaxaxaxaxa 55 2 55454353252151 ,45454 2 44343242141 ,35354343 2 33232131 ,25254243232 2 22121 ,15154143132121 2 11 Решить сформированную систему линейных уравнений, исполь- зовав встроенные функции MS EXCEL, предварительно определив коэффициенты при неизвестных j по формулам, представленным в табл. 5.10 по вариантам заданий. Таблица 5.10 Номер варианта Число неизвестных j аij ci 1 2 3 4 1 8 jiji 2 sin 2 10tg 3 i 2 9 22 3 cos iijj 5 sin3 i 3 10 jiln 3 sin2 2i 4 11 10 tg ji 322 ii 5 12 2 2 log ji 23 5 sin2 i 6 8 jiji 12 sin3 23 cos ii 7 9 ji22 tg ii 24 8 10 22 12 log ji 22 sin12 i 9 11 ji 5 sin13 3 ii 310ln 2 10 12 ji 5 sin5 1ctg3 i 11 8 2 12 2 log ji 232 cos ii 12 9 jiji 8 sin 2 105tg 2 i 13 10 22 26 cos3 iij 5 sin3 i 2 6 4 Продолжение табл. 5.10 1 2 3 4 14 11 ji5ln10 38 sin 2i 15 12 84 4tg2 ji 232i 16 8 2 5 5 log8 ji ji 42 5tg 2 17 9 jiji 22 sin2 23 4 cos14 ii 18 10 ji 8 8tg 22 ii 524 19 11 22 12 log ji 52 sin25 i 20 12 ji 5 sin13 3 ii 310ln7 2 21 8 ji 5 2sin5 72ctg3 i 22 9 22 2 2 log2 ji 232 32 cos3 ii 23 10 jiji 33 sin3 2 22tg 2 i 24 11 23 3 cos2 ijj 5,1 sin5,1 i 25 12 ji 4ln4 5 sin5 5i 26 8 ji2 2tg 1444 2 ii 2 6 5 Продолжение табл. 5.10 1 2 3 4 27 9 ji 82 ,8tg1 2 3 log5 23 i 28 10 jiji 5,12 sin2 2 233 3 cos2 ii 29 11 ji 7 7tg 22 ii 614 6 30 12 22 7 7 log7 ji 24 4 sin4 i 31 8 ji 58 sin8 2 3ln3 2i 32 9 ji 4 sin6 1tg 33 i 33 10 22 3 3 log3 ji ii 34 cos4 34 11 iji 28 sin8 2 155tg3 i 35 12 222 1,5 cos5,1 ij 155 sin4 2 i 36 8 ji 7ln7 2 sin2 22 i 37 9 ji 3 3tg2 1824 2 ii 38 10 25 5 sin2 i 44 log4 222 i 39 11 jiji 33 sin3 3 52 5tg- 2i 2 6 6 Окончание табл. 5.10 1 2 3 4 40 12 ji22 1,5tg ii 57 2 41 8 2 5 5 log5 ji 22 5 sin5,2 i 42 9 ji 5 sin13 3 ii 314ln4 2 43 10 ji 32 sin3 2 115tg2 i 44 11 2 8 32 log3 ji 23 34 cos4 ii 45 12 ji23 sin3 124tg2 i 46 8 22 77 cos7 iijj 52 sin3 2 i 47 9 ji7ln7 8 sin5 22 i 48 10 122 2tg2 ji 525 2 ii 49 11 25 5 log5 ji 244tg 2 i 50 12 jiji 412 sin4 232 2 cos ii 2 6 7 270 5.11. Задачи по разработке технологии решения нелинейных уравнений в MS EXCEL Постановка задачи. Разработать алгоритм решения нелинейных уравнений вида f(x) = 0, используя метод дихотомии на отрезке [а, b]. Определить число корней на указанном отрезке, используя гра- фические средства MS EXCEL. Найти три любых корня уравнения с точностью ε = 0,01. Варианты заданий представлены в табл. 5.11. Таблица 5.11 Номер варианта Функция f(x) a b 1 2 3 4 1 4 4sin x -10 10 2 xx 7 sin 4 cos5 -5 15 3 x x 4 cos 1 1 cos4 -11 21 4 4cossin 2 x -14 6 5 xxx 4 cos5 sin23 cos -5 25 6 xx 7 ctg4 tg -16 8 7 xxx 27 cos4 2 -13 40 8 312sin211sin5 2 xx -8 30 9 13log12log 54 xx -17 8 10 xx 3cos23cos 23 -20 14 11 )6sin()3sin( xx -12 18 12 )7tg()5tg( xx -19 5 13 )2ctg()ctg( xx -4 24 14 xx 3cos23cos 23 -5 17 15 xx 3sin43sin 24 -10 10 16 xx 4 tg3tg2 -5 15 271 Продолжение табл. 5.11 1 2 3 4 17 xx 11ctg4 ctg 3 -11 21 18 xxx 4 sin7cos4sin 32 -14 6 19 4 4sin x -5 25 20 xx 7 sin 4 cos5 -16 8 21 x x x 4 cos 1 1 cos4 10 tg3 -13 40 22 8ln4cossin 2 xx -8 30 23 xxx 4 cos5 sin23 cos -17 8 24 xxx 11 tg7 ctg4 tg -20 14 25 xxx 27 cos4 2 -12 18 26 312sin211sin5 2 xx -19 5 27 14log13log 65 xx -4 24 28 xx 3 cos33cos3 -5 17 29 )11sin()9sin()6sin()3sin( xxxx -10 10 30 )7tg()5tg()3tg()tg( xxxx -5 15 31 )9ctg()ctg(7)2ctg()ctg( xxxx -11 21 32 73 cos33cos23cos 23 xxx -14 6 33 773sin43sin 24 xx -5 25 34 xxx 7ctg24 tg3tg2 -16 8 35 xxx 3ctg11ctg4 ctg 23 -13 40 36 xxx 4 sin7cos4sin 32 -8 30 37 80 4 4sin5ln xx -17 8 38 xxx 7 sin 4 cos510log2 -20 14 272 Окончание табл. 5.11 1 2 3 4 39 x x x 4 cos 1 1 cos4 10 tg3 -12 18 40 8ln4cossin 2 xx -19 5 41 xxx 4 cos5 sin23 cos -4 24 42 xxx 11 tg7 ctg4 tg -14 6 43 xxx 27 cos4 2 -5 25 44 312sin211sin5 2 xx -16 8 45 14log13log12log 654 xxx -13 40 46 73 cos33cos23cos 23 xxx -8 30 47 )11sin()9sin()6sin()3sin( xxxx -17 8 48 )7tg()5tg()3tg()tg( xxxx -20 14 49 )9ctg()ctg(7)2ctg()ctg( xxxx -12 18 50 73 cos33cos23cos 23 xxx -19 5 5.12. Задачи по разработке технологии аппроксимации полиномов табулированных функций в MS EXCEL Постановка задачи. Построить два аппроксимационных поли- нома с различными степенями по табличным функциям, определен- ным в задании. Значения функций заданы в табл. 5.12. Таблица 5.12 Номер варианта x y1 y2 y3 y4 y5 y6 y7 1 2 3 4 5 6 7 8 9 1 0,1 1,345 -8,003 -19,0 -8 9,99 69,9 -170 2 0,6 1,6 1,352 9,0 -8,0 9,99 69,998 -170,2 3 1,1 6,005 8,007 29,0 -8,4 9,19 69,2 -170,3 4 1,6 35,56 9,712 34,1 -8,1 9,76 69,5 -170,5 5 2,1 126,265 4,217 17,6 -8,2 9,373 69,11 -171,06 6 2,6 329,12 -10,728 -27,1 -8,5 9,94 69,39 -176,08 7 3,1 70,125 -37,373 -107,1 -8,8 9,91 69,56 -179,9 8 3,6 1350,28 -77,968 -228,8 -8,13 9,866 69,925 -170,011 273 Продолжение табл. 5.12 1 2 3 4 5 6 7 8 9 9 4,1 235,585 -134,763 -399,2 -8,19 9,798 69,929 -170,012 10 4,6 387,04 -210,008 -624,9 -8,27 9,711 70,068 -170,013 11 5,1 580,645 -305,953 -912,7 -8,365 9,6079 70, -170,014 12 5,6 8647,4 -424,848 -1269,3 -8,47 9,482 70,027 -170,015 13 6,1 1223,31 -568,943 -1701,51 -8,59 9,3304 70,06 -170,015 14 6,6 179,36 -740,488 -2215,92 -8,73 9,1522 70,143 -170,014 15 7,1 23041,57 -941,733 -2819,31 -8,891 8,9466 70,15 -170,012 16 7,6 3000,09 -1174,93 -3518,4 -9,06 8,7092 70,235 -170,008 17 8,1 353,43 -1442,32 -4319,89 -9,245 8,4404 70,328 -170,001 18 8,6 500,08 -1746,17 -5230,45 -9,437 8,193 70,443 -169,991 19 9,1 6376,89 -2088,71 -6256,78 -9,63 7,7941 70,593 -169,976 20 9,6 79204,84 -2472,21 -7405,51 -9,834 7,41374 70,78657 -169,954 21 10,1 97409,95 -2898,9 -8683,31 -10,09 6,992345 71,02071 -169,923 22 10,6 118583,2 -3371,05 -10096,8 -10,28 6,52795 71,30643 -169,881 23 11,1 143030,6 -3890,89 -11652,5 -10,478 6,018553 71,65176 -169,826 24 11,6 171073,2 -4460,69 -13357,2 -10,53 5,462163 72,06554 -169,752 25 12,1 203046,9 -5082,68 -15217,2 -10,09 4,856804 72,55744 -169,657 26 12,6 2902,7 -559,13 -1739,2 -10,253 4,251 73,18 -169,534 27 13,1 2006,7 -6492,27 -19429,7 -10,83 3,491327 73,815 -169,377 28 13,6 3239,9 -7284,37 -2795 -10,88 2,727314 74,6179 -169,18 29 14,1 3798,2 -8137,66 -241,8 -10,866 1,906 75,53078 -168,934 30 14,6 4392,6 -9054,41 -276,2 -10,76 1,027 76,59003 -168,63 31 15,1 4949,2 -10036,9 -3004,8 -10,4786 0,0875 77,80497 -168,255 32 15,6 56309 -11087,2 -333,8 -10,13 -0,916 79,19216 -167,798 33 16,1 64567,9 -12207,8 -3669,5 -9,70228 -1,982 80,766 -167,244 34 16,6 73077 -13400,9 -4008,1 -9,11796 -3,112 82,555 -166,576 35 17,1 8232,2 -14668,6 -4375,7 -8,37 -4,31 84,569 -165,776 36 17,6 9254,5 -16013,3 -4778,6 -7,467 -5,582 86,8362 -164,822 37 18,1 106140 -17437,2 -5202,6 -6,36 -6,93 89,312 -163,69 38 18,6 11620 -18942,6 -56463,9 -5,04 -8,346 92,223 -162,354 39 19,1 1287309 -20531,6 -6118,3 -3,482 -9,832 95,319 -160,784 40 19,6 14270 -22206,6 -66121,7 -1,66 -11,48 98,867 -158,947 41 20,1 15579 -23969,8 -712,9 0,4467 -13,56 102,777 -156,806 42 20,6 1465 -25823,4 -76798,5 2,8712 -14,748 107,35 -154,319 43 21,1 1915 -27769,8 -8253,2 5,6427 -16,51 111,794 -151,443 44 21,6 2111 -29811,1 -88539,6 8,781 -18,47 116,937 -148,128 45 22,1 237 -31949,6 -94823 12,31 -20,42 122,52 -144,318 46 22,6 2536 -34187,5 -10139 16,34 -22,5425 128,891 -139,954 47 23,1 2863 -36527,2 -108242 20,78 -24,73 135,706 -134,971 48 23,6 3089 -38970,8 -1159 25,778 -26,91 143,134 -129,297 49 24,1 3211 -41520,6 -122833 31,34 -29,2938 151,227 -122,853 50 24,6 3538 -44178,8 -130580 37,4297 -31,711 160,016 -115,555 51 25,1 3898 -46947,8 -138634 44,181 -34,265 169,5498 -107,311 52 25,6 41931 -49829,6 -14701 51,61 -36,8957 179,8744 -98,0192 53 26,1 45493 -5226,7 -15685 59,74 -39,6264 191,038 -87,5727 54 26,6 48055 -5541,3 -16689 68,26 -42,4582 203,0907 -75,8536 274 Окончание табл. 5.12 1 2 3 4 5 6 7 8 9 55 27,1 52603 -59175,5 -17420 78,45 -45,3927 216,0847 -62,7355 56 27,6 562938 -6231,7 -13680 89,08308 -48,4315 230,074 -48,0817 57 28,1 6097877 -66012,1 -193674 100,6349 -51,5763 245,1147 -31,7454 58 28,6 65249 -69619 -204005 113,16 -54,8285 261,2649 -13,5685 59 29,1 70102 -73354,5 -21478 126,745 -58,1898 278,5851 6,618548 60 29,6 7516696 -77221 -2295 141,423 -61,6618 297,1375 28,99778 61 30,1 80407 -81220,7 -23060 157,264 -65,2459 316,9868 53,76401 62 30,6 8591 -85355,8 -24777 174,338 -68,9437 338,1998 81,12576 63 31,1 91690 -89628,7 -26848 192,69 -72,7567 360,8457 111,3058 64 31,6 97778 -9041,5 -273276 212,42 -76,6865 384,9958 144,542 65 32,1 104168 -9896,5 -26063 233,59 -80,7345 410,7238 181,0881 66 32,6 110830 -103296 -29213 256,26 -84,9023 438,1058 221,2142 67 33,1 117880 -108142 -31727 280,55 -89,1912 467,2203 265,208 68 33,6 125129 -113137 -326606 306,4 -93,6028 498,12 313,3752 69 34,1 13773 -118283 -340854 334,9 -98,1384 530,9 366,07 70 34,6 1474 -123583 -355472 363,92 -102,8 565,78 423,92 71 35,1 1496 -129039 -370460 395,42 -107,588 602,65 486,64 72 35,6 1572 -1352 -385820 428,36 -112,504 641,70 554,794 73 36,1 166917 -140426 -401553 463,9 -117,551 682,99 628,84 74 36,6 1762 -1462 -417658 501,4 -122,72 726,64 709,61 75 37,1 181923 -152462 -434138 541,67 -128,08 772,74 797,38 76 37,6 196312 -15830 -450990 584,56 -133,42 821,40 892,39 77 38,1 207373 -165167 -468216 628,9 -139,02 872,71 995,22 78 38,6 21439 -1775 -485814 676,32 -144,778 926,79 1106,65 79 39,1 230055 -178557 -503784 726,53 -150,61 983,75 1227,4 80 39,6 2410982 -1815 -522125 779,51 -156,24 1043,69 1356,977 Варианты заданий представлены в табл. 5.13. Таблица 5.13 Номер варианта Виды функции Максимальные степени многочленов 1 2 3 1 y1 = f(x), y2 = f(y1) 3, 4, 5 2 y2 = f(x), y3 = f(y1) 4, 5, 6 3 y3 = f(x), y4 = f(y1) 3, 5, 7 4 y4 = f(x), y5 = f(y1) 4, 6, 8 5 y5 = f(x), y6 = f(y1) 2, 4, 6 6 y6 = f(x), y7 = f(y1) 5, 6, 7 7 y7 = f(x), y3 = f(y2) 4, 5, 8 8 y1 = f(y3), y2 = f(y4) 3, 4, 5 9 y2 = f(y3), y3 = f(y4) 4, 5, 6 275 Продолжение табл. 5.13 1 2 3 10 y3 = f(y5), y4 = f(y6) 3, 5, 7 11 y4 = f(y3), y5 = f(y4) 4, 6, 8 12 y5 = f(y3), y6 = f(y4) 2, 4, 6 13 y6 = f(y3), y7 = f(y4) 5, 6, 7 14 y7 = f(y3), y3 = f(y4) 4, 5, 8 15 y1 = f(y5), ln(y2) = f(y1) 3, 4, 5 16 y2 = f(y5), ln(y3) = f(y1) 4, 5, 6 17 y3 = f(y5), ln(y4) = f(y1) 3, 5, 7 18 y4 = f(y5), ln(y5) = f(y1) 4, 6, 8 19 y5 = f(y6), ln(y6) = f(y1) 2, 4, 6 20 y6 = f(y5), ln(y7) = f(y1) 5, 6, 7 21 y7 = f(y5), ln(y3) = f(y2) 4, 5, 8 22 y1 = f(y6), ln(y2) = f(y4) 3, 4, 5 23 y2 = f(y6), ln(y3) = f(y4) 4, 5, 6 24 y3 = f(y6), ln(y4) = f(y6) 3, 5, 7 25 y4 = f(y6), ln(y5) = f(y4) 4, 6, 8 26 y5 = f(y7), ln(y6) = f(y4) 2, 4, 6 27 y6 = f(y6), ln(y7) = f(y4) 5, 6, 7 28 y7 = f(y6), ln(y3) = f(y4) 4, 5, 8 29 ln(y1) = f(x), y2 = f(y1) 3, 4, 5 30 ln(y2) = f(x), y3 = f(y2) 4, 5, 6 31 ln(y3) = f(x), y4 = f(y2) 3, 5, 7 32 ln(y4) = f(x), y5 = f(y2) 4, 6, 8 33 ln(y5) = f(x), y6 = f(y2) 2, 4, 6 34 ln(y6) = f(x), y7 = f(y2) 5, 6, 7 35 ln(y7) = f(x), y3 = f(y2) 4, 5, 8 36 y1 = f(x), y2 = f(y1) 4, 5, 6 37 y2 = f(x), y3 = f(y1) 5, 6, 7 38 y3 = f(x), y4 = f(y1) 6, 7, 8 39 y4 = f(x), y5 = f(y1) 3, 4, 5 40 y5 = f(x), y6 = f(y1) 4, 5, 6 41 y6 = f(x), y7 = f(y1) 5, 6, 7 42 y7 = f(x), ln(y3) = f(y2) 4, 5, 8 43 y1 = f(y3), ln(y2) = f(y1) 3, 4, 5 44 y2 = f(y3), ln(y3) = f(y4) 4, 5, 6 45 y3 = f(y5), y4 = f(y6) 3, 4, 5 46 y4 = f(y3), y5 = f(y4) 4, 5, 6 276 Окончание табл. 5.13 1 2 3 47 y5 = f(y3), y6 = f(y4) 5, 6, 7 48 y6 = f(y3), y7 = f(y4) 7, 8, 9 49 y7 = f(y3), y3 = f(y4) 3, 5, 7 50 y1 = f(y5), ln(y2) = f(y1) 4, 6, 8 Если вид функции дается с использованием логарифма, то соот- ветствующий столбец необходимо прологарифмировать. Например, при построении многочлена для функции ln(y7) = f(x) необходимо столбец у7 прологарифмировать, а многочлен должен быть построен по новым значениям столбца. 5.13. Задачи по разработке технологии численного дифференцирования функций в MS EXCEL Постановка задачи. Провести табуляцию функции, заданной в табл. 5.14, в соответствии с вариантом задания на интервале [–3 , 3 ]. Шаг табуляции выбрать самостоятельно. Численно про- дифференцировать эту функцию, определив )(xf , )(xf , )(xf , )(xf . Использовать формулы для левых, правых и центральных разностей. Графически сравнить результаты численного дифферен- цирования, изобразив на одном рисунке дифференциальную кри- вую, полученную тремя методами. Вычислить суммы, составленные из дифференциальных кривых для трех шагов табуляции: х – пер- вичный шаг табуляции; 21 xx ; 222 xx ; 23 xx ; 1 1 1 )( n i ixfS ; 1 1 2 )(sin n i ixfS ; 2 1 3 )( n i ixfS ; 2 1 4 )( n i ixfS ; 2 1 )(tg n i ixf 3 1 5 )( n i ixfS ; 3 1 2 5 )()( n i ii xfxfS . Провести процесс сглаживания по заданному количеству точек для функций )(xf , )(xf . Построить графики исходной и сгла- женной кривой. Для сглаживания функций использовать усредне- ния соседних точек по формуле 277 уyi = (уi+1+ уi-1)/2, где ууi – точки сглаженной кривой; уi+1, уi-1 – точки несглаженной кривой. Таблица 5.14 Вариант Функция 1 2 1 80 4 4sin5ln xx 2 xxx 7 sin 4 cos510log2 3 x x x 4 cos 1 1 cos4 10 tg3 4 8ln4cossin 2 xx 5 xxx 4 cos5 sin23 cos 6 xxx 11 tg7 ctg4 tg 7 xxx 27 cos4 2 8 72sin5,0sin3 2 xx 9 13log312log2 54 xx 10 73 cos33cos23cos 23 xxx 11 )11sin()9sin()6sin()3sin( xxxx 12 )7tg()5tg()3tg()tg( xxxx 13 )9ctg()ctg(7)2ctg()ctg( xxxx 14 73 cos33cos23cos 23 xxx 15 773sin43sin 24 xx 16 xxx 7ctg24 tg3tg2 17 xxx 3ctg11ctg4 ctg 23 18 xxx 4 sin7cos4sin 32 19 80 4 4sin5ln xx 278 Продолжение табл. 5.14 1 2 20 xxx 7 sin 4 cos510log2 21 x x x 4 cos 1 1 cos4 10 tg3 22 8ln4cossin 2 xx 23 xxx 4 cos5 sin23 cos 24 xxx 11 tg7 ctg4 tg 25 xxx 27 cos4 2 26 312sin211sin5 2 xx 27 15log514log4 76 xx 28 73 cos33cos23cos 23 xxx 29 )11sin()9sin()6sin()3sin( xxxx 30 )7tg()5tg()3tg()tg( xxxx 31 )9ctg()ctg(7)2ctg()ctg( xxxx 32 73 cos33cos23cos 23 xxx 33 773sin43sin 24 xx 34 xxx 4ctg23 tg2tg 2 35 xxx 3ctg11ctg4 ctg 23 36 xxx 4 sin7cos4sin 32 37 6 4sin3ln 3 xx 38 xxx 3 sin 4 cos1520log5 39 x x x 4 sin 1 1 cos6 10 tg 3 1 2 40 18ln]4sin[cos 23 xx 41 xxx 7 cos55 sin123 cos 279 Окончание табл. 5.14 1 2 42 xxx 14 tg1111 ctg77 4tg 43 xxx 55 cos14 3 44 312sin211sin5 2 xx 45 14log13log12log 654 xxx 46 73 cos33cos23cos 23 xxx 47 )11sin(5)9sin(4)6sin(3)3sin(2 xxxx 48 )7tg(5)5tg(4)3tg(3)2tg( xxxx 49 )9ctg(5)ctg(74)2ctg(3)2ctg( xxxx 50 23 cos33cos23cos 32 xxx 5.14. Задачи по разработке технологии интегрирования функций в MS EXCEL Постановка задачи. Вычислить значения суммы интегралов для различных значений параметра, используя метод трапеций (а), пря- моугольников (б) и Симпсона (в). Варианты заданий представлены в табл. 5.15. Использовать пять шагов интегрирования, определяя их по формулам: хх0 , 401 хх , 412 хх , 423 хх , 434 хх , где х – начальное значения шага, соответствующее не менее 100 разбиениям интервала интегрирования. Построить зависимость вычисляемого интеграла от шага инте- грирования для различных параметров k. 280 Вид вычисляемой суммы интегралов dxkxfdxkxfS nn x x x x 2 22 00 . Таблица 5.15 Номер варианта Подынтегральная функция f (x) х0 хn Метод Параметр k 1 2 3 4 5 6 1 )4cos( xеx 2 10 а 1, 2, 3 2 4 4sin 4 xеx 4 7 б 4, 5, 6 3 xx 7sin7 3 20 в 10, 11, 12 4 )tg(9)8cos( xx 7 23 а 7, 9, 12 5 )4sin()arctg(9 xx 8 15 б 8, 10, 12 6 )9(log)ln(8 2 xx 9 22 в 9, 13, 17 7 )9ln(2 xx 12 17 а 13, 14, 15 8 )4cos(3 xе x 1 10 б 18, 20, 22 9 )tg(18)7sin(4 2 xx 11 21 в 24, 26, 28 10 )7ln()10cos(5 xx 24 40 а 30, 32, 34 11 35)8ln( 2 xxx 30 70 б 37, 40, 43 12 10 4cos102 xxx 12 20 в 8, 10, 12 13 )cos( 223 xxе x 14 30 а 13, 15, 17 14 )3sin()3ln(2 xxx 15 31 б 20, 22, 24 15 32 2)ln( xxxxx 17 33 в 70, 73, 76 16 xxxx )4cos(102 18 28 а 80, 84, 88 17 xexx 428 )4(cos 30 40 б 92, 95, 97 18 5,24 )4(cos xxx 11 21 в 100, 102, 104 281 Продолжение табл. 5.15 1 2 3 4 5 6 19 )4(cos232 xx 24 34 а 33, 36, 39 20 43 )7(cos xxеx 40 50 б 31, 32, 33 21 )7sin()4cos( 42 xxxx 60 80 в 41, 42, 43 22 )8sin()7cos( 3 xxxx 70 90 а 70, 71, 72 23 )ctg()tg( 332 xxxx 100 110 б 81, 84, 87 24 )4cos( 22 xе x 2 10 а 13, 15, 17 25 2 4sin 2/1 3 xеx 4 7 б 20, 22, 24 26 xx 5sin5 3 20 в 70, 73, 76 27 )tg(9)cos( 3/13 xx 7 23 а 80, 84, 88 28 )4sin()tg(9 4/1xx 8 15 б 92, 95, 97 29 )9(log)ln(5 6 5/1 xx 9 22 в 100, 102, 104 30 )4ln( 42/1 xx 12 17 а 33, 36, 39 31 )cos( 5/14 xе x 1 10 б 31, 32, 33 32 )tg(8)8sin(8 8/18/1 xx 11 21 в 41, 42, 43 33 )7ln()10cos( 7/11,0 xx 24 40 а 70, 71, 72 34 3,010ln 28/1 xxx 30 70 б 81, 84, 87 35 80 4cos182/1 xxx 12 20 в 13, 14, 15 36 )cos( 32/12 xxе x 14 30 а 18, 20, 22 37 )5sin()ln( 23 xxx 15 31 б 24, 26, 28 38 3/1223 4)ln( xxxxx 17 33 в 30, 32, 34 39 4/142 cos5 xxxx 18 28 а 37, 40, 43 40 xexx 32/17 )8(cos 30 40 б 8, 10, 12 282 Окончание табл. 5.15 1 2 3 4 5 6 41 5,353/1 )4(cos xxx 11 21 в 13, 15, 17 42 )4(cos232 xx 24 34 а 20, 22, 24 43 35/1 )5(cos xxе x 40 50 б 1, 2, 3 44 )17sin()4cos( 4/142/1 xxxx 60 80 в 4, 5, 6 45 )18sin()17cos( 3/12 xxxx 70 90 а 10, 11, 12 46 )ctg()tg( 23/123 xxxx 100 110 б 7, 9, 12 47 )4cos( 2/1 xе x 2 10 а 24, 26, 28 48 4 4sin 4/1 3 xеx 4 7 б 30, 32, 34 49 xx 17sin7/1 3 20 в 37, 40, 43 50 )tg()18cos( 2xx 7 23 а 8, 10, 12 Пример для первого варианта. Используя метод трапеций, вы- числить интегралы. dxxfdxxfS 20 2 22 10 2 1 1 , dxxfdxxfSS 20 2 22 10 2 2 2 , dxxfdxxfSSS 20 2 22 10 2 3 3 , где вид подынтегральной функции xеxf x 4cos)( . Для каждого интеграла вычислять значения для пяти различных шагов. При выполнении задания заполнить таблицу (табл. 5.16) и исследовать влияние шага разбиения на величину интеграла. 283 Таблица 5.16 S( хх0 ) SS( хх0 ) SSS( хх0 ) S( 401 хх ) SS( 401 хх ) SSS( 401 хх ) S( 412 хх ) SS( 412 хх ) SSS( 412 хх ) S( 423 хх ) SS( 423 хх ) SSS( 423 хх ) S( 434 хх ) SS( 434 хх ) SSS( 434 хх ) 5.15. Задачи по разработке технологии решения дифференциальных уравнений методом Рунге-Кутта в MS EXCEL Постановка задачи. Разработать алгоритм решения методом Рунге-Кутта дифференциального уравнения ),( yxfy на интер- вале отрезка [а, b] при начальном условии y(x = а) = с. Шаг измене- ния переменной выбрать самостоятельно. Варианты заданий пред- ставлены в табл. 5.17. Таблица 5.17 Номер варианта Дифференциальное уравнение а b с 1 2 3 4 5 1 )4cos( xеу 2 10 22 2 ) 4 4sin( 4 уеx 4 7 4 3 xу 7sin 3 20 10 4 )tg(9)8cos( xу 7 23 7 5 )4sin()arctg(9 xу 8 15 8 6 )9(log)8ln( 2 xy 9 22 9 7 )9ln(2 xx 12 17 13 8 )4cos(3 xе у 1 10 18 9 )tg(8)7sin( 2 xу 11 21 24 10 )7ln()cos( xу 24 40 30 Продолжение табл. 5.17 284 1 2 3 4 5 11 35)ln( 2 xxу 30 70 37 12 ) 10 4cos()10( 2 xxу 12 10 22 13 )cos( 223 xxе у 4 7 4 14 )3sin()3ln(2 xxу 5 20 10 15 32 2)ln( xxxxу 7 23 7 16 xxxу ))4cos(10( 2 1 15 8 17 xexу 42 )4(cos 3 22 9 18 5,24 )4(cos xxу 11 17 13 19 )4(cos232 xу 2 10 18 20 43 )7(cos xxеу 4 21 24 21 )7sin()4cos(2 xxxу 6 40 30 22 )8sin()7cos( 3 xxуу 7 10 22 23 )ctg()tg( 32 xxуу 1 7 4 24 )4cos( 22 xе у 2 20 10 25 ) 2 4sin( 2/1 3 xеу 4 23 7 26 xу 5sin 3 15 8 27 )tg(9)cos( 3/13 xу 7 22 9 28 )4sin()9tg( 4/1xу 8 17 13 29 )9(log)ln(5 6 5/1 xу 9 10 18 30 )4ln( 42/1 xу 1 10 22 31 )cos( 5/14 xе у 1 7 4 32 )tg(8)8sin(8 8/1xу 1 20 10 33 )7ln()10cos( 7/1xу 2 23 7 Окончание табл. 5.17 285 1 2 3 4 5 34 3,010)ln( 28/1 xxу 3 15 8 35 ) 80 4cos()18( 2/1 ууx 1 22 9 36 )cos( 32 xе у 4 17 13 37 )5sin(3 xу 5 10 18 38 xуx 423 7 21 24 39 4/142 ))cos(5( xxуу 8 40 30 40 xexу 32/1 )8(cos 30 70 37 41 5,35 )4(cos xу 11 21 17 42 )4(cos232 уx 24 34 24 43 35 )5(cos xуx 40 50 3 44 )4cos( 42/1 уx 60 80 6 45 )18sin(3/1 уxx 70 90 12 46 )(tg 23 уx 1 11 12 47 )4cos( 2/1 xе у 2 10 28 48 ) 4 4sin( 4/1xеу 4 7 34 49 xу 17sin 3 20 43 50 )tg()18cos( 2xу 7 23 12 Построить решение дифференциального уравнения y = F(х). 5.16. Задачи по разработке технологии решения задачи оптимизации методом простых итераций в MS EXCEL Постановка задачи. Определить комбинацию значений пере- менных х1, x2, …, xn, для которых выполняются условия 286 ,)(...)(...)()( ... ,)(...)(...)()( ,)(...)(...)()( 222111 222222221121 111122121111 mmnnmnjjmjmm nnnjjj nnnjjj Fcxfaxfaxfaxfa Fcxfaxfaxfaxfa Fcxfaxfaxfaxfa где F1(x1, x2, …, xn) = 0; F2(x1, x2, …, xn) = 0; … Fm(x1, x2, …, xn) = 0; n – число переменных; m – число уравнений. Функционал цели выбрать на основе усло- вия min),...,,( 21 mFFFF . Значения n, m и вид функционала це- ли заданы вариантом задачи. Коэффициенты системы уравнений вычисляются по законам aij = n·m – i – j, ci = ln(i·m·k). Предположить следующие интервалы изменения переменных: x1 = [5; 15], x2 = [0; 40], x3 = [–10; 20], x4 = [0; 20], x5 = [10; 25], x6 = [–0,5; 3,4]. При формировании функционала цели учесть об- ласть определения. Значения n, m и вид функционала цели F выбрать из табл. 5.18, функции fi(xi) – из табл. 5.19 в соответствии с вариантом задачи. Таблица 5.18 Номер варианта n m Функционал цели ),...,,( 21 mFFFF 1 2 3 4 1 3 3 2 3 2 2 2 1 FFF 2 3 4 43 2 2 2 1 FFFF 3 3 5 5432 2 3 1 2 1 1 FFF F F 4 3 6 65 2 43 2 21 5,0223 FFFFFF 287 Продолжение табл. 5.18 1 2 3 4 5 4 2 22 3 1 53 FF 6 4 3 3 2 21 5,023 FFF 7 4 4 4 32 2 2 1 3 1 F F FF 8 4 5 54 2 3 2 21 1 FF FFF 9 4 6 654 2 3 2 21 FFFFFF 10 5 2 2 22 1 7 1 F F 11 5 3 3 2 21 5,03 FFF 12 5 4 43 2 2 2 1 FFFF 13 5 5 2 5 4 32 2 2 1 7 1 F F F FF 14 5 6 6543 2 2 2 1 FFFFFF 15 6 2 2 2 2 1 FF 16 6 3 3 2 2 2 1 FFF 17 6 4 43 2 21 3 FFFF 18 6 5 543 2 2 2 1 3,02 FFFFF 19 6 6 65 4 2 32 21 FF F F FF 20 3 3 3 2 2 2 1 4FFF 21 3 4 43 2 21 25,0 FFFF 22 3 5 54 2 3 2 21 1 2 FF FFF 23 3 6 6543 2 2 2 1 FFFFFF 288 Продолжение табл. 5.18 1 2 3 4 24 4 2 3 2 2 1 9 1 FF 25 4 3 3 2 2 2 1 25 FFF 26 4 4 43 2 21 3 FFFF 27 4 5 5 3 42 21 3 5 F F F FF 28 4 6 543 2 261 3 FFFFFF 29 5 2 21 27 FF 30 5 3 2 3 2 21 25 FFF 31 5 4 4 2 3 2 21 1 2 F FFF 32 5 5 543 2 2 2 1 2 FFFFF 33 5 6 3 542 21 5 27 F FF FF 34 6 2 221 97 FF 35 6 3 3 2 21 3 1 2 F FF 36 6 4 3 2 24 2 1 25 FFFF 37 6 5 54 2 321 2 FFFFF 38 6 6 654321 2 FFFFFF 39 3 3 321 2 FFF 40 3 4 4321 2 FFFF 41 3 5 54 32 1 3 2 FF FF F 42 3 6 6543 2 2 2 1 FFFFFF 43 4 2 22 2 1 FF 289 Окончание табл. 5.18 1 2 3 4 44 4 3 2 3 2 2 2 1 FFF 45 4 4 4 2 3 2 2 2 1 FFFF 46 4 5 5 2 4 2 3 2 2 2 1 FFFFF 47 4 6 6 2 5 2 4 2 3 2 2 2 1 FFFFFF 48 5 2 2 2 1 5FF 49 5 3 2 3 2 2 2 1 FFF 50 5 4 3 4 21 2 F F FF Таблица 5.19 i 1 2 3 4 5 6 fi(xi) cos(4·x1) tg (8·x2) ln (4·x3) 2 4 x e 7 1 2 5x log2 (4·x6) Например, для варианта 2 условие задачи с учетом данных в табл. 5.18, 5.19 будет иметь вид: Шаг 1. Вычисление коэффициентов системы уравнений: а11 = 3·4 – 1 – 1 = 10, а12 = 3·4 – 1 – 2 = 9, а13 = 3·4 – 1 – 3 = 8; с1 = ln(1·3·4) = ln(12); а21 = 3·4 – 2 – 1 = 9, а22 = 3·4 – 2 – 2 = 8, а23 = 3·4 – 2 – 3 = 7; с2 = ln(2·3·4) = ln(24); а31 = 3·4 – 3 – 1 = 8, а32 = 3·4 – 3 – 2 = 7, а33 = 3·4 – 3 – 3 = 6; с3 = ln(3·3·4) = ln(36); а41 = 3·4 – 4 – 1 = 7, а42 = 3·4 – 4 – 2 = 6, а43 = 3·4 – 4 – 3 = 5; с4 = ln(4·3·4) = ln(48). Шаг 2. Формирование системы уравнений .)()()( ,)()()( ,)()()( ,)()()( 44334322421141 33333322321131 22332322221121 11331322121111 Fcxfaxfaxfa Fcxfaxfaxfa Fcxfaxfaxfa Fcxfaxfaxfa 290 После подстановки значений коэффициентов aij, ci и функций fi(xi) система будет иметь вид .)48ln(4ln58tg64cos7 ,)36ln(4ln68tg74cos8 ,)24ln(4ln78tg84cos9 ,)12ln(4ln88tg94cos10 4321 3321 2321 1321 Fxx·x Fxx·x Fxx·x Fxx·x Шаг 3. Запись функционала цели min43 2 2 2 1 FFFFF . Шаг 4. Формирование ограничений x1 = [5; 15], x2 = [0; 40], x3 = [–10; 20], F3 ≥ 0. РЕКОМЕНДУЕМЫЕ УЧЕБНЫЕ ПОСОБИЯ ДЛЯ СТУДЕНТОВ 1. Макконелл, Джефри. Анализ алгоритмов: вводный курс / Дже- фри Макконелл; пер. С.К. Ландо. – М.: Техносфера, 2002. – 302 с. 2. Макконелл, Джефри. Основы современных алгоритмов / Дже- фри Макконелл; ред. перевода С.К. Ландо. – 2-е изд., доп. – М.: Техносфера, 2006. – 366 с. 3. Федоренко, Ю.В. Алгоритмы и программы на Turbo Pascal / Ю.В. Федоренко. – СПб.: Питер, 2001. – 240 с. 4. Жернак, А.Н. Программирование. Основы конструкции и опе- раторы языка Паскаль: текст лекций / А.Н. Жернак, Р.А. Кимашева, М.В. Копейкин. – Л.: СЗПИ, 1991. – 48 с. 5. Фаронов, В.В. Турбо Паскаль [7.0]. Начальный курс: учебное пособие / В.В. Фаронов. – М.: Нолидж, 1999. – 612 с. 6. Фаронов, В.В. Турбо Паскаль 7.0: Практика программирова- ния: учебное пособие / В.В. Фаронов. – М.: Нолидж, 1999. – 429 с. 7. Могилев, А.В. Информатика / А.В. Могилев, Н.И. Пак, Е.К. Хеннер. – М.: Издательский центр «Академия», 2004. – 848 с. 291 8. Ставровский, А.Б. Турбо Паскаль 7.0: учебник / А.Б. Ставров- ский. – М.: Нолидж, 2000. – 399 с. 9. Вальвачев, А.Н. Программирование на языке Паскаль для пер- сональных ЭВМ ЕС: справочное пособие / А.Н. Вальвачев, В.С. Крисевич. – М.: Высшая школа, 1989. – 223 с. 10. Мудров, А.Э. Численные методы для ПЭВМ на языках Бей- сик, Фортран и Паскаль / А.Э. Мудров. – Томск: МП «Раско», 1991. – 272 с. 11. Калиткин, Н.Н. Численные методы / Н.Н. Калиткин. – М.: Наука, 1978. – 512 с. 12. Волков, Е.А. Численные методы / Е.А. Волков. – М.: Наука, 1987. – 248 с. 13. Чичко, О.И. Алгоритмы и технология решения задач матрич- ного исчисления в MS EXCEL: учебное пособие / О.И. Чичко, В.И. Махнач, А.Н. Чичко. – Минск: БНТУ, 2005. – 105 с. 14. Чичко, А.Н. Информатика / А.Н. Чичко, Е.А. Дроздов. – Минск: БНТУ, 2000. – 151 с. 15. Чичко, О.И. Алгоритмы и технология решения численных задач в MS EXCEL / О.И. Чичко, В.И. Махнач, А.Н. Чичко. – Минск: БНТУ, 2005. – 101 с. 16. Чичко, А.Н. Информатика: учебно-методическое пособие / А.Н. Чичко, А.С. Бороздин. – Минск: БНТУ, 2003. – 187 с. 292 ПРИЛОЖЕНИЯ ПРИЛОЖЕНИЕ 1 КРАТКИЕ СВЕДЕНИЯ О ЯЗЫКЕ PASCAL П 1.1. Алфавит языка Pascal Язык Pascal включает следующий набор основных символов: 1) 26 латинских строчных и прописных букв: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z; 2) символ подчеркивание «_»; 3) 10 цифр (0 1 2 3 4 5 6 7 8 9); 4) знаки операций ( + - * / = <> < > <= >= := @); 5) ограничители: (. , ' ( ) [ ] (. .) {} (* *) .. : ); 6) спецификаторы: ( ^ # $); 7) служебные (зарезервированные) слова: ABSOLUTE FILE MOD SHR AND FOR NIL STRING ARRAY FORWARD NOT THEN BEGIN FUNCTION OF TO CASE GOTO OR TYPE CONST IF PACKED UNIT DIV IMPLEMENTATION PROCEDURE UNTIL DO IN PROGRAM USES DOWNTO INLINE RECORD VAR ELSE INTERFACE REPEAT WHILE END INTERRUPT SET WITH EXTERNAL LABEL SHL XOR Кроме того, в набор основных символов входит пробел « ». П 1.2. Элементарные конструкции Элементарные конструкции языка Pascal включают в себя имена, числа и строки. 293 Имена (идентификаторы) – это элементы языка: константы, метки, переменные, процедуры, функции и т. д. Имя – это последователь- ность букв и цифр, начинающаяся с буквы. В именах может исполь- зоваться символ «подчеркивание». В качестве имен не разрешается использовать служебные слова и стандартные имена, которыми названы стандартные константы, типы, процедуры, функции и фай- лы. Примеры правильных имен языка Pascal: M, bFlag, iMax, OutFile, F_1 Примеры неправильных имен языка Pascal: 1qwick, Begin, function Числа в языке Pascal обычно записываются в десятичной системе счисления. Они могут быть целыми и действительными. Действи- тельные числа записываются в форме с десятичной точкой или в форме с использованием десятичного порядка, который изобража- ется буквой Е: 32.1, -0.06, 3Е7, 2.3Е-12. Строки в языке Pascal – это последовательность символов, запи- санных между апострофами: ‘Строка 1’, ‘Введите а’, ‘Значение функции = ’. Выражение состоит из констант, переменных, указателей функ- ций, знаков операций и скобок. Выражение задает правило вычис- ления некоторого значения. Порядок вычисления определяется старшинством (приоритетом) содержащихся в нем операций. Основные операции языка Pascal представлены в табл. П 1.1. Для изменения приоритета операций необходимо использовать скобки. Таблица П 1.1 Операция Описание Пример Приоритет = Равно A = B 4 + Сложить A + B 3 – Вычесть A – B 3 / Делить A / B 2 * Умножить A * B 2 <> Не равно A <> B 4 < Меньше A < B 4 > Больше A > B 4 not Отрицание not A 1 and Логическое «и» A and B 2 294 or Логическое «или» A or B 3 В табл. П 1.2 приведены некоторые математические функции язы- ка Pascal, использованные в заданиях и примерах учебного пособия. Наиболее высокий приоритет имеет операция отрицания, затем сле- дующий уровень приоритета имеют операции «умножить», «делить», логическое «и». Самый малый уровень приоритета имеет операция «равно». Таблица П 1.2 Функция Назначение exp(x) Вычисление экспоненты x ln(x) Вычисление натурального логарифма x abs(x) Вычисление абсолютной величины x sqr(x) Вычисление квадрата величины x sqrt(x) Извлечение корня x trunc(x) Получение целой части значения x ( результат Integer) round(x) Округление в сторону ближайшего целого x odd(x) True – если x – нечетное и False – если x – четное frac(x) Вычисление дробной части x int(x) Вычисление целой части x (результат Real) pi Возвращает число (пи) sin(x) Вычисление синуса x cos(x) Вычисление косинуса x arctan(x) Вычисление арктангенса x В языке Pascal имеются минимальные возможности для вычис- ления функций, поэтому сложные функции строятся на основе эле- ментарных. При использовании сложных тригонометрических и логарифмических функций рекомендуется использовать следующие формулы: arcsin(x) = arctg 212 )1( / xx , если 0)1( 2xx ; arccos(x) = pi/2 – arcsin(x); arctctg(x) = pi/2 – arctg(x); sec(x) = 1/cos(x), если cos(x) 0; tg(x) = sin(x)/cos(x), если cos(x) 0; log a (x) = ln(x)/ln(a); ))ln(*exp(ln xAex AxA , если x > 0. 295 Пример. Записать фрагмент выражения 7)1)(cos(xy в языке Pascal. … Y := cos(x) + 1; Y :=exp(7*ln(Y)); … или Y := exp(7*ln((cos(x)+1)) Пример. Записать выражение ))((cosln 337 xy в языке Pascal с учетом области определения функции. If (cos(x) > 0) and (Ln(cos(x)* cos(x)* cos(x)) > 0) then Y := exp(7/3*ln(ln(cos(x)*cos(x)*cos(x)))); П 1.3. Структура программы на языке Pascal Структура программы на языке Pascal имеет вид Program <имя программы>; Uses <подключаемые модули>; Label {раздел описания меток, используемых в программе } Const {раздел описания констант, используемых в программе} Type {раздел описания типов, используемых в программе} Var {раздел описания переменных, используемых в программе} {раздел описания процедур и функций} Procedure <имя процедуры>; <тело процедуры>; Function <имя функции>; <тело функции>; {раздел операторов основной программы} Begin <операторы>; End. После зарезервированного слова Program идет название про- граммы. Любой раздел, кроме раздела операторов, может отсут- ствовать. Все используемые объекты программы должны быть опи- саны в соответствующих разделах. Рассмотрим примеры использования различных элементов про- граммы: 296 Uses Crt, Dos;{подключение библиотечных модулей crt и dos} Const {раздел описания констант} Point_beg =3.80, Point_End = 130, M = 3.1415, M1 = 100; Type {раздел описания типов} {описание типа Mas, как двухмерного массива} Mas = Array [1..20,1..40] of Real; {описание типа MM как одномерного массива размером 40} MM = Array[ 1..40] of Integer; Var {раздел описания переменных} A,B,C : Real; {описание переменных вещественного типа} i : Integer; {описание переменной i - целого типа} k : Byte; {описание переменной k - байтового типа} П 1.4. Типы данных Каждая константа, переменная, выражение или функция в языке Pascal имеет свой тип. Тип определяет множество допустимых зна- чений, а также операции и функции, которые могут быть примени- мы к переменным, константам и другим величинам, принадлежа- щим данному типу. Типы в языке Pascal могут быть простыми и структурированными. Простые типы подразделяются на стандарт- ные и пользовательские. Стандартными типами являются целые, вещественные, логический тип (Boolean), символьный (Char). К пользовательским типам относятся перечисляемый и интервальный типы. Представителями структурированных типов в языке Pascal являются массивы, файлы, записи и множества. Описание переменной производится перед ее использованием в разделе описания переменных и имеет следующую форму записи: Var <имя переменной> : <тип>;. Целые типы Характеристики целых типов данных представлены в табл. П 1.3. Таблица П 1.3 Тип Требуемая память (байт) Диапазон значений Shortint 1 –128–127 Integer 2 –32 768–32 767 Longint 4 –2 147 483 648–2 147 483 647 Byte 1 0–255 Word 2 0–65 535 297 Пример описания переменных Var I, J : Byte; {целые переменные типа Byte} Temp, T : Integer; {целые переменные типа Integer} MaxA : Word; {целая переменная типа Word} Вещественные типы Числа действительного типа могут быть представлены в двух ви- дах: числом с фиксированной и с плавающей точкой (экспоненциаль- ная форма). Число с фиксированной точкой изображается десятичным числом с дробной частью (дробная часть может быть нулевой), напри- мер 127.3, 25.0, -16.003, 200.59, 0.54. Число с плавающей точкой имеет вид <мантисса>E<порядок>, где <мантисса> – вещественное число в форме с фиксированной точкой, <порядок> – целое число. Буква Е может быть строчной или заглавной. Как мантисса, так и порядок мо- гут содержать знаки «+» и «–». Эту запись следует понимать как про- изведение мантиссы на 10 в степени, равной порядку. Примеры записи действительных чисел приведены в табл. П 1.4. Таблица П 1.4 Математическая запись Запись с плавающей точкой 0,000009 9Е–6 0,62 104 0.62Е+4 –10,8 1012 –10.8Е12 20 10-3 20Е-3 В табл. П 1.5 представлены характеристики вещественных типов данных. Таблица П 1.5 Тип Память (байт) Число значащих цифр Область допустимых значений Real 6 11–12 -1.7.1038 1.7.10380 -2.9.10-39 2.9.10-39 ]107,1;109,2[ ]109,2;107,1[ 3839 3938   298 Окончание табл. П 1.5 Тип Память (байт) Число значащих цифр Область допустимых значений Double 8 15–16 -1.7.10308 1.7.103080 -5.10-324 5.10-324 ]107,1;105[ ]105;107,1[ 308324 324308   Single 4 7–8 -3.4.1038 3.4.10380 -1.5.10-45 1.5.10-45 ]104,3;105,1[ ]105,1;104,3[ 3845 4538   Extended 10 19–20 -1.1.10 4932 1.1.1049320 -1.9.10-4951 1.9.10-4951 ]101,1;109,1[ ]109,1;101,1[ 19324951 49514932   Comp 8 -9.2.1018 9.2.1018 0 -263 + 1 .. 263 – 1 ]102,9;102,9[ 1818 Примечание: 1) во всех указанных дипазонах нуль входит в область значений типа; 2) тип Comp содержит только целочисленные значения в диапа- зоне от –263+1 до 263–1, что приблизительно равно –9,2·1018 и 9,2·1018. Например, числа типа Real могут принимать как положи- тельные, нулевые, так и отрицательные значения и изменяться в 299 диапазоне от –1,7 1038 до 1,7 1038, минимальным ненулевым аб- солютным значением для них является 39 39 10 9,2 109,2 . Они имеют точность 11–12 знаков, т. е. числа, отличающиеся в 13 знаков, будут представлены одинаково. Пример описания переменных Var A, b : Real; {вещественные переменные типа Real} P_1 : Double; {вещественная переменная типа Double} e : Extended; {вещественная переменная типа Extended} Логический тип (Boolean) Логические типы переменных имеют два значения: истина (True) и ложь (False), занимают один байт памяти. Пример описания переменных Var b1, D : Boolean; Символьный тип (Char) Символьные типы переменных Char могут принимать значения из множества символов ASCII, занимают один байт памяти. Пример описания переменных Var С1, c2 : Char; Строковый тип (String) Для описания строки символов используется тип String: <имя переменной> : String [<длина строки>]; где параметр <длина строки> указывает значение максимально допустимой длины строки. Параметр <длина строки> может быть опущен, тогда максимальная длина строки равна 255 сим- волам. Пример описания переменных Var S1 : String [100]; {строка, состоящая из 100 символов} Str2 : String [12]; {строка, состоящая из 12 символов} 300 Массивы Массивы – это формальное объединение нескольких однотипных объектов, рассматриваемых как единое целое. Описание одномерного массива: Var <имя массива> : Array [Нач_индекс..Кон_индекс] of <тип элементов>; где параметры Нач_индекс, Кон_индекс указывают начальное и конечное значение индексов массива. Доступ к элементу одномерного массива осуществляется через индекс (обычно целое число, являющееся порядковым номером элемента массива). Пример описания одномерных массивов Var A : Array [1..10] of Integer; B : Array [0..5] of String[7]; В данном примере описаны следующие переменные: а) А – одномерный целый массив, состоящий из 10 элементов, первому элементу массива соответствует A[1], второму элементу – A[2], …, десятому элементу – A[10]; б) B – одномерный строковый массив, состоящий из шести эле- ментов, первому элементу массива соответствует B[0], второму – B[1], …, шестому элементу массива – B[6]. Описание двумерного массива (матрицы) Var <имя массива> : Array [Нач_инд1..Кон_инд1,Нач_инд2..Кон_инд2] of <тип>; где параметры Нач_инд1, Кон_ инд1 указывают начальное и конеч- ное значение номеров строк массива, параметры Нач_инд2, Кон_ инд2 указывают начальное и конечное значение номеров столбцов массива. Пример описания двумерных массивов Var C : Array [1..3, 1..5] of Real; D : Array [0..4, 1..2] of Byte; 301 В данном примере описаны следующие переменные: а) C – двумерный вещественный массив, состоящий из трех строк (индексы строк от 1 до 3) и пяти столбцов (индексы столбцов от 1 до 5). Доступ к элементам массива С осуществляется так: элемент первой строки и второго столбца массива – С[1, 2], элемент третьей строки и четвертого столбца массива – С[3, 4]; б) D – двумерный байтовый массив, состоящий из пяти строк (индексы строк от 0 до 4) и двух столбцов (индексы столбцов от 1 до 2), доступ к элементам массива D осуществляется так: элемент нулевой строки и второго столбца массива – D[0, 2], элемент четвертой строки и первого столбца массива – D[4, 1]. П 1.5. Основные операторы языка Pascal Оператор присваивания <переменная> := <выражение>; где <переменная> – переменная, элемент массива или имя функции, а <выражение> – любое допустимое выражение, совместимое по ти- пу с переменной в левой части оператора. Оператор вычисляет зна- чение выражения, записанного справа от операции присваивания «:=», и присваивает полученное значение переменной в левой ча- сти оператора. Примеры использования оператора присваивания: Х := 10; {присваивание переменной Х значения 10} P :=P + 5; {увеличение значение переменной P на 5} Операторы ввода-вывода Для выполнения ввода-вывода данных используются операторы Read, Readln, Write, Writeln. Структура оператора ввода Read(F, x1, x2, ..., xn) или Readln(F, x1, x2, ..., xn), где F – переменная, связанная с файлом, из которого происходит чтение значений переменных x1, x2, ..., xn. Если переменная F отсутствует, то чтение значений переменных производится с клави- атуры. Оператор Readln в отличие от Read переводит курсор 302 на следующую строку. Использование оператора Readln без аргу- ментов используется для ожидания нажатия клавиши . Структура оператора вывода: Write(F, e1, e2, ..., en) или Writeln(F, e1, e2, …, en), где F – переменная, связанная с файлом, в который осуществляется запись значений выражений e1, e2, ..., en. При отсутствии F значения выводятся на экран. Оператор Writeln в отличие от Write переводит курсор на новую строку после вывода значений. Исполь- зование оператора Writeln без аргументов используется для выво- да пустой строки. Выходные форматы языка Pascal Для вывода значений переменных в языке Pascal используются следующие форматы (шаблоны): R : a : b и R : a, где R – переменная; а – число всех отводимых позиций под число; b – число позиций дробной части числа. Для целых чисел и строковых переменных используется формат R : a, для вещественных рекомендуется формат R : a : b, причем под знак и десятичную точку отводится отдельная позиция. Если для вещественного числа не указан выходной формат, то оно выводится в форме с плавающей точкой. Строки символов, заключенные в апострофы, выводятся как текст. Примеры работы оператора Write представлены в табл. П 1.6. Если значение короче, оно «прижимается» к правому краю отве- денного поля; если длиннее – поле «раздвигается» до необходимых размеров. Таблица П 1.6 Значение Оператор Результат на экране R = 654.734 Write(R) 6.54734000000171E+00002 R = 654.734 Write(R:10) 6.5E+0002 R = 654.734 Write(R:10:2) 654.73 303 Окончание табл. П 1.6 Значение Оператор Результат на экране I = 77 Write(I) 77 I = 77 Write(I:5) _ _ _77 S = Minsk Write(S) Minsk S = Minsk Write(S:3) Min S = Minsk Write(S,’ ‘,S) Minsk Minsk Оператор условного перехода Условный оператор позволяет проверить некоторое условие и в зависимости от результата выполнить то или иное действие. Услов- ный оператор обеспечивает ветвление вычислительного процесса. В языке Pascal используются два вида условных операторов. 1. If <условие> then begin <группа операторов 1> end else begin <группа операторов 2> end; 2. If <условие> then begin <группа операторов > end; где If, then, else – служебные слова (если, то, иначе); begin … end – операторные скобки, ограничивающие дей- ствия операторов. Если используется один оператор, то оператор- ные скобки могут быть опущены. Для оператора первого вида если <условие> истинно, то выпол- няются <группа операторов 1>, если ложно, то <группа операто- ров 2>. Для оператора второго вида если <условие> истинно, то вы- полняется <группа операторов>. В общем случае <условие> пред- ставляет собой логическое выражение, в котором могут использоваться логические операции not («логическое отрицание»), and («логическое умножение И») и or («логическое сложение ИЛИ») и xor («логическое исключающее ИЛИ»). Примеры использования оператора if приведены в табл. П 1.7. 304 Таблица П 1.7 Фрагмент программы Математическая форма фрагмента If A <> B then Y:= sin(x); Если A ≠ B, то вычислить Y = sin(x) If (A > B) and (C < D) then begin Y:= cos(x); Z := ln(abs(cos(x))); end; Если условия А > B и C < D выполняются одновременно, то вычислить Y = cos(x) и Z = ln(|cos(x)|) If (A + B) < D) then Y:= cos(x) else Y:= sin(x); Если условие (A + B) < D выполняется, то вычислить Y = cos(x), иначе вычислить Y = sin(x) If (R/D < D) or (A >0 ) then begin Y:= ln(x); Z := cos(x); end else begin Y:= sin(x)/cos(x); R := Y*Y; end; Если выполняется одно из условий: R/D < D или A > 0, то вычислить Y = ln(x) и Z = cos(x), иначе вычислить Y = sin(x)/cos(x) и R = Y Y Операторы циклов Операторы циклов используются для повтора фрагментов про- граммы. В языке Pascal используется три вида операторов цикла: for, While, Repeat. Структура оператора for Движение цикла «вверх» (шаг +1) или Движение цикла «вниз» (шаг –1) for := to do begin <операторы> end; for := downto do begin <операторы> end; где n – параметр цикла; 305 n1, n2 – начальное и конечное значения параметра цикла; to, downto – служебные слова, означающие движение цикла «вверх» и «вниз». Пример использования оператора цикла for Фрагмент программы реализации возведения переменной A в третью степень: … p:= 1; for i:= 1 to 3 do p:= p * A; … Пошаговая иллюстрация работы оператора for Шаг 1. P = 1; Шаг 2. I = 1; Шаг 3. Если 1 < 3, то P = 1·А; Шаг 4. I = 1 + 1 = 2; Шаг 5. Если 2 < 3, то P = А·А; Шаг 6. I = 2 + 1 = 3; Шаг 7. Если 3 < 3, то P = А2·А; Шаг 8. I = 3 + 1 = 4; Шаг 9. Если 4 > 3, то выход из цикла. Цикл с предусловием – оператор While While <условие> do begin <операторы> end; где While, do – служебные слова (пока, выполнить). При выполнении <условия> выполняются <операторы>, после чего проверка <условия> повторяется. Если <условие> ложно (False), то «работа» While прекращается. Если тело цикла (<опера- торы>) состоит из одного оператора, то операторные скобки begin …end не используются. 306 Пример использования оператора While Фрагмент программы реализации возведения переменной А в третью степень: … i:= 1; p:= 1; While i <= 3 do Begin p:= p * A; i:= i + 1; End; … Цикл с постусловием – оператор Repeat Repeat <операторы> Until <условие>, где Repeat, Until – служебные слова (повторять до тех пор, пока). Тело цикла (<операторы>) выполняется хотя бы один раз, после чего вычисляется <условие>, которое проверяется. Если его значе- ние False, то <операторы> повторяются, в противном случае опера- тор Repeat...Until завершает свою работу. Пример использования оператора Repeat Фрагмент программы реализации возведения переменной A в третью степень: … i:= 1; p:= 1; Repeat p:= p * A; i:= i + 1; Until i > 3; … Сравнение циклов While, Repeat, For В цикле While проверка условия выполнения цикла находится в начале цикла, а в Repeat – в конце. Цикл Repeat всегда выполняется 307 хотя бы один раз, а цикл While может не выполняться ни разу. В цикле While выход из цикла осуществляется, если условие ложно, а в Repeat – если условие истинно. При заранее известном числе цик- лов удобным является использование оператора for. Операторы для работы с файлами В языке Pascal существуют три класса файлов: типизированные, текстовые и нетипизированные. Каждому файлу в языке ставится в соответствие файловая переменная определенного типа. Для этого используется процедура Assign(f : File, name : String), где f – переменная файлового типа; name – строковое выражение, содержащее полное имя файла, включая диск и все подкаталоги. При отсутствии диска и подкаталогов в выражении name файло- вая переменная будет ссылаться на файл, который находится или будет находиться в текущем каталоге на текущем диске. Данная процедура всегда предшествует другим процедурам работы с фай- лами, так как ставит в соответствие конкретному файлу на внешнем устройстве логическую файловую переменную языка, к которой впоследствии будут обращаться все другие файловые процедуры. Для описания переменной текстового файла используется слу- жебное слово Text. Например, запись f:Text означает описание файловой переменной f, которая будет использоваться для работы с текстовым файлом. Для ввода и вывода информации в файл используются следую- щие процедуры: Reset(f : File) – открывает существующий файл для чтения и записи; Rewrite(f : File) – создает и открывает новый файл для записи. В текстовом файле может быть использована процедура откры- тия файла с добавлением информации в конец файла: AppEnd(f : Text), где f – текстовая переменная. 308 Текстовый файл можно рассматривать как последовательность символов, разбитую на строки. Запись и чтение в файл осуществ- ляются с помощью процедур ввода/вывода: Read(f, Ww :Word) – чтение из файла, связанного переменной f и присваивание значений переменной Ww. Write(f, Ww :Word) – осуществляет запись переменной Ww в файл, на который указывает файловая переменная f. Дополнительно можно использовать процедуры Readln и Writeln, которые обеспе- чивают те же действия, что и Read и Write соответственно, но при этом еще осуществляют перевод на новую строку. Операция закрытия файла является логическим окончанием ра- боты с любым открытым файлом. Для этого служит процедура Close(f : File) Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом, установленную с помо- щью процедуры Assign. После окончания работы с файлом обяза- тельно требуется закрыть его. Примеры ввода и вывода данных в файл Разработать программу чтения трех чисел из файла koef.txt и вы- вод их произведения в файл rez.txt. Структура файла koef.txt: 12.7 6.1 0.85 Решение Шаг 1. Создать текстовый файл koef.txt. Шаг 2. Записать в файл числа 12.7 6.1 0.85. Шаг 3. Создать программу чтения чисел 12.7 6.1 0.85 и запи- си из произведения в файл rez.txt. Шаг 4. Запустить программу. Программа Program ReadFile Var {файловые переменные для работы с текстовыми файлами} 309 f1, f2 : Text; k1, k2, k3 : Integer; begin Assign(f1, ‘koef.txt’); Reset(f1);{открытие файла koef.txt} Readln(f1, k1, k2, k3);{чтение значений из файла koef.txt} Close(f1); {закрытие файла koef.txt} Assign(f2 ‘rez.txt’); Rewrite(f2); {создание файла rez.txt} {вывод значения произведения в файл rez.txt} Writeln(f2, ‘Произведение коэффициентов = ’, k1*k2*k3); Close(f2); {закрытие файла rez.txt} end. П1.6. Использование стандартных процедур и функций модулей Crt и Graph в языке Pascal В языке Pascal используются следующие варианты подпрограмм: 1) стандартные процедуры; 2) стандартные фунции; 3) процедуры пользователя; 4) функции пользователя. Примеры стандартных процедур: TextMode, Close, Assign. При- меры стандартных функций: sin(x), cos(x), ln(x), exp(x). Стандартные процедуры и функции находятся в соответствующих библиотечных модулях языка. Так, например, процедуры и функции управлении экраном находятся в модуле Crt, процедуры и функции работы с графикой – в модуле Graph. Процедуры и функции пользователя могут включать в себя наборы стандартных процедур и функций. Работа в текстовом режиме (модуль Crt) Для использования процедур, которые находятся в модуле Crt необходимо использовать запись: Uses Crt. Текстовые режимы отображают символы кодовой таблицы персо- нального компьютера. Минимальной единицей управления служит символ. Текстовые режимы устанавливаются процедурой TextMode(режим). Значение режим – номер режима (если режим = 0, то производится установка экрана 25 строк 40 столбцов, если режим = 2, то установка режима 25 строк 80 столбцов). Например, в результате работы процедуры TextMode(2) будет установлен такой 310 текстовый режим, для которого координата Х изменяется от 1 до 80, координата Y – от 1 до 25, координата левого верхнего угла (1, 1). Процедуры управления экраном Для управления экраном используются следующие процедуры: ClrScr, которая очищает экран и помещает курсор в левый верхний угол экрана с координатами (1; 1); GotoXY(X, Y), помещающая курсор в точку экрана с координа- тами X (столбец) и Y (строка); WhereX, возвращающая X координату текущей позиции курсора (результат целочисленный); WhereY, возвращающая Y координату текущей позиции курсора (результат целочисленный). Например, если курсор находится в 70-м столбце во 2-й строке, то результатом выполнения следующих операторов: A := WhereX; B := WhereY; будет A = 70, B = 2. Установка цвета и фона символов Для установки цвета выводимых символов используется проце- дура TextColor (цвет), для фона – процедура TextBackGround(цвет). Значение цвет – это имя или номер констан- ты цвета, возможные значения приведены в табл. П 1.8. Таблица П 1.8 Номер константы Имя константы Цвет 0 Black Черный 1 Blue Синий 2 Green Зеленый 3 Cyan Голубой 4 Red Красный 5 Magenta Фиолетовый 6 Brown Коричневый 7 LightGray Светло-серый … … … 14 Yellow Желтый 15 White Белый 311 Следующие примеры реализуют вывод строк с различным цве- том и фоном: TextColor(0); {установка черного цвета символов} TextBackGround(7); {установка светло-серого цвета фона} Write(‘Черные символы на светлом фоне’); {вывод строки на экран} TextColor(7); {установка светло-серого цвета символов} TextBackGround(0); {установка черного цвета фона} Write(‘Светлые символы на черном фоне’); {вывод строки на экран} TextColor(Yellow); {установка желтого цвета символов} TextBackGround(Red); {установка красного цвета фона} Write(‘Желтые символы на красном фоне’); {вывод строки на экран} Чтобы добавить при выводе эффект мерцания, при установке цвета символов указывается константа Blink (или 128), например: TextColor(Green + Blink); { мерцающие зеленые символы} TextColor(12 + 128); {мерцающие светло-красные символы} Управление звуком Для управления частотой звука и его продолжительностью в языке Pascal используются стандартные процедуры Sound, Nosound, Delay из модуля Crt. Sound(I) активизирует звуковые средства, где целочисленное значение I указывает частоту звучания звука в герцах в диапазоне 37–32767 Гц. Сила звука (громкость) не регулируется. Звук указан- ной частоты будет генерироваться до тех пор, пока не будет отме- нен процедурой Nosound. Nosound – отмена звука. Отменяет звуковой режим, заданный процедурой Sound. Для указания времени, в течение которого будет продолжаться звучание, используется процедура Delay(I). Значение I указывает- ся в миллисекундах (мс). Управление клавиатурой Стандартная клавиатура имеет три типа клавиш: – символьные (буквы, цифры); 312 – управляющие (функциональные, клавиши перемещения курсо- ра, вставка и т. д.); – сдвига (Ctrl, Alt, NumLock, CapsLock). При нажатии клавиши микропроцессор клавиатуры вырабатыва- ет код, который преобразуется системой Turbo Pascal в код скани- рования. Символьные клавиши возвращают при нажатии одно зна- чение (простой код), а управляющие – два, одно из которых ноль. Управление клавиатурой осуществляется посредством специали- зированных функций KeyPressed и ReadKey. Функция ReadKey счи- тывает символ с клавиатуры и возвращает значение типа char (табл. П 1.9). Чтение символа не сопровождается отображением его на экране. Функция KeyPressed возвращает булевое значение True, если была нажата какая-либо клавиша (табл. П 1.10), и False в про- тивном случае. Таблица П 1.9 Процедура Клавиши Символьные Управляющие сдвига KeyPressed True True False ReadKey Значение #00+значение – Таблица П 1.10 Код Значение Код Значение 1 2 3 4 71 Home 79 End 72 80 73 PgUp (страница вверх) 81 PgDn (страница вниз) 75 82 Ins (Вставка) 77 83 Del Работа в графическом режиме (модуль Graph) Модуль Graph предназначен для работы с графическими встро- енными функциями, которые можно использовать в программе по- сле подключения этого модуля с помощью зарезервированного сло- ва Uses. Подключение осуществляется следующим образом: Uses Graph; 313 Далее в программе следует загрузить графический драйвер для работы с монитором, например, для egavga.bgi – драйвер для EGAVGA-адаптера. Для этого выполняются две команды: Uses Graph; Var GraphDriver : Integer; GraphMode : Integer; Begin GraphDriver : = Detect; InitGraph(GraphDriver,GraphMode, ’C:\PAS\BGI’); CloseGraph; End. Первая команда присваивания устанавливает флаг для опознава- ния аппаратуры, а функция InitGraph автоматически обнаруживает аппаратные средства и загружает соответствующий графический драйвер, помещенный в каталоге «C:\PAS\BGI». Каталог может быть и другим и зависит от пути, где находится драйвер. Процедура CloseGraph останавливает работу графической системы и освобож- дает рабочие области, занятые графическим драйвером. После подключения драйвера можно использовать встроенные функции и процедуры для работы в графическом режиме. Некото- рые из них представлены ниже: Arc(x, y :Integer; нач_угол, кон_угол, радиус :Word) – процедура вычерчивает дугу окружности с центром (x, y) и радиу- сом «радиус»; дуга рисуется от начального («нач_угол») до конеч- ного угла («кон_угол»); Circle(X, Y :Integer; радиус :Word) – процедура вычерчива- ет окружность с центром (X,Y) и радиусом «радиус»; Ellipse(X, Y :Integer; нач_угол, кон_угол :Word; радX, радY : Word) – процедура рисует эллиптическую дугу, где точка центра (X,Y), а «радX» и «радY» – горизонтальная и вертикальная оси; дуга вычерчивается от начального «нач_угол» до конечного угла «кон_угол»; Line(X1, Y1, X2, Y2 :Integer) – процедура вычерчивает пря- мую линию из точки (X1,Y1) в точку (X2,Y2); Lineto(x, y :Integer) – процедура вычерчивает прямую ли- нию из точки, в которой находится текущий курсор, в точку с коор- динатами (x,y); 314 Moveto(x, y :Integer) – процедура перемещает текущий указа- тель в точку с координатами (x,y); OutText(строка :String) – процедура пересылает значение пара- метра «строка» на устройство вывода, начиная с текущего указателя; OutTextXY(X, Y :Integer; текст_строка :String) – процедура выводит значение параметра «текст_строка» , начиная с точки, за- данной координатами (X,Y); Rectangle(X1, Y1, X2, Y2 : Integer) – процедура вычерчива- ет прямоугольник. (X1,Y1) – левый верхний угол, (X2, Y2) – пра- вый нижний угол; GetX :Integer – функция возвращает X-координату текущего указателя; GetY :Integer – функция возвращает Y-координату текущего указателя; SetColor(цвет :Word) – процедура, используя палитру, устанав- ливает текущий цвет рисунка; SetBkColor(цвет :Word) – процедура, используя палитру, уста- навливает текущий цвет для фона; SetLineStyle(тип_строки :Word; образец :Word; толщина :Word) – процедура устанавливает текущую толщину и тип линии; SetTextStyle(шрифт :Word; направление :Word; разм_символа : CharSizeType) – процедура устанавливает текущий шрифт, тип и ко- эффициент размера символа. Пример (использование процедур модуля Graph). Написать про- грамму рисования «ели». Рисование «ели» производить поэтапно в цикле, до нажатия любой клавиши. (x0 + 50; y0 + 30) (x0 + 100; y0 + 80) (x0 + 180; y0 + 150) (x0 – 50; y0 + 30) (x0 – 100; y0 + 80) (x0 – 180; y0 + 150) (x0; y0) 315 Программа Program DemoGraph; Uses Graph, Crt; Var Gd, Gm : Integer; X0, Y0, T : Integer; Begin {начало раздела операторов программы} Gd := Detect; InitGraph(Gd, Gm, 'E:\Pascal\BIN'); {открытие граф. режима} X0 := 300; Y0 := 100; {координаты начала рисования} T := 30000; {значение задержки времени для поэтапного рисования} Repeat {начало цикла–выполнять, пока не нажата любая клавиши} {рисование ели с задержкой} MoveTo(X0, Y0); LineTo(X0+50, Y0+30); Delay(T); LineTo(X0+20, Y0+30); LineTo(X0+100, Y0+80); Delay(T); LineTo(X0+50, Y0+80); LineTo(X0+180, Y0+150);Delay(T); LineTo(X0+5, Y0+150); LineTo(X0+5, Y0+155); Delay(T); LineTo(X0-5, Y0+155); LineTo(X0-5,Y0+150); Delay(T); LineTo(X0-180, Y0+150);LineTo(X0-50, Y0+80); Delay(T); LineTo(X0-100, Y0+80); LineTo(X0-20, Y0+30); Delay(T); LineTo(X0-50, Y0+30); LineTo(X0, Y0); Delay(T); ClearDevice; {очистка графического экрана} Until KeyPressed; {конец цикла} CloseGraph; {закрытие графического режима} End. {конец программы} Встроенные функции для обработки строк Length(str) – функция вычисления длины строки str – типа String; Delete(str, i, j) – функция удаления из строки str подстроки длиной j начиная с позиции i; Insert(str, str2, i) – функция вставки строки str в строку str2 с позиции i; Copy(str, i, j) – функция выделения из str подстроки дли- ной j начиная с позиции i. Пример (использование строковых переменных). Написать про- грамму сортировки пяти фамилий Petrov, Sidorov, Pupkin, Turov, Ivanov по алфавиту. 316 Программа Program DemoStr; Uses Strings; Var Stroks : array[1..10] of String; i, j, k : Integer; r : string; Begin {начало раздела операторов программы} {заполнение массива Stroks фамилиями} Stroks[1] := 'Petrov'; Stroks[2] := 'Sidorov'; Stroks[3] := 'Pupkin'; Stroks[4] := 'Turov'; Stroks[5] := 'Ivanov'; for i := 4 downto 1 do for j :=1 to i do begin {начало циклов 1, 2} k := 1; while k < Length(stroks[j]) do begin {начало цикла 3 – побуквенное сравнение} if stroks[j,k] < stroks[j+1,k] then Break; if stroks[j,k] > stroks[j+1,k] then begin {начало блока 1} {перемена местами строк stroks[j] и stroks[j+1]} r := stroks[j]; stroks[j] := stroks[j+1]; stroks[j+1] := r; Break; {выход из цикла} end; {конец блока 1} k := k + 1; end; {конец циклов 1, 2} end; for i :=1 to 5 do writeln(Stroks[i]); {вывод фамилий} Readln; {ожидание нажатия клавиши Enter} end. {конец программы} Результат работы программы Ivanov Petrov Pupkin Sidorov Turov 317 П 1.7. Процедуры и функции пользователя Подпрограмма пользователя (процедура, функция) – это неза- висимая поименованная часть программы, предназначенная для вы- полнения определенных действий. После однократного предвари- тельного описания подпрограмму при необходимости можно вы- звать из любой позиции программы. По структуре ее можно рассматривать как мини-программу. Функция аналогична процеду- ре, но имеет два отличия: 1) функция передает в точку вызова скалярное значение (резуль- тат своей работы); 2) имя функции может входить в выражение как операнд, т. е. может использоваться в выражениях с различными вычислениями. Описание подпрограммы Описание подпрограммы включает заголовок (имя) и тело под- программы. Заголовок процедуры состоит из зарезервированного слова Pro- cedure, идентификатора (имени) процедуры и необязательного за- ключенного в круглые скобки списка формальных параметров с указанием типа каждого параметра. Procedure <имя> [(формальные параметры)]; Label … Const … Type … Var < описание локальных переменных > Begin < раздел операторов > End; Заголовок функции содержит зарезервированное слово Function, идентификатор (имя) функции, заключенный в круглые скобки, не- обязательный список формальных параметров с указанием типа каждого параметра и тип возвращаемого функцией значения. Function <имя> [(формальные параметры)] : Тип результата; Label … 318 Const … Type … Var < описание локальных переменных > Begin <раздел операторов> End; Например, Function Prov(x, y, z : Integer) : Real; В разделе операторов должен находиться по крайней мере один опе- ратор, присваивающий значение идентификатору (имени) функции. Когда подпрограмма выполнит свои действия, программа про- должится с оператора, следующего непосредственно за оператором вызова процедуры. Обращение к процедуре или функции производится с помощью оператора вызова: Имя процедуры или функции (список фактических параметров); Оператор вызова состоит из идентификатора (имени) процедуры или функции и списка фактических параметров, отделенных друг от друга запятыми и заключенных в скобки. Фактические параметры должны быть тех же типов и указаны в том же порядке, что и в описании подпрограммы. Пример (программа с использованием процедуры без входных и выходных параметров). Написать программу с использованием процедуры, которая на центр экрана периодически (100 раз) выво- дит слово «Справочник». Программа Program DemoProc1; Uses Crt; Var i : Integer; Procedure Ekran; {заголовок процедуры} Begin {начало процедуры Ekran} ClrScr; {очистка экрана} GotoXY (37, 11); {курсор помещается в центр экрана} Writeln(‘Справочник’); {вывод на экран} End; {конец процедуры Ekran} 319 Begin {начало основной программы} TextMode (2); {установка текстового режима} for i:= 1 to 100 do Ekran; {вызов процедуры Ekran 100 раз} End. {конец основной программы} Пример (программа с использованием двух процедур с входными параметрами). Написать программу с использованием процедур, которая в начале каждой строки экрана выводит слово «Справоч- ник» с сопровождением звукового сигнала. Входными параметрами первой процедуры являются номера строки и столбца вывода стро- ки. Входным параметром второй процедуры является частота зву- кового сигнала. Программа Program DemoProc2; Uses Crt; Var i : Integer; {локальная переменная функции} {Процедура Ekran входные параметры: X, Y – номера строки и столбца} Procedure Ekran(X, Y : Byte); {заголовок процедуры} Begin {начало процедуры Ekran} ClrScr; {очистка экрана} GotoXY (X, Y);{курсор помещается в точку с координатами X Y} Writeln(‘Справочник’); {вывод на экран слова ‘Справочник’} End; {конец процедуры Ekran} {Процедура Zwuk входной параметр: X – частота звукового сигнала} Procedure Zwuk(X : Integer); {заголовок процедуры} Begin {начало процедуры Zwuk} Sound(X); {генерация звука частотой Х} Delay(10); {задержка времени 10 мс} Nosound; {отмена звука} End; {конец процедуры Zwuk} Begin {начало основной программы} TextMode (2); {установка текстового режима} for i:= 1 to 25 do begin Ekran(1, i); {вызов процедуры Ekran для каждой i-й строки экрана} {вызов процедуры Zwuk с увеличением частоты звукового сигнала} Zwuk(100 + 10*i); end; End. {конец основной программы} 320 Пример (программа с использованием функции с входным и вы- ходным параметрами). Составить программу с использованием функции для вычисления значения y по формуле .0 если,cos ,0 если,sin xx xx y (П 1.1) Программа Program DemoFunc1; Var x1, y1 : Real; {Функция F входной параметр: x; выходной параметр: значение, вычисленное по формуле (П 1.1)} Function F(x : Real) : Real; {заголовок функции} Begin {начало функции F} {расчет значения функции в зависимости от величины x} If x > 0 Then F:= sin(x) Else F:= cos(x); End; {конец функции F} Begin {начало основной программы} Write(‘Введите x=’); Readln(x1); {ввод значения х с клавиатуры} y1:= F(x1); {вызов функции F для расчета} Writeln(‘Значение функции равно ’, y1:5:2);{вывод результата} End. {конец основной программы} Пример (программа с использованием процедуры с входным и выходным параметрами). Составить программу с использованием процедуры для вычисления значения y по формуле .0 если,cos ,0 если,sin xx xx y (П 1.2) Программа Program DemoProc3; Var x1, y1 : Real; {Процедура F входной параметр: x; 321 выходной параметр: y вычисленное по формуле (П 1.2)} Procedure F(x : Real; Var y : Real) {заголовок процедуры} Begin {начало процедуры F} {вычисление переменной y в зависимости от величины x} If x > 0 Then y:= sin(x) Else y:= cos(x); End; {конец процедуры F} Begin {начало основной программы} Write(‘Введите x=’); Readln(x1); {ввод значения х с клавиатуры} F(x1, y1); {вызов процедуры F для расчета} Writeln(‘Значение функции равно ’, y1:5:2);{вывод результата} End. {конец основной программы} Пример (программа с использованием двух процедур, в которых в качестве входного и выходного параметров используется массив). Составить программу с использованием двух процедур, первая про- цедура формирует одномерный массив Y по закону, представленно- му ниже. Вторая процедура находит значение максимального эле- мента этого массива. .0 если,cos ,0 если,sin xx xx y i i i (П 1.3) Значения элементов xi вводятся с клавиатуры, i = 1, 10. Программа Program Demo5; Type TMas = array[1..10] of Real; {описание типа массива TMas} Var {описание глобальных переменных программы} X1, Y1 : TMas; MaxY1 : Real; {Процедура FormY входной параметр: X – массив; выходной параметр: Y – массив, элементы которого вычисляют- ся по формуле (П 1.3)} Procedure FormY(X : TMas; Var Y : TMas);{заголовок процедуры} Var I : Byte; {описание локальных переменных процедуры} Begin {начало раздела операторов процедуры FormY} For I :=1 to 10 do If X[I] > 0 Then Y[I]:= sin(X[I]) Else Y:= cos(X[I]); End; {конец процедуры FormY} 322 {Процедура MaxArr входной параметр: X – массив; выходной параметр: MaxX – максимальный элемент массива X} Procedure MaxArr(X : TMas; Var MaxX : Real);{заголовок процедуры} Var {раздел описания локальных переменных процедуры} I : Byte; Begin {начало раздела операторов процедуры MaxArr} MaxX := Y[1]; For I :=2 to 10 do If Y[I] > MaxX Then MaxX:= Y[I]; End; {конец процедуры MaxArr } Begin {начало раздела операторов основной программы} Write(‘Введите элементы массива Х ’); for I :=1 to 10 do Read(X1[I]); {ввод значений с клавиатуры} FormY(X1, Y1); MaxArr(Y1, MaxY1) ; Writeln(‘Максимальный элемент массива Y равен ’, MaxY1); {вывод} End. {конец основной программы} Глобальные и локальные переменные Глобальные переменные – это переменные, описанные в основ- ной программе и доступные как программе, так и всем ее подпрограммам. Локальные переменные – это переменные, описанные внутри подпрограммы и доступные только данной подпрограмме. Они могут быть описаны как в заголовке подпрограммы (формальные параметры), так и в разделе описания переменных. Если переменная описана в основной программе (глобальная переменная) и не переопределена в подпрограмме, она может использоваться в подпрограмме и ее значение может измениться. Если эта переменная описана в подпрограмме (локальная переменная), то эти локальная и глобальная переменные между собой никак не связаны и при изменении значения локальной переменной в подпрограмме значение глобальной переменной в основной программе изменяться не будет. Фактические и формальные параметры. Передача параметров в подпрограммы Параметры подпрограммы – это значения, передаваемые в про- цедуру или функцию в качестве аргументов. При описании подпро- 323 граммы в скобках указываются имена переменных, содержащих передаваемые значения. Значение каждого фактического параметра при вызове процедуры передаётся формальному параметру. Существуют два способа передачи фактических параметров в подпрограмму: по значению и по ссылке. С помощью первого способа (передача по значению) значение переменной фактического параметра при вызове подпрограммы присваивается локальной переменной (объявленной внутри подпрограммы), являющейся формальным параметром подпро- граммы. Что бы потом ни происходило с локальной переменной, это никак не отразится на соответствующей глобальной (объявленной в основной программе). Если же значение переменной необходимо изменить с помощью вычислений подпрограммы, то используют второй способ (передача по ссылке). При этом происходит следующее: при обращении к подпрограмме не происходит формирования локальной переменной формального параметра, а во время выполнения подпрограммы имя этой локальной переменной будет указывать на ту же область памяти, что и имя соответствующей глобальной переменной. Если в этом случае изменить локальную переменную, изменятся данные и в глобальной. Для использования этого способа передачи параметров перед именем переменной формального параметра в описании подпрограммы ставится служебное слово Var. В нижеприведенных примерах направления стрелок указывают тип передачи фактического параметра в подпрограмму (по значению или по ссылке). Стрелка над параметром подпрограммы показыва- ет, что подпрограмма только принимает значение этого параметра (передача по значению). Стрелка над параметром подпрограммы указывает, что подпрограмма принимает значение этого параметра и передает его в основную программу (передача по ссылке). Примеры заголовков процедур Procedure K1 (Var A, B : Integer; D : Real) – процедура принимает значения переменных A, B по ссылке (значения меняются и 324 передаются в основную программу) и принимает значение переменной D по значению (просто принимает значение и не передает его). Procedure K3 (R1, R2 : Integer; Var X1, X2 : Real) – про- цедура принимает значения переменных R1, R2 по значению (про- сто принимает и не передает их) и значения переменных Х1, Х2 по ссылке (значения меняются и передаются в основную программу). Если в качестве передаваемого параметра используется массив, то заранее в разделе Type тип этого массива должен быть описан, а затем этот тип будет использоваться для описания как самого мас- сива в основной программе, так описания в списке формальных па- раметров подпрограммы. Например: Procedure K2 (OK : Massiv) – передача в процедуру массива типа Massiv, который прежде должен быть описан: Type Massiv = Array [1..12] of Real; Пример (фрагмент программы с использованием процедуры) Procedure Calc(X, Y, Z : Real; Var R1, R2 : Real); Var U : Real; begin U:= X*Y*Z; R1:= Cos(U); R2:= Sin(U); end; Эта процедура вызывается следующим образом: Calc(2.1, 3.2, 8.5, Rez1, Rez2); Пояснения к примеру. Формальные входные параметры X, Y, Z процедуры Calc принимают значения, соответствующие фактиче- ским при вызове процедуры, а именно: X = 2.1, Y = 3.2, Z = 8.5. Ис- пользуя эти значения, выполняется процедура. Результатами вы- полнения процедуры являются формальные параметры R1, R2, ко- торые передают свои значения фактическим параметрам Rez1, Rez2. 325 Пример (программа с использованием процедур) Программа Program Demo7; Var {описание глобальных переменных программы} A1, A2 : Integer; J1, J2, J3 : Integer; Procedure W1(R1, R2 : Integer; {принимает R1, R2} Var X1, X2 : Integer);{X1, X2 - передает} Begin {начало процедуры W1} X1:= R1 + R2; X2 := R1 * R2; end; {конец процедуры W1} Procedure W2(R3, R4 : Integer); {принимает R3, R4} Begin {начало процедуры W2} A1:= R3 - 4; {А1, А2 – изменяются глобальные переменные} A2:= R4 + 4; end; {конец процедуры W2} Procedure W3(Var R5, R6 : Integer);{передает R5, R6} Begin {начало процедуры W3} R5:= J1 + 1; R6:= J2 + 7; end; {конец процедуры W3} begin {начало основной программы} J1:= 10; J2:= 30; J3:= 40; W1(J1, J2, A1, A2); {вызов процедуры W1} {вывод результатов} Writeln(' J1 = ', J1,' J2 = ', J2,' A1 = ',A1, ' A2 = ', A2); W2(J2, J3); {вызов процедуры W2} Writeln('A1 = ', A1, ' A2 = ', A2);{вывод результатов} W3(A1, A2); {вызов процедуры W3} {вывод результатов} Writeln(' J1 = ',J1,' J2 = ', J2,' A1 = ', A1,' A2 = ',A2); Readln; {ожидание нажатия клавиши Enter} end. {конец основной программы} Результаты работы программы: J1 = 10 J2 = 30 A1 = 40 A2 = 300 A1 = 26 A2 = 44 J1 = 10 J2 = 30 A1 = 11 A2 = 37 Пояснения к примеру. При вызове процедуры W1 происходит сле- дующее. Значения переменных J1, J2 передаются в процедуру (пере- дача по значению), а значения переменных А1, А2 изменяются (пере- дача по ссылке). Результаты выполнения процедуры – в первой строке. 326 При вызове процедуры W2 значения переменных J2, J3 переда- ются в процедуру (передача по значению), внутри процедуры изме- няются значения глобальных переменных А1, А2. Результаты вы- полнения процедуры – во второй строке. При вызове процедуры W3 значения переменных A1, A2 переда- ются и изменяются в процедуре (передача по ссылке), внутри про- цедуры используются глобальные переменные J1, J2. Результаты выполнения процедуры – третья строка. Пример (программа с использованием процедуры). Написать про- грамму вычисления 4 1 3 1 JI ij aS , где aij – элементы матрицы А, фор- мирующиеся по закону j i aij . Для вычисления суммы использовать процедуру. Программа Program Demo8; Type {описание типа Mas - двухмерного вещественного массива} Mas = Array [1..3, 1..4] of Real; Var {глобальные переменные программы} I, J : Byte; A : Mas; Result : Real; Procedure Summa(B : Mas; Var C : Real); Var I, J : Byte; {локальные переменные процедуры} Begin {начало процедуры Summa} C:= 0; for I:=1 to 3 do {цикл по строкам матрицы В} for J:=1 to 4 do {цикл по столбцам матрицы В} C:= C+ B[I, J]; {подсчет суммы элементов матрицы В} end; {конец процедуры Summa} Begin {начало основной программы} for I:=1 to 3 do {цикл по строкам матрицы А} for J:=1 to 4 do {цикл по столбцам матрицы А} A[I, J]:= I/J; {вычисление элемента A[I, J] } Summa(A, Result); {вызов процедуры Summa} {вывод результата} Writeln('Сумма элементов массива = ', Result:5:2); Readln; {ожидание нажатия клавиши Enter} end. {конец основной программы} 327 Результаты работы программы Сумма элементов массива = 12.50 Пояснения к примеру. При вызове процедуры Summa формаль- ные параметры процедуры принимают значения фактических, а именно: массив В становится равным массиву А, значение С = Re- sult. В процедуре производится суммирование элементов массива В, значение суммы содержится в переменной C. Значение С передает- ся по ссылке, следовательно, при изменении С в процедуре также изменяется значение переменной Result в основной программе. Пример (программа с использованием процедуры). Написать программу вычисления формирования массива C по закону iii bac , где ai, bi – элементы массивов A и B, i = 1; 10 (1). Для формирования элементов массива использовать процедуру, вход- ными параметрами которой будут массивы A и B, выходной – мас- сив C. Программа Program Demo9; Type {описание типа Mas – одномерного вещественного массива} Mas = Array [1..10] of Real; Var {глобальные переменные программы} I : Byte; A, B : Mas; Procedure FormC(A, B : Mas; Var C : Mas); Var I : Byte; {локальная переменная процедуры} Begin {начало процедуры FormC} for I:=1 to 10 do {цикл по элементам массива С} C[I]:= A[I] * B[I]; {формирование С[I] элемента массива} end; {конец процедуры FormC} Begin {начало основной программы} for I:=1 to 10 do {цикл по элементам массива А} Readln(A[I]); {чтение I-го элемента массива А} for I:=1 to 10 do {цикл по элементам массива B} Readln(B[I]); {чтение I-го элемента массива B} FormC(A, B, C); {вызов процедуры FormC} Readln; {ожидание нажатия клавиши Enter} end. {конец основной программы} 328 П 1.8. Интегрированная среда Turbo Pascal Главное меню содержит лишь оглавление дополнительных ме- ню. В этих меню сгруппированы действия, близкие по своему роду, условное название которых и служит кодовым словом соответству- ющей опции главного меню: File (файл) – действия с файлами и выход из системы; Edit (редактировать) – восстановление испорченной строки и операции с временным буфером; Search (искать) – поиск текста, процедуры, функции или места ошибки; Run (выполнить) – выполнение программы; Compile (компилировать) – компиляция программы; Debug (отладка) – отладка программы; Tools (инструменты) – вызов вспомогательных программ (ути- лит); Options (опции) – установка параметров среды; Window (окно) – работа с окнами; Help (помощь) – обращение к справочной службе. Рассмотрим некоторые пункты меню более подробно. Меню File (файл) New (новый) Создание нового файла, по умолчанию этому файлу присваивается имя NONAME.PAS, кото- рое можно изменить при записи файла на диск Open… (открыть) Открытие в редакторе существующего текстово- го файла, в котором набрана либо программа, либо данные Save (со- хранить) Сохранение файла на диске; если имя файла дано по умолчанию, то пользователю предла- гается изменить на другое имя, иначе сохраня- ется файл со старым именем Save as… (сохранить как) Сохранение файла с заданным пользователем именем Change dir Установка рабочего каталога Exit (вы- ход) Выход из среды Turbo Pascal 329 Меню Edit (редактирование) Undo (отменить) В активном окне редактора восстанавли- вает только что уничтоженную или изме- ненную строку Cut (вырезать) Удаляет (вырезает) выделенный блок из окна редактора и переносит его в буфер обмена Copy (копировать) Копирует выделенный блок из окна редак- тора в буфер обмена Paste (вставить) Вставляет содержимое буфера обмена в окно редактора с позиции курсора Clear (очистить) Удаляет из окна редактора выделенный блок, но не помещает его в буфер обмена Меню Run (выполнить) Run (выполнить) Осуществляет компиляцию, компоновку и выполнение программы из окна редактора Step Over Построчно выполняет программу (трасси- ровка) без захода в процедуры и функции Trace into Построчно выполняет программу (трасси- ровка) с заходом в процедуры и функции Go to cursor Выполняет программу до строки, где распо- ложен курсор, а затем останавливается и пе- редает управление встроенному отладчику Program re- set Прекращает выполнение программы Меню Compile (компилировать) Compile (компилировать) Компилирует программу в активном окне редактора Меню Debug (отладка) Breakpoints… Позволяет просмотреть все точки оста- нова (контрольные точки) и при необ- ходимости удалить, переместить любую точку или задать условия ее работы Call stack Делает активным окно программного стека. В этом окне отображаются все вызовы процедур и функций 330 Watch Делает активным окно наблюдения состояния переменных, добавленных командой Add Watch… Output Делает активным окно выходных ре- зультатов User screen Делает активным окно пользователя и распахивает его во весь экран Evaluate/modify… Дает возможность в процессе отладки просмотреть и изменить значение пе- ременной или выражения Add watch… Добавляет переменную в окно Watch Add breakpoint… Установка точки останова в текущей строке. Текущая строка – строка с кур- сором в окне редактора П 1.9. Работа в интегрированной среде Turbo Pascal Создание программы 1) Установить рабочий каталог (File → Change dir). 2) Создать новый файл (File → New). Откроется новое окно ре- дактирования, по умолчанию имя файла NONAME00.PAS. 3) Сохранить программу на диске (File → Save или ) или (File → Save As…). 4) В появившемся окне редактирования набрать программу или редактировать существующую. 5) Компилировать программу (Compile → Compile или ). Если компиляция прошла успешно, то на экран выво- дится сообщение «Compile successful: Press any key» и для возврата в окно редактирования следует нажать любую кнопку. Если найде- ны ошибки, то компилятор укажет строку с ошибкой, в верхней строке будет ее описание. Ошибку следует исправить и выполнить компиляцию программы заново. 6) Выполнить программу (Run → Run или ). 7) Посмотреть результат (Debug → User Screen или ). 8) Выход из Паскаля (File → Exit или ). 331 Редактирование существующей программы 1) Открыть существующий файл (File → Open или ). 2) В появившемся окне редактирования редактировать программу. 3) Далее – см. раздел «Создание программы», пункты 4–7. Отладка программы Отладка используется в том случае, если происходят ошибки или сбои при работе программы. Встроенный отладчик среды Turbo Pascal позволяет выполнять программу построчно, отдельными блоками, что дает возможность следить за изменениями значений переменных в ходе работы программы. Производить отладку можно различными способами: 1) Пошаговое выполнение программы (трассировка). Для этого необходимо выбрать Run → Step over () или Run → Trace into (). В первом случае подпрограмма выполняется за один шаг при трассировке, во втором – производится построчное выполнение подпрограммы. Начало выполнения – первый исполняемый опера- тор основной программы. После выполнения очередного оператора выполнение останавливается и у пользователя есть возможность провести анализ промежуточных результатов работы программы. 2) Выполнение программы до точки останова, для этого надо: а) установить курсор на строке, на которой необходимо оста- новить выполнение; б) установить точку останова – нажать на правую кнопку мыши и в локальном меню выбрать пункт Toggle breakpoint () – эта строка подсветится красным цветом; в) выполнить программу до точки останова, для этого выбрать Run → Run (). Выполнение программы остановится на выбранной строке (см. п.2, а, б), и далее можно продолжать отладку путем трассировки, анализируя результаты работы операторов; г) убрать точки останова можно тем же способом, а именно, установить курсор на строке останова, в локальном меню выбрать Toggle breakpoint (), можно также это сделать с помо- щью пункта меню Debug → Breakpoints…. 3) Выполнение программы, пока не станет истинным заданное условие, для этого надо: 332 а) установить курсор на строку, на которой необходимо оста- новить выполнение программы; б) выбрать Debug → Add Breakpoint… и в появившемся диа- логовом окне в поле Condition задать условие остановки (например, в цикле с параметром i = 1, 100 можно задать условие для одного из операторов цикла i = 10 – в этом случае выполнение остановится на этом операторе при i = 10). 4) Выполнение программы до позиции курсора, для этого надо: а) установить курсор на строке, на которой необходимо оста- новить выполнение; б) выбрать Run → Go to cursor, или в локальном меню пункт Go to cursor, или (). Анализ промежуточных результатов работы операторов про- граммы производится с помощью: 1) окна Watch – окно наблюдения состояния переменных и вы- ражений; для работы с ним необходимо: а) активизировать окно Watch, для этого выбрать Debug → Watch и внизу появится окно Watch; б) задать переменные и/или выражения, значения которых необходимы для наблюдения, для этого необходимо выбрать Debug → Add Watch…, или в окне Watch дважды щелкнуть на пу- стой строке, или нажать и в появившемся диалоговом окне ввести имя переменной или выражение; в) указанные переменные и выражения вместе с их текущими значениями будут постоянно содержаться в окне наблюдения со- стояния переменных Watch; 2) окна Evaluate/Modify, которые позволяют просматривать те- кущие и задавать новые значения для переменных и выражений, для этого надо: а) выбрать пункт меню Debug → Evaluate/Modify (); б) в появившемся диалоговом окне в поле Expression задать имя переменной или выражение, после нажатия или кнопки Evaluate в поле Result появится текущее значение заданной пере- менной, новое значение переменной необходимо задавать в поле New value. Прервать выполнение программы во время отладки можно с по- мощью команды Run → Program reset (. 333 Пример отладки Текст программы: 1. Program DemoDebug; 2. Var I, P : Integer; 3. R : Real; 4. Begin 5. for I:=-5 to 5 do 6. Begin 7. P := Sin(I)*Cos(I); 8. R := 1/P; 9. Writeln(R:5:2); 10. end; 11. end. Алгоритм отладки программы 1) Запустить программу на компиляцию. Компиляция програм- мы прошла успешно. 2) На этапе выполнения программы появится сообщение об ошиб- ке «Error 200. Division by zero». Это означает, что произошло прерыва- ние выполнения программы вследствие того, что знаменатель выраже- ния стал равен нулю. Очевидно, что ошибка произошла при вычисле- нии в седьмой строке. Необходимо найти, при каком значении I происходит ошибка, и исправить ее, для этого необходимо: а) на восьмой строке программы поставить точку останова (щелкнуть мышью на этой строке и в локальном меню выбрать Toggle breakpoint); б) активизировать окно Watch (пункт меню Debug → Watch) и задать в нем переменную для наблюдения – P (щелкнуть мышью в окне редактора, выбрать Add Watch…), для удобного отображения окон редактора и Watch можно воспользоваться пунктом меню Win- dow → Tile – в результате окна не будут перекрываться; в) запустить программу на выполнение () – про- грамма остановится на восьмой строке, в окне Watch будет отобра- жено значение переменной Р, затем продолжать выполнять про- грамму (), параллельно отслеживая изменение перемен- ной Р; в результате будет обнаружено, что обнуление переменной Р происходит при I = 0; 334 г) для того чтобы избавиться от ошибки, необходимо вставить проверку условия (Р <> 0) в начале восьмой строки, в результате получим: If p<>0 then R := 1/P. П 1.10. Правила и примеры построения схем алгоритмов Алгоритм – совокупность правил и предписаний, выполнение ко- торых приводит к решению поставленной задачи. Процесс построе- ния алгоритма (конструирование) называется алгоритмизацией. Правильно разработанный алгоритм обладает следующими свойствами: 1) дискретность – значения величин в каждый следующий мо- мент времени должны получаться по определенным правилам из значений величин, имевшихся в предшествующий момент времени; 2) определенность (детерминированность) – каждое правило ал- горитма должно быть однозначным, т. е. значения величин, получа- емых в какой-то момент времени, однозначно связаны со значения- ми величин, вычисленных ранее; 3) результативность (конечность) – алгоритм должен приво- дить к решению задачи за конечное число шагов; 4) массовость – алгоритм должен разрабатываться в общем виде так, чтобы его можно было применить для класса задач, различаю- щихся лишь исходными данными. Для оценки эффективности работы алгоритма используется ха- рактеристика вычислительной сложности алгоритма, которая может быть определена как сравнительное время решения задачи с помо- щью различных алгоритмов. Для обеспечения хорошей наглядности и доступности при кон- струировании алгоритмов используется метод построения схем ал- горитма. Схемы алгоритмов – графический способ записи последо- вательности выполнения некоторых процедур, изображаемых в ви- де графических символов определенной геометрической конфигурации, причем размеры этих символов и порядок построе- ния схем регламентирован ГОСТ 19.701–90 (схемы алгоритмов, программ, данных и систем) (ИСО 5807–85). Наиболее часто упо- требляемые графические символы и соответствующие им процеду- ры приведены в табл. П 1.11. 335 Таблица П 1.11 Обозначение Наименование Терминатор (отображает выход во внешнюю среду или вход из внешней среды) Данные (отображает данные, ввод-вывод данных) Процесс (отображает функцию обработки данных любого вида) Решение (отображает решение или функцию переключательно- го типа, разветвление) Граница цикла (начало … конец) Предопределенный процесс (подпрограмма, модуль) Соединитель (выход в часть схемы и вход из другой части этой схе- мы, используется для обрыва линии и продолжения ее в другом месте) Подготовка (отображает модификацию команды с целью воздей- ствия на некоторую функцию, инициализация) Комментарий 336 Символы в схеме должны быть расположены равномерно и быть по возможности одного размера. Внутри символа необходимо поме- щать минимальное количество текста, необходимого для понимания функции данного символа. Если объем текста, помещаемого внутри символа, превышает его размер, следует использовать символ ком- ментария. Потоки управления в схемах показываются линиями. Если направление потока отлично от стандартного (т. е. справа налево и снизу вверх), то стрелки должны указывать это направление. Известно, что для реализации любого алгоритма достаточно трех базовых управляющих процессом обработки информации структур: композиция или следование, альтернатива или ветвление, итерация или цикл (теорема Бома–Якопини). Первая базовая структура «сле- дование» реализуется линейным вычислительным алгоритмом. Вто- рой базовой структурой является «ветвление», позволяющее в зави- симости от результата проверки условия (истина или ложь) выбрать один из альтернативных путей работы алгоритма. Третья базовая структура «цикл» обеспечивает повторное выполнение операторов. Примеры оформления алгоритмических структур согласно стан- дартам и соответствующие им фрагменты программы представлены в табл. П 1.12, П 1.13. Основными элементами программ являются структуры, реализующие ветвления и циклические структуры, и правила их оформления должны соответствовать ГОСТ 19.701–90. В частности, при построении схемы алгоритма для структуры, реа- лизующей ветвление, используется символ «Решение», для цикли- ческих структур используется парный символ «Граница цикла» или символ «Подготовка». В табл. П 1.12 представлены различные эле- менты алгоритмических структур, реализующих ветвление. В табл. П 1.13 представлены различные элементы алгоритмических структур, реализующих циклы. 337 Таблица П 1.12 Описание задачи и фрагмент программы на языке Pascal Элемент алгоритмической структуры 1 2 Пример 1 Если A > B, то А =10 да нет A>B A=10 If A > B Then A := 10; Пример 2 BА BА Y если,0 ; если,10 данет A>B A=10A=0 If A>B Then Y := 10 else Y := 0; Пример 3 BА BА BА Y если3, ; если,2 ; если,1 данет A>B Y=1AB Then Y := 1 else If AB P=1 P=Pcos(K) 2 K=1,10 2 S=0 S=S+sin(K) 1 K=3, 20 1 данет If A > B then begin P := 1; for K := 1 to 10 do P := P * cos(K); end else begin S := 0; for K := 3 to 20 do S:=S + sin(K); end; Цикл с параметром – c использованием символа «Подготовка» 10 4i iaP P=1 P=PA[I] Вывод P I=4,10 … P := 1; for I :=4 to 10 do P := P * A[I]; Writeln(P); … 340 Продолжение табл. П 1.13 1 2 Два цикла с параметрами – с использованием парных символов «Граница цикла» 10 1 20 1i j ijaS S=0 S=S+A[I, J] Вывод S A I=1,10 B B J=1,20 A S := 0; for I :=1 to 10 do for J :=1 to 20 do S := S + A[I, J]; Writeln(S); … Два цикла с параметрами – с использованием символа «Подготовка» 10 1 20 1i j ijaP P=1 P=PA[I, J] Вывод P I=1,10 J=1,20 … P := 1; for I :=1 to 10 do for J :=1 to 20 do P := P * A[I, J]; Writeln(P); … 341 Продолжение табл. П 1.13 1 2 Ввод одномерного массива K10 – c использованием парного символа «Граница цикла» … for I :=1 to 10 do Read(K[I]); … A I=1,10 A Ввод K[I] Ввод (вывод) двумерного массива K10×20 – c использованием парных символов «Граница цикла» Построчный ввод … for I :=1 to 10 do begin for J :=1 to 20 do Read(K[I, J]); Readln; end; … Построчный вывод … for I :=1 to 10 do begin for J :=1 to 20 do Write(K[I, J], ' '); Writeln; end; … Ввод Вывод B J=1,20 B Ввод K[I, J] A I=1,10 A B J=1,20 B Вывод K[I, J] A I=1,10 A 342 Окончание табл. П 1.13 1 2 Использование символа предопределенного процесса Фрагмент программы с использованием процедуры Gauss … Readln(a1, b1, c1); Readln(a2, b2, c2); Gauss(a1, b1, c1, a2, b2, c2, x1, x2); … Ввод a2, b2, c2 Ввод a1, b1, c1 Gauss(a 1,b1,c1, a2,b2,c2) П 1.11. Представление схем алгоритмов с помощью Microsoft Word Чаще всего для построения схем алгоритмов используют ин- струменты Microsoft Word. В данном подразделе будет приведено описание основных операций, используемых для создания схем, в среде Microsoft Word. Создание символов производится с помощью инструментов пункта Автофигуры Блок схема (рис. П 1.1) панели Рисование (рис. П 1.2). Включить отображение панели Рисование можно с по- мощью кнопки Панель рисования на панели Стандартная или выбором пункта меню Вид Панели Инструментов Панель ри- сования. Так, например, организация цикла производится с помо- щью автофигуры «Подготовка» . Добавление текста необходимо производить с помощью пункта Добавить текст локального меню автофигуры (появляется после щелчка правой кнопкой на автофигуре). Если текст не помещается в символе, то следует написать его в комментарии к этому символу, сконструировав его из линий. 343 Выделение группы символов производится с помощью клавиши . Рис. П 1.1 Рис. П 1.2 Указание размеров производится следующим образом: необхо- димо выделить символ или группу символов и дважды щелкнуть на выделенном символе или выбрать пункт меню Формат Автофи- гура, затем перейти на вкладку Размер и в полях Ширина и Высота указать необходимые значения. Выравнивание символов производится следующим образом: 1) выделить необходимые символы с помощью инструмента Выбор объектов или последовательно выделяя их щелчком мыши с одновременно нажатой клавишей ; 2) активизировать команду Действия на панели Рисование: Дей- ствия Выровнять/распределить; 3) из открывшегося списка выбрать необходимую команду для работы с выделенными объектами. Необходимо обратить внимание на наличие флажка у пункта Относительно страницы (Действия Выровнять/распреде- лить Относительно страницы). Если он отсутствует, то вырав- 344 нивание символов производится относительно друг друга, а если он имеется – то относительно страницы. Соединение символов производится с помощью инструментов пункта Автофигуры Соединительные линии (рис. П 1.3). Ин- струмент Соединительные линии работает только на полотне ри- сунка. Выбрав соединительную линию, надо указать мышью места закрепления соединительной линии. При перемещении указателя мыши по символам места возможных соединений отображаются в виде синих кружков. Следует подвести указатель к первому симво- лу и щелкнуть на месте начала соединения, затем подвести указа- тель мыши на другую фигуру и щелкнуть на месте конца соедине- ния. Рис. П1.3 Указание направления действия в алгоритме производится в том случае, если оно отлично от стандартного, а именно – справа налево и снизу вверх. Для этого необходимо использовать инструмент Стрелка на панели Рисование. Если необходимо указать на рисунке несколько стрелок, то лучше копировать уже имеющиеся, поскольку при этом не происходит изменения направления соединительных линий. Для более точного подбора положений символов и стрелок мож- но использовать одновременное нажатие клавиши и клавиш движения курсора, а для подбора положения линии можно исполь- зовать одновременное нажатие клавиши и кнопки мыши. 345 Вставка слов «да» и «нет» возле символа ветвления произво- дится с помощью инструмента Надпись на панели Рисование. Надпись следует отформатировать, убрав заливку и рамку: Фор- мат Надпись вкладка Цвета и линии. Для поля цвет Заливки выбрать значение «Нет заливки», для поля цвет линии – значение «Нет линий». Добавление комментария к схеме алгоритма производится сле- дующим образом: а) добавить символ Автофигуры Основные фигуры Левая круглая скобка (рис. П 1.4); б) желтый маркер добавленной автофигуры переместить в край- нее левое верхнее положение, для того чтобы скобка приобрела вид квадратной скобки; в) соединить соответствующий символ и скобку соединительной линией, сделав ее пунктирной с помощью инструмента Тип штриха; г) вставить текст комментария с помощью инструмента Надпись. Рис. П 1.4 Пример пошагового построения схемы алгоритма 346 Используя инструментарий MS Word, необходимо построить схему алгоритма для табуляции функции xxy 233 sin)4(log для x = –10, 100 (0,1). Шаг 1. Определить типов символов исходя из анализа условия задачи: а) символ начала алгоритма – терминатор ; б) для перебора значений х необходимо организовать цикл с по- мощью символа Решение , с его помощью организуется про- верка окончания цикла; в) для вычисления значения y необходимо использовать cимвол Процесс ; г) для вывода значений на экран необходимо использовать cимвол Данные ; д) символ окончания алгоритма – терминатор . Шаг 2. С помощью команды панель Рисования Автофигу- ры Блок-схема добавить символы в схему алгоритма в опреде- ленной последовательности один под другим. Шаг 3. Задать необходимые размеры символов с помощью коман- ды Формат Автофигуры Размер Ширина и Высота, а имен- но: для поля Ширина задать значение 3 см, для поля Высота – 2 см, для символов начала и конца алгоритма для поля Высота – 1 см. Шаг 4. Выровнять символы, размещенные по центру: а) установить флажок у пункта Относительно страницы (Дей- ствия Выровнять/распределить Относительно страницы); б) выделить группу символов с помощью клавиши Shift или ин- струмента Выбор объектов; в) применить команду Действия Выровнять/распределить Выровнять по центру. Шаг 5. Выровнять символы, размещенные справа (символы Процесс и Данные): а) убрать флажок у пункта Относительно страницы (Дей- ствия Выровнять/распределить Относительно страницы); 347 б) выделить группу символов с помощью клавиши или инструмента Выбор объектов; в) применить команду Выровнять по центру к выделенным сим- волам. Шаг 6. Добавить в символы текст. Для этого необходимо щелк- нуть на символе, в локальном меню выбрать команду Добавить. Так, например, в символ начала алгоритма необходимо добавить текст «Начало», в следующий символ Процесс «Х = –10». Отфор- матировать текст таким образом, чтобы он располагался по центру символа. Результаты шагов 1–6 представлены на рис. П 1.5. Начало X = -10 Х3-4 0 Вывод Y «Функция не опре- делена» Х=Х+0.1 Конец X<100 Y = … Рис. П 1.5 348 Шаг 7. Поскольку весь необходимый текст не помещается в символе процесса, необходимо добавить комментарий: а) вставить скобку с помощью инструмента Автофигуры Основные фигуры Левая круглая скобка; б) соединить её с символом схемы пунктирной соединительной линией; в) вставить в комментарий текст с помощью инструмента Надпись (в данном случае создается формула в редакторе формул Microsoft Equation). Шаг 8. Вставить надписи «да» и «нет» возле символов, реализую- щих ветвление с помощью инструмента Надпись панели Рисование. Шаг 9. Соединить символы соединительными линиями с исполь- зованием инструментов панели Рисование: Автофигуры Соеди- нительные линии. Указать направление действия алгоритма (где это необходимо) стрелками с помощью инструмента Стрелка на пане- ли Рисование. Результаты шагов 7–9 представлены на рис. П 1.6. 349 Результаты шагов 7–9 представлены на рис. П 1.7. Рис. П 1.7 Начало X = -10 Х3-4 0 Вывод Y «Функция не опре- делена» Х=Х+0.1 Конец X<100 Y = … x xy 2 3 3 sin )4(log да нет да нет Рис. П 1.6 350 П 1.12. Представление схем алгоритмов с помощью программы Microsoft Visio Для построения схем алгоритмов можно использовать инстру- менты программы Microsoft Visio (исполнение рисунков данного подраздела проводилось в Microsoft Visio 2003). Последовательность действий для построения схемы алгоритмов: Шаг 1. Определить типы символов, исходя из анализа условия задачи. Шаг 2. Создать символы путем перемещения объектов на стра- ницу документа из вкладки Basic Flowchart Shapes и расположить их в необходимом порядке следования. Размеры символов, коорди- наты и угол расположения можно задавать с помощью панели Раз- мер и положение, активизация которой производится с помощью выбора пункта Вид Размер и положение. Шаг 3. Ввести в символы необходимый текст (активизируется двойным щелчком мыши) или формулу (выбор пункта Вставка Объект… Microsoft Equation). Текст можно вращать с помощью кнопки Текстовый блок (рис. П 1.7). Рис. П 1.7 Шаг 4. Соединить символы с помощью инструмента Соедини- тель (кнопка Соединитель на панели Стандартная) и точек соеди- нения (рис. П 1.8): активизировав кнопку Соединитель, щелкнуть по точке соединения первого символа и появившуюся линию про- тянуть, не отпуская мыши, до точки соединения со вторым симво- лом. После соединения символов щелкнуть по кнопке Указатель (активизация кнопки Указатель позволяет завершить работу с объектами определенных групп). Рис. П. 1.8 351 Можно использовать как уже имеющиеся точки соединения сим- волов, так и создавать новые. Для этого необходимо выделить щелчком символ или линию , щелкнуть по кнопке Точка соедине- ния щелкнуть в месте расположения новой точки соединения при нажатой клавише (появится синий крестик, который будет перемещаться вместе с символом). Такой способ соединения сим- волов удобен тем, что при перемещении символов линии соедине- ния не обрываются. Шаг 5. Нарисовать стрелки: 1) вставить на линии по две точки соединения (рис. П 1.9, а); 2) создать стрелку с помощью инструмента Линия на панели Стандартная и кнопки Концы линий панели Форматирование (рис. П 1.9, б); 3) вставить стрелки в точки соединения (рис. П 1.9, в), для чего последовательно подтягивать концы стрелок к соответствующим местам соединения. а б в Рис. П 1.9 Шаг 6. Вставить подписи «да», «нет» для символов решения с помощью кнопки Текст на панели Стандартная (см. рис. П 1.7). Шаг 7. Пронумеровать символы с помощью инструмента Текст (см. рис. П 1.7). Шаг 8. Выровнять символы: Точки соединения 352 а) выделить объекты; б) выбрать пункт меню Форма → Выровнять формы; в) в диалоговом окне Выровнять формы задать параметры вы- равнивания. Шаг 9. Сгруппировать символы: а) выделить объекты; б) выбрать пункт Группировать в основном или локальном меню Форма. П 1.13. Пояснения к решению некоторых задач пособия Табулирование (табуляция) функции Табулирование (табуляция) функции – это составление таблицы значений функции, т. е. для определенных значений переменных или переменной находятся соответствующие значения функции. При программировании реализация табулирования предполагает организацию цикла или циклов (если используется несколько пере- менных) для перебора значений переменных и вычисление функции. Перебор значений переменной можно проводить различными способами: 1) если переменная x представлена в виде массива чисел X[N], то для перебора можно использовать цикл for…to…do c параметром цикла I = 1, …, N, где N – размер (число элементов) массива; 2) если переменная x изменяется по закону x = xn, xk (h), где xn – начальное значение переменной x; xk – конечное значение переменной x; h – шаг изменения, то для перебора значений x можно использовать циклы While… do или Repeat … Until. В этом случае необходимо: а) до цикла задать начальное значение x = xn, б) в конце тела цикла произвести увеличение x на шаг измене- ния: x = x + h; в) в качестве условия окончания перебора значений для цикла While…do использовать условие x ≤ xk (пока x ≤ xk, выполнять опе- раторы цикла), для цикла Repeat…Until – условие x > xk (выполнять операторы цикла до тех пор, пока x не станет больше xk). Например, пусть переменная x изменяется по закону x = 2,5; 10 (0,1), т. е. xn = 2,5, xk = 10, h = 0,1, тогда циклы перебора переменных следует организовать следующим образом: 353 Фрагмент программы с использованием цикла While…do Фрагмент программы с использованием цикла Repeat … Until … X := 2.5; While X <= 10 do Begin <операторы цикла> X := X + 0,1; End; … … X := 2.5; Repeat <операторы цикла> X := X + 0,1; Until X > 10; … 3) Для перебора значений x, заданных по закону x = xn, xk (h), можно также использовать цикл for…to…do. В этом случае необходимо: а) до цикла определить число итераций цикла, например, с помощью оператора: IMax:= Trunc((Xk – Xn)/Xh )+1; функция Trunc() – возвращает значение целой части аргумента; б) в цикле значение x для перебора определяется с помощью оператора X := Xn + (I – 1)*h. Например, пусть переменная x изменяется от 1 до 6 с шагом 2 (т. е. может принимать значения 1, 3, 5). Таким образом, xn = 1, xk = 6, h = 2, а число итераций цикла будет равно трем. Цикл следует организовать следующим образом: Фрагмент программы Пояснения … IMax:=Trunc((6-1)/2)+1; for I:=1 to IMax do Begin X:= Xn + (I - 1)*Xh; <операторы цикла> end; … IMax:= Trunc(2.5)+1=2+1=3; 1-я итерация: I = 1, X = 1 + (1 – 1)·2 = 1; 2-я итерация: I = 2, X = 1 + (2 – 1)·2 = 3; 3-я итерация: I = 3, X = 1 + (3 – 1)·2 = 5. Формирование массива по заданному закону 1) Организация одного цикла (для одномерного массива) или двух циклов (для двумерного массива) for…to… do для перебора всех значений массива. Максимально возможные параметры цикла (в примере это I, J) соответствуют размеру массива, например, если 354 массив описывается как А20×30, т. е. состоит из 20 строк и 30 столб- цов, то I = 1, 2, …, 20 и J = 1, 2, …, 30. 2) В теле цикла осуществляется присваивание текущему элемен- ту массива A[I, J] определенного значения. Если для формирования массива указано одно или несколько условий, то с помощью опера- тора или операторов If… Then организуется ветвление. Пример … Var A : Array [1..20, 1..30] of Real; … for I:=1 to 20 do for J:=1 to 30 do If I=J Then A[I, J] := … Else A[I, J]:=… … 3) Если в цикле for…to…do или в операторе If…Then только один оператор (даже если он занимает несколько строк), то операторные скобки Begin…end можно не ставить. Вывод двумерного массива (матрицы) на экран или в файл 1) Организация двух циклов (для двумерного массива) for…to… do для перебора всех значений массива. 2) Второй вложенный цикл будет содержать оператор Write(A[I, J]) для вывода через пробелы значения элементов массива J-го столбца. После этого цикла в конце первого цикла необходимо использовать оператор Writeln() – переход на другую строку, т. е. сначала произойдет вывод первой строки массива, потом переход на другую строку, затем вывод второй строки, переход на следую- щую строку и т. д. Пример … Var A : Array [1..20, 1..30] of Real; … for I:=1 to 20 do Begin for J:=1 to 30 do Write(A[I, J]); Writeln; 355 end; … Поиск минимального элемента массива и его номера 1) Произвести в разделе Var описание массива, переменной для минимального значения массива того же типа, что и элементы мас- сива (в примере это переменная Min), переменной для номера эле- мента массива (IMin) в случае одномерного массива или перемен- ных для номеров строки и столбца минимального значения (IMin, JMin) в случае двумерного массива. Например: … Var A : Array [1..20, 1..30] of Real; Min : Real; IMin : Byte; … for I:=1 to 20 do for J:=1 to 30 do If A[I, J] < Min Then Begin Min := A[I, J]; IMin := I; end; … 2) Присвоить переменной минимума (Min) значение выбранного элемента массива, например A[1], а переменной номера минималь- ного элемента (IMin) – соответствующее значение, например 1. 3) Организовать один цикл (для одномерного массива) или два цикла (для двумерного массива) for…to… do для перебора всех не- обходимых значений массива. Параметры цикла (в примере это I, J) соответствуют размеру массива. Для одномерного массива началь- ное значение параметра цикла равно 2 (поскольку значение первого элемента присвоено переменной для минимума). 4) В теле цикла производится сравнение переменной минимума (Min) с очередным значением элемента массива A[I]. Если значение элемента массива A[I] меньше, то переменной минимума присваи- вается значение A[I], а переменной номера (IMin) присваивается значение I, если значение элемента массива не больше, то все оста- ется без изменений. 356 Поиск максимального элемента массива и его номера Действие производится аналогично поиску минимального эле- мента, отличие состоит в том, что если при сравнении значение очередного элемента массива A[I] больше максимума (Max), то пе- ременной максимума присваивается значение элемента массива. Организация табличного вывода результатов 1) Вывести на экран шапку таблицы (горизонтальные линии, с помощью символов «-» или «_» и названия столбцов), длина гори- зонтальной линии и расположение шапки подбираются. 2) При выводе в цикле значений использовать символ «|» – раз- деление столбцов и форматный вывод (для того чтобы столбцы по- лучались одинаковой ширины). 3) После цикла вывести горизонтальную линию. Нахождение суммы бесконечного числа элементов ряда Поиск суммы бесконечного числа элементов ряда производится с помощью циклов While…do или Repeat…Until. Условие окончания суммирования – разность предыдущего и текущего членов ряда – должна быть меньше определенной величины (погрешности). Ниже приведено описание действий для цикла Repeat…Until. 1) Описать в разделе Var: а) две переменные, в которых будут храниться текущий и следующий элементы ряда (S1, S2); б) переменную для вычисления членов ряда (X); в) переменную суммы ряда (S). 2) Присвоить переменной S2 – первый элемент ряда – начальное значение (значение 1), переменной суммы ряда – значение первого элемента ряда (S2). 3) Для суммирования членов ряда организуется Repeat …Until. В теле цикла выполняются действия: а) переменной S1 (значение предыдущего члена) присвоить значение S2, т. е. значение текущего элемента ряда на следующей итерации становится значением предыдущего элемента; б) вычислить следующий член ряда (переменная S2); 357 в) к сумме ряда (S) прибавить следующий член ряда (S2); г) проверить условие продолжения суммирования, а именно: разность текущего и следующего элементов ряда не должна быть меньше определенной величины (погрешности): если условие вы- полняется, то продолжается выполнение цикла (пункты 3, а–в), если нет – выход из цикла. ПРИЛОЖЕНИЕ 2 П 2.1. Основные теоретические сведения о численных методах решения систем линейных уравнений П 2.1.1. Матричный метод Матричный метод применим к решению систем уравнений, где число уравнений равно числу неизвестных. Этот метод удобен для решения систем невысокого порядка и основан на применении свойств умножения матриц. Пусть дана система из n уравнений с n неизвестными: .... ... ,... ,... 2211 22222121 11212111 nnnnnn nn nn cxaxaxa cxaxaxa cxaxaxa Составим матрицы: коэффициентов А = nnnn n n aaa aaa aaa ... ... ... ... 21 22221 11211 ; 358 свободных членов С = nc c c ... 2 1 ; корней системы уравнений X = nx x x ... 2 1 . Тогда систему уравнений можно записать как A X = С. Массив корней системы уравнений можно найти из следующего соотношения: X = A–1С. Таким образом, для нахождения корней системы уравнений необходимо найти обратную матрицу A–1. Обратная матрица вычис- ляется по формуле А–1 = nnnn n n AAA AAA AAA ... ... ... ... 1 21 22212 12111 , где – детерминант (определитель) матрицы А, который вычисля- ется по формуле nnjj AaAaAa 11111111 ...... ; Aij – алгебраические дополнения элементов aij, вычисляемые по формуле ij ji ij MA )1( , где Mij – дополнительный минор элемен- та aij. Дополнительный минор элемента aij является определителем союзной матрицы, получаемой из матрицы A вычеркиванием i-й строки и j-го столбца. В результате корни системы можно вычислить по уравнению 359 Х = nnnnn n n c c c AAA AAA AAA CA ... ... ... ... ... 1 2 1 21 22212 12111 1 = n nnnn n n n n c A c A c A c A c A c A c A c A c A ... ... ... ... 2 2 1 1 2 2 22 1 12 1 2 21 1 11 . Пошаговый алгоритм решения системы уравнений Шаг 1. Сформировать матрицу А коэффициентов и вектор сво- бодных членов С системы уравнений. Шаг 2. Вычислить определитель матрицы А. Если он не равен нулю, следовательно, система имеет решение. Шаг 3. Определить алгебраические дополнения A11, …, Ann. Шаг 4. Построить обратную матрицу A–1. Шаг 5. Вычислить вектор Х корней системы уравнений. Пример решения системы линейных уравнений матричным методом Постановка задачи. Решить систему линейных уравнений 11024 ;6546 ;12347 321 321 321 xxx xxx xxx матричным методом. 360 Пошаговый алгоритм решения Шаг 1. Сформировать матрицу А коэффициентов системы урав- нений и вектора С свободных членов: A= 10 2- 4 5 4 6 3 4 7 , С= 1- 6 12 . Шаг 2. Вычислить определитель матрицы А: 2- 4 4 6 3)1( 10 4 5 6 4)1( 10 2- 5 4 7)1( 312111A .106)44)2(6(3)54106(4)5)2(104(7 Поскольку определитель не равен нулю, то обратная матрица существует. Шаг 3. Вычислить алгебраические дополнения: 505)2(104 10 2- 5 4 )1( 1111A ; 40)54106( 10 4 5 6 )1( 2112A ; 2844)2(6 2- 4 4 6 )1( 3113A ; 46)3)2(104( 10 2- 3 4 )1( 1221A ; 5834107 10 4 3 7 )1( 2222A ; 30)44)2(7( 2- 4 4 7 )1( 3223A ; 361 83454 5 4 3 4 )1( 1331A ; 17)3657( 5 6 3 7 )1( 2332A ; 44647 4 6 4 7 )1( 3333A . Шаг 4. Построить обратную матрицу: A–1 = 4 30 28- 17- 58 40- 8 46- 50 106 1 . Шаг 5. Вычислить вектор корней системы уравнений: X = A–1 C = 4 30 28- 17- 58 40- 8 46- 50 106 1 1- 6 12 = = 1,51- 1,08- 2,98 106 )1(4 106 630 106 1228 106 )1(17 106 658 106 1240 106 )1(8 106 646 106 1250 . Таким образом, корни системы уравнений: x1 = 2,98; x2 = –1,08; x3 = – 1,51. П 2.1.2. Метод Крамера Суть метода Крамера заключается в вычислении корней системы уравнений с помощью формул Крамера. В этих формулах исполь- зуются значения главного определителя матрицы коэффициентов системы уравнений и вспомогательных определителей, получаемых из матрицы коэффициентов заменой одного из столбцов столбцом 362 свободных членов. В зависимости от значений главного и вспомо- гательных определителей возможны следующие ситуации: – если главный определитель системы отличен от нуля, то си- стема имеет единственное решение; – если главный и вспомогательные определители равны нулю, то система имеет бесконечное множество решений; – если главный определитель равен нулю и имеется хотя бы один отличный от нуля вспомогательный определитель, то система несовместна, т. е. не имеет решения. Пусть дана система из n уравнений с n неизвестными: .... ... ,... ,... 2211 22222121 11212111 nnnnnn nn nn cxaxaxa cxaxaxa cxaxaxa Составим матрицу коэффициентов А = nnnn n n aaa aaa aaa ... ... ... ... 21 22221 11211 ; матрицу свободных членов С = nc c c ... 2 1 ; матрицу корней системы уравнений X = nx x x ... 2 1 и запишем систему уравнений в матричном виде: A X = С. Если определитель матрицы системы уравнений не равен нулю, то система имеет единственное решение и это решение находится по формулам Крамера: 363 i ix , где ∆ – определитель матрицы коэффициентов А; ∆i – определитель матрицы, получаемой из матрицы А заменой i-го столбца столбцом свободных членов С: nnninninn nii nii i aacaaa aacaaa aacaaa ... ... ... ... ... ... ... 1121 2122122221 1111111211 . Пошаговый алгоритм решения системы уравнений Шаг 1. Сформировать матрицу коэффициентов и вектор свобод- ных членов системы уравнений. Шаг 2. Вычислить определитель ∆ матрицы коэффициентов системы уравнений. Если он не равен нулю, значит, система имеет решение. Шаг 3. Вычислить первый корень системы уравнений: – сформировать промежуточную матрицу из исходной матрицы коэффициентов А заменой первого столбца столбцом свободных членов С; – вычислить определитель промежуточной матрицы ∆1; – вычислить первый корень 11x . Шаг 4. Вычислить остальные корни системы аналогично шагу 3. Пример решения системы линейных уравнений методом Крамера Постановка задачи. Решить систему линейных уравнений 11024 ;6546 ;12347 321 321 321 xxx xxx xxx 364 с помощью метода Крамера. Пошаговый алгоритм решения Шаг 1. Сформировать матрицы коэффициентов системы и век- тора свободных членов: A = 10 2- 4 5 4 6 3 4 7 , С = 1- 6 12 . Шаг 2. Вычислить определитель матрицы А: 2- 4 4 6 3)1( 10 4 5 6 4)1( 10 2- 5 4 7)1( 312111A .106)44)2(6(3)54106(4)5)2(104(7 Поскольку определитель не равен нулю, то обратная матрица существует. Шаг 3. Вычислить первый корень системы уравнений: – сформировать промежуточную матрицу A1 из исходной мат- рицы A заменой первого столбца столбцом свободных членов С: A1 = 10 2- 1- 5 4 6 3 4 12 ; – вычислить определитель матрицы A1: 2- 1- 4 6 3)1( 10 1- 5 6 4)1( 10 2- 5 4 12)1( 3121111 ;316)4)1()2(6(3)5)1(106(4)5)2(104(12 365 – вычислить корень 98,2 106 3161 1x . Шаг 4. Вычислить второй корень системы уравнений: – сформировать промежуточную матрицу A2 из исходной матри- цы A заменой второго столбца столбцом свободных членов С: A2 = 10 1- 4 5 6 6 3 12 7 ; – вычислить определитель матрицы A2: 1- 4 6 6 3)1( 10 4 5 6 12)1( 10 1- 5 6 7)1( 3121112 ;115)64)1(6(3)54106(12)5)1(106(7 – вычислить второй корень: 08,1 106 1152 2x . Шаг 5. Вычислить третий корень системы уравнений: – сформировать промежуточную матрицу A3 из исходной матри- цы A заменой третьего столбца столбцом свободных элементов С: A3 = 1- 2- 4 6 4 6 12 4 7 ; – вычислить определитель матрицы A3: 2- 4 4 6 12)1( 1- 4 6 6 4)1( 1- 2- 6 4 7)1( 3121113 ;160)44)2(6(12)64)1(6(4)6)2()1(4(7 366 – вычислить третий корень: 51,1 106 1603 3x . Таким образом, корни системы уравнений: x1 = 2,98; x2 = –1,08; x3 = –1,51. П 2.1.3. Метод Гаусса При численном решении систем линейных уравнений одним из распространенных является метод Гаусса, сущность которого сво- дится к поэтапному исключению неизвестных из уравнений. Решение системы уравнений методом Гаусса возможно только в случае, если матрица коэффициентов системы уравнений невырож- денная, т. е. её определитель (детерминант) не равен нулю. Пусть необходимо решить систему линейных уравнений .... ... ,... ,... 2211 22222121 11212111 nnnnnn nn nn cxaxaxa cxaxaxa cxaxaxa (П 2.1) Пошаговый алгоритм решения Процесс решения делится на два этапа. На первом этапе (прямой ход) последовательным исключением неизвестных составляется преобразованная эквивалентная система уравнений с треугольной матрицей коэффициентов, в которой все элементы под главной диа- гональю равны нулю, т. е. добиваются того, что в первом уравнении остаются все переменные, а в каждом последующем убирается по одной переменной до тех пор, пока в последнем уравнении не оста- нется только одна переменная. На втором этапе (обратный ход) решается полученная система уравнений. С помощью подстановок проводится последовательное вычисление неизвестных переменных. Решение начинается с по- 367 следнего уравнения и заканчивается решением первого уравнения системы. Шаг 1. Среди элементов ija (i, j = 1, ..., n) матрицы A необходимо выбрать главный элемент pqa , являющийся наибольшим по моду- лю. Соответствующая строка матрицы A с номером p называется главной строкой. Главную строку необходимо поместить на место первого уравнения, для чего следует поменять местами первую строку со строкой p. Главный элемент должен находиться на месте первого коэффициента уравнения, для этого надо поменять местами первый столбец коэффициентов со столбцом q. В результате глав- ный элемент окажется на месте элемента a11. При написании программы необходимо запоминать информацию о старой нумерации коэффициентов и вводить новую нумерацию. Шаг 2. Необходимо, чтобы коэффициент первого уравнения a11 был равен 1. Для этого следует разделить коэффициенты первого уравнения системы на значение 11a = pqa , в результате первое уравне- ние примет вид 112121 .. dcxcx n , где ;/ 1111 aac jj 1111 / abd . Шаг 3. Теперь следует исключить неизвестную переменную 1x из каждого уравнения исходной системы, начиная со второго. Для этого выполняются следующие действия: 1) умножая коэффициенты первого уравнения на первый коэф- фициент второго уравнения (a12), получают преобразованное первое уравнение, которое и вычитают из второго уравнения (первое урав- нение остается неизменным); 2) умножая коэффициенты первого уравнения на первый коэф- фициент третьего уравнения (a13), получают преобразованное пер- вое уравнение, которое вычитают из третьего уравнения (первое уравнение остается неизменным); … n–1) вычетают из n-го уравнения произведение первого уравне- ния и первого коэффициента n-ного уравнения (a1n). В результате получают следующую систему уравнений: 368 . ...с ... ;...с ;.. ;... 3232 333232 223232 113132121 nnnn nn nn nn dxcxx dxcxx dxcxcx dxcxcxcx Шаг 4. Последовательно повторяют шаги 2–3 для исключения переменных от x2 до xn–1. В результате получают систему уравнений с треугольной матрицей, эквивалентной исходной (П 2.1): . ... ,... ,.. ,... 333 223232 113132121 nnnn nn nn nn dxc dxcx dxcxcx dxcxcxcx (П 2.2) Шаг 5. Обратный ход. Неизвестные переменные nxxx .., , , 21 определяют в обратном порядке по формулам, полученным из си- стемы уравнений (П 2.2): ;/ nnnn cdx ;,111 nnnnn xcdx … nnxcxcdx ,122,111 .. . Пример решения системы линейных уравнений методом Гаусса Постановка задачи. Решить систему уравнений 11024 ;6546 ;12347 321 321 321 xxx xxx xxx (П 2.3) 369 методом Гаусса. Пошаговый алгоритм решения Прямой ход. Шаг 1. Найти максимальный коэффициент системы уравнений. В системе уравнений (П 2.3) apq = a33 = 10. Необходимо переместить максимальный коэффициент на место коэффициен- та a11. Для этого необходимо произвести следующие действия: 1) поменять местами первую и третью строки: ;12347 ;6546 ;11024 321 321 321 xxx xxx xxx 2) поменять местами первый и третий столбцы: .12743 ;6645 ;14210 123 123 123 xxx xxx xxx Шаг 2. Разделить коэффициенты первого уравнения (первая строка) на первый коэффициент строки (число 10): .12743 ;6645 ;1,04,02,0 123 123 123 xxx xxx xxx Шаг 3. Исключить переменную х3 из второго и третьего уравне- ний. Для этого произвести следующие действия. 1) Из второго уравнения вычесть произведение первого уравне- ния и первого коэффициента второго уравнения (число 5). Вместо второго уравнения системы будет получено уравнение )52,04()55( 23 xx .51,06)54,06(1x После приведения подобных членов второе уравнение примет вид 5,645 12 xх . 2) Из третьего уравнения вычесть произведение первого уравне- ния и первого коэффициента третьего уравнения (число 3). Вместо 370 третьего уравнения системы будет получено уравнение )32,04()33( 23 xx 31,012)34,07(1x . После приведения подобных членов третье уравнение примет вид 3,128,56,4 12 xx . В результате будет получена система уравнений: .3,128,54,6 ;5,645 ;1,04,02,0 12 12 123 xx xx xxx (П 2.4) Шаг 4. На этом шаге будем работать со вторым и третьим урав- нениями. Найти максимальный коэффициент системы уравнений (П 2.4): a33 = 5,8. Поместить коэффициент a33 на место коэффициен- та a21. Произвести действия, аналогичные шагу 1: 1) поменять местами вторую и третью строки: ;5,645 ;3,128,54,6 ;1,04,02,0 12 12 123 xx xx xxx 2) поменять местами второй и третий столбцы: .5,654 ;3,126,45,8 ;1,02,04,0 21 21 213 xx xx xxx Шаг 5. Исключить переменную х1 из третьего уравнения. Для этого произвести следующие действия. 1) Второе уравнение разделить на значение первого коэффици- ента второго уравнения a21 (число 5,8): .5,654 ;12,279,0 ;1,02,04,0 21 21 213 xx xx xxx 371 2) Из третьего уравнения вычесть произведение второго уравне- ния и первого коэффициента третьего уравнения (число 4). Вместо третьего уравнения системы будет получено 1)44( x .412,25,6)479,05( 2x После упрощения третье уравнение примет вид 98,184,1 2x . В результате будет получена система уравнений .98,11,84 ;12,279,0 ;1,02,04,0 2 21 213 x xx xxx Таким образом, система приведена к треугольному виду, в кото- ром все коэффициенты под главной диагональю равны нулю. Обратный ход. Выполнить вычисление переменных последова- тельно, начиная с третьего и заканчивая первым уравнением. Шаг 6. Получить x2 из третьего уравнения: .08,1 84,1 98,1 ;12,279,0 ;1,02,04,0 2 21 213 x xx xxx Шаг 7. Получить x1 из второго уравнения: .08,1 ;98,2)08,1(79,012,2 ;1,02,04,0 2 1 213 x x xxx Шаг 8. Получить x3 из первого уравнения: .08,1 ;98,2 ;51,1)08,1(2,098,24,01,0 2 1 3 x x x 372 Таким образом, корни системы уравнений: x1 = 2,98; x2 = –1,08; x3 = – 1,51. П 2.2. Основные теоретические сведения о численных методах решения нелинейных уравнений Общая постановка задачи. Во многих практических инженер- ных задачах возникает необходимость решения уравнения вида ,0,...,,, 21 npppxf (П 2.5) где f – заданная функция; x – неизвестная величина; p1, p2, …, pn – параметры задачи. Например, уравнение ))ln(cos(54 xxe x не имеет решения в аналитическом виде, так как решение нельзя выразить в виде алгеб- раических функций. Только для простейших нелинейных уравнений можно найти ре- шение в аналитическом виде, т. е. записать формулу, выражающую искомую величину x в явном виде через параметры pk. В большинстве же случаев уравнения вида (П 2.5) приходится решать численными методами. В результате численного решения уравнения (П 2.5) полу- чают таблицы зависимостей искомой величины x от параметров pk. Чаще всего фиксируют все параметры, за исключением одного, кото- рый изменяют в интересующем интервале с выбранным шагом и по- лучают одномерные таблицы и графики на плоскости. Численное решение уравнения (П 2.5) обычно проводят в два этапа. На первом этапе необходимо отделить корни уравнения, т. е. найти такие интервалы изменения переменной x, где расположен только один корень. Для этого в определенном интервале измене- ния переменной ][ 0 nx,xx при фиксированных параметрах pk необходимо вычислить ряд значений f(x) и результаты поместить в таблицу. На втором этапе находят корни с заданной точностью. Для уточнения корней могут использоваться методы дихотомии, методы Ньютона и др. В основе этих методов лежат рекуррентные последовательности. Рекуррентная последовательность – это последовательность, члены 373 которой связаны рекуррентной формулой. Рекуррентная формула – это формула вида 1 ), ..., , ,( 21 pnaan, afa pnnnn , выражающая каждый член последовательности an (n N) через p предыдущих членов. Общая постановка задачи. Функция f(х) задана на отрезке [a, b]. Необходимо с заданной погрешностью ε найти корень уравнения f(x) = 0. (П 2.6) П 2.2.1. Метод дихотомии Сущность метода дихотомии состоит в поэтапном делении от- резка [a, b], на котором находится корень уравнения (П 2.6), по- полам. На первом этапе табулируют функцию на отрезке ],[ 0 nxx с за- данным шагом. В результате получают таблицу значений x 0x 1x 2x ... nx xf 0xf 1xf 2xf ... nxf Из таблицы выделяют интервалы ] ,[ 1ii xx , на которых функция изменяет свой знак (f(xi) > 0 и f(xi+1) < 0), что проиллюстрировано на рис. П 2.1. x 7 f (x ) x 6x 1 x 5x 4x 3x 2x 0 - 1. 5 - 1 - 0. 5 0 0. 5 1 1. 5 0 1 2 3 4 5 6 7 X Y Рис. П 2.1 374 Из рисунка видно, что на отрезках ],[ 10 xx , ],[ 43 xx , ],[ 76 xx функция меняет свой знак, следовательно, на интервале ],[ 70 xx она имеет три корня. На втором этапе на выделенных интервалах осу- ществляется поиск корней с заданной точностью . Пошаговый алгоритм решения Шаг 1. Определяется первое приближение корня x1 = (a + b)/2, которое затем проверяется на точность (условие окончания вычис- лений). Если (b – a)/2 > , вычисления продолжаются. Шаг 2. Из двух отрезков [a, х1] и [х1, b] выбирается тот, на кото- ром функция f(x) меняет знак. В соответствии с иллюстрацией выби- рается отрезок [a, х1], на котором выполняется условие f(а) f(х1) < 0. Шаг 3. Вычисляется второе приближение корня х2 = (a + х1)/2 и проверяется условие окончания вычислений. Если (х1 – a)/2 > , вы- числения продолжаются. Шаг 4. Из двух отрезков [a, х2] и [х2, х1] выбирается тот, на кото- ром функция f(x) меняет знак. В соответствии с иллюстрацией выби- рается отрезок [х2, х1], на котором выполняется условие f(x2) f(х1) < 0. Шаг 5. Вычисляется третье приближение корня х3 = (х1 + х2)/2 и проверяется условие окончания вычислений. 375 … Шаг m. Вычисляется n-е приближение корня хn = (хn-1 + хn-2)/2 и проверяется условие окончания вычислений. Если (хn-1 – хn-2)/2 ≤ , вычисления закончены и корнем нелинейного уравнения является значение хn. П 2.2.2. Методы Ньютона (метод хорд и метод касательных) Методы Ньютона (метод хорд и метод касательных) являются более эффективными методами решения нелинейных уравнений по сравнению с методом дихотомии. Сходимость методов достигается при удовлетворении следующих условий: 1) функция f(x) должна быть дважды дифференцируема на отрезке [a, b]; 2) обе производные функции f(x) (и первая и вторая) не меняют знак на отрезке [a, b]. Метод хорд. При использовании метода хорд проводится хорда, соединяющая точки графика функции f(x) на границах отрезка, и за новое приближение берется точка, в которой хорда пересекается осью Х. Новое приближение корня xi вычисляется по формуле )()( )()( bfaf bfaafb xi . Вычисления продолжаются до тех пор, пока разница между приближениями не станет меньше или равна по- грешности, а именно |xi+1 – xi| ≤ ε. В иллюстрациях пошагового алгоритма пунктирной линией обо- значена проведенная хорда. Пошаговый алгоритм решения Шаг 1. Определяется первое приближение корня 376 )()( )()( 1 bfaf bfaafb x . Проверяется условие окончания вычислений. Если |b – a| > , вы- числения продолжаются. Шаг 2. Из двух отрезков [a, х1] и [х1, b] выбирается тот, на кото- ром функция f(x) меняет знак. В соответствии с иллюстрацией выби- рается отрезок [х1, b], на котором выполняется условие f(b)∙f(х1) < 0. Шаг 3. Вычисляется второе приближение корня )()( )()( 1 11 2 bfxf bfxxfb x и проверяется условие окончания вычислений. Если |х1 – b| > , вы- числения продолжаются. Шаг 4. Из двух отрезков [х1, х2] и [х2, b] выбирается тот, на кото- ром функция f(x) меняет знак. В соответствии с иллюстрацией выби- рается отрезок [х2, b], на котором выполняется условие f(b) f(х2) < 0. Шаг 5. Вычисляется третье приближение корня 377 )()( )()( 2 22 3 bfxf bfxxfb x и проверяется условие окончания вычислений. Если |х2 – b| > , вы- числения продолжаются. … Шаг m. Вычисляется n-е приближение корня на отрезке [xn-2, xn-1] )()( )()( 21 2112 nn nnnn n xfxf xfxxfx x и проверяется условие окончания вычислений. Если |хn-1 – хn-2)| ≤ , вычисления закончены и корнем нелинейного уравнения является значение хn. Mетод касательных. При использовании метода касательных проводится касательная к графику функции f(x) и за новое прибли- жение принимается точка, в которой касательная пересекает ось Х. Новое приближение корня вычисляется по формуле )( )( 1 cf cf cxi . В качестве точки c берется точка начала или конца рассматриваемого отрезка, в которой функция )(cf и вторая произ- водная )(cf имеют одинаковые знаки. Для проверки этого условия используется выражение )()( cfcf . Если оно больше нуля, то эти величины имеют одинаковые знаки, если меньше – разные. Вычисле- ния продолжаются до тех пор, пока разница между приближениями не станет меньше или равна погрешности, а именно |xi+1 – xi| ≤ ε. В иллюстрациях пошагового алгоритма пунктирной линией обо- значена проведенная касательная. Пошаговый алгоритм решения Шаг 1. Определяется точка для проведения касательной – это точка начала (a) или конца отрезка (b). Поскольку в точке b функ- 378 ция )(bf и вторая производная )(bf имеют одинаковые знаки (выполняется условие 0)()( bfbf ), то искомая точка b. Шаг 2. Вычисляется первое приближение к корню )( )( 1 bf bf bx . Проверяется условие окончания вычислений. Если |b – a| > , вы- числения продолжаются. Шаг 3. Из двух отрезков [a, х1] и [х1, b] выбирается тот, на котором функция f(x) меняет знак. В соответствии с иллюстрацией выбирается отрезок [a, х1], на котором выполняется условие f(a) f(х1) < 0. Шаг 4. Определяется точка для проведения касательной – это точка начала (a) или конца отрезка (х1). Поскольку в точке х1 функ- ция f(х1) и вторая производная )( 1xf имеют одинаковые знаки (выполняется условие 0)()( 11 xfxf ), искомая точка х1. Шаг 5. Вычисляется второе приближение к корню . )( )( 1 1 12 xf xf xx Проверяется условие окончания вычислений. Если |x2 – x1| > , вы- числения продолжаются. 379 Шаг 7. Из двух отрезков [a, х2] и [х2, x1] выбирается тот, на котором функция f(x) меняет знак. В соответствии с иллюстрацией выбирается отрезок [a, х2], на котором выполняется условие f(a) f(х2) < 0. Шаг 8. Определяется точка для проведения касательной – это точка начала (a) или конца отрезка (х2). Поскольку в точке х2 функ- ция f(х2) и вторая производная )( 2xf имеют одинаковые знаки (выполняется условие 0)()( 22 xfxf ), искомая точка – х2. Шаг 9. Вычисляется третье приближение к корню . )( )( 2 2 23 xf xf xx Проверяется условие окончания вычислений. Поскольку |x3 – x2| > , вычисления продолжаются. … Шаг m. Рассматривается отрезок [xn–2, xn–1]. Определяется точка для проведения касательной – это точка начала (xn–2) или конца от- резка (xn–1). Поскольку в точке хn–2 функция f(хn–2) и вторая произ- водная )( 2nxf имеют одинаковые знаки (выполняется условие 0)()( 22 nn xfxf ), искомая точка хn-2. Шаг m+1. Вычисляется n-е приближение корня на отрезке [xn–2, xn–1] )( )( 2 2 2 n n nn xf xf xx и проверяется условие окончания вычислений. Если |хn-1 – хn-2| ≤ , вычисления закончены и корнем нелинейного уравнения является значение хn. П 2.2.3. Метод простых итераций Пусть задан отрезок [a, b] для поиска корня функции f(x). Пред- ставим уравнение (П 2.6) в виде )(xx . (П 2.7) 380 Если для всех точек ],[ bap выполняются два условия: 1) функция ],[)( bax ; 2) производная 1)(x , то существует единственное решение уравнения (П 2.7) при любом начальном значении корня ],[0 bax . Для поиска корня необходимо использовать итерационную фор- мулу: каждое следующее приближения корня xi+1 вычисляется по формуле )(1 ii xx . Вычисления продолжаются до тех пор, пока разница между приближениями не станет меньше погрешности, а именно |xi+1 – xi| ≤ ε. П 2.3. Основные теоретические сведения о численных методах аппроксимации Методы аппроксимации функции используются для определения аналитической формулы многочлена, который наилучшим образом описывает исходную функцию, заданную таблично. Общая постановка задачи. Пусть функция ii xfy , где i = 1, п, задана таблично. Определить аппроксимационный много- член m-степени, наилучшим образом описывающий табличную функцию. В качестве критерия оптимизации использовать функци- онал, построенный по методу наименьших квадратов и обеспечи- вающий минимальный разброс точек табличной и моделируемой функций многочлена. Вид функционала следующий: n i iim yxPS 1 2 , где yi – функция, заданная таблично; im xP – многочлен вида m i m m i im xaxaxaaxaP 0 2 210 ... ; n – число точек табличной функции; m – степень аппроксимирующего многочлена. 381 Для определения оптимального многочлена, т. е. многочлена, удовлетворяющего условию minS , определим частные произ- водные функционала n i m ii m imi m n i ii m imi n i i m imi xyxaxaa a S xyxaxaa a S yxaxaa a S 1 10 1 10 1 1 10 0 .0...2 ... ,0...2 ,0...2 (П 2.8) После преобразований со знаками сумм система (П 2.8) примет вид n i n i i m i m im m i m i n i n i ii m imii n i n i i m imi yxxaxaxa yxxaxaxa yxaxaa 1 1 21 10 1 1 12 10 1 1 10 .... ... ... ... ... ... ,... ,... (П 2.9) Введем обозначения nt0 ; n i ixt 1 1 ; …, n i m im xt 1 ; n i iyc 1 0 ; n i ii yxc 1 1 ; …, n i i m im yxc 1 . В новых переменных система (П 2.9) имеет вид .... ... ... ... ... ... ... ... ... ... ... ... ... ,... ,... 2110 111201 01100 mmmmm mm mm catatat catatat catatat (П 2.10) 382 Решая систему линейных уравнений (П 2.10), можно определить коэффициенты многочлена таааа ...,,,, 210 . Схема алгоритма аппроксимации представлена на рис. П 2.2. Формирование массива коэффициентов системы линейных уравнений Решение системы линейных уравнений матричным методом, методом Гаусса и др. n i m im n i i xt,...,xt,nt Вычисление 11 10 n i i m imi n i i n i i yxc,...,yxc,yс Вычисление 11 1 1 0 n ,i y, xзначений Задание ii 1 Начало Конец Рис. П 2.2 П 2.4. Основные теоретические сведения о численных методах дифференцирования табулированных функций При решении математических уравнений численными методами возникает необходимость в вычислении производной. В основе численного дифференцирования лежит определение производной: x xfxxf у x 0 lim . При вычислении производной в j-й точке используются различ- ные приближения: а) центрально-разностное 383 11 11 jj jj xx xx yy y j ; (П 2.11) б) левое разностное 1 1 jj jj xx xx yy y j ; (П 2.12) в) правое разностное jj jj xx xx yy y j 1 1 . (П 2.13) Иллюстрация геометрического смысла численного дифференци- рования представлена на рис. П 2.3, где изображены элементы ис- пользуемых при построении левых (а), центральных (б) и правых (в) разностей. Для построения второй производной чаще всего используют центрально-разностное приближение 2 11 2 x yyy y jjj xx j . (П 2.14) Иллюстрация геометрического смысла численного дифференцирования представлена на рис. П 2.3, где изображены элементы, использу мых при построении л вых (а), центральных (б) и правых (в) разностей. а) б) в) Рис. П 2.3 Для построения второй производной чаще всего используют центрально-разностное приближение i-1 i i+1 y x i-1 i i+1 x y x y i-1 i i+1 а б в Рис. П 2.3 Левые и правые разности функции соответственно строятся по формулам 384 2 212 x yyy y jjj xx j ; 2 12 2 x yyy y jjj xx j . Замена производной конечными разностями приводит к некото- рым погрешностям, так как происходит сглаживание нелинейных участков функции. Чем меньше шаг изменения аргумента, тем больше точность аппроксимации функции конечными разностями. Считается, что формула центральных разностей дает более точное численное значение производной, чем формула, соответствующая левым и правым разностям. При вычислении производных второго, третьего, четвертого и бо- лее высоких порядков наиболее удобно пользоваться конечно- разностной аппроксимацией первой производной. При этом вычис- ление второй производной основывается на конечных разностях пер- вой производной. Для вычисления третьей производной необходимо использовать конечно-разностную аппроксимацию, составленную из вторых производных. Общая формула при этом имеет вид 11 11 11 jj n x n xn x xx ff f jj , (П 2.15) где п – порядковый номер производной. П 2.5. Основные теоретические сведения о численных методах интегрирования табулированных функций Методы численного интегрирования функций основываются на специальных формулах суммирования подынтегральных функций. Геометрический смысл вычисления интеграла основан на формуле nх х n i ii xfAdxxf 0 1 , где xf – подынтегральная функция; 385 ii xfA – квадратурная сумма; iA – коэффициенты квадратурной суммы; ix – узлы квадратурной функции; nxx ,0 – пределы интегрирования функции; i – индекс, связанный с разбиением функции пошаговым методом; п – число разбиений функции. На рис. П 2.4 представлена иллюстрация метода вычисления определенного интеграла по формуле прямоугольников ( ii xxh 1 – шаг интегрирования: x1 = x0 + h, …, xi+1 = xi + h, …, xn = xn–1 + h). f (x) x0 xi xi+1 xn X Y yn yi+1 yi y0 Рис. П 2.4 Для вычисления интегралов используются: а) формула прямоугольников nx х h k xfhxf h xfhdxxf 0 2 12 ... 2 3 2 000 ,(П 2.16) где k xx h n 0 (k – число разбиений); h – шаг интегрирования; nxx ,0 – пределы интегрирования; 386 б) формула трапеций nх х nxfnhxfhxfxf h dxxf 0 )1(2...2 2 000 , (П 2.17) (ошибка вычисления интегралов (П 2.16), (П 2.17) определяется как fxx h n max 12 0 2 , где nxx0 ); в) формула Симпсона nх х hnxfhxfhxfxf h dxxf 0 22...224 3 0000 nhxfhnxf 00 14 (П 2.18) (ошибка вычисления интеграла (П 2.18) определяется по формуле IV 0 4 max 180 fxx h n , где nxx0 , IVf – четвертая производная функции). Приведем примеры вычисления интеграла 9 4 )3cos( dxx различ- ными методами, приняв шаг интегрирования равным 0,01; число разбиений интервала интегрирования – равным 500: а) по формуле прямоугольников: ...01,0 2 3 43 cos 2 01,0 43 cos01,0)3cos( 9 4 dxx 01,0 2 15002 43 cos , ошибка вычисления интеграла 310125,0 ; 387 б) по формуле трапеций: ...01,0243 cos201,043 cos243 cos 2 01,0 )3cos( 9 4 dxx 01,050043 cos01,049943 cos2 , ошибка вычисления интеграла 310125,0 ; в) по формуле Симпсона: ...01,0243 cos201,043 cos443 cos 3 01,0 )3cos( 9 4 dxx 01,050043 cos01,049943 cos401,049843 cos2 , ошибка вычисления интеграла 710225,0 . П 2.6. Основные теоретические сведения о численных методах решения обыкновенных дифференциальных уравнений Дифференциальным уравнением первого порядка называется уравнение вида ),( yxfy . (П 2.19) Решить дифференциальное уравнение – означает определить функцию y = F(x), которая при подстановке в уравнение (П 2.19) приводит к тождеству. Поиск решения y = F(x) при реализации ана- литических методов сводится к интегрированию уравнения (П 2.19), что не всегда приводит к успеху из-за сложности функции f(x, y). В этом случае для решения дифференциальных уравнений ),( yxfy используют численные методы. Для решения уравнения (П 2.19) вводят начальное условие Коши 00 )( yxy . Таким образом, общей постановкой задачи для решения диффе- ренциальных уравнений первого порядка является 388 .)( ),,( 00 yxy yxfy (П 2.20) Для решения дифференциальных уравнений вида (П 2.18) ис- пользуются методы Эйлера, Рунге-Кутта и другие. П 2.6.1. Метод Эйлера Суть метода Эйлера заключается в аппроксимации интегральной кривой y = F(x) ломаной линией. Метод Эйлера является одношаго- вым методом первого порядка. Поиск решения производится на интервале [x0, a). На этом ин- тервале вводится набор равноотстоящих точек axxx n10 . Шаг разбиения ii xxh 1 . Фактически необходимо получить таб- лицу значений функции F(x) в каждой точке xi. При решении задачи методом Эйлера приближенное значение y1 в точке x1 с помощью уже известных значений x0 и y0 вычисляется по формуле 101 yyy , где ),( 001 yxfhy . Значение функции f(x0, y0) получается подстановкой x0 и y0 в функцию f(x, y). Аналогично вычисляются значения во всех после- дующих точках интервала. Таким образом, приближенное значение функции yi+1 в следую- щей точке рассматриваемого отрезка [x0, a) равно сумме значения функции yi в предыдущей точке и произведения шага h на величину производной, вычисленной в предыдущей точке. То есть прибли- женные значения yi+1 в точках xi+1 = x0 + (i+1)h, i = 1, 2, ..., n, вычис- ляются по формуле iii yyy 1 , (П 2.21) где ),( iii yxfhy . Особенностью любого пошагового метода является то, что, начиная со второго шага, значение yi является приближенным и по- этому погрешность на каждом следующем шаге возрастает. Приня- 389 то считать, что погрешность метода Эйлера пропорциональна вели- чине h2. Пример решения дифференциального уравнения методом Эйлера Постановка задачи. Решить дифференциальное уравнение xeyy 2 на отрезке [0, 2] при начальном условии y(0) = 1 мето- дом Эйлера. Задать шаг разбиения отрезка h = 0,5. Решение Для решения уравнения используем итерационную формулу (П 2.21): )2(1 x ii eyhyy . Отрезок [0, 2] разбивается с помощью шага h = 0,5 и формируется таблица значений функции F(x) в каждой точке xi (x0 = 0; x1 = 0,5; x2 = 1; x3 = 1,5; x4 = 2) (табл. П2.1). Таблица П 2.1 i xi yi 0 0 1 1 0,5 2,5 2 1 5,82 3 1,5 13,00 4 2 28,24 В точке x0 = 0 значение y0 = 1 согласно начальному условию. В точке x1 = 0,5 значение 5,2)112(5,01)2(5,0 0001 eyyy . В точке x2 = 1 значение )2(5,0 5,0 112 eyyy 82,5)65,15,22(5,05,2 . В точке x3 = 1,5 значение )2(5,0 1 223 eyyy 00,13)72,282,52(5,082,5 . 390 В точке x4 = 2 значение 00,13)2(5,0 5,1 334 eyyy 24,28)48,400,132(5,0 . П 2.6.2. Метод Рунге-Кутта Более эффективным методом для решения дифференциальных уравнений является метод Рунге-Кутта. В метод Рунге-Кутта входит семейство формул, которые отличаются способом вычисления при- ращения функции в точках разбиения xi. Наиболее популярным яв- ляется метод Рунге-Кутта четвертого порядка. Суть метода заклю- чается в использовании на каждом шаге вычислений значений функции f(x, y) в нескольких точках. Аналогично методу Эйлера необходимо получить таблицу значений функции F(x) в каждой точке xi на интервале [x0, a). На этом интервале вводится набор равноотстоящих точек axxx n10 . Шаг разбиения ii xxh 1 . В основе метода Рунге-Кутта, так же как и в методе Эйлера, ле- жит итерационная формула iii yyy 1 , (П 2.22) где )(4 )( 3 )( 2 )( 1 22 6 iiii i kkkk h y ; ),()(1 ii i yxfhk ; ) 2 , 2 ( 1 )( 2 hk y h xfhk ii i ; ) 2 , 2 ( 2 )( 3 hk y h xfk ii i ; ),( 3 )( 4 hkyhxfk ii i . Погрешность метода Рунге-Кутта пропорциональна величине h5. Пример решения дифференциального уравнения первого порядка методом Рунге-Кутта 391 Постановка задачи. Решить дифференциальное уравнение xeyy 2 на отрезке [0, 2] с начальными условиями y(0) = 1 ме- тодом Рунге-Кутта четвертого порядка. Задать шаг разбиения от- резка h = 0,5. Пошаговый алгоритм решения Для решения уравнения используем итерационную формулу (П 2.22). Отрезок [0, 2] разбивается с помощью шага h = 0,5 и фор- мируется таблица (табл. П 2.2) для получения значений функции F(x) в каждой точке xi (x0 = 0; x1 = 0,5; x2 = 1; x3 = 1,5; x4 = 2). Шаг 0. В точке x0 = 0 значение y0 = 1 согласно начальному усло- вию. Шаг 1. В точке x1 = 0,5 определяется значение y1. 3122),( 00001 0 eeyyxfk x ; ;78,4) 2 3 5,01(2 ) 2 (2) 2 , 2 ( 2 5,0 0 21 0 1 002 0 e e k hy k hy h xfk h x ;67,5) 2 78,4 5,01(2 ) 2 (2) 2 , 2 ( 2 5,0 0 22 0 2 003 0 e e k hy hk y h xfk h x ;32,9)67,55,01(2 )(2),( 5,00 303004 0 e ekhyhkyhxfk hx .77,332,967,5278,423 6 1 5,01 22 6 432101 kkkk h yy Шаг 2. В точке x2 = 1 определение значение y2. 19,977,322),( 5,01111 1 eeyyxfk x ; 392 25,14) 2 19,9 5,077,3(2) 2 , 2 ( 2 5,0 5,0 1 112 e hk y h xfk ; 78,16) 2 25,14 5,077,3(2) 2 , 2 ( 2 5,0 5,0 2 113 e hk y h xfk ; 03,27)78,165,077,3(2),( 5,05,03114 ehkyhxfk ; .96,1103,2778,16225,14219,9 6 5,0 77,3 22 6 432112 kkkk h yy Шаг 3. В точке x3 = 1,5 определение значение y3. 63,2696,1122),( 12221 2 eeyyxfk x ; 72,40) 2 63,26 5,096,11(2) 2 , 2 ( 2 5,0 1 1 222 e hk y h xfk ; 76,47) 2 72,40 5,096,11(2) 2 , 2 ( 2 5,0 1 2 223 e hk y h xfk ; 16,76)76,475,096,11(2),( 5,013224 ehkyhxfk ; .27,3616,7676,47272,40263,26 6 5,0 96,11 22 6 432123 kkkk h yy Шаг 4. В точке x4 = 2 определение значение y4. 02,7527,3622),( 5,133331 eeyyxfk x ; 81,113) 2 02,75 5,027,36(2) 2 , 2 ( 2 5,0 5,1 1 332 e hk y h xfk ; ;20,133) 2 81,113 5,027,36(2) 2 , 2 ( 2 5,0 5,1 2 333 e hk y h xfk 13,211)20,1135,027,36(2),( 5,05,13334 ehkyhxfk ; 393 .28,100)13,21120,133281,1132 02,75( 6 5,0 27,3622 6 432134 kkkk h yy . Результаты вычислений приведены в табл. П2.2. Таблица П 2.2 i xi yi 0 0 1 1 0,5 3,77 2 1 11,96 3 1,5 36,27 4 2 100,28 Решение дифференциальных уравнений порядка )(,...,,,, nyyyyxf Для решения дифференциального уравнения более высокого по- рядка )(,...,,,, nyyyyxf используется следующий прием. Любое уравнение n-го порядка можно свести к системе n уравнений перво- го порядка способом замены переменных. Для этого вводят новые переменные 1 )1( 21 ,...,, n n yyyyyy , в результате чего полу- чают эквивалентную систему .,...,,,, ... , , 1211 21 1 nn yyyyxfy yy yy Указанный метод позволяет свести решение дифференциального уравнения n-го порядка к решению системы n уравнений первого порядка. В свою очередь, методы решения одного уравнения перво- го порядка распространяются на систему таких уравнений. Пример решения дифференциального уравнения второго порядка методом Рунге-Кутта четвертого порядка 394 Постановка задачи. Решить дифференциальное уравнение 043 xyyy с начальными условиями 5)1(y , 1)1(y на отрезке [1, 3] методом Рунге-Кутта четвертого порядка. Решение Выполняя замену переменной 1yy , приходим к системе из двух уравнений: .43 , 11 1 xyyy yy Таким образом, любое уравнение n-го порядка можно свести к системе уравнений первого порядка. П 2.7. Основные теоретические сведения о численных методах решения дифференциальных уравнений в частных производных Многие математические модели описываются дифференциаль- ным уравнением или системой дифференциальных уравнений с краевыми условиями первого, второго или третьего рода. Точное решение краевых задач удается получить лишь для немногих част- ных случаев. Поэтому общий способ решения таких дифференци- альных уравнений заключается в использовании различных при- ближенных моделей. Наиболее распространены модели на основе метода конечных разностей (метод сеток). Сущность метода сеток состоит в том, что на область изменения независимых переменных «накладывается» сетка, т. е. область раз- бивается на определенные участки в виде отрезков, прямоугольни- ков, параллелепипедов в зависимости от размерности модели. Так, для одномерной модели сетка может иметь вид, представленный на рис. П 2.5. Сущность метода сеток с стоит в том, что на область изменения независимых переменных как бы «накладывается» сетка, т. е. о разбивается на определенные участки в виде отрезков, прямоугольников, параллелепипедов в зависимости от размерности модели. Так, для одномерной модели сетка может иметь вид, представленный на рис. П 2.5. Рис. П 2.5 0 1 2 3 4 9 5 6 7 8 x x Рис. П 2.5 395 Для двумерных задач наиболее часто применяется прямоуголь- ная сетка, узлы которой лежат на пересечении прямых, параллель- ных координатным осям (рис. П 2.6), для трехмерных – сетка из прямоугольных параллелепипедов, узлы которой лежат на пересе- чении плоскостей, параллельных координатным плоскостям (рис. П 2.7). Расстояния между узлами называются шагом сетки по соответствующей переменной ( x, y, z). (0;3) 1 0 2 3 4 1 2 3 4 0 (2;2) (2;3) (3;4) x y х y Для двумерных задач наиболее часто применяется прямоугольная сетка, узлы которой лежат на пересечении прямых, параллельных координатным осям (рис. П 2.6), для трехмерных – сетка из прямоугольных параллелепипедов, узлы которой лежат на пересечении плоскостей, параллельных координатным плоскостям (рис. П 2.7). Расстояния между узлами называются шагом сетки по соответствующей переменной ( x, y, z). Так как математические модели обычно описывают физические или химические процессы, протекающие в течение определенного промежутка времени, то весь временной интервал также разбивается с некоторым шагом t на равномерные малые отрезки, называемые временными слоями. Вычисления искомой функции производятся последовательно на каждом временном слое – от начального момента времени до конечного. х (1; 1; 1) y z x y z 1 0 2 1 2 1 2 Рис. П 2.6 Рис. П 2.7 Так как математические модели обычно описывают физические или химические процессы, протекающие в течение определенного промежутка времени, то весь временной интервал также разбивает- ся с н которым шагом t на равномерные малые отрезки, называе- мые временными слоями. Вычисления искомой функции произво- дятся последовательно на каждом временном слое – от начального момента времени до конечного. Таким образом область непрерывного изменения аргументов за- меняется расчетной сеткой – дискретным множеством точек (уз- лов). Вместо функции непрерывных аргументов вводятся функции дискретных аргументов, определяемые в узлах сетки. Например, при построении одномерной модели, описывающей нагрев стержня длиной 10 мм, вместо области непрерывного изменения переменной х от 0 до 10 мм рассматриваются дискретные значения хi = 0; 0,5; 1; …; 9,5; 10 (шаг сетки задан как x = 0,5). Следует отметить, что номера узлов в данном случае изменяются как 0, 1, 2, …, 21. Соот- 396 ветственно решением дифференциального уравнения является не непрерывная функции T(x, t), а ее дискретный аналог jiT , где i – координата узла для переменной х; j – номер временного слоя. Таким образом, метод конечных разностей состоит в замене (ап- проксимации) всех частных производных дифференциального уравнения разностными соотношениями, а именно приближенным вычислением бесконечно малых приращений функций и аргумен- тов, которые называются конечными разностями. Все производные, входящие в уравнение, заменяют разностями значений функции в ближайших узлах пространственной сетки. Так, например, для дву- мерной сетки вычисление функции для узла (i, j) производится с использованием значений функций, полученных в узлах (i, j + 1), (i, j – 1), (i + 1, j), (i – 1, j) (рис. П 2.8). (i, j+1) (i, j) (i+1, j)(i-1, j) (i, j-1) x y Рис. П 2.8 Применение этого метода позволяет свести дифференциальную краевую задачу к системе нелинейных, а в общем случае – алгебра- ических уравнений относительно неизвестных значений функций в узлах пространственной сетки. Решение начинается с первого временного слоя, поскольку нуле- вой слой по времени определяется начальными условиями. Значения функции в каждом из узлов пространственной сетки на первом вре- менном слое определяются по ее значениям в ближайших узлах ну- левого слоя. После того как будут известны значения функции в уз- лах пространственной сети первого временного слоя, аналогично 397 рассчитываются значения функции в узлах второго слоя, затем – тре- тьего и т. д. Метод конечных разностей для решения двумерной стационарной задачи Постановка задачи. Пусть дана прямоугольная металлическая пластина с известными значениями теплопроводности ( ), теплоем- кости (с) и плотности ( ), начальная температура которой равна T0. Она помещается в температурное поле с температурой T1. Необхо- димо рассчитать тепловое поле пластины (значение температуры в каждой точке) в последующие моменты времени. Температура любой точки пластины зависит не только от распо- ложения точки (координат x, y), но и от времени (t). Очевидно, что с течением времени все области пластины нагреваются сильнее и тем больше, чем ближе расположены к границе пластины. Известно, что изменение температуры подчиняется уравнению в частных произ- водных 2 2 2 2 y T x T a t T , (П 2.23) где T = f(x, y, t) – температура пластины в точке с координатами (x, y) в момент времени t; a – коэффициент температуропроводности материала: c a , где – теплопроводность. Решение Шаг 1. Построение сетки в заданной области. Для решения уравнения (П 2.23) численным методом необходимо построить сет- ку с пространственным шагом h = x = y (рис. П 2.9). При этом пластина разбивается на большое количество узлов, находящихся на пересечении вертикальных и горизонтальных линий. Каждый узел задается парой чисел (i, j), где i = 0; n, j = 0; m. Таким образом, от непрерывных переменных х и y переходим к дискретным набо- 398 рам значений х1, х2, …, хm–1, хm и y1, y2, …, yn–1, yn. От непрерывного времени t переходим к дискретному k так, что k = k , k = 0, 1, 2, … , l – временные слои. Шаг 1. Построение сетки в заданной области. Для решения уравнения (П 2.23) численным методом необходимо построить сетку с пространственным шагом h = x = y (рис. П 2.9). При этом пластина разбивается на большое количество узлов, находящихся на пересечении вертикальных и горизонтальных линий. Каждый узел задается парой чисел (i, j), где i = 0, n, j = 0, m. Таким образом, от непрерывных переменных х и y переходим к дискретным наборам значений х1, х2, …, хm-1, хm и y1, y2, …, yn-1, yn. От непрерывного времени t переходим к дискретному k так, что k = k , k = 0, 1, 2, … , l – временные слои. Решением исходной задачи является определение температуры в последующие моменты времени в каждом узле сетки, т. е. в узлах T00, T01, …, Tmn-1, Tmn.. y x T1n T1n-1 T12 T11 T10 T0n T0n-1 T02 T01 T00 T2n T2n-1 T22 T21 T20 Tmn Tmn-1 Tm2 Tm1 Tm0 T(m-1)n T(m-1)n-1 T(m-1)2 T(m-1)1 T(m-1)0 Tij+1 T(i-1)j Tij T(i+1)j Tij-1 yn yn-1 … … … y1 y0 x0 x1 x2 xi-1 xi xi+1 xm-1 xm Рис. П 2.9 Решением исходной задачи я определение температуры в последующие оменты времени в ка до сетки, т. е. в узлах 0, T01, …, Tmn-1, Tmn. Шаг 2. Задание начального условия. Поскольку в начальный мо- мент времени внутри пластины температура точек равна T0, началь- ное условие имеет вид 0 0 TTij , (П 2.24) где 0ijT – температура в узле (i, j) плоскости x0y на нулевом времен- ном слое, где i = 0; n, j = 0; m. Шаг 3. Задание граничного условия. Поскольку в начальный мо- мент крайние точки пластины имеют температуру T1 (так как пла- стина была помещена в температурное поле с температурой T1), то граничное условие (условие для узлов пластины, находящихся на границе) имеет вид 1, )0(11 TtT ji , (П 2.25) 399 где 11, ji T – температура в точке с координатами i1, j1 по осям x, y соответственно, где 0i и тj ,0 или n i ,0 и 0j . Таким образом, используя начальное и граничное условие можно записать формулу определения температуры пластины в начальный момент времени (t = 0): точек.остальныхдля, 0); и 0,( или ) 0, и 0( если, 1 00 T jnimjiT Ti,j Шаг 4. Замена дифференциальных операторов t T , 2 2 x T , 2 2 y T в исходном дифференциальном уравнении разностными аналогами, построенными с помощью формулы конечных разностей. Так, пер- вая производная заменяется конечными разностями с использова- нием формулы (П 2.11): t TT t T k ji k ji 1 ,, . (П 2.26) Вторые производные заменяются вычислением конечных разностей по формуле (П 2.14): 2 1 ,1 1 , 1 ,1 2 2 2 x TTT x T k ji k ji k ji ; 2 1 1, 1 , 1 1, 2 2 2 y TTT y T k ji k ji k ji , (П 2.27) где jiT , – температура в узле (i, j) плоскости x0y; k – номер временного слоя; x и y – шаги сетки для величин x и y. Таким образом, уравнение (П 2.23) после подстановки формул (П2.24)–(П2.27) будет иметь вид 400 2 1 1 11 1 2 1 1 11 11 22 y TTT x TTT taTT k i,j k i,j k i,j k ,ji k i,j k ,jik i,j k i,j . (П 2.28) Шаг 5. Составление системы алгебраических уравнений: . 22 ... ; 22 ; 22 точек;остальныхдля 0); и 0,( или ) 0, и 0( если, 2 1 1 11 1 2 1 1 11 11 2 1 1 11 1 2 1 1 11 112 2 0 1 00 1 2 0 1 00 101 1 00 y TTT x TTT taTT y TTT x TTT taTT y TTT x TTT taTT T jnimjiT T l i,j l i,j l i,j l ,ji l i,j l ,jil i,j l i,j i,ji,ji,j,jii,j,ji i,ji,j i,ji,ji,j,jii,j,ji i,ji,j i,j Шаг 6. Решение полученной системы. Решение системы можно осуществлять поэтапно, т. е. сначала в момент времени t1 вычислять значения 1i,jT по известным значениям 0 i,jT , затем в момент времени t2 – значения 2i,jT и так до конечного момента времени l – значения l i,jT . Учебное издание ЧИЧКО Александр Николаевич САЧЕК Ольга Александровна ЧИЧКО Ольга Ильинична ИНФОРМАТИКА. ПРАКТИКУМ Учебное пособие Редактор Т.Н. Микулик Компьютерная верстка Д.А. Исаева Подписано в печать 07.07.2011. Формат 60 84 1/16. Бумага офсетная. Отпечатано на ризографе. Гарнитура Таймс. Усл. печ. л. 23,19. Уч.-изд. л. 18,14. Тираж 100. Заказ 1339. Издатель и полиграфическое исполнение: Белорусский национальный технический университет. ЛИ № 02330/0494349 от 16.03.2009. Проспект Независимости, 65. 220013, Минск.