Пояснительная
записка к
курсовой
работе
Тема:
Вычисление
несобственных
интегралов
методом
Гаусса
СОДЕРЖАНИЕ
Введение 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 с. : ил.;
2. ГОСТ 19.701-90. Единая
система
программной
документации.
Схемы алгоритмов,
программ,
данных и
систем.
Обозначения условные
и правила
выполнения
[Текст]. - Введ.
1992-01-01. - М. : Изд-во
стандартов, 1990. – 27 с. :
ил.;
3. Демидович
П.Д.
Основы
вычислительной
математики
[Текст]. / Демидович
П.Д., Марон И.А. - М.:
Наука, 1966. - 664 с.: ил.;
4. Турбо
Паскаль 7.0
[Текст]. / Рютген
Т. и др. – К.:
Торгово-издательское
бюро BHV, 1996. – 448 с.: ил. :