Методичка Программирование
.pdfif (fun(a)*fun(x0)<0) then b:=x0
else a:=x0;
until (abs(b-a)<=e); x1:=(a+b)/2;
writeln(Rus('Решение уравнения:')); writeln(Rus('Точное значение корня :'),1.3853:0:4); writeln(Rus('Вычисленное значение корня:'),x1:0:4); writeln(Rus('Число итераций :'),iterz); end
else begin
writeln(Rus('Неправильно выбран отрезок локализации!')); end;
end.
Рис. 14. Вычисление корня уравнения методом бисекций
Задание
Составить программу нахождения корня уравнения с заданной точностьюуказанным методом. Если за заданное число шагов (по умолчанию взять 20) точность не будет достигнута, то вывести соответствующее сообщение и закончить вычисления, иначе вывести найденное значение корня, число шагов, за которое оно было найдено, и значение функции в корне.
Варианты домашних заданий
№ |
|
|
|
|
Уравнение |
Отрезок, |
Метод |
Точное |
|
вар. |
|
|
|
|
|
|
содержащ |
|
значение |
|
|
|
|
|
|
|
ий корень |
|
корня |
1 |
3 sin |
|
|
0,35 x 3,8 0 |
[2;3] |
Итерации |
2,2985 |
||
|
x |
||||||||
2 |
0,25 x3 x 1,2502 0 |
[0;2] |
Ньютона |
1,0001 |
|||||
3 |
x |
|
1 |
0 |
[0;0,9] |
Итерации |
0,2624 |
||
|
|
|
|
|
|
|
|
||
|
|
3 sin(3,6 x) |
|
|
|
||||
4 |
0,1 x2 |
x ln(x) 0 |
[1;2] |
Ньютона |
1,1183 |
||||
|
|
|
|
|
|||||
5 |
cos(4 x) 0,5 x 0 |
[0;1] |
Дихотомии |
0,3488 |
|||||
6 |
x5 cosx x 1 0 |
[0;2] |
Итерации |
1,5054 |
61
7 |
|
3 x 4 lnx 5 0 |
|
[2;4] |
Ньютона |
|
3,2300 |
|
||||||||||||||||||
8 |
|
cos |
2 |
2 sin |
1 |
|
1 |
|
0 |
[1;2] |
Дихотомии |
|
1,8756 |
|
||||||||||||
|
|
x |
x |
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
x |
|
|
|
|
|
|
|
|
|
|
||||||||||
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[1;2,2] |
Итерации |
|
2,0926 |
|
|
|
|
2 0,4 x |
2 |
|
cosx 0 |
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
10 |
|
ex |
e x 2 0 |
|
|
|
|
[0;1] |
Ньютона |
|
0,8814 |
|
||||||||||||||
11 |
|
sin(lnx) cos(lnx) 2 lnx 0 |
[1;3] |
Дихотомии |
|
1,3749 |
|
|||||||||||||||||||
12 |
|
|
x 2 sin |
1 |
|
0 |
|
[1,2;2,4] |
Итерации |
|
1,3077 |
|
||||||||||||||
|
x |
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
13 |
|
ex |
lnx 10 x 0 |
|
[3;4] |
Ньютона |
|
3,5265 |
|
|||||||||||||||||
14 |
|
cosx e |
x2 |
x 1 0 |
[1;2] |
Дихотомии |
|
1,0895 |
|
|||||||||||||||||
|
|
2 |
|
|
|
|
|
|
||||||||||||||||||
15 |
|
1 x sinx ln(1 x) 0 |
[1;1,5] |
Итерации |
|
1,1474 |
|
|||||||||||||||||||
16 |
|
3x 14 ex |
|
e x 0 |
[1;3] |
Ньютона |
|
2,0692 |
|
|||||||||||||||||
17 |
|
|
|
|
|
|
|
|
|
tanx 0 |
|
[0;1] |
Дихотомии |
|
0,6417 |
|
||||||||||
|
|
|
1,2 x |
|
|
|||||||||||||||||||||
18 |
|
|
x cos(x0,52 |
|
2) 0 |
[0,5;1,5] |
Итерации |
|
0,9892 |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
19 |
|
3 (lnx)2 6 lnx 5 0 |
[1;3] |
Ньютона |
|
0,9892 |
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
20 |
|
sinx2 cosx2 10 x 0 |
[0;1] |
Дихотомии |
|
0,1010 |
|
|||||||||||||||||||
21 |
|
|
x ln |
x |
0 |
|
|
|
|
|
|
|
|
[0,5;1,5] |
Итерации |
|
1,0499 |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
23 |
|
(x2 1) 1 21 x |
0 |
|
[1,5;2] |
Ньютона |
|
1,5793 |
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
24 |
|
3 x2 5 x2 |
x 0,4 0 |
[-1;0] |
Дихотомии |
|
-0,1927 |
|
||||||||||||||||||
25 |
|
|
x |
3 |
x sin(14 x) 0 |
[1;2] |
Итерации |
|
1,0777 |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
2 |
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Задание к лабораторной работе № 5 |
|
|
||||||||||
Вычисление определенных интегралов |
|
|
|
|
||||||||||||||||||||||
|
Для |
|
вычисления |
значений |
определенных интегралов |
существует |
множество методов. Рассмотрим некоторые из них: метод левых, правых, средних прямоугольников и метод трапеций на примерах при следующей
постановке задачи. Составить |
фрагмент программы для |
вычисления |
|
b |
|
приближенного значения определенного интеграла z f (x)dx |
при заданных |
|
подынтегральной функции f (x), |
a |
|
пределах интегрирования а и b и числе N |
разбиений интервала на подынтервалы. При этом шаг изменения аргумента x
следует найти по формуле x b a .
N
Суть этих методов в накоплении, с учетом знаков, сумм площадей прямоугольников или трапеций, заменяющих на каждом подынтервале криволинейную трапецию.
62
Замену криволинейной трапеции прямоугольником можно осуществить одним из трех способов. В первом случае (рис. 15) построение прямоугольников начинается с левой границы интервала интегрирования, при этом основание каждого прямоугольника равно x, а высота численно равна значению подынтегральной функции на левой границе подынтервала (левых прямоугольников).
Рис. 15. Метод левых прямоугольников
Во втором случае (рис. 16) построение прямоугольников начинается с правой границы интервала интегрирования, при этом основание каждого прямоугольника равно x, а высота численно равна значению подынтегральной функции на правой границе подынтервала (правых прямоугольников). Оба этих способа дают одинаковую погрешность при вычислении интеграла.
Рис. 16. Метод правых прямоугольников
В третьем случае (рис. 17) верхнее основание прямоугольника находится на точке пересечения перпендикуляра к оси абсцисс, проведенного через середину подынтервала, с кривой графика подынтегральной функции. При этом основание каждого прямоугольника равно x, а высота численно равна значению подынтегральной функции в середине подынтервала (средних прямоугольников). Этот способ дает более точный результат и обычно применяется на практике.
63
Рис. 17. Метод средних прямоугольников
В методе трапеций (рис. 18) основания каждой трапеции образуют перпендикуляры к оси абсцисс, проведенные на концах подынтервала и заключенные между точкой пересечения с осью абсцисс и точкой пересечения с кривой графика подынтегральной функции. Одну боковую сторону образует отрезок оси абсцисс, а другую – отрезок, соединяющий точки пересечения оснований с кривой графика функции.
Рис. 18 Метод трапеций
Пример. Использование метода средних прямоугольников. В этом методе формула приближенного значения определенного интеграла представляется в виде
N
zf (xi ) x,
i 1
где xi a x2 (i 1) x.
Для уменьшения объема вычислений множитель ∆х следует вынести за
N
знак суммы z x f (xi ), а для вычисления текущих значений центров
i 1
xi подынтервалов будем использовать прием накопления суммы:
64
z:=0; dx:=(b-a)/N;
x:=a+dx/2; //Середина первого подынтервала for i:=l to N do
begin z:=z+Sin(x); x:=x+dx end;
z:=z*dx; //вычисляем результат
Задание
Составить программу вычисления приближенных значений определенного интеграла двумя предложенными методами (табл. 8), а также точного его значения по первообразной. Вычислить абсолютную и относительную ошибки для каждого приближенного метода. Пределы интегрирования a и b, а также число N подынтервалов задавать при вводе. Выполняя программы при вводимых N = 50 ∙ k, k = 1, 2, 3, …, 8, установить зависимость величины относительной погрешности от N.
65
|
Варианты заданий для лабораторной работы |
|
|
|
|
Таблица 8 |
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
№ |
|
Подынтегральная |
Первообразная |
||||||||||||||||||||||||||
Методы |
подынтегральной |
||||||||||||||||||||||||||||
вар. |
функция |
||||||||||||||||||||||||||||
|
|
|
|
|
функции |
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
1 |
Трапеций и правых |
|
1 |
|
|
|
|
|
|
|
|
1 |
ln |
|
x 1 |
||||||||||||||
прямоугольников |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
1 x2 |
|
|
|
|
|
|
2 |
1 x |
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
Средних и левых |
|
|
|
|
|
|
|
|
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|||||||
2 |
прямоугольников |
|
|
sin2 x |
|
|
|
|
x |
|
|
sin(2 x) |
|||||||||||||||||
2 |
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|||||||||
3 |
Трапеции и левых |
|
1 |
|
|
|
|
|
|
|
|
|
|
ln| x| |
|||||||||||||||
прямоугольников |
|
|
|
|
x |
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
4 |
Левых прямоугольников и |
|
|
|
|
x |
|
|
|
|
|
|
|
arctg(x) |
|||||||||||||||
трапеций |
|
|
1 x2 |
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
5 |
Средних прямоугольников и |
|
|
|
|
x |
|
|
|
|
|
|
1 |
|
|
|
|
|
1 |
|
|
||||||||
трапеций |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
(1 x) |
3 |
|
|
|
2 (1 x) |
2 |
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
1 x |
|||||||||||||||||||||
6 |
Правых и левых |
|
|
ex sinx |
|
ex |
(sinx cosx) |
||||||||||||||||||||||
прямоугольников |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
7 |
Трапеций и правых |
|
|
|
lnx |
|
|
|
|
|
|
|
xlnx x |
||||||||||||||||
прямоугольников |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
8 |
Средних и левых |
|
1 |
|
|
|
|
|
|
|
|
ln |
1 x |
||||||||||||||||
прямоугольников |
|
|
x(1 x) |
|
|
|
|
|
|
|
|
x |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
9 |
Трапеций и левых |
1 |
|
|
|
|
|
|
|
|
|
ln(lnx) |
|||||||||||||||||
прямоугольников |
|
|
|
xlnx |
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
10 |
Правых и средних |
sin3(x) cosx |
|
|
|
|
|
|
sin4(x) |
||||||||||||||||||||
прямоугольников |
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тема № 6. Массивы
Массив – это упорядоченная структура однотипных данных, хранящая их последовательно. Доступ к элементу массива осуществляется через его индекс. Массивы описываются следующим образом:
ARRAY [ <диапазоны индексов> ] OF <тип элемента массива>; , где
<диапазоны индексов> - один или несколько интервалов, определяющие количество элементов в массиве, размерность массива и диапазон возможных индексов в массиве.
<тип элемента массива> - массив это структура однотипных данных, здесь определяется тип всех элементов массива. В качестве элементов массива могут быть как простые, так и сложные типы данных.
Пример 1:
ARRAY[1..10] OF Integer; - описывает массив из десяти элементов, с номерами от 1 до 10, каждый элемент массива является числом типа integer.
66
ARRAY[-50..100] OF Real; - описывает массив из 151 элемента, с номерами от -50 до 100, и где каждый элемент является числом вещественного типа.
ARRAY[1..10 , -10..10,0..100] of Boolean; - описывает трехмерный массив, с общим количеством элементов равным 21 210 (10*21*101), каждый элемент является логическим типом данных.
Существуют некоторые ограничения на массивы:
1.Левая граница всегда должна быть меньше или равна правой.
2.Типами элементов не могут выступать файлы.
3.Общий размер памяти выделенной под массив должен быть менее 2 ГБ.
Массив можно задать, как при объявлении10, так и внутри программы. Пример 2:
a:array[1..5] of integer=(4,3,2,1,0);
При работе с массивами предпочтительнее использование функций и процедур11. Типовыми операциями с массивами могут быть: поиск заданного элемента, нахождение количества заданных элементов, вывод массива на экран (Пример 3).
Пример 3 (результат работы на рис. 19):
const NMAX=50; //Максимальное кол-во элементов в массиве.
type mas=array[1..NMAX] of Integer; //"скрываем"
массив, для сохранности индексов
//процедура заполнения массива случайными числами // m - массив, переданный по ссылке,
//т.к. для передачи используется // другой тип данных, то
//нумерация индексов сохраняется //N - размер массива
procedure FillArray(var m:mas;N:integer);
var i:integer; //используется, как индекс элементов массива
begin
Randomize(); // вызов внешней функции
10Число задаваемых элементов обязательно должно быть равно числу элементов в массиве. Массив должен быть объявлен как глобальная переменная, иначе нельзя будет задать значения при объявлении массива.
11При передаче массива в явном виде невозможно передать начальный и конечный индексы элементов, поэтому в функции (процедуре) все индексы массивов, всегда начинаются с 0. Например, если при объявлении индексы были от -100 до 50, то в функции они будут от 0 до
67
for i:=1 to N do |
//последовательный перебор |
begin |
//всех элементов массива |
m[i]:=Random(100); //запись в каждый
//элемент массива случайного //числа (от 0 до 100, включительно)
end; end;
//вывод содержимого массива на экран.
//m - массив, который необходимо вывести на экран //передан по ссылке для повышения скорости
//работы программы //N - размер массива
procedure PrintArray(var m:mas;N:integer);
var i:integer; //используется, как индекс элементов массива
begin
for i:=1 to N do //последовательный перебор всех элементов массива
write(m[i],' '); //и вывод их на экран через пробел writeln; //перевод на новую строку
end;
//Поиск номера элемента в массиве
//m - массив, в котором нужно найти номер элемента //Val - значение элемента, номер которого нужно найти //N - размер массива
//результат - номер элемента, //или -10000, если элемент не найден
function GetIndexOf(var m:mas; Val,N:Integer):Integer; var i,rez:integer;
begin
rez:=-10000; //предполагаем, что элемента в массиве нет.
for i:=1 to N do // проверяем все элементы массива begin
if (m[i]=Val) then //если это тот элемент, то...
begin
rez:=i; //сохраняем номер, который //необходимо вернуть и
break; //выходим из цикла, //т.к. элемент уже найден
end; end;
68
Result:=rez; //возвращаем номер элемента, или - 10000 если его нет.
end;
//Поиск количества элементов с заданным // значением в массиве
//m - массив, в котором нужно найти номер элемента //Val - значение для поиска
//N - размер массива
//результат - количество элементов //с таким же значением
function GetCountOf(var m:mas; Val,N:Integer):Integer; var i,cnt:integer;
begin
cnt:=0; //предпологаем, что элементов в массиве нет. for i:=1 to N do // проверяем все элементы массива
begin
if (m[i]=Val) then //если это тот элемент, то...
begin
cnt:=cnt+1; //считаем количество end;
end;
Result:=cnt; //возвращаем количество элементов. end;
var a:mas; //объявили массив
c:integer; //переменная для значения, //которое неоходимо будет найти
nom:integer; //для хранения (не)найденного //индекса элемента
n:integer; //кол-во элементов в массиве begin
Write(Rus('Введите кол-во элементов в массиве:')); Readln(n); //с каким кол-вом элементов программа будет работать
if ((n>NMAX) or (n<=0)) then //Если элементов больше, //или меньше, чем может //быть в программе, то
begin
Writeln(Rus('Элементов не может быть менее 1 и более
'),NMAX);
exit; //Выход из программы end;
FillArray(a,n); //заполнение массива случайными числами
69
PrintArray(a,n); // вывод их на экран |
|
|
||
Write(Rus('Введите значение для поиска:')); |
|
|||
Readln(c); |
//значение |
для поиска |
|
|
nom:=GetIndexOf(a,c,n); |
//выполняем поиск |
|
||
if (nom<>-10000) then |
|
//Выводим |
||
writeln(Rus('Номер:'),nom) |
// |
резальтат |
||
else |
|
не найдено')); |
// |
поиска |
writeln(Rus('Значение |
// |
элемента |
||
writeln(Rus('Количество |
элементов с таким |
|
значением='),GetCountOf(a,c,n)); end.
Рис. 19. Результат работы программы
Задание
Впервой части задания необходимо написать подпрограмму, которая генерирует массив приведенного вида из N*N элементов, где N это константа, заданная в начале программы. Также должна быть создана подпрограмма для вывода массива на экран.
Вотчете должны быть приведены примеры сгенерированных массивов для N равных 4 и 10.
Во второй части задания - написать подпрограмму, выполняющую указанные действия, в случае изменения значений элементов массива, его необходимо вывести на экран до и после изменения
Образец выполнения задания
Задание. |
|
|
|
|
||
|
|
0 |
3 |
0 |
1 |
|
|
|
|||||
|
||||||
Вид массива: |
|
3 |
0 |
2 |
0 |
|
|
0 |
2 |
0 |
1 |
|
|
|
|
|
||||
|
|
1 |
0 |
1 |
0 |
|
|
|
|
|
|
|
|
Сгенерировать массив из случайных чисел, сравнить произведение элементов на главной диагонали с их суммой.
Решение.
Вданном массиве наблюдается закономерность следующего вида:
1.Если сумма номеров строки и столбца – четное число, то ставится 0, иначе не 0.
2.Если число (не 0) находится выше диагонали, то оно равно [N] – [номер строки].
70