Laba_infa6 (Все ЛР)
Описание файла
Файл "Laba_infa6" внутри архива находится в папке "Labs". Документ из архива "Все ЛР", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Онлайн просмотр документа "Laba_infa6"
Текст из документа "Laba_infa6"
Задача
Вычислить значение определенного интеграла от выбранной подынтегральной функции и заданных с клавиатуры интервала интегрирования, точности и двух значений начальных разбиений 4-мя методами:
-
Метод левых прямоугольников:
Int = h * ∑ yi , h = (b-a) / n
-
Метод трапеций:
Int = h * ((y0 + yn)/2 + ∑ yi )
-
Метод кубических парабол:
Int = 3*h/8 * (y0+yn+2*S1+3*S2),
S1 = y3+y6+y9+y12+…
S2 = y1+y2+y4+y5+…
Условие: n - кратно 3.
-
Метод Уэддля:
Int = 6*h/840 * (41*(y0+yn) + 82*S1 + 216*S2 + 27*S3 + 272*S4),
S1 = y6+y12+y18+y24+…
S2 = y1+y5+y7+y11+…
S3 = y2+y4+y8+y10+y…
S4 = y3+y9+y15+y21+…
Условие: n - кратно 6.
Требования
Требования к отчету:
-
Титульный лист;
-
Формулировка задания;
-
Обоснование используемых типов данных;
-
Листинг программы;
-
Набор исходных тестовых данных с результатами (скриншоты окна).
Общие для всех требования:
-
Построить меню «по запросу» в виде:
-
Ввод исходных данных
-
Вычисление интеграла 4 способами
-
функция 1
-
функция 2
-
функция 3
-
-
Вывод таблицы с результатами
Выход;
Процедуры ввода данных и процедуры для каждого метода вынести в модуль;
Подынтегральные функции передавать в процедуры методов в качестве параметров (использовать процедурный тип);
Исходные данные: интервал, точность и два количества начальных разбиений вводить с клавиатуры;
Вид результатов:
Метод Количество Значение
разбиений итераций интеграла
Прямоугольников n1 it1 s1 при n1
n2 it2 s2 при n2
Парабол n1 it1 s1 при n1
n2 it2 s2 при n2
и т.д.
Обоснование типов данных
Переменные для границ интервала, погрешности, значения функции и её интеграла возьмём типа double, так как это нецелые числа. Переменные-счётчики возьмём беззнакового типа word, так как они всегда больше 0 и принимают только целые значения. Переменные для выборов в меню сделаем типа shortint. Количество разбиений будет иметь тип smallint для возможности исправления неверного ввода пользователем.
Код
program laba6;
{Выполнил Кирдин М.Д., Вариант 9, Группа ФН12-11Б. Вычислить значение определенного интеграла от выбранной подынтегральной функции и заданных с клавиатуры интервала интегрирования, точности и двух значений начальных разбиений 4-мя методами.}
uses
crt,
lab6;
var
i, k: shortint;
//переменные для меню
S: double;
//значение интеграла
a, b: double;
//границы интегрируемого отрезка
h: double;
//шаг интегрирования
error: double;
//погрешность
n1, n2: smallint;
//количество разбиений
it1, it2: word;
//количество итераций
begin
repeat
ClrScr;
WriteLn('1 -> Input');
WriteLn('2 -> Integration of... ');
WriteLn('3 -> Display resulting table');
WriteLn('4 -> Exit');
Write('Select the action: ');
//очищаем окно от лишнего текста каждый раз после окончания действий определенного пункта меню
repeat
ReadLn(i);
if (i = 1) or (i = 2) or (i = 3) or (i = 4) then
break;
writeln('Incorrect input. Try again.');
until False;
//проверяем правильность ввода варианта в меню
case i of
1:
begin
Input(a, b, n1, n2, error);
writeln ('Input successful, press <Enter> to continue');
readln;
end;
2:
begin
WriteLn('1 -> f(x) = cos(x)');
WriteLn('2 -> f(x) = pi^x');
WriteLn('3 -> f(x) = 4x^2 - 1');
repeat
ReadLn(k);
if (k = 1) or (k = 2) or (k = 3) then
begin
case k of
1:
writeln ('You have chosen cos(x). Press <Enter> to continue.');
2:
writeln ('You have chosen pi^x. Press <Enter> to continue.');
3:
writeln ('You have chosen 4x^2 - 1. Press <Enter> to continue.');
end;
//выбираем функцию, которую будем интегрировать
readln;
break;
end;
writeln('Incorrect input');
until False;
end;
3:
begin
case k of
1:
writeln('Displaying cos(x)');
2:
writeln('Displaying pi^x');
3:
writeln('Displaying 4x^2 - 1');
end;
writeln ('Integration limits are [ ', a:5,'; ', b:5, ']');
writeln('Method of ': 25, 'Amount of ': 25,
'Value of integration': 25);
writeln('divisions': 35, 'iterations': 15);
left_out(a, b, n1, n2, it1, it2, S, h, error, k);
trapezoid_out(a, b, n1, n2, it1, it2, S, h, error, k);
cubics_out(a, b, n1, n2, it1, it2, S, h, error, k);
Weddle_out(a, b, n1, n2, it1, it2, S, h, error, k);
writeln('Press <Enter> to continue');
readln;
end;
4:
halt;
end;
until False;
end.
unit lab6;
{модуль, содержащий все необходимые процедуры}
interface
procedure Input (var a_p, b_p: double; var n1_p, n2_p: smallint; var error_p: double);
//процедура ввода данных
function funk (x_f: double; k_f: shortint): double;
//функция для подынтегральных функций
procedure left (a_p1, b_p1: double; n_p1: smallint; var S_p1: double; var it_p1: word; h_p1: double; error_p1: double; k_p1: shortint);
//расчёт методом левых прямоугольников
procedure trapezoid (a_p2, b_p2: double; n_p2: smallint; var S_p2: double; var it_p2: word; h_p2: double; error_p2: double; k_p2: shortint);
//расчёт методом трапеций
procedure cubics (a_p3, b_p3: double; n_p3: smallint; var S_p3: double; var it_p3: word; h_p3: double; error_p3: double; k_p3: shortint);
//расчёт методом кубических парабол
procedure Weddle (a_p4, b_p4: double; n_p4: smallint; var S_p4: double; var it_p4: word; h_p4: double; error_p4: double; k_p4: shortint);
//расчёт методом Уэддля
procedure left_out (a_o1, b_o1: double; n1_o1, n2_o1: smallint; it1_o1, it2_o1: word; S_o1: double; h_o1: double; error_o1: double; k_o1: shortint);
//вывод результатов левых прямоугольников
procedure trapezoid_out (a_o2, b_o2: double; n1_o2, n2_o2: smallint; it1_o2, it2_o2: word; S_o2: double; h_o2: double; error_o2: double; k_o2: shortint);
//вывод результатов трапеций
procedure cubics_out (a_o3, b_o3: double; n1_o3, n2_o3: smallint; it1_o3, it2_o3: word; S_o3: double; h_o3: double; error_o3: double; k_o3: shortint);
//вывод результатов кубических парабол
procedure Weddle_out (a_o4, b_o4: double; n1_o4, n2_o4: smallint; it1_o4, it2_o4: word; S_o4: double; h_o4: double; error_o4: double; k_o4: shortint);
//вывод результатов метода Уэддля
implementation
procedure Input (var a_p, b_p: double; var n1_p, n2_p: smallint; var error_p: double);
begin
repeat
write ('Enter the interval of integration: ');
readln (a_p, b_p);
if (a_p < b_p) then
break;
writeln ('Incorrect input');
until false;
repeat
write ('How many divisions will be made(enter 2 numbers)? ');
readln (n1_p, n2_p);
if (n1_p > 0) and (n2_p > 0) then
break;
writeln ('Incorrect input');
until false;
repeat
write ('Enter error: ');
readln (error_p);
if (error_p > 0) then
break;
writeln ('Incorrect input');
until false;
//для каждого значения, вводимого с клавиатуры делаем проверку на правильность, прогоняем каждое из них пока пользователь не введёт правильное значение
end;
function funk (x_f: double; k_f: shortint): double;
begin
case k_f of
1: funk := abs (cos (x_f));
2: funk := exp (x_f * ln(pi));
3: funk := 4 * x_f * x_f - 1;
end;
end;
procedure left (a_p1, b_p1: double; n_p1: smallint; var S_p1: double; var it_p1: word; h_p1: double; error_p1: double; k_p1: shortint);
var
i: word;
//переменная-счётчик
S1: double;
//промежуточное значение интеграла
begin
S_p1 := 0;
h_p1 := (b_p1 - a_p1) / n_p1;
for i:= 0 to n_p1 - 1 do
begin
S1 := S1 + funk (a_p1 + h_p1 * i, k_p1) * h_p1;
if (S1 - S_p1 > error_p1) then
begin
S_p1 := S1;
end;
//учитываем изменения в значении только если они меньше погрешности
end;
it_p1 := n_p1 + 1;
end;
procedure trapezoid (a_p2, b_p2: double; n_p2: smallint; var S_p2: double; var it_p2: word; h_p2: double; error_p2: double; k_p2: shortint);
var
i: word;
//переменная-счётчик
S1: double;
//промежуточное значение интеграла
y1, y2: double;
//боковые стороны трапеции
x: double;
//промежуточное значение аргумента
begin
S_p2 := 0;
h_p2 := (b_p2 - a_p2) / n_p2;
x:= a_p2;
for i := 0 to n_p2 - 1 do
begin
y1 := funk (x, k_p2);
x := a_p2 + h_p2 * i;
y2 := funk (x, k_p2);
S1 := S1 + (y1 + y2) / 2 * h_p2;
if (S1 - S_p2 > error_p2) then
S_p2 := S1;
end;
it_p2 := n_p2 + 1;
end;
procedure cubics (a_p3, b_p3: double; n_p3: smallint; var S_p3: double; var it_p3: word; h_p3: double; error_p3: double; k_p3: shortint);
var
i: word;
//переменная счётчик
x: double;
//промежуточное значение аргумента
S1, S1_1, S2, S2_1: double;
//S1, S2 и их промежуточные значения
begin
S1_1 := 0;
S2_1 := 0;
S_p3 := 0;
h_p3 := (b_p3 - a_p3) / n_p3;
it_p3 := n_p3 + 1;
for i := 1 to n_p3 do
begin
x := a_p3 + h_p3 * i;
if (i mod 3 = 0) then
begin
S1_1 := S1_1 + funk (x, k_p3);
if (S1_1 - S1 > error_p3) then
S1 := S1_1;
end;
if (i mod 3 <> 0) then
begin
S2_1 := S2_1 + funk(x, k_p3);
if (S2_1 - S2 > error_p3) then
S2 := S2_1;
end;
//выбираем значения в итерациях, кратных 3, и все остальные
end;
S_p3 := 3 / 8 * h_p3 * (funk (a_p3, k_p3) + funk (b_p3, k_p3) + 2*S1 + 3*S2);
end;
procedure Weddle (a_p4, b_p4: double; n_p4: smallint; var S_p4: double; var it_p4: word; h_p4: double; error_p4: double; k_p4: shortint);
var
i: word;
// переменная-счётчик
x: double;
//промежуточное значение аргумента
S1, S1_1, S2, S2_1, S3, S3_1, S4, S4_1: double;
//S1, S2, S3 и S4 с их промежуточными значениями
begin
S_p4 := 0;
h_p4 := (b_p4 - a_p4) / n_p4;
it_p4 := n_p4 + 1;
for i := 1 to n_p4 do begin
begin
x := a_p4 + h_P4 * i;
if (i mod 6 = 0) then
begin
S1_1 := S1_1 + funk (x, k_p4);
if (S1_1 - S1 > error_p4) then
S1 := S1_1;
end
else
begin
if (i mod 2 <> 0) and (i mod 3 <> 0) then
begin
S2_1 := S2_1 + funk (x, k_p4);
if (S2_1 - S2 > error_p4) then
S2 := S2_1;
end;
if (i mod 2 = 0) then
begin
S3_1 := S3_1 + funk (x, k_p4);
if (S3_1 - S3 > error_p4) then
S3 := S3_1;
end;