Программа


{ По заданной точности вычислить
  интеграл, используя различные
  разбиения, вывести график
  подынтегральной ф-ии,
  вывести результатаы вычислений
  при различных разбиениях и
  сравнивая их с точным значением }
Uses Crt,Graph;                     { Подключение модулей консоли и графики }
Const
  a=1;                              { Левая грница интервала интегрирования }
  b=7;                             { Правая грница интервала интегрирования }
Var
  Symbol:Char;                        { Переменная для обработки клавиатуры }
Function F(x:real):real;      { Вычисление значения подынтегральной функции }
  Begin
    F:=x*exp(x)
  End;
Function Fproto(x:real):real;           { Вычисление значения первообразной }
  Begin
    Fproto:=exp(x)*(x-1)
  End;
Procedure Graphic;                                          { Вывод графика }
  Const
    ScaleX=40;                            { Масштабный коэффициент по оси X }
    ScaleY=0.02;                          { Масштабный коэффициент по оси Y }
    DriverPath='';                           { Путь к графическому драйверу }
  Var
    GraphDriver,GraphMode:integer;  { Номера графического драйвера и режима }
    i:integer;                                                    { Счетчик }
    DifferenceX0:integer;  { Смещение оси X относительно левого края экрана }
    DifferenceY0:integer;{ Смещение оси Y относительно верхнего края экрана }
  Begin
    GraphDriver:=Detect;              { Автоматическое определение драйвера }
    InitGraph(GraphDriver,GraphMode,DriverPath);
                                        { Инициализация графического режима }
    DifferenceX0:=0;                           { Определение смещения оси X }
    DifferenceY0:=GetMaxY;                     { Определение смещения оси Y }
    SetColor(White);                               { Установка белого цвета }
    SetLineStyle(SolidLn,0,NormWidth);
                              { Установка сплошной линии нормальной толщины }
    Line(DifferenceX0,0,DifferenceX0,GetMaxY);                      { Ось Y }
    Line(0,DifferenceY0,GetMaxX,DifferenceY0);                      { Ось X }
    Line(Round(a*ScaleX)+DifferenceX0,DifferenceY0,
         Round(a*ScaleX)+DifferenceX0,DifferenceY0-Round(F(a)*ScaleY));
                                                   { Левая граница трапеции }
    Line(Round(b*ScaleX)+DifferenceX0,DifferenceY0,
         Round(b*ScaleX)+DifferenceX0,DifferenceY0-Round(F(b)*ScaleY));
                                                  { Правая граница трапеции }
    SetLineStyle(SolidLn,0,ThickWidth);   { Установка сплошной толстой линии}
    MoveTo(a*ScaleX+DifferenceX0,DifferenceY0-Round(F(a)*ScaleY));
                               { Помещение указателя в первую точку графика }
    for i:=a*ScaleX+1 to b*ScaleX do                   { Построение графика }
      LineTo(i+DifferenceX0,DifferenceY0-Round(F(i/ScaleX)*ScaleY));
    SetFillStyle(LtSlashFill,White);  { Установка заполнения ///,белый цвет }
    FloodFill(DifferenceX0+Round((a+b)/2*ScaleX),
              DifferenceY0-Round(F((a+b)/2)/2*ScaleY),White);
                           { Заполнение трапеции указанием ее средней точки }
    Symbol:=ReadKey;          { Чтение клавиатуры для остановки программы и
                                определения дальнейшего действия            }
    CloseGraph                               { Закрытие графического режима }
  End;
Procedure Result;             { Вычисление интеграла и определение точности
                                вычислений в зависимости от разбиения       }
  Const
    StepOfBreak=50;                                    { Шаг ряда разбиений }
  Var
    Eps:real;                                { Критерий точности вычисления }
    Res:real;                                   { Точное значение интеграла }
    Sum,SumPred:real;{ Текущая интегральная и предыдущая интегральная суммы }
    Step:real;                                              { Шаг разбиения }
    Fcurrent,Fpred:real;
                    { Текущее и предыдущее значения подынтегральной функции }
    i,k:integer;                                                 { Счетчики }
  Begin
    write('Задайте критерий точности вычисления ');
                                   { Приглашение ввести точность вычисления }
    readln(Eps);                            { Получение точности вычисления }
    writeln;
    Res:=Fproto(b)-Fproto(a);       { Вычисление точного значения интеграла }
    writeln('Точное значение ',Res);             { Вывод значения интеграла }
    writeln;
    writeln('РАЗБИЕНИЕ       ЗНАЧЕНИЕ        ПОГРЕШНОСТЬ');
    i:=0;                       { Определение начального положения счетчика }
    repeat                 { Цикл вычисления интеграла и вывода результатов }
      i:=i+1;
      SumPred:=Sum;             { Сохранение предыдущего значения интеграла }
      Sum:=0;                                { Обнуление интегральной суммы }
      Step:=(b-a)/StepOfBreak/i;               { Определение шага разбиения }
      Fcurrent:=F(a);  { Определение значения функции в левой точке участка
                            интегрирования перед набором интегральной суммы }
      for k:=1 to StepOfBreak*i do               { Набор интегральной суммы }
        begin
          Fpred:=Fcurrent;        { Сохранение предыдущего значения функции }
          Fcurrent:=F(a+k*Step);     { Вычисление текущего значения функции }
          Sum:=Sum+(Fpred+Fcurrent)/2
                        { Набор интегральной суммы без учета шага разбиения }
        end;
      Sum:=Step*Sum;   { Пересчет интегральной суммы, учитывающий разбиение }
      if i=1 then writeln(StepOfBreak*i:6,'     ',Sum)
                                                 { Вывод первого результата }
             else writeln(StepOfBreak*i:6,'     ',Sum,' ',abs(Sum-Res));
                       { Вывод последующих результатов вычисления интеграла,
                         вычисление и вывод погрешности                     }
      if KeyPressed then Symbol:=ReadKey;
                    { Если была нажата клавиша, то чтение буфера клавиатуры }
    until (abs(Sum-SumPred)<=Eps)and(i>1)or(Symbol=#27);
                  { Выход из цикла по критерию точности или при нажатии Esc }
    if Symbol<>#27                          { Если из цикла вышли не по Esc }
      then                                  { то                            }
        begin
          writeln('----------------------------------------------');
                                              { Оформление конца вычислений }
          Symbol:=ReadKey     { Чтение клавиатуры для остановки программы и
                                определения дальнейшего действия            }
        end
  End;
BEGIN
  repeat
    Graphic;
    if Symbol<>#27 then Result;  { Если из графики вышли не по Esc, то
                                   вычисление интеграла и вывод результатов }
  until Symbol=#27                                  { Выход при нажатии Esc }
END.


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