Приближенное вычисление интеграла

Автор работы: Пользователь скрыл имя, 24 Января 2011 в 21:19, реферат

Описание работы

Паскаль – гибкий и развитый в отношении типов данных язык. Привлекательны его рекурсивные возможности, а также поддержка технологии объектно-ориентированного программирования.

Изучение программирования на языке Паскаль может дать хороший старт в огромный и увлекательный мир программирования. Обучение языку программирования проходит намного более эффективно с изучением примеров.

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

Содержание работы

Введение 2

1. Различные методы вычисления определенных интегралов 3

1.1. Метод Симпсона для интегрирования функций F(x) по

заданному промежутку и его реализация на языке Pascal 4

1.2. Метод Симпсона для интегрирования функции от двух

переменных F(x,y) по прямоугольной двумерной области и его

реализация на языке Pascal 5

1.3. Метод Ромберга и его реализация на языке Pascal 7

1.4. Метод Гаусса и его реализация на языке Pascal 10

Заключение 16

Литература

Файлы: 1 файл

Приближенное вычисление интеграла.doc

— 163.50 Кб (Скачать файл)

    Метод вычислений нулей полинома заключается в том, чтобы поделить интервал [0,1] на маленькие подынтервалы и проверить каждый из них на изменение знака полинома. Если изменение знака имеет место, то однократное применение метода секущих позволяет достаточно хорошо определить положение нуля. Для уточнения этого значения применяется метод Ньютона. Для обработки интервала [-1,0] учитывается симметрия.

    Листинг 1.7. Процедура compute_gauss_coeffs модуля integral

    procedure compute_gauss_coeffs(deg:word);

         const

               eps=6.0e-20;

    var

         i,index:word;

         P0k, P0k_1,D0k, P1k,P1k_1, D1k,

         x0,x1,y,z,dx,x,u:real;

    procedure legendre_poly(n:word; x:real; var Pk,Pk_1,Dk:real);

    var

          Pk_2,Dk_1,Dk_2:real;

          i,j,k:word;

    begin

            If n=0 then

    Begin

             Pk:=1.0;

             Dk:=0.0;

    end

         else

    begin

            Pk_1:=1.0;

            Pk:=x;

            Dk_1:=0.0;

            Dk:=1.0;

            i:==3;

            j:=1;

            for k:=2 to n do

    begin

                  Pk_2:=Pk_1;

                  Pk_1:=Pk;

                  Dk_2:=Dk_1;

                  Dk_1:=Dk;

                  Pk:=(i*x*Pk_1-j*Pk_2)/k;

                  Dk:=(i*(Pk_1+x*Dk_1)-j*Dk_2)/k;

    Inc(I,2);

    Inc(j);

                         end;

                end

    end;{legendre_poly}

    begin{computr_gauss_coeffs}

             index:=(deg+1) div 2;

             dx:=1.0/(10.0*deg);

             x0:=0.0;

             x1:=x0+dx;

                if Odd(deg) then

    begin

             zero[index]:=0.0;

             legendre_poly(deg,x0,P0k, P0k_1,D0k);

             weight[index]:=2.0/(P0k_1*D0k*deg);

    end;

               for i:=0 to 10*deg-1 do

    begin

              x0:=x1;

              x1:=x1+dx;

              legendre_poly(deg,x0,P0k_1,D0k);

              legendre_poly(deg,x1,P1k,P1k_1,D1k);

              if P0k*P1k<=0.0 then

    begin

              x:=x0-P0k*dx/(P1k-P0k);

              legendre_poly(deg,x,P0k,P0k_1,D0k);

              u:=P0k/D0k;

              y:=x-u;

              while Abs(x-y)>=eps do

    begin

             if keyPressed then begin

             writeln(‘>=eps loop:’,x:10:10,’ ‘, y:10:10,’ ‘,Abs(x-y):10);

        readln;

    end;

           x:=y;

           legendre_poly(deg,x,P0k,P0k_1,D0k);

           u:=P0k/D0k;

           y:=x-u;

    end;

          inc(index);

          legendre_poly(deg,y,P0k,P0k_1,D0k);

          zero[index]:=y;

          weight[index]:=2.0/(P0k_1*D0k*deg);

          if index=deg then

                     Break;

    end;

    end;

          For i:=1 to deg div 2 do

    begin

             Zero[i]:=zero[deg-i+1];

             Weight[i]:=weight[deg-i+1];

    end;

    end;{compute_gauss_coeffs} 

    В функции gauss (листинг 1.8.) запрограммирован один гауссовский шаг на заданном интервале. Конечно, серьезная прикладная программа будет делить интервал на меньшие подынтервалы, применять эту процедуру к каждому из них адаптивным способом.

    Листинг1.8. Функция gauss модуля integral

    Function gauss(F:real_fun;x0,x1:real;deg:word):real;

    var

        Index:word;

        a,b,sum:real;

    begin

        a:=0.5*(x1-x0);

        b:=0.5*(x1+x0);

         sum:=0.0;

         for index:=1 to deg do begin

          sum:=sum+F(a*zero[index]+b)*weight[index];

                  if KeyPressed then

                                Halt;

    end;

          gauss:=a*sum;

    end;

    end. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Заключение 

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

    Литература 

  1. Немнюгин  С.А.  Turbo Pascal, 2 - издание – С-П.: Питер, 2003-544 с.
  2. Большой энциклопедический словарь: под редакцией Ю.В. Прохорова – М.: Большая Российская энциклопедия, 2000. – 845 с.

Информация о работе Приближенное вычисление интеграла