Программа


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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию