БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
А.Н. Чичко
О.А. Сачек
О.И. Чичко
ИНФОРМАТИКА.
ПРАКТИКУМ
Допущено Министерством образования Республики Беларусь
в качестве учебного пособия для студентов высших учебных
заведений по техническим специальностям
Минск
БНТУ
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;
S – сумма индексов строк и столбцов минимального элемента мат-
рицы А среди элементов aij, удовлетворяющих условию i + j > 10.
Символ 1. Начало алгоритма.
Символ 2. Ввод двумерного массива из файла а.а. Ввод значений
производится с организацией внешнего цикла для перебора строк мат-
рицы А и внутреннего цикла для перебора столбцов матрицы
(табл. П 1.13), на схеме для упрощения это показано в одном символе.
Символ 3. Присвоение переменным IMin, JMin значений 10 и 20
(первоначально элемент должен удовлетворять условию I + J > 10).
Символ 4. Открытие внешнего цикла с параметром I = 1, 10 для
перебора строк матрицы А.
Символ 5. Открытие внутреннего цикла с параметром J = 1, 20
для перебора столбцов матрицы А.
Символ 6. Проверка условия на минимум и условия I + J > 10.
Если условия верны, то выполняется символ 7, иначе – символ 8.
Символ 7. Присвоение переменной IMin значения номера
строки I, переменной JMin – значения номера столбца J.
Символ 8. Закрытие внутреннего цикла с параметром J.
Символ 9. Закрытие внешнего цикла с параметром I.
Символ 10. Вычисление суммы индексов (переменная S) строк и
столбцов минимального элемента.
Символ 11. Вывод на экран значения переменной S.
Символ 12. Конец алгоритма.
Задача 1.9. Разработать схему алгоритма и программу для вы-
числения значений интервальной функции z для значений элемен-
тов массива хi (i = 1; n), которые заданы с клавиатуры:
.10 если ,tg
;101 если ,ln
;110 если ,cos
;10 если ,sin
ii
ii
ii
ii
xx
x x
xx
xx
z
Значения z выводятся на экран.
29
Решение задачи
Алгоритм решения задачи состоит в организации цикла для пе-
ребора элементов массива Х (проводится последовательная провер-
ка заданных интервальных условий переменной xi и вычисление z в
соответствии с постановкой задачи). Обратить внимание, что тан-
генс должен быть определен, то есть cos xi ≠ 0. Схема алгоритма
решения задачи представлена на рис. 1.9.
Программа
Program Prog1_9;
Var
N, I : Byte;
X : Array [1..20] of Real;
Z: Real;
Begin {начало раздела операторов программы}
Write('Введите размер (число элементов) массива Х (до 20) ');
Read(N); {чтение числа элементов массива Х}
for I := 1 to N do
Begin {начало цикла–для перебора элементов массива Х}
Write('Введите ', I, '-й элемент массива Х ');
Readln(X[I]); {чтение значения элемента Х[I]}
{вычисление Z в зависимости от значения элемента X[I]}
If (X[I]>=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 =
=Psin(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 X[I] then MinX := X[I];
end; {конец процедуры MinArr }
Begin {начало раздела операторов основной программы}
K := 0; {начальное значение числа элементов массива B}
Writeln('Значения элементов массива заштрихованной области:');
for I := 1 to 7 do {цикл 1–для перебора строк массива А}
for J := 1 to 10 do {цикл 2–для перебора столбцов массива А}
begin {начало циклов 1, 2}
81
A[I, J] := Random(1000); {вычисление A[I, J]}
{проверка условия 1}
If ((I>=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| 0, следовательно, функ-
ция и вторая производная в точке Xn имеют одинаковые знаки и в
этом случае выполняется символ 5. Если выражение
F(Xn)∙FP2(Xn) ≤ 0, следовательно, функция и вторая производная в
точке Xn имеют разные знаки и в этом случае выполняется символ 6.
Символ 5. Вычисление нового приближения к корню уравнения
(Х) путем построения касательной в точке Xn.
Символ 6. Вычисление нового приближения к корню уравнения
(Х) путем построения касательной в точке Xk.
Символ 7. Проверка знаков функции на концах отрезка [X, Xn].
Если выражение F(X)∙F(Xk) < 0, то на этом отрезке функция меняет
знак и имеется корень; в этом случае выполняется символ 8. Если
выражение F(X)∙F(Xk) ≥ 0, то функция на концах отрезка имеет
одинаковый знак и, значит, корня на этом отрезке нет; в этом случае
выполняется символ 9.
Символ 8. Присвоение переменной начала отрезка (Xn) значения Х.
Символ 9. Присвоение переменной конца отрезка (Xk) значения Х.
Символ 10. Вывод результатов на экран.
Символ 11. Проверка условия окончания вычислений: разница
между текущим и предыдущим приближениями к корню уравнения
меньше погрешности (e). Если условие верно, то выполняется сим-
вол 12, иначе – символ 3.
Символ 12. Конец алгоритма.
146
12
10
2
3
1
Начало
Вывод
Xn, Xk,
F(X)
Xn=0 Xk=1
e=0.0005
X=10
Конец
4
5
F(Xn)·
FP2(Xn)>0
X=Xn-F(Xn)/
FP1(Xn)
данет
6
11
Определение точки для
проведения касательной -
точка, где знаки функции
и второй производной в
точке Xn совпадают
X1=X
X=Xk-F(Xk)/
FP1(Xk)
7
8
F(X)·
F(Xk)<0
Xn=X
данет
9
Xk=X
Определение отрезка для
поиска корня - знаки
функции на границах
отрезка должны быть
различными
|X1-X| 0 Then X := Xn - F(Xn)/FP1(Xn)
Else X := Xk - F(Xk)/FP1(Xk);
{определение отрезка–знаки функции на концах отрезках различны}
If F(X)*F(Xk)<0 Then Xn:=X {отрезок для анализа [X,Xk]}
Else Xk:=X;{отрезок для анализа [Xn,X]}
Writeln(' Xn = ', Xn :8:8, ' Xk = ', Xk :5:3, ' Значение
функции = ', F(X):13:11); {вывод результатов на экран}
{конец цикла–разница между корнями < погрешности}
Until Abs(X-X1) < e;
End. { конец программы}
Результат работы программы
Xn = 0.11111111 Xk = 1.000 Значение функции = 0.00869278363
Xn = 0.11209660 Xk = 1.000 Значение функции = 0.00000108286
Xn = 0.11209672 Xk = 1.000 Значение функции = 0.00000000000
148
3.3. Аппроксимация табличных данных
методом наименьших квадратов
Задача 3.7. Разработать схему алгоритма и программу аппрок-
симации функции, заданной таблично, методом наименьших квад-
ратов с помощью полинома второй степени 2210)( xaxaaxF .
x 0 1 2 3 4 5 6 7 8 10
F(x) –1 1 5 17 31 49 71 97 112 144
Решение задачи
Формульный аппарат аппроксимации методом наименьших
квадратов описан в прил. 2.
;100t
;4610876543210
10
1
1
i
ixt
;30410876543210 2222222222
10
1
2
2
i
ixt
;229610876543210 3333333333
10
1
3
3
i
ixt
;1877210876543210 4444444444
10
1
4
4
i
ixt
;5261441129771493117511
10
1
0
i
iyc
9777164953141735211)1(0
10
1
1 i
i
i yxc
;3872144101128
149
7164953141735211)1(0 2222222
10
1
2
2 i
i
i yxc
30772144101128977 222 .
Таким образом, линейная система имеет вид
.30772187722296304
;3872229630446
;5263044610
210
210
210
aaa
aaa
aaa
Для решения полученной линейной системы используется ме-
тод Гаусса (п. 3.1.3). Схема алгоритма решения задачи представ-
лена на рис. 3.7.
Программа
Program Approksim;
Type
Tablica = Array [1..3, 1..4] of Real;
Colonka = Array [1..3] of Real;
Var
I : Byte;
T0, T1, T2, T3, T4, C0, C1, C2 : Integer;
X, Y : Array[1..10] of Integer;
A : Tablica;
XK : Colonka;
{функция вычисления корней системы уравнений методом Гаусса}
Procedure Gauss(Koef : Tablica; Count : Byte;
Var X: Colonka; Var flag_virogdena : Boolean);
Var
…
Begin {начало раздела операторов процедуры Gauss}
{текст программы функции представлен в разделе 3.1.3}
End; {конец функции Gauss}
Begin {начало раздела операторов основной программы}
T0 := 10;
For I := 1 to 10 do {цикл по всем точкам}
Begin {начало цикла}
Write('Введите значения X, Y для точки ', I, ‘: ’);
Readln(X[I], Y[I]); {чтение значений X[I], Y[I]}
{вычисление коэффициентов T1, T2}
150
T1 := T1+X[I]; T2 := T2 + X[I]*X[I];
T3 := T3 + X[I]*X[I]*X[I]; {вычисление коэффициента T3}
T4 := T4 + X[I]*X[I]*X[I]*X[I]; {вычисление коэффициента T4}
{вычисление коэффициентов С0, С1, С2}
C0:=C0 + Y[I]; C1:=C1 + X[I]*Y[I];
C2:=C2 + X[I]*X[I]*Y[I];
end; {конец цикла}
{коэффициенты 1-го уравнения системы}
A[1, 1]:=T0; A[1, 2]:=T1; A[1, 3]:=T2; A[1, 4]:=C0;
{коэффициенты 2-го уравнения системы}
A[2, 1]:=T1; A[2, 2]:=T2; A[2, 3]:=T3; A[2, 4]:=C1;
{коэффициенты 3-го уравнения системы}
A[3, 1]:=T2; A[3, 2]:=T3; A[3, 3]:=T4; A[3, 4]:=C2;
Gauss(A, 3, XK, B);{вычисление корней системы уравнений}
{вывод значений корней}
If not B Then for I :=1 to 3 do
Writeln(‘x’,I, ‘ = ’, XK[I]:5:2)
Else Writeln(‘Система не имеет решения.’);
End. {конец основной программы}
Результат работы программы
Введите значения X, Y для точки 1: 0 -1
Введите значения X, Y для точки 2: 1 1
Введите значения X, Y для точки 3: 2 5
Введите значения X, Y для точки 4: 3 17
Введите значения X, Y для точки 5: 4 31
Введите значения X, Y для точки 6: 5 49
Введите значения X, Y для точки 7: 6 71
Введите значения X, Y для точки 8: 7 97
Введите значения X, Y для точки 9: 8 112
Введите значения X, Y для точки 10: 10 144
x1 = -7.86
x2 = 7.66
x3 = 0.83
Пояснения к схеме алгоритма
Обозначения:
X[I], Y[I] – массивы значений x и F(x) (заданные таблично);
Gauss(A, 3, XK, B) – вызов процедуры Gauss для вычисления
корней системы уравнений с тремя переменными методом Гаусса;
входными параметрами процедуры являются: матрица коэффициен-
тов системы А, число уравнений системы 3, выходными параметра-
151
ми: массив значений корней системы XK, флаг существования ре-
шения системы – переменная B (равна false, если матрица коэффи-
циентов невырожденная и система имеет решение).
Символ 1. Начало алгоритма.
Символы 2–3. Присвоение первоначальных значений коэффици-
ентам T0, T1, T2, T3, T4, C0, C1, C2.
Символы 4–8. В цикле с параметром I = 1; 10 производится ввод
значений элементов массивов X[I] и Y[I] и вычисление коэффициен-
тов T0, T1, T2, T3, T4, C0, C1, C2 с использованием суммирования.
Символы 9–11. Формирование массива коэффициентов А, содер-
жащего коэффициенты системы уравнений (передаются в качестве
входного параметра в процедуру Gauss).
Символ 12. Вызов процедуры Gauss, реализующей решение си-
стемы линейных уравнений методом Гаусса.
Символ 13. Проверка условия существования решения системы
уравнений (B = false).
Символ 14. Вывод на экран сообщения «Система не имеет решения».
Символ 15. Вывод значений корней системы уравнений произво-
дится в цикле (табл. П 1.13), на схеме для упрощения вывод пред-
ставлен в одном символе.
Символ 16. Конец алгоритма.
152
12
11
1
Начало
A
I=1, 10
A
Конец
2
3
4
5
6
Ввод
X[I], Y[I]
T1=T1+X[I]
T2=T2+X[I]2
T3=T3+X[I]3
T4=T4+X[I]4
C0=C0+Y[I]
C1=C1+X[I]·Y[I]
C2=C2+X[I]2·Y[I]
Gauss(A,
3, XK, B)
7
39
10
A[1,1]=T0
A[1, 2]=T1
A[1,3]=T2
A[1,4]=C0
A[2,1]=T1
A[2,2]=T2
A[2,3]=T3
A[2,4]=C1
A[3,1]=T2
A[3,2]=T3
A[3,3]=T4
A[3,4]=C2
8
14
T0=10
T1=0
T2=0
T3=0
T4=0
C0=0
C1=0
C2=0
16
Вывод
XK
Формирование массива
коэффициентов системы
линейных уравнений A
Решение системы
линейных уравнений
методом Гаусса
Задание начальных
значений коэффициентов
T1, T2, T3, T4 и
С0, С1, 2
Ввод исходных
значений
Вывод коэффициентов
аппроксимационного
полинома
Вычисление
коэффициентов
T1, T2, T3, T4 и
С0, С1, 2
Условие
верно?
Проверка условия
существования решения
системы (матрица
коэффициентов
невырожденная)
Вывод
«Система
не имеет
решения»
15
13
данет
Рис. 3.7
153
3.4. Дифференцирование и интегрирование
табулированных функций
Задача 3.8. Разработать схему алгоритма и программу вычисле-
ния и вывода на экран значения интеграла
1
0
)12( 2
x
x
x dxex с помо-
щью метода прямоугольников с шагом интегрирования h. Значения
h, x0, x1 задаются с клавиатуры. Вычисление значения функции
xex212 оформить в виде подпрограммы (function).
Решение задачи
Схема алгоритма решения задачи представлена на рис. 3.8.
1
2
3
4
5
6
7
Начало
D=(X1-X0)/h
Int=0
Ввод
X0, X1,
h
A
I=1, D
A
xex212
Конец
Вывод
Int
F - вызов функции
вычисления значения
функции
Вычисление числа узлов
на отрезке
интегрирования [X0; X1]
8
Int=Int+
+F(X0+
+I·h/2)
Рис. 3.8
154
Пояснения к схеме алгоритма
Обозначения:
Int – значение интеграла, вычисленное методом прямоугольников;
F – функция для вычисления значения функции xex212 ;
D – число узлов на отрезке интегрирования.
Символ 1. Начало алгоритма.
Символ 2. Ввод начальных данных.
Символ 3. Вычисление числа разбиений на прямоугольники (D) –
числа узлов на отрезке интегрирования.
Символы 4–6. Вычисление в цикле с параметром I = 1; D суммы
Int с помощью функции F для вычисления исходной функции.
Символ 7. Вывод на экран значения интеграла.
Символ 8. Конец алгоритма.
Программа
Program Intgr;
Var
X0, X1, h, Int : Real;
D, I : Integer;
Function F(X : Real) : real;
Begin {начало раздела операторов функции F}
F := 12*X*X + Exp(X);
end; {конец функции F}
Begin {начало раздела операторов основной программы}
{ввод пределов интегрирования X0, X1}
Write('Введите пределы интегрирования '); Readln(X0, X1);
Write('Введите шаг h '); Readln(h); {ввод шага h}
D:=Round((X1-X0)/h); {вычисление числа узлов отрезка}
Int := 0; {первонач. значение значения интеграла}
For I:=1 to D do {цикл – по узлам отрезка интегрирования}
Int := Int + F(X0 + I*h/2)*h; {вычисление интеграла}
Writeln('Значение интеграла = ', Int:6:2); {вывод результата}
End. {конец основной программы}
Результаты работы программы
Введите пределы интегрирования 1 5
Введите шаг h 0.1
Значение интеграла = 248.43
155
Задача 3.9. Разработать алгоритм и программу вычисления
двойного интеграла
3
2
33
1
0
)4( dyyxxydx с помощью метода прямо-
угольников с шагом интегрирования h1 по переменной х и с шагом
интегрирования h2 по переменной y. Шаги интегрирования h1 и h2
задаются с клавиатуры. Вычисление выражения
334),( yxxyyxf оформить в виде функции. Полученный ре-
зультат вывести на экран. Решить аналитически заданный интеграл
и сравнить полученные результаты.
Решение задачи
Суть аналитического вычисления двойного интеграла сводится к
последовательному вычислению двух определенных интегралов
(внутреннего и внешнего). Во внутреннем интеграле (по перемен-
ной y) переменная х принимается при интегрировании за постоян-
ную.
Для численного вычисления двойного интеграла необходимо ис-
пользовать следующий алгоритм.
Шаг 1. Организация цикла для перебора значений переменной x
с шагом h1 (шаг интегрирования внешнего интеграла).
Шаг 2. Для каждого значения x определение значения внутрен-
него интеграла методом прямоугольников (используется технология
предыдущей задачи).
Шаг 3. Суммирование произведений значений внутренних инте-
гралов и шага h2.
Результат аналитического решения задачи:
15)4(
3
2
33
1
0
dyyxxydx . Схема алгоритма численного решения
задачи представлена на рис. 3.9.
156
10
13
2
3
4
1
5
да
нет
6
7
8
9
D=(b2-a2)/h2
Int2=0
A
I=1, D
A
F - вызов функции
вычисления
значения функции
Начало
XXk
Ввод
N
9
Y=Y+
h·F(X, Y)
Рис. 3.11
162
Пояснения к схеме алгоритма
Обозначения:
Xn, Xk – начальное и конечное значение отрезка, на котором
производится поиск решения;
F(X, Y) – функция для вычисления значения функции xey2 ;
h – шаг изменения переменной x;
I – номер точки.
Символ 1. Начало алгоритма.
Символ 2. Ввод значения N – числа точек отрезка.
Символ 3. Задание границ отрезка поиска корня – [Xn, Xk]. Вы-
числение значение приращения для переменной X – h.
Символ 4. Задание значений X, Y для первой точки отрезка –
начальное условие Коши. Переменной номера точки (I) присваива-
ется значение 1.
Символ 5. Вычисление Y для следующей точки с использованием
значений X, Y предыдущей точки. Значение уравнения xeyy 2
вычисляется с помощью функции F.
Символ 6. Значение номера точки I увеличивается на 1. Значение
переменной X увеличивается на величину шага h.
Символ 7. Вывод на экран значений I, X, Y.
Символ 8. Проверка условия X > Xk. Если условие верно, то вы-
полняется символ 9, если нет – символ 5.
Символ 9. Конец алгоритма.
Программа
Program Ejler;
Var
Xn, Xk, h, X, Y, YF : Real;
I, N : Integer;
Function F(X, Y : Real) : Real;
Begin {начало раздела операторов функции F}
F := 2*Y + Exp(X);
end; {конец функции F}
Begin {начало раздела операторов основной программы}
Xn := 0; Xk := 2; {границы отрезка}
{чтение значения n}
Write(‘Введите число точек отрезка N ’); Readln(N);
163
h := (Xk - Xn)/N; {приращение для переменной Х}
X := 0; Y := 1; {начальное условие Коши}
I := 0; {первоначальное значение номера точки}
Repeat {начало цикла}
{вычисление Y с использованием X, Y предыдущей точки}
Y := Y + h*F(X, Y);
I := I + 1; {номер точки увеличивается на 1}
X := X + h; {значение X для I-й точки}
{вывод результатов итерации}
Writeln(I, ' точка Х = ', X:4:2, ' Y = ', Y:7:4);
Until X >= Xk; {выход из цикла, когда X станет больше Xk}
End. {конец основной программы}
Результаты работы программы
Введите число точек отрезка 10
1 точка X = 0.2000 Y = 1.6000
2 точка X = 0.4000 Y = 2.4843
3 точка X = 0.6000 Y = 3.7764
4 точка X = 0.8000 Y = 5.6513
5 точка X = 1.0000 Y = 8.3570
6 точка X = 1.2000 Y = 12.2434
7 точка X = 1.4000 Y = 17.8048
8 точка X = 1.6000 Y = 25.7377
9 точка X = 1.8000 Y = 37.0234
10 точка X = 2.0000 Y = 53.0428
Введите число точек отрезка 100
1 точка X = 0.0200 Y = 1.0600
2 точка X = 0.0400 Y = 1.1228
3 точка X = 0.0600 Y = 1.1885
4 точка X = 0.0800 Y = 1.2573
…
96 точка X = 1.9200 Y = 79.8924
97 точка X = 1.9400 Y = 83.2245
98 точка X = 1.9600 Y = 86.6927
99 точка X = 1.9800 Y = 90.3024
100 точка X = 2.0000 Y = 94.0593
Введите число точек отрезка 1000
1 точка X = 0.0020 Y = 1.0060
2 точка X = 0.0040 Y = 1.0120
3 точка X = 0.0060 Y = 1.0181
4 точка X = 0.0080 Y = 1.0242
…
996 точка X = 1.9920 Y = 99.3283
997 точка X = 1.9940 Y = 99.7403
998 точка X = 1.9960 Y = 100.1540
999 точка X = 1.9980 Y = 100.5693
1000 точка X = 2.0000 Y = 100.9863
Введите число точек отрезка 10000
1 точка X = 0.0002 Y = 1.0006
2 точка X = 0.0004 Y = 1.0012
3 точка X = 0.0006 Y = 1.0018
4 точка X = 0.0008 Y = 1.0024
…
9996 точка X = 1.9992 Y = 101.5562
9997 точка X = 1.9994 Y = 101.5983
9998 точка X = 1.9996 Y = 101.6404
9999 точка X = 1.9998 Y = 101.6825
10000 точка X = 2.0000 Y = 101.7247
3.5.2. Задача с использованием метода Рунге-Кутта
Задача 3.12. Разработать схему алгоритма и программу решения
дифференциального уравнения xeyy 2 на отрезке [0, 2] мето-
дом Рунге-Кутта четвертого порядка. Начальное условие Коши
y(0) = 1. Вывести на экран значения х и y в 10 и 1000 точках отрезка.
Значение числа точек вводить с помощью клавиатуры.
164
Решение задачи
Схема алгоритма решения задачи представлена на рис. 3.12.
Согласно этой схеме ниже представлен текст программы.
1
Начало
Xn=0 Xk=2
h=|Xn-Xk|/N
K1=0 K2=0
K3=0 K4=0
Y[I+1]=…
X[I+1]=X[I]+h
A
I=1, N
A
Конец
2
3
4
5
7
6
8
9
10
Вывод
I,X[I+1],
Y[I+1]
K1=F(X[I], Y[I])
K2=F(X[I]+h/2, Y[I]·h·K1/2)
K3=F(X[I]+h/2, Y[I]·h·K2/2)
K2=F(X[I]+h, Y[I]·h·K3)
Y[I+1]=Y[I]+(h/6)·
·(K1+2K2+2K3+K4)
Ввод
N
X[1]=0
Y[1]=1
11
K1=…
K2=…
K3=…
K4=...
Рис. 3.12
Пояснения к схеме алгоритма
Обозначения:
Xn, Xk – начальное и конечное значения отрезка, на котором
производится поиск решения;
h – шаг изменения переменной x;
Y[I + 1] – yi + 1 элемент массива Y (Y – массив значений функции y);
X[I], X[I + 1] – xi, i + 1 элементы массива X (X – массив значений
функции x);
K1, K2, K3, K4 – коэффициенты метода Рунге-Кутта;
I – номер точки.
Символ 1. Начало алгоритма.
165
Символ 2. Ввод значения N – числа точек отрезка.
Символ 3. Задание границ отрезка поиска корня – [Xn, Xk]. Вы-
числение значение приращения h для переменной X.
Символ 4. Задание значений X[1], Y[1] для первой точки отрез-
ка – начальное условие Коши.
Символ 5. Присвоение коэффициентам K1, K2, K3, K4 начальных
значений.
Символ 6. Открытие цикла с параметром I = 1; N для перебора
точек отрезка.
Символ 7. Вычисление значений коэффициентов K1, K2, K3, K4.
Значение уравнения xeyy 2 вычисляется с помощью функции F.
Символ 8. Вычисление значения Y[I + 1] для точки (I + 1) с ис-
пользованием значений Y[I] и коэффициентов K1–K4. Присвоение
значения переменной X[I + 1].
Символ 9. Вывод на экран значений I, X[I + 1], Y[I + 1].
Символ 10. Закрытие цикла с параметром I.
Символ 11. Конец алгоритма.
Программа
Program Runge_Cutta;
Uses Crt;
Var
Y, X : Array [0..1001] of Real;
K1, K2, K3, K4, h, Xn, Xk : Real;
I, N : Integer;
{функция вычисления значения f(x, y)}
Function F(X, Y : Real) : Real;
Begin {начало раздела операторов функции F}
F:= 2*Y + Exp(X);
end; {конец функции F}
Begin {начало раздела операторов основной программы}
ClrScr; {очистка экрана}
Xn:= 0; Xk:= 2; {границы отрезка}
{чтение значения N}
Write('Введите число точек отрезка N '); Readln(N);
h:= Abs(Xn - Xk)/N; {вычисление шага изменения X}
X[0]:= 0; Y[0]:= 1; {начальное условие Коши}
K1:=0; K2:=0; K3:=0; K4:=0;{начальные значения коэффициентов}
for I := 0 to N - 1 do
Begin {начало цикла 1}
166
{вычисление коэффициентов K1, K2, K3, K4}
K1:= F(X[I], Y[I]); K2:= F(X[I]+h/2, Y[I]+h*K1/2);
K3:= F(X[I]+h/2, Y[I]+h*K2/2);
K4:= F(X[I]+h, Y[I]+h*K3);
{вычисление Y в (I+1)-й точке}
Y[I+1]:=Y[I]+(h/6)*(K1+2*K2+2*K3+K4);
X[I+1]:= X[I] + h; {значение Х в (I+1)-й точке}
Writeln(I, ' точка X = ', X[I+1]:2:1, ' Y = ', Y[I+1]:5:3);
End; {конец цикла 1}
Repeat Until KeyPressed;{ожидание нажатия любой клавиши}
end. {конец основной программы}
Результаты работы программы
Введите число точек отрезка 10
1 точка X = 0.2 Y = 1.762
2 точка X = 0.4 Y = 2.959
3 точка X = 0.6 Y = 4.817
4 точка X = 0.8 Y = 7.678
5 точка X = 1.0 Y = 12.056
6 точка X = 1.2 Y = 18.719
7 точка X = 1.4 Y = 28.821
8 точка X = 1.6 Y = 44.090
9 точка X = 1.8 Y = 67.109
10 точка X = 2.0 Y = 101.745
Введите число точек отрезка 1000
1 точка X = 0.0 Y = 1.006
2 точка X = 0.0 Y = 1.012
3 точка X = 0.0 Y = 1.018
4 точка X = 0.0 Y = 1.024
…
996 точка X = 2.0 Y = 100.133
997 точка X = 2.0 Y = 100.549
998 точка X = 2.0 Y = 100.967
999 точка X = 2.0 Y = 101.386
1000 точка X = 2.0 Y = 101.807
3.5.3. Задача с использованием метода конечных разностей
Задача 3.13. Разработать схему алгоритма и программу решения
двумерного уравнения теплопроводности конечно-разностным ме-
тодом для заданной области, используя следующие параметры для
типов клеток:
– для типа 1: теплоемкость c = 519 Дж/К, теплопроводность
= 44,4 Вт/(м К), плотность = 1600 кг/м3, начальная температура
t = 100 C;
– для типа 2: теплоемкость c = 343 Дж/К, теплопроводность
= 110 Вт/(м К), плотность = 8900 кг/м3, начальная температура
t = 1100 C;
С шагами по пространству x = y = 0,002 м и по времени
t = 0,00005 с рассчитать температурное поле до времени 0,1 с.
167
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 2 2 2 1 1 1 1
1 1 1 1 2 2 2 1 1 1 1
1 1 1 1 2 2 2 1 1 1 1
1 1 1 2 2 2 2 2 1 1 1
1 1 1 2 2 2 2 2 1 1 1
1 1 1 2 2 2 2 2 1 1 1
1 1 1 1 2 2 2 1 1 1 1
1 1 1 1 2 2 2 1 1 1 1
1 1 1 1 2 2 2 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
Решение
Учитывая, что шаги по осям x и y, x и y равны, равенство
(П 2.26) будет иметь вид
2
,1,1,,1,1
,
1
,
4
x
TTTTT
taTT
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji , (3.1)
где jiT , – температура в точке с координатами i, j по осям x, y соот-
ветственно;
n, n+1 – координаты по времени;
c
a ,
где – теплопроводность;
с – теплоемкость;
– плотность.
Схема алгоритма решения задачи представлена на рис. 3.13. Со-
гласно этой схеме ниже представлен текст программы. Алгоритм
содержит цикл по времени t с вложенными в него циклами по i и j, в
которых перебираются сеточные элементы объекта, в каждом из
которых определяются температуры в момент времени + .
168
12
11 10
Начало
Ввод
Tip[I, J]
Ввод
C1,C2,
R1,R2,
L1,L2
Ввод
TCalc,
Tn1,
Tn2,dx,dt
TCurr=dt
Tip[I, J]=1
T[I, J]=Tn1T[I, J]=Tn2
1
3
4
2
5
6
7
9
1
данет
I=1, 15
J=1,11
I=1, 15
J=1,11
Ввод значений
физических параметров
области из файла dat.txt
8
Ввод расположения
типов клеток
заданной области
из файла tip.txt
Определение
температуры клеток
пространства в
зависимости от типа
в начальный момент
времени
Ввод параметров
расчета
из файла dat.txt
Рис. 3.13
169
24
21
14
18
25
22
19
17
Tip[I, J]=1
A=L1/
(C1·R1)
A=L2/
(C2·R2)
TCurr<
TCalc
Temp[I,J]=
...
TCurr=
=TCurr+dt
T[I,J]=
Temp[I,J]
Конец
13
15
16
20
23
Вывод
элемен-
тов мас-
сива T
1
данет
I=2, 14
J=2,10
I=1, 15
J=1,11
Вычисление
температуры
в клетке (I, J)
Temp[I,J]=T[I,J]+
+A·(T[I+1,J]+
+T[I,J+1]-4T[I,J]+
+T[I-1,J]+
+T[I,J-1])/(dx·dx)
да
нет
Приращение
переменной
времени TCurr
Присвоение
элементам массива
T значений
массива Temp
Вычисление
температуры в
следующий момент
времени для
заданной области
Вычисление
коэффициента
А в зависимости
от типа клетки
Рис. 3.13 (окончание)
170
Пояснения к схеме алгоритма
Обозначения:
Tip – массив размером 15 × 11, содержащий значения типов кле-
ток заданной области, содержит значение 1 – если клетка типа 1, зна-
чение 2 – для клетки типа 2, заполняется значениями из файла tip.txt;
Tip[I, J] – элемент, расположенный в i-й строке и j-м столбце мас-
сива Tip;
T – массив размером 15 × 11 значений температур клеток задан-
ной области.
T[I, J] – tij элемент массива T;
Temp – массив размером 15 × 11 для временного хранения темпе-
ратур клеток заданной области;
Temp[I, J] – элемент, расположенный в i-й строке и j-м столбце
массива Temp;
C1, C2 – значения теплоемкости материалов типов 1 и 2;
R1, R2 – значения плотности материалов типов 1 и 2;
L1, L2 – значения теплопроводности материалов типов 1 и 2;
dx, dt – значения шагов изменения по пространству и времени;
Tn1, Tn2 – значения начальных температур клеток для типов 1 и
2 клеток заданной области;
TCurr – текущее время расчета;
TCalc – конечное время расчета.
Символ 1. Начало алгоритма.
Символ 2. Открытие цикла с параметром I = 1; 15 для перебора
координат по оси y заданной области (перебор строк области).
Символ 3. Открытие цикла с параметром J = 1; 11 для перебора
координат по оси x заданной области (перебор столбцов области).
Символ 4. Ввод типа клетки с координатами (I, J) из файла tip.txt.
Символ 5. Ввод значений физических параметров материалов
типов 1 и 2: теплоемкостей (С1, С2), плотностей (R1, R2), теплопро-
водностей (L1, L2) из файла dat.txt.
Символ 6. Ввод значений параметров расчета: время расчета
(TCalc), значения начальных температур для материалов типов 1 и 2
(Tn1, Tn2), шаги по пространству (dx) и времени (dt) из файла
dat.txt.
Символ 7. Открытие цикла с параметром I = 1; 15 для перебора
координат по оси y заданной области (перебор строк области).
171
Символ 8. Открытие цикла с параметром J = 1; 11 для перебора
координат по оси x заданной области (пребор столбцов области).
Символ 9. Вычисление значения температуры клетки с коорди-
натами (I, J) в начальный момент времени.
Символ 10. Присвоение элементу массива T[I, J] значения Tn1.
Символ 11. Присвоение элементу массива T[I, J] значения Tn2.
Символ 12. Присвоение переменной текущего времени расчета
TCurr значения dt.
Символ 13. Проверка условия, что текущее время (TCurr) не пре-
вышает конечное время расчета (TCalc). Если условие верно, то вы-
полняется символ 14, если нет – символ 25.
Символ 14. Открытие цикла с параметром I = 2; 14 для перебора
координат по оси y заданной области (перебор строк области).
Символ 15. Открытие цикла с параметром J = 1; 10 для перебора
координат по оси x заданной области (перебор столбцов области).
Символ 16. Определение типа материала клетки с координатами
(I, J). Проверка условия равенства значения элемента Tip[I, J] еди-
нице. Если условие верно, то выполняется символ 17, если нет –
символ 18.
Символ 17. Вычисление значения коэффициента А для типа
1 клетки с координатами (I, J).
Символ 18. Вычисление значения коэффициента А для типа
2 клетки с координатами (I, J).
Символ 19. Вычисление значения температуры в клетке с коор-
динатами (I, J) в момент времени TCurr по формуле (3.1).
Символ 20. Открытие цикла с параметром I = 1; 15 для перебора
координат по оси y заданной области (перебор строк области).
Символ 21. Открытие цикла с параметром J = 1; 11 для перебора
координат по оси x заданной области (перебор столбцов области).
Символ 22. Присвоение элементу массива T[I, J] значения эле-
мента массива Temp[I, J].
Символ 23. Вывод элементов массива T на экран. Вывод значений
производится с организацией внешнего цикла для перебора строк
массива T и внутреннего цикла для перебора столбцов (табл. П 1.13),
на схеме для упрощения это показано в одном символе.
Символ 24. Приращение переменной текущего времени расчета
(TCurr) на значение шага по времени (dt).
Символ 25. Конец алгоритма.
172
Программа
Program PartDeriv;
Uses Crt;
Var
f : Text;
T, tip, Temp : Array [1..15, 1..11] of Real;
TCurr, TCalc, A : Real;
L1, L2, C1, C2, R1, R2, Tn1, Tn2, dx, dt : Real;
I, J : Integer;
Begin {начало раздела операторов программы}
ClrScr; {очистка экрана}
Assign(f,'tip.txt'); Reset(f); {открытие файла tip.txt}
{чтение расположения типов клеток области из файла tip.txt}
for I:=1 to 15 do
Begin {начало цикла 1}
for J:=1 to 11 do Read(f, Tip[I, J]);
Readln(f); {переход на след. строку в файле}
end; {конец цикла 1}
Close(f); {закрытие файла tip.txt}
Assign(f,'dat.txt'); Reset(f); {открытие файла dat.txt}
{чтение физических параметров области из файла dat.txt}
Read(f, C1); Readln(f, C2); {значения теплоемкостей}
Read(f, R1); Readln(f, R2); {значения плотностей}
Read(f, L1); Readln(f, L2); {значения теплопроводностей}
{значения шагов по пространству и по времени}
Read(f, dx); Readln(f,dt);
Readln(f, TCalc); {значение времени расчета}
Read(f, Tn1); Readln(f, Tn2); {значения начальных температур}
Close(f); {закрытие файла dat.txt}
{расчет}
{температуры клеток области в начальный момент времени}
for I:=1 to 15 do
for J:=1 to 11 do
If Tip[I, J]=1 Then T[I, J]:= Tn1 Else T[I, J]:=Tn2;
TCurr:= dt;
While TCurr <= TCalc do
Begin {начало цикла 2}
ClrScr; {очистка экрана}
for I:=2 to 14 do
for J:=2 to 10 do {начало цикла 4}
Begin {начало цикла 5}
If Tip[I, J] = 1 Then A:= L1/(C1*R1)
Else A:= L2/(C2*R2);
{температура в клетке (I,J) в след. момент времени}
Temp[I, J]:=T[I, J]+A*dt*(T[I+1, J] + T[I, J+1] –
173
4*T[I, J] + T[I-1, J] + T[I, J-1])/(dx*dx);
end; {конец циклов 4, 5}
for I:=2 to 14 do
for J:=2 to 10 do T[I, J]:= Temp[I, J];
{вывод массива значений температур Т на экран}
for I:=1 to 15 do
Begin {начало цикла 6}
{вывод строки температур}
for J:=1 to 11 do Write(' ',T[I, J]:6:1);
Writeln(' '); {переход на следующую строку}
end; {конец цикла 6}
Writeln('Время ', TCurr:7:5, ' Осталось итераций ',
Trunc((TCalc-TCurr)/dt):10);
Writeln('Нажмите клавишу Enter');
TCurr:= TCurr + dt; {приращение переменной времени}
Readln; {ожидание нажатия клавиши Enter}
end; {конец цикла 2 – While}
End. {конец программы}
Результат работы программы
Файл dat.txt:
519 343
1600 8900
44.4 110
0.002 0.00005
0.1
100 1100
Поле температур после окончания расчета:
100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
100.0 109.4 128.2 161.6 200.4 217.1 200.4 161.6 128.2 109.4 100.0
100.0 123.9 171.0 255.2 354.0 396.6 354.0 255.2 171.0 123.9 100.0
100.0 144.2 229.1 379.0 563.0 641.8 563.0 379.0 229.1 144.2 100.0
100.0 167.0 288.0 488.3 719.0 815.5 719.0 488.3 288.0 167.0 100.0
100.0 193.4 349.6 584.2 821.1 914.2 821.1 584.2 349.6 193.4 100.0
100.0 219.8 409.8 676.7 900.1 979.2 900.1 676.7 409.8 219.8 100.0
100.0 231.0 435.1 715.3 930.5 1002.7 930.5 715.3 435.1 231.0 100.0
100.0 219.8 409.8 676.7 900.1 979.2 900.1 676.7 409.8 219.8 100.0
100.0 193.4 349.6 584.2 821.1 914.2 821.1 584.2 349.6 193.4 100.0
100.0 167.0 288.0 488.3 719.0 815.5 719.0 488.3 288.0 167.0 100.0
100.0 144.2 229.1 379.0 563.0 641.8 563.0 379.0 229.1 144.2 100.0
100.0 123.9 171.0 255.2 354.0 396.6 354.0 255.2 171.0 123.9 100.0
100.0 109.4 128.2 161.6 200.4 217.1 200.4 161.6 128.2 109.4 100.0
100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
174
4. ВЫЧИСЛИТЕЛЬНЫЕ ТЕХНОЛОГИИ
РЕШЕНИЯ ЗАДАЧ В MS EXCEL
4.1. Решение системы линейных уравнений
матричным методом
Задача 4.1. Решить систему линейных уравнений с помощью
матричного метода. Систему линейных уравнений сформировать на
основе заданного закона, определяющего коэффициенты при неиз-
вестных. Принять, что число неизвестных системы равно четырем.
Коэффициенты системы задаются по закону
;при)sin(3
;при)cos(2
jiji
jiji
aij (4.1)
2)5(tg iici . (4.2)
Решение задачи
Система уравнений с четырьмя неизвестными имеет вид
.
,
,
,
4444343242141
3434333232131
2424323222121
1414313212111
cxaxaxaxa
cxaxaxaxa
cxaxaxaxa
cxaxaxaxa
(4.3)
Используя уравнения (4.1) и (4.2), вычислим значения некоторых
коэффициентов системы линейных уравнений:
a11 = 2cos(1 + 1) при 1 = 1;
a12 = 2cos(1 + 2) при 1 < 2;
a21 = 3sin(2 + 1) при 2 > 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=Pcos(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=PA[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=PA[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 n10 .
Шаг разбиения 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 n10 . Шаг разбиения 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, Минск.