Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка Программирование

.pdf
Скачиваний:
35
Добавлен:
13.03.2016
Размер:
3.61 Mб
Скачать

if (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