Программа


{ Вычисление интеграла
  методом Симпсона
  с заданной точностью }
CONST Eps=0.0001;                  { Точность }
TYPE Func=function(x:real):real; { Тип функция }
VAR Left,Right:real;       { Левая и правая границы интервала интегрирования }
FUNCTION F(X:real):real;far; { Вычисление интегрируемой функции }
  Begin
    F:=sin(x)
  End;
FUNCTION Integral(Left,Right:real;Break:integer;F:Func):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;
    Integral:=LengthStep/3*(F(Left)+F(Right)+2*Sum1+4*Sum2)
                                        { Определение значения интеграла }
  End;
Function ExactIntegral(Left,Right:real;Eps:real;F:Func):real;
                         { Функция вычисления интеграла с заданной точностью }
  var PredInt,Int:real;  { Предыдущее и текущее значения интеграла }
      Break:integer;     { Разбиение }
  Begin
    Break:=1;                         { Оперделение начального разбиения }
    Int:=Integral(Left,Right,Break,F);{ Предварительное вычисление интеграла }
    repeat
      PredInt:=Int;             { Сохранение предыдущего значения интеграла }
      Break:=Break*2;           { Увеличение разбиения }
      Int:=Integral(Left,Right,Break,F)
                                { Вычисление нового значения интеграла }
    until abs(Int-PredInt)<=Eps;
             { Выход из цикла при достижении заданной точности }
    ExactIntegral:=Int  { Определение значения функции }
  End;

BEGIN
  { Ввод данных: }
  Write('Введите левую границу интервала интегрирования ');
  ReadLn(Left);
  Write('Введите правую границу интервала интегрирования ');
  ReadLn(Right);

  WriteLn('=',ExactIntegral(Left,Right,Eps,F))
                                             { Вычисление и вывод результата }
END.

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