Программа численного интегрирования

      Министерство  образования Республики Беларусь

      Белорусский национальный технический университет 
       

      Кафедра «Горные машины» 
       
       
       
       
       
       
       

      КУРСОВАЯ  РАБОТА

      По  дисциплине «Информатика» 
       

      Программа численного интегрирования 
       

      ПОЯСНИТЕЛЬНАЯ ЗАПИСКА 
       
       
       
       
       
       
       

      Руководитель:          Ринкевич В. П. 
       
       

      Исполнитель:        Семенова М. В.

      гр. 102528 
       
       
       

      2010 

Содержание 

      Введение…………………………………………………………………………4

    1. Постановка задачи………………………………………………………………5
    2. Математическая формулировка задачи………………………………………..7
    3. Алгоритмизация задачи…………………………………………………………9
    4. Идентификаторы программы…………………………………………………..12
    5. Блок-схема алгоритма…………………………………………………………..13
    6. Текст исходной программы………………………………………………………..
    7. Результаты выполнения программы……………………………………………...
    8. Анализ результатов………………………………………………………………...
    9. Инструкция по работе с программой……………………………………………..

      Заключение…………………………………………………………………………

      Список использованных источников……………………………………………..

 

           Введение 

           В курсовой работе в соответствии с  заданием на проектирование решается задача разработки программы вычисления определенных интегралов численными методами. Численное интегрирование используется, когда аналитическое нахождение значений первообразной функции  сложно или вообще невозможно. 

           В данной пояснительной записке проводится описание последовательности шагов  по составлению программы на алгоритмическом  языке Turbo Pascal 7.0 и результаты применения этой программы для нахождения приближенного значения интеграла численным методом Симпсона и методом трапеций. Рассматриваются вопросы математической формулировки и алгоритмизации задачи, разработки блок-схемы алгоритма её решения, составления исходной Pascal-программы и реализации вычислений по составленной программе. 

           Выбор метода вычисления, обращение к справке  по программе и выход из программы  обеспечивается с помощью специального меню. Ввод исходных данных и вывод  результатов вычисления интеграла  выполняется в отдельном для  каждого метода вычислений окне. 

           В пояснительной записке приводится также анализ точности вычислений определенного  интеграла использованными методами.

 

    1. Постановка  задачи
 

        Ставится  задача составить программу вычисления интеграла вида 

      I=  (1) 

      где a и b – нижний и верхний пределы интегрирования, f(x) – непрерывная интегральная функция на отрезке [a, b]. Такой определённый интеграл можно трактовать как площадь фигуры (рисунок 1), ограниченной ординатами a и b, осью абсцисс x и графиком подынтегральной функции f(x). 

      Рисунок 1. К вычислению определенного интеграла 

        Обыкновенный  определённый интеграл, у которого известна его первообразная F(x), вычисляется по формуле Ньютона-Лейбница 

      I=F(b)-F(a)   (2) 

        Численное интегрирование применяется, если нахождение F(x) сложно или невозможно. Оно заключается в интерполяции f(x) на отрезке [a, b] подходящим полиномом, для которого известна первообразная F(x). Обычно отрезок [a, b] разбивается на N частей, к каждой применяется соответствующая простая формула. 

        Таким образом, программа должна обеспечивать возможность:

    • быструю смену подынтегральной функции f(x) путем замены аналитического выражения ее правой части в подпрограмме – функции;
    • выбором пользователем численного метода вычисления интеграла;
    • ввода с клавиатуры значений пределов интегрирования a и b и количества интегралов разбиения n;
    • вывода результатов вычисления на дисплей в удобном для восприятия виде с отображением названия выбранного численного метода, значений пределов интегрирования и принятого числа интегралов разбиения;
    • программа после загрузки должна выводить на дисплей исходное окно-заставку, в которой отображаются общие сведения о статусе программы и ее авторах;
    • после выполнения указанной в строке подсказки процедуры перехода должно выводиться вертикальное меню с пунктами: «Справка», «Метод Симпсона», «Метод трапеций» и «Выход»;
    • при выборе в меню пункта «Справка» должна выводится краткая выводиться краткая справка о назначении программы и порядке работы с ней;
    • после выбора в меню варианта численного метода должно открываться отдельное окно, в котором будут выводиться запросы программы о значениях пределов интегрирования, числе интегралов разбиения и в этом же окне после ввода исходных значений будет выводиться результат вычисления интеграла выбранным методом;
    • при выборе пункта меню «Выход» программы должна завершать работу.
 

 

    1. Математическая  формулировка задачи
 

        Метод Симпсона.

        Подынтегральную функцию f(x) заменим интерполяционным полиномом второй степени P2(x) – параболой, проходящей через узлы x0, x1, x2 (рис 2), тогда 

      (3) 

        где R – погрешность вычисления интеграла.

           
         
f(x)        
  P2(x)    
         
           
         
         
  x0 x1 x2   x
 

      Рисунок 2. Метод Симпсона 

        Для записи полинома P2(x) воспользуемся интерполяционной формулой Ньютона для трех узлов 

      P2(x)=f0+f01(x-x0)+f012(x-x0)(x-x1),     (4) 

      где 

      ,

      - разделенные разности; h – расстояние между узлами.

            Введем  новую переменную z=x-x0, тогда x=z+x0 и полиномом (4) принимает вид 

      P2(z)=f0+(f01-f012h)z+f012z2    (5) 

            Теперь  вычислим интеграл от полинома (5) 

          (6) 

            Последнее соотношение называют квадратурной формулой Симпсона, или формулой парабол где

      f0=f(x)   (7)

       – значение подынтегральной функции при текущем значении x; 

        (8) 

        (9) 

            Метод трапеций.

        Подынтегральную функцию заменим на участке [xi, xi+h] полиномом первой степени P1(x). Такая аппроксимация неоднозначна. Одним из возможных способов является проведение прямой через значения функции на границах интервала интегрирования (рис. 3). В этом случае приближенное значение интеграла определяется площадью трапеции 

      .

           
         
f(x)        
        f(xi+h)  
         
           
  f(xi)      
         
  xi   xi+h   x
 

      Рисунок 3. Метод трапеций

 

    1. Алгоритмизация  задачи
 

        В соответствии с постановленной в разделе 2 задачей целесообразно реализовать алгоритм, использующий обращение к соответствующим подпрограммам из головной программы.

        Алгоритм  работы головной программы следующий:

    1. Скрыть курсор с использованием подпрограммы – процедуры скрытия курсора и вывести в специальном окне заставку программы, содержащую сведения о назначении программы, исполнителе и руководителе курсовой работы, а также подсказку для пользователя о последующих действиях, с использованием подпрограммы – процедуры заставки.
    2. Запустить подпрограмму-процедуру вертикального меню при нажатии любой клавиши с использованием подпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора.
    3. Запустить подпрограмму-процедуру справки и вывести в специальном окне справочные сведения о работе с программой при выборе пункта меню «Справка» с использованием подпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора, а также строки-подсказки о возврате в меню.
    4. Запустить подпрограмму-процедуру вычисления интеграла методом Симпсона при выборе пункта меню «Метод Симпсона» с использованием подпрограмм-процедур построения окна, вывода рамки окна и выключения курсора, а также строки-подсказки о возврате в меню.
    5. Запустить подпрограмму-процедуру вычисления интеграла методом трапеций при выборе пункта меню «Метод трапеций» с использованием подпрограмм-процедур построения окна, вывода рамки и включения курсора, а также строки-подсказки о возврате в меню.
    6. Завершить работу программы при выборе пункта меню «Выход».
 

           Алгоритм  вычисления интеграла методом Симпсона в подпрограмме-процедуре включает следующие шаги:

    1. Создать окно для ввода исходных данных и вывода результатов вычисления по методу Симпсона.
    2. Восстановить отображение курсора нормального размера соответствующей подпрограммой-процедурой.
    3. Ввести нижний a и верхний b пределы интегрирования как границы отрезка интегрирования и количество n интервалов его разбиения.
    4. Вывести в окне запрос о правильности ввода a, b и n.
    5. Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти к вычислениям, при нажатии любой клавиши перейти к пункту 3 алгоритма.
    6. Вычислить значение шага по h формуле h=(b-a)/n.
    7. Присвоить первоначальному значению интеграла s нуль и начальному значению аргумента x0 значение a.
    8. Организовать цикл по i от 1 до n.
    9. Вычислить по формулам (7) – (9) значения f0, f1 и f2.
    10. Вычислить значение s=s+ f0+4 f1+ f2.
    11. Вычислить новое значение x=x+h.
    12. Закончить цикл по i.
    13. Вычислить конечное значение интеграла s=s*h/6.
    14. Вывести результаты вычислений в том же окне.
    15. Вывести в окне запрос о продолжении вычислений с новыми исходными данными.
    16. Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти в окно с меню, при нажатии любой другой клавиши прейти в окно с заставкой программы.
 

        Алгоритм  вычисления интеграла методом трапеций в подпрограмме-процедуре включает:

    1. Создать окно для ввода исходных данных и вывода результатов вычисления по методу трапеции.
    2. Восстановить отображение курсора нормального размера соответствующей подпрограммой-процедурой.
    3. Ввести нижний a и верхний b пределы интегрирования как границы отрезка интегрирования и количество n интервалов его разбиения.
    4. Вывести в окне запрос о правильности ввода a, b и n.
    5. Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти к вычислениям, при нажатии любой клавиши перейти к пункту 3 алгоритма.
    6. Вычислить значение шага h по формуле h=(b-a)/n.
    7. Присвоить первоначальному значению интеграла s нуль и начальному значению аргумента x0 значение a.
    8. Организовать цикл по i от 1 до n.
    9. Вычислить значения f0 и f1
    10. Вычислить значение s=s+ f0+f1.
    11. Вычислить новое значение x=x+h.
    12. Закончить цикл по i.
    13. Вычислить конечное значение интеграла s=s*h/2.
    14. Вывести результаты вычислений в том же окне.
    15. Вывести в окне запрос о продолжении вычислений с новыми исходными данными.
    16. Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти в окно с меню, при нажатии любой другой клавиши прейти в окно с заставкой программы.
 

 

    1. Идентификаторы  программы
 

        Для указания соответствия обозначений переменных в формулах математической формулировки и их идентификаторов в программе сведем их в таблицу 1: 

      Обозначение параметров Смысл параметра
      В формулах В программе
      А a Левая граница  отрезка интегрирования (нижний предел интегрирования)
      В b Правая граница  отрезка интегрирования (верхний  предел интегрирования)
      N n Число интервалов разбиения отрезка интегрирования
      H h Длина интервала  разбиения
      x x Аргумент подынтегральной  функции
      dx h1 – метод Симпсона

      h2 – метод трапеций

      Приращение  аргумента x
      I S Значение интеграла
 
 

 

    1. Блок-схемы

    Блок-схема  алгоритма головной программы.

 

Блок-схема  алгоритма подпрограммы-процедуры  Simpson.

 

Блок-схема  алгоритма подпрограммы-процедуры  Trapeciya.

 

Блок-схема  алгоритма подпрограммы-процедуры  Okno.

 

Блок-схема  алгоритма подпрограммы-процедуры  Ramka.

 

Блок-схема  алгоритма подпрограммы-процедуры  Spravka.

 

Блок-схема  алгоритма подпрограммы-процедуры  Emenu. 
 
 
 
 
 
 
 
 
 
 
 

Блок-схема  алгоритма подпрограммы-процедуры  Exitfrom. 
 
 

 

    1. Текст исходной программы
 

      program Kursovoi_integeral;

      Uses crt,dos;

      Label 11,12,m1;

            Type

                  mas=Array[1..4] of String[50];

                  Const

                  menu:mas=('Spravka',

                       'Metod Simpsona',

                   'Metod trapecii',

                   'Vixod'); 

      var

      i,s,pos: Integer;

      c,kod,k10:Char;

      pass: String;

      ch: char; 

      function f(x:real): real;

      begin

      f:=exp(sqr(x))

      end;

      {____________________} 

      {-----------Cursorcursor init-----------}

      Procedure CursorSize(Size: word);

      var Regs: Registers;

      Begin

      With Regs do

      Begin AH:=$01;

            CH:=Hi(size);

            Cl:=Lo(Size);

            intr($10,Regs);

            end;

      end;

      {-----------Cursor init------------------} 
       

      {-----------Cursor OFF-------------------}

      procedure HiddeCursor;

      begin

      CursorSize($2000);

      end;

      {-----------Cursor OFF-------------------} 
       

      {-----------Cursor ON--------------------}

      Procedure NormCursor;

      begin

      CursorSize($0607);

      end;

      {-----------Cursor ON--------------------} 

       

      {-----------Create of Frame--------------}

      procedure ramka(x1,y1,x2,y2: byte);

      const

      a=#201;

      b=#205;

      c=#187;

      d=#186;

      e=#188;

      f=#200;

      Begin

      Textcolor(14);

      Textbackground(0);

      Clrscr;

      gotoxy(x1,y1);

      write(a);

      for i:=x1+1 to x2-1 do write(b);

      write(c);

      for i:=y1+1 to y2-1 do

      Begin

      gotoxy(x1,i);

      write(d);

      gotoxy(x2,i);

      write(d);

      End;

      Gotoxy(x1,y2);

      write(f);

      for i:=x1+1 to x2-1 do write(b);

      write(e);

      End; 
       

      Procedure Okno(x1,y1,x2,y2,Fcolor,Tcolor:byte);

      Begin

      Clrscr;

      TextMode(3);

      HiddeCursor;

      Ramka(x1,y1,x2,y2);

      Window(x1+1,y1+1,x2-1,y2-1);

      textbackground(Fcolor);

      textcolor(Tcolor);

      Clrscr;

      Gotoxy(1,1);

      End; 
       

      Procedure Zastavka;

      Begin

      Okno(1,1,79,23,5,14);

      gotoxy(3,1);

      writeln(' ');

      writeln('                 Ministerstvo obrazovaniya Respubliki Belarus');

      writeln('                Belorusskii nacionalnji texnicheskii universitet');

      gotoxy(1,6);

      writeln('                       Programma vichisleniya integrala');

      writeln;

      writeln;

      writeln;

      writeln;

      writeln('                              Kursovaya rabota');

      writeln('                         po discipline informatika ');

      gotoxy(1,15);

      writeln('Ispolnitel                                                   Semenova M. V.');

      writeln('                                                             gr. 102528');

      writeln('Rukovoditel                                                  Rinkevich V. P.');

      writeln;

      writeln;

      writeln('                                 Minsk 2010');

      window(0, 0, 80, 25);

      gotoxy(40,23);

      Textcolor(13);

      gotoxy(1,79);

      writeln('Dlay prodolzheniya nazhmite lubyu klavishy...');

      repeat until keypressed;

      while keypressed do ch:=readkey;

      clrscr;

      End; 
       

      Procedure Spravka;

      var

      ch: char;

      Begin

      Okno(1, 1, 79, 23, 5, 14);

      Writeln('==================================>Spravka<==================================');

      Writeln('     Dannaya programma pozvolyaet vichislyat integral');

      Writeln('I=exp(sqrt(x))dx metodom Simpsona i metodom trapecii dlya zadannix');

      Writeln('znachenii predelov integrirovaniya a - niznii i b - verxnii.');

      Writeln('     Posle perexoda v menu vibirite klavishami upravleniya kursora');

      writeln('neobxodimii punkt.');

      Writeln('     Pri vibore metoda Simpsona ili metoda trapecii vvedite po zaprosy');

      Writeln('programmi celochislennie znacheniya predelov integrirovaniya i chislo');

      Writeln('intervalov integrirovaniya.');

      Writeln('     Dlya integrala s drugoi podintegralnoi funkciei sleduet');

      Writeln('zapisat ee v pravoi chaste virazeniya dlya vichisleniya znacheniya funkcii');

      Writeln('v podprogramme-funkcii f v razdele obyavlenii golovnoi programmi.');

      Window(2,2,79,24);

      Textcolor(13);

      gotoxy(5,20);

      write('          Dlya vozvrata v menu nazhmite lubyu klavishy...');

      ch:=readkey;

      End; 
       

      Procedure Emenu;

      Begin

      clrscr;

      Okno(15,9,55,17,5,7);

      For i:=1 to 4 do

      begin

      Gotoxy(15,i+1);

         if i=pos then Textbackground(8) else Textbackground(5);

         write(Menu[i]);

      end;

      End;

             procedure Exitfrom;

             Begin

             writeln;

             gotoxy(50,26);

      Writeln('Dlya prodolzeniya vichisleniya nazmite - Y, dlya vixoda - N');

      ch:=readkey;

      if ch =#121 then Emenu else Zastavka;

      End; 

      Procedure Simpson;

      label m1;

      Var

      i,n : byte;

      a,b,h,h1,s,x : real;

      ch: char;

      Begin

      Okno(1, 1, 79, 23, 5, 14);

      NormCursor;

      Writeln('==================>Vichislenie integrala metodom Simpsona<==================');

      Writeln;

      Writeln;

      m1:

      Writeln('          Vvedite predelu integrirovaniya a i b');

      Write('               Niznii pridel a=');

      read(a);

      Write('               Verxnii pridel b=');

      read(b);

      Write('          Vvedite chislo intervalov integrirovaniya N=');

      read(n);

      Begin

      writeln;

      Writeln('          Znacheniya vvedeny pravilno(Y/N)?');

      ch:= readkey;

      If ch=#110 then

      begin

      writeln;

      Writeln('          Dannie vvedeni neverno. Povtoryaem vvod');

      writeln;

      writeln;

      goto m1;

      end;

      h:=(b-a)/n;

      h1:=h/2;

Программа численного интегрирования