Программа
Var Left,Right:real; { Левая и правая границы интервала интегрирования }
Break:integer; { Разбиение }
Function F(x:real):real; { Вычисление интегрируемой функции }
Begin
F:=Exp(X)
End;
Function IntegralTrap(Left,Right:real;Break:integer):real;
{ Функция вычисления интеграла }
Var Sum, { Промежуточная сумма }
LengthStep, { Длина шага разбиения }
LeftY,RightX, { Левая и правая границы шага интегрирования }
RightY:real;
{ Значение интегрируемой функции на правой границе шага интегрирования }
i:integer; { Счетчик }
Begin
Sum:=0; { Обнуление промежуточной суммы }
LengthStep:=(Right-Left)/Break; { Вычисление длины шага интегрирования }
LeftY:=F(Left); { Вычисление значения функции на левой границе }
RightX:=Left+LengthStep; { Вычисление правой границы левого интервала }
for i:=1 to Break do { Цикл набора промежуточной суммы }
begin
RightY:=F(RightX); { Вычисление значения функции на правой границе }
Sum:=Sum+(LeftY+RightY)/2; { Набор промежуточной суммы }
LeftY:=RightY; { Сохранение значения функции на правой
границе для последующей итерации }
RightX:=RightX+LengthStep
{ Вычисление правой границы следующего участка }
end;
IntegralTrap:=Sum*LengthStep { Определение интегральной суммы }
End;
FUNCTION IntegralSimp(Left,Right:real;Break:integer):real;
{ Функция вычисления интеграла методом Симпсона }
Var Sum1,Sum2, { Промежуточные суммы }
X, { Промежуточная абсцисса }
LengthStep, { Длина шага разбиения }
LeftY,RightX, { Левая и правая границы шага интегрирования }
RightY:real; { Значение интегрируемой функции
на правой границе шага интегрирования }
i:integer; { Счетчик }
Begin
LengthStep:=(Right-Left)/Break/2; { Вычисление длины шага интегрирования }
X:=Left+LengthStep; { Начальное определение промежуточной абсциссы }
Sum1:=0; { Обнуление промежуточной суммы 1 }
Sum2:=F(X); { Начальное определение промежуточной суммы 2 }
for i:=2 to Break do { Цикл набора промежуточных сумм }
begin
X:=X+LengthStep; { Переопределение абсциссы }
Sum1:=Sum1+F(X); { Набор промежуточной суммы 1 }
X:=X+LengthStep; { Переопределение абсциссы }
Sum2:=Sum2+F(X); { Набор промежуточной суммы 2 }
end;
IntegralSimp:=LengthStep/3*(F(Left)+F(Right)+2*Sum1+4*Sum2)
{ Определение значения интеграла }
End;
VAR StepBreak:integer; { Шаг изменения разбиения }
i:integer; { Счетчик цикла }
ExactInt:real; { Точное значение интеграла }
Int:real; { Значение интеграла }
BEGIN
WriteLn; { Пропуск строки }
{ Ввод данных: }
Write('Введите левую границу интервала интегрирования ');
ReadLn(Left);
Write('Введите правую границу интервала интегрирования ');
ReadLn(Right);
Break:=6; { Определение начального разбиения }
StepBreak:=6; { Определение шага изменения разбиения }
WriteLn; { Пропуск строки }
ExactInt:=Exp(Right)-Exp(Left); { Вычисление точного значения интеграла }
WriteLn('Точное значение интеграла ',ExactInt); { Вывод точного значения }
WriteLn('╔═════╦═══════════════════╤══════════╦═══════════════════╤══════════╗');
WriteLn('║ n ║ Метод Симпсона │ ошибка ║ Метод трапеций │ ошибка ║');
WriteLn('╠═════╬═══════════════════╪══════════╬═══════════════════╪══════════╣');
for i:=0 to 4 do { Цикл вычислений для различных разбиений }
begin
Write('║ ',Break:3,' ║ '); { Вывод разбиения }
Int:=IntegralSimp(Left,Right,Break); { Вычисление по Симпсону }
Write(Int,' │ ',Abs(Int-ExactInt):8,' ║ ');{ Вывод результата и погрешности}
Int:=IntegralTrap(Left,Right,Break); { Вычисление по методу трапеций }
WriteLn(Int,' │ ',Abs(Int-ExactInt):8,' ║ ');{ Вывод результата и погрешности}
Break:=Break+StepBreak { Переопределение разбиения }
end;
WriteLn('╚═════╩═══════════════════╧══════════╩═══════════════════╧══════════╝');
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию