Паскаль. Основы программирования

       

Приближенное вычисление интегралов с помощью рядов


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

Так, исходя из разложения

,

найдем значение интеграла 

 для всех действительных значений x.

Вначале разложим в ряд функцию

:

Интегрируем почленно этот ряд, получим:

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

Чтобы составить программу, найдем рекуррентную формулу для вычисления суммы ряда.

 

отсюда получаем:



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

Программа

Program Problem1;

      uses WinCrt;

      var

        n                  : longint;

        u,  I,  x, eps : real;

{----------------------------------------------------------------------------------------}

{ Функция вычисления порядка - кол-во знаков после запятой }

      Function

t(eps : real) : integer;

            var

               k : integer;

            begin

               k := -1;

               repeat

                   eps := eps*10;

                   k := k + 1

               until eps > 1;

               t := k

            end;

{----------------------------------------------------------------------------------------}

      begin

          write('Введите значение аргумента x '); readln(x);

          write('Введите точность вычисления '); readln(eps);

          u := x; n := 0; I := 0;

          repeat

             I := I + u;

             n := n + 1;

             u := -(u*x*x*(2*n - 1))/(2*n*(2*n + 1))

          until abs(u) <  eps;

          writeln('Значение интеграла равно ', I:6:t(eps))

      end.

В теории вероятностей нам придется иметь дело с функцией - интегралом вероятностей

Надо лишь заметить, что значение этой функции при

равно 1, а при
 равно -1.

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


{ Рекуррентная функция вычисления интеграла вероятностей }

Function FF(x : real) : real;

      var

         n     : integer;

         u, I : real;

      begin

        if x >= 5

          then FF := 1

          else if x <= -5

                   then FF := -1

                   else

                     begin

                       u := x; n := 0; I := 0;

                       repeat

                           I := I + u;

                           n := n + 1;

                           u := -u*(x*x*(2*n - 1)/(2*n*(2*n + 1)))

                       until abs(u) < 0.00001;

                       FF := 2*I/sqrt(2*Pi)

                     end

      end;

Использование ее в программе приводится ниже.

Program Problem2;

      uses WinCrt;

      var

        x, eps : real;

{----------------------------------------------------------------------------------------}

      Function

t(eps : real) : integer;

            var

               k : integer;

            begin

               k := -1;

               repeat

                   eps := eps*10;

                   k := k + 1

               until eps > 1;

               t := k

            end;

{----------------------------------------------------------------------------------------}

{ Рекуррентная функция вычисления интеграла вероятностей }

      Function FF(x, eps : real) : real;

            var

               n     : integer;

               u, I : real;

            begin

                if x >= 5

                  then FF := 1

                  else if x <= -5

                           then FF := -1

                           else

                              begin

                                 u := x; n := 0; I := 0;

                                 repeat

                                     I := I + u;  n := n + 1;

                                     u := -u*(x*x*(2*n - 1)/(2*n*(2*n + 1)))

                                 until



abs(u) < eps;

                                 FF := 2*I/sqrt(2*Pi)

                              end

             end;

{-----------------------------------------------------------------------------------------}

      begin

          write('Введите значение аргумента x '); readln(x);

          write('Введите точность вычисления '); readln(eps);

          writeln('Значение интеграла вероятностей равно ', FF(x, eps):6:t(eps))

      end.

Аналогично предыдущему примеру вычислим интеграл
.

Для этого надо вспомнить ряд, в который разлагается функция sinx

 

при всех


Разложим в ряд
:



Интегрируя его, получим:

 

Найдем рекуррентную формулу для составления программы.



 Отсюда находим, что


Оценить точность можно по абсолютной величине n-го члена, т. е. по величине


Составим процедуру вычисления этого интеграла.

     Procedure

Integral(x, eps : real; var I : real);

           var

              n : integer;

              u : real;

           begin

              u := x; n := 1; I := 0;

              repeat

                 I := I + u;

                 n := n + 1;

                 u := -(u*x*x*(2*n - 3))/((2*n - 2)*sqr(2*n - 1))

              until abs(u) <  eps

           end;

Программа

Program Problem2;

      uses WinCrt;

      var

         I,  x, eps : real;

{----------------------------------------------------------------------------------------}

     Procedure

Integral(x, eps : real; var I : real);

           var

              n : integer;

              u : real;

           begin

              u := x; n := 1; I := 0;

              repeat

                 I := I + u;

                 n := n + 1;

                 u := -(u*x*x*(2*n - 3))/((2*n - 2)*sqr(2*n - 1))

              until abs(u) <  eps

           end;

{----------------------------------------------------------------------------------------}

{ Функция вычисления порядка - кол-во знаков после запятой }

      Function

t(eps : real) : integer;

            var



               k : integer;

            begin

               k := -1;

               repeat

                   eps := eps*10;

                   k := k + 1

               until eps > 1;

               t := k

            end;

{----------------------------------------------------------------------------------------}

      begin

          write('Введите значение аргумента x '); readln(x);

          write('Введите точность вычисления '); readln(eps);

          Integral(x, eps, I);

          writeln('Значение интеграла равно ', I:6:t(eps))

      end.

Задание 6

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


 

5.1. Полный эллиптический интеграл 2-го рода

Полный эллиптический интеграл 1-го рода


Полный эллиптический интеграл 2-го рода


Поставим задачу разложить эти интегралы по степеням модуля k (0 < k < 1). Для этого, положим в формуле интеграла 1-го рода

  (1)

 получим:


Этот ряд сходится равномерно относительно
, ибо мажорируется при всех значениях
 сходящимся рядом



следовательно, допустимо почленное интегрирование, получим:



Аналогично, исходя из формулы

, (2)

найдем



Ряды (1) и (2) являются частными случаями биномиального ряда при
 и


Найдем рекуррентную формулу для вычисления суммы



 
отсюда получаем


Процедура

      Procedure Elliptic2(k, eps : real; var

Ek : real);

           var

              n : integer;

              u : real;

           begin

              u := k*k/4; n := 1; Ek := 0;

              repeat

                 Ek := Ek + u;

                 n  := n + 1;

                 u  := (u*k*k*(2*n - 1)*(2*n - 3))/(4*n*n);

              until abs(u) <  eps;

              Ek := Pi*(1 - Ek)/2

           end;

Программа

Program Problem3;

      uses WinCrt;

      var

         Ek,  k, eps : real;

{----------------------------------------------------------------------------------------}

      Procedure

Elliptic2(k, eps : real; var Ek : real);

           var

              n : integer;



              u : real;

           begin

              u := k*k/4; n := 1; Ek := 0;

              repeat

                 Ek := Ek + u;

                 n  := n + 1;

                 u  := (u*k*k*(2*n - 1)*(2*n - 3))/(4*n*n);

              until abs(u) <  eps;

              Ek := Pi*(1 - Ek)/2

           end;

{----------------------------------------------------------------------------------------}

{ Функция вычисления порядка - кол-во знаков после запятой }

      Function

t(eps : real) : integer;

            var

               k : integer;

            begin

               k := -1;

               repeat

                   eps := eps*10;

                   k := k + 1

               until eps > 1;

               t := k

            end;

{----------------------------------------------------------------------------------------}

      begin

          write('Введите значение аргумента 0 < k < 1 '); readln(k);

          write('Введите точность вычисления '); readln(eps);

          Elliptic2(k, eps, Ek);

          writeln('Значение интеграла равно ', Ek:6:t(eps));

          writeln('С точностью до ', eps:1:t(eps))

      end.

Задание 7

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

 


Содержание раздела