Министерство образования Российской Федерации

Пояснительная записка к курсовой работе

 

Тема: Вычисление несобственных интегралов методом Гаусса

 

СОДЕРЖАНИЕ

 

Введение                                                                                               2

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

2      Метод решения                                                                               4

3      Алгоритм                                                                                         7

4      Исходный код                                                                               11

5      Тест программы                                                                            21

6      Руководство пользователя                                                                22

Заключение                                                                                        24

Список литературы                                                                            25


ВВЕДЕНИЕ

 

 

 

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

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

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


1 ПОСТАНОВКА ЗАДАЧИ

 

 

Пусть задана функция f(x). Интеграл  называется собственным, если:

1)    промежуток интегрирования [a, b] конечен;

2)    подынтегральная функция f(x) непрерывна на [a, b].

В противном случае интеграл называется несобственным.

Требуется написать программу на языке Pascal которая должна реализовать следующие функции.

1. Ввод значений пределов интегрирования;

2. Вычисление несобственного интеграла методом Гаусса.


2 МЕТОД РЕШЕНИЯ

 

 

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

 

Рассмотрим сначала приближенное вычисление несобственного интеграла

                                                                  (1)

с бесконечным промежутком интегрирования, где функция f(x) непрерывна при .

Интеграл (1) называется сходящимся, если существует конечный предел

                                                           (2)

и по определению полагают:

                                            (3)

Если предел (2) не существует, то интеграл (1) называется расходящимся, и такой интеграл считается лишенным смысла.

Чтобы вычислить сходящийся несобственный интеграл (1) с заданной точностью ε, представим его в виде:

                                    (4)

В силу сходимости интеграла число b можно выбирать сколь угодно большим, чтобы имело место неравенство:

                                                                     (5)

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

Предположим теперь, что промежуток интегрирования [a, b] конечен и подынтегральная функция имеет конечное число точек разрыва на [a, b]. Рассмотрим случай, когда на [a, b] имеется единственная точка разрыва с функции f(x), причем второго рода.

Если точка с есть внутренняя точка отрезка [a, b], то по определению полагают:

,                  (6)

и в случае существования этого предела интеграл называют сходящимся, в противном случае – расходящимся.

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

Таким образом, вычисление несобственного интеграла сводится к вычислению собственного интеграла.

 

2.2. Квадратурная формула Гаусса

 

Рассмотрим теперь использование квадратурной формулы Гаусса для вычисления общего интеграла

Делая замену переменной

,

получим:

Применяя квадратурную формулу Гаусса будем иметь:

,

где

ti – нули полинома Лежандра Pn(t), т.е.

Pn(t) = 0.

 

 

 


3 АЛГОРИТМ ПРОГРАММЫ

 

 

 

 

 

Процедура "Выбор функции" InputF

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



4 ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ.

 

 

Program nesobst_int;

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

методом Гаусса}

 

uses graph,crt;

type maskoef = array[1..10] of real;

var Rezult,i,n,reg     :integer;

    RezFunc,porp1,porp2:integer;

    ax,bx              :real;

    integral           :real;

    fout               :text;

    Ti,Ai,Ci,xi,yi     :maskoef;

    koefp1,koefp2      :maskoef;

 

function mnogo(p:integer; x:real; koef:maskoef):real;

var s  :real;

    i  :integer;

begin

  s:=koef[1];

  for i:=2 to p+1 do

    s:=s*x+koef[i];

  mnogo:=s;

end;

 

function mnexp(p:integer; x:real; koef,koef1:maskoef):real;

var s  :real;

    i  :integer;

begin

  s:=0;

  for i:=1 to p do

    s:=s+koef[i]*exp(koef1[i]*x);

  mnexp:=s;

end;

 

function f1(x: real): real;

var   s1,s2   :real;

      i,j     :integer;

begin

  case rezfunc of

    1:begin

        s1:=mnogo(porp1,x,koefp1);

        s2:=mnogo(porp2,x,koefp2);

        f1:=s1/s2;

      end;

    2:begin

        s1:=mnexp(porp1,x,koefp1,koefp2);

        f1:=s1;

      end;

    3:begin

        s1:=mnogo(porp1,x,koefp1);

        s2:=mnogo(porp2,x,koefp2);

        f1:=sqrt(s1/s2);

      end;

    4:begin

        s1:=mnexp(porp1,x,koefp1,koefp2);

        f1:=sqrt(s1);

      end;

    end;

end;

 

{function f1(x: real):real ;

begin

  f1:=exp(-x);

  f1:=1/sqrt(x*(1-x));

  f1:=1/sqrt(1-2*x);

end;}

 

Procedure Frame(X1,Y1,X2,Y2:integer);

{X1,Y1,X2,Y2 - координаты левого верхнего и правого нижнего угла рамки}

Const

     {Для черчения двойной линии}

     A=#186; B=#187; C=#188; D=#200; E=#201; F=#205;

     {Для черчения одинарной линии

     A=#179; B=#191; C=#217; D=#192; E=#218; F=#196;}

Var I,J : Integer;

Begin

  GotoXY(X1,Y1);

  Write(E);

  For I:=(X1+1) To (X2-1) Do Write(F);

  Write(B);

  For I:=(Y1+1) To (Y2-1) Do

    Begin

      GotoXY(X1,I); Write(A);

      GotoXY(X2,I); Write(A);

    End;

  GotoXY(X1,Y2); Write(D);

  For I:=(X1+1) To (X2-1) Do Write(F);

    Write(C);

End;

 

function MenuInt(var Rez:integer):integer;

begin

  clrscr;

  GoToXY(20,5);

  Writeln('1. - Выбор функции');

  GotoXY(20,7);

  Writeln('2. - Ввод пределов интегрирования');

  GotoXY(20,9);

  Writeln('3. - Вычисление интеграла');

  GotoXY(30,11);

  Write('Выберите режим. 0 - Выход ');

  Readln(Reg);

  rez:=reg;

end;

 

function VibFunc(var Rez:integer):integer;

begin

  clrscr;

  GoToXY(20,5);

  Writeln('Выбор функции');

  GotoXY(0,7);

  writeln('     1 - (a1*x^n+b1*x^(n-1)+..+q1*x+c1)/(a2*x^m+b2*x^(m-1)+..+q2*x+c2)');

  writeln('     2 - a1*e^b1*x+a2*e^b2*x+..+an*e^bn*x');

  writeln('     3 - sqrt((a1*x^n+b1*x^(n-1)+..+q1*x+c1)/(a2*x^m+b2*x^(m-1)+..+q2*x+c2))');

  writeln('     4 - sqrt(a1*e^b1*x+a2*e^b2*x+..+an*e^bn*x)');

  GotoXY(20,12);

  Write('Выберите функцию. 0 - Выход ');

  Readln(Reg);

  rez:=reg;

end;

 

Procedure InputF;

begin

  ClrScr;

  GotoXY(40-Length('Ввод функции') div 2,8);

  Writeln('Ввод функции');

  GotoXY(25,12);

  case rezfunc of

    1:begin

        Write('Задайте порядок полинома числителя');

        readln(porp1);

        GotoXY(25,14);

        writeln('Вводите коэффициенты полинома, начиная со старшего');

        for i:=1 to porp1+1 do

          begin

            GotoXY(1+(i-1)*6,15);

            read(koefp1[i]);

          end;

        Write('Задайте порядок полинома знаменателя');

        readln(porp2);

        GotoXY(25,14);

        writeln('Вводите коэффициенты полинома, начиная со старшего');

        for i:=1 to porp2+1 do

          begin

            GotoXY(1+(i-1)*6,15);

            read(koefp2[i]);

          end;

        Readkey;

      end;

    2:begin

        Write('Задайте число экспонент в выражении');

        readln(porp1);

        GotoXY(25,14);

        writeln('Вводите коэффициенты a и степени b ');

        for i:=1 to porp1 do

          begin

            GotoXY(1+(i-1)*6,15);

            read(koefp1[i],koefp2[i]);

          end;

        Readkey;

      end;

    3:begin

        Write('Задайте порядок полинома числителя');

        readln(porp1);

        GotoXY(25,14);

        writeln('Вводите коэффициенты полинома, начиная со старшего');

        for i:=1 to porp1+1 do

          begin

            GotoXY(1+(i-1)*6,15);

            read(koefp1[i]);

          end;

        Write('Задайте порядок полинома знаменателя');

        readln(porp2);

        GotoXY(25,14);

        writeln('Вводите коэффициенты полинома, начиная со старшего');

        for i:=1 to porp2+1 do

          begin

            GotoXY(1+(i-1)*6,15);

            read(koefp2[i]);

          end;

        Readkey;

      end;

    4:begin

        Write('Задайте число экспонент в выражении');

        readln(porp1);

        GotoXY(25,14);

        writeln('Вводите коэффициенты a и степени b ');

        for i:=1 to porp1 do

          begin

            GotoXY(1+(i-1)*6,15);

            read(koefp1[i],koefp2[i]);

          end;

        Readkey;

      end;

    end;

end;

 

Procedure StartInit;

begin

  Ti[1]:=-0.96028986;

  Ti[2]:=-0.79666648;

  Ti[3]:=-0.52553242;

  Ti[4]:=-0.18343464;

  Ti[5]:= 0.18343464;

  Ti[6]:= 0.52553242;

  Ti[7]:= 0.79666648;

  Ti[8]:= 0.96028986;

  Ai[1]:= 0.10122854;

  Ai[2]:= 0.22238104;

  Ai[3]:= 0.31370664;

  Ai[4]:= 0.36268378;

  Ai[5]:= Ai[4];

  Ai[6]:= Ai[3];

  Ai[7]:= Ai[2];

  Ai[8]:= Ai[1];

  n:=8;

end;

 

Procedure limitint;

begin

  clrscr;

  GoToXY(20,1);

  Writeln('Ввод пределов интегрирования');

  GoToXY(20,3);

  Write('Введите пределы интегрирования по x (a,b) через пробел ');

  readln(ax,bx);

end;

 

Procedure SchetInt;

begin

  integral:=0;

  for i:=1 to n do

    begin

      Ci[i]:=(bx-ax)/2*Ai[i];

      Xi[i]:=(bx+ax)/2+(bx-ax)/2*Ti[i];

      Yi[i]:=f1(Xi[i]);

      Integral:=Integral+Yi[i]*Ci[i];

    end;

  writeln('Интеграл равен ',integral:10:6);

  writeln('Для продолжения нажмите любую клавишу');

  readkey;

end;

procedure Vizit;

begin

   gotoXY(22,12);

   writeln('   Программу выполнил студент ЭФ.');

   gotoXY(22,13);

   writeln('     гр. Э-65 Якубовский В.Е.');

   gotoXY(22,14);

   write('           Барнаул 2007  ');

 

end;

 

{основной модуль}

begin

  TextBackground(3);

  TextColor(1);

  clrscr;

  TextBackground(5);

  TextColor(2);

  frame(20,10,60,16);

  TextBackground(3);

  TextColor(1);

  Vizit;

  readkey;

  rezult:=1;

  StartInit;

  repeat

    MenuInt(Rezult);

    Case Rezult of

    1:begin

        VibFunc(RezFunc);

        InputF;

      end;

    2: Limitint;

    3: SchetInt;

    end;

  until rezult=0;

 

end.


5 ТЕСТ ПРОГРАММЫ

 

 

 

В качестве теста возьмем пример из [3]. На странице 602 рассматривается пример нахождения несобственного интеграла

Тестовый расчет с использованием разработанной программы дает те же результаты. I = 1,398717.

 

В качестве другого контрольного примера выбран пример [3, 604]

Тестовый расчет дает результат 2,797435.

 

Как пример вычисления несобственного интеграла рассмотрим [6, 622]

 

Вычисленное значение равно I=1,498377

 

Пример вычисления несобственного интеграла с бесконечным пределом:

Вычисленное значение I=0.999994


6 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

 

 

 

           Назначение программы

 

Программа предназначена для вычисления собственных и несобственных интегралов методом Гаусса.

 

           Условия выполнения программы

 

Для выполнения программы требуется персональный компьютер следующей комплектации или выше:

процессор 286;

оперативная память 1 Мб;

место на жестком диске 1 Мб;

монитор 14'';

клавиатура, мышь.

Компилятор Borland Pascal.

Программа не накладывает каких-либо специальных требований на видеокарту, поэтому достаточно стандартной видеокарты, установленной в компьютере.

 

           Выполнение программы

 

Для запуска программы необходимо с помощью программы «Проводник» или используя кнопку «Мой компьютер» войти в папку, где она установлена и запустить на выполнение файл nesobst.exe. После этого на экране появится окно:

 

В режиме 1 выполняется выбор вида интегрируемой функции.

В режиме 2 выполняется ввод пределов интегрирования.

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

Для выхода из программы требуется нажать 0 и Enter.

 

6.4 Сообщения оператору

 

В процессе работы могут появляться следующие сообщения:

Введите пределы интегрирования по х (а, b) через пробел:

Необходимо ввести нижний и верхний пределы интегрирования несобственного интеграла. Для бесконечных пределов вводится конечное значение.

Для продолжения нажмите любую клавишу:

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

 


ЗАКЛЮЧЕНИЕ

 

 

 

В данной работе была предпринята попытка создания программы вычисления несобственного интеграла методом Гаусса. Для реализации был выбран язык программирования Pascal, так как он является объектно-ориентированным языком программирования высокого уровня и позволяет использовать ресурсы операционной системы.

В целом, работа соответствует постановке задачи. Программа позволяет задать вид функции, ввести пределы интегрирования, вычислить значения собственного и несобственного интеграла, просмотреть его на экране.

К недостаткам алгоритма можно отнести следующие:

ограниченное количество интегрируемых функций;

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

 

 


СПИСОК ЛИТЕРАТУРЫ

 

 

 

1.    ГОСТ 19.505-79. Единая система программной документации. Руководство оператора. Требования к содержанию и оформлению [Текст]. - Введ. 1980-01-01. - М. : Изд-во стандартов, 1979. - 16 с. : ил.; 29 см.

2.    ГОСТ 19.701-90. Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения [Текст]. - Введ. 1992-01-01. - М. : Изд-во стандартов,  1990. – 27 с. : ил.; 29 см.

3.    Демидович П.Д. Основы вычислительной математики [Текст]. / Демидович П.Д., Марон И.А. - М.: Наука, 1966. - 664 с.: ил.; 25 см – Библиогр.: с. 658. -Предм. указ.: с.659-664.-75000 экз. ISBN 5-8459-0315-7.

4.    Турбо Паскаль 7.0 [Текст]. / Рютген Т. и др. – К.: Торгово-издательское бюро BHV, 1996. – 448 с.: ил. : 25 см – Библиогр. с. 445-446. -6000 экз. ISBN 5-7733-0008-7.