Зная , из линейной теперь системы первых (4.2) легко найти коэффициенты . Определитель этой системы есть определитель Вандермонда.
Формулу , в которой - нули полинома Лежандра , а определяют из (3.3), называют квадратурной формулой Гаусса.
Таким образом, алгоритм решения нашей задачи будет таким:
Ввод данных – пределы интегрирования, количество узлов, точность и подынтегральная функция
Подпрограмма вычисления интеграла с заданной точностью, которая использует подпрограмму вычисления функции десятиточечным методом
Подпрограмма графического отображения результатов вычислений по данному методу.
В основной программе необходимо предусмотреть ввод необходимых данных и реализацию контрольно примера, а также удобное управление элементами программы и команду выхода.
Подпрограммы реализованы в виде функций. Существует главная функция, которая вызывается из основной программы и которая выполняет основные действия (подсчет значения интеграла и вывод на экран результата, вывод графика на экран), вызывая другие подпрограммы.
Главная функция вызывает функцию подсчета интеграла с заданной точностью вычислений, которая в свою очередь на каждом шаге вызывает функцию подсчета значения функции.
Программный комплекс имеет интуитивно понятный интерфейс. Вначале программы на экран выводится меню, где можно выбрать несколько дальнейших действий, а именно: решение контрольного примера, произвольный ввод данных или выход из программы.
После выбора нужного пункта в режиме диалога необходимо ввести соответствующие данные, результат появится на экране, а затем после нажатия клавиши ввода появится графическое отображение метода.
{$N+}
{ Вычисление интегpала десятиточечным методом Гаусса }
uses crt,graph;
var aaa,bbb,kkk: real;
{константы десятиточечного метода Гаусса}
const
g10c1=0.9739065285/6. 2012983932;
g10c2=0.8650633667/6. 2012983932;
g10c3=0.6794095683/6. 2012983932;
g10c4=0.4333953941/6. 2012983932;
g10c5=0.1488743390/6. 2012983932;
g10x1=0.0666713443/6. 2012983932;
g10x2=0.1494513492/6. 2012983932;
g10x3=0.2190863625/6. 2012983932;
g10x4=0.2692667193/6. 2012983932;
g10x5=0.2955242247/6. 2012983932;
function F(x: real): real; {интегрируемая функция}
begin
F: = kkk*(exp(-aaa*x) - exp(-bbb*x));
end;
function gauss_calc(a,b: real): real; {сам десятиточечный метод Гаусса}
var n,m,s,s1,s2,s3,s4,s5: real;
begin
m: =(b+a) /2; n: =(b-a) /2;
s1: =g10c1*(f(m+n*g10x1) +f(m-n*g10x1));
s2: =g10c2*(f(m+n*g10x2) +f(m-n*g10x2));
s3: =g10c3*(f(m+n*g10x3) +f(m-n*g10x3));
s4: =g10c4*(f(m+n*g10x4) +f(m-n*g10x4));
s5: =g10c5*(f(m+n*g10x5) +f(m-n*g10x5));
s: =s1+s2+s3+s4+s5;
gauss_calc: =s*(b-a);
end;
{рекурсивная ф-ция подсчета с заданной точностью}
{ gc - ранее посчитаный интеграл на интервале (a,b) }
function gauss(a,b,eps,gc: real): real;
var t,ga,gb: real;
begin
t: =(a+b) /2; {разбиваем интервал на две половинки}
ga: =gauss_calc(a,t); {в каждой половинке считаем интеграл}
gb: =gauss_calc(t,b);
if abs(ga+gb-gc) >eps then {проверяем точность вычислений}
begin
ga: =gauss(a,t,eps/2,ga); {рекурсия для первой половинки}
gb: =gauss(t,b,eps/2,gb); {рекурсия для второй половинки}
end; {при этом точность повышаем, чтобы }
{при сложении ошибка не накапливалась}
gauss: =ga+gb; {интеграл = сумме интегралов половинок}
end;
procedureinputnum(prm: string; varnum: real; lb,ub: real); {процедура ввода данных}
var q: boolean;
begin
repeat
write('Введите ',prm,' '); readln(num);
q: =(lb>=num) or (num>ub);
if q then writeln('Число должно быть от ', lb: 0: 0,' до ',ub: 0: 0);
until not q;
end;
procedure titul; {Вывод титульного листа}
var f: text; s: string;
i: integer;
begin
clrscr;
assign(f,'f42. txt');
reset(f);
while not eof(f) do begin
readln(f,s);
while length(s) <79 do s: =' '+s+' ';
writeln(s);
end;
close(f);
end;
function main_menu: integer; {Главное меню}
var i: integer;
begin
Writeln('==========================================================');
Writeln('Что будем делать? ');
Writeln('----------------------------------------------------------');
Writeln('0 - выход');
Writeln('1 - решать тестовый пример a=1,5 b=6 k=10 eps = 0.0001');
Writeln('2 - решать пример с произвольными a, b, k, eps');
Writeln('----------------------------------------------------------');
Write('Выбор >>> '); readln(i);
Writeln('==========================================================');
main_menu: =i;
end;
procedure outputgraph(a,b,a1,b1: real; n: integer); {Вывод графика}
var i,j,j1,k: integer; t,y1,y2,x1,x2,x,y: double; s: string;
begin
clearviewport;
x1: =a1-1; x2: =b1+1;
if x1<0.5 then x1: =-0.5;
y2: =f(ln(bbb/aaa) /(bbb-aaa)) *1.2;
y1: =-y2;
{Линия y=0}
setcolor(15);
y: =0;
j: =trunc(480*(y-y2) /(y1-y2));
line(0,j,639,j);
{Линии x=a,x=b}
setcolor(5);
j: =trunc(480*(-y2) /(y1-y2));
i: =trunc(640*(a-x1) /(x2-x1));
j1: =trunc(480*(f(a) - y2) /(y1-y2));
line(i,j, i,j1);
i: =trunc(640*(b-x1) /(x2-x1));
j: =trunc(480*(-y2) /(y1-y2));
j1: =trunc(480*(f(b) - y2) /(y1-y2));
line(i,j, i,j1);
{Сам график}
setcolor(14);
setlinestyle(0,0,3);
t: =(b-a) /n;
k: =0;
j1: =trunc(480*(-y2) /(y1-y2));
for i: =0 to 640 do begin
x: =(x2-x1) *i/640+x1;
y: =f(x);
j: =trunc(480*(y-y2) /(y1-y2));
if j>479 then j: =479;
if j<0 then j: =0;
setcolor(14);
setlinestyle(0,0,3);
if i=0 then moveto(i,j) else lineto(i,j);
setcolor(8);
if (x>t*k+a) then begin
k: =k+1;
setcolor(15);
end;
setlinestyle(0,0,1);
if (x>=a) and (x<=b) then line(i,j, i,j1);
end;
setcolor(15);
y: =f(b);
i: =trunc(640*(b-x1) /(x2-x1));
j: =trunc(480*(y-y2) /(y1-y2));
line(i,j, i,j1);
setlinestyle(0,0,1);
setcolor(12);
{Подписи}
setcolor(13);
str(a: 6: 6,s);
s: ='a='+s;
i: =trunc(640*(a-x1) /(x2-x1));
outtextxy(i,j1+2,s);
str(b: 6: 6,s);
s: ='b='+s;
i: =trunc(640*(b-x1) /(x2-x1));
outtextxy(i-10,j1+2,s);
setcolor(15);
y: =0;
j: =trunc(480*(y-y2) /(y1-y2));
outtextxy(5,j+3,'y=0');
{Ждем... }
readkey;
end;
procedure equateit(a,b: real; eps: real); {процедура подсчета значения интеграла и вывода графика на экран}
var integral: real; i,j: integer;
begin
Integral: =gauss(a,b,eps,gauss_calc(a,b));
writeln('Интеграл = ', integral: 0: 6);
readkey;
i: =vga; j: =vgahi;
initgraph(i,j,'. . \bgi');
outputgraph(a,(b+a) /3,a,b,1);
outputgraph((b+a) /3,2*(b+a) /3,a,b,1);
outputgraph(2*(b+a) /3,b,a,b,1);
closegraph;
end;
var sel: integer;
eps: real;
begin
titul;
Writeln('==========================================================');
readkey;
repeat
clrscr;
sel: =main_menu;
case sel of
1: begin
aaa: =1.5; bbb: =6; kkk: =10;
eps: =1e-4;
equateit(aaa,bbb,eps);
end;
2: begin
inputnum('a',aaa,0,1000);
inputnum('b',bbb,-1000,1000);
inputnum('k',kkk,-1000,1000);
inputnum('точность',eps,0.000000001,1);
equateit(aaa,bbb,eps);
end;
end;
until sel=0;
end.
В данной работе описана и реализована с помощью блок-схем и языка программирования TurboPascal задача нахождения численного решения интеграла методом Гаусса. Программное средство содержит средства вычисления интеграла по исходным данным, а также выбирая произвольный интервал и шаг интегрирования с заданной точностью. При этом на экран выводится график, отражающий процесс интегрирования заданной функции по шагам.
Представленный метод и реализованный алгоритм достаточно прост и эффективен для решения большого класса задач.
1. Малыхина М.П. Программирование на языке высокого уровня TurboPascal. – Спб.: БХВ-Петербург, 2006, 544 с.
2. Немнюгин С.А. TurboPascal. – Спб.: Питер, 2002. – 496 с.
3. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: Нолидж, 1997. – 616 с.
4. Гусева А.И. Учимся программировать: PASCAL 7.0. Задачи и методы их решения. – М.: Диалог-МИФИ, 1997. – 256 с.
5. Дьяконов В.П. Справочник по алгоритмам и программам на языке бейсик для персональных ЭВМ: Справочник. - М.: Наука. Гл. ред. физ. -мат. лит., 1987. – 240 с.
6. Сапаров В.Е., Максимов Н.А. Системы стандартов в электросвязи и радиоэлектронике: Учебное пособие для вузов. – М. - Радио и связь, 1985. – 248 с.
7. ГОСТ 19.701-90 (ИСО 5807-85). “Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения”/ Cб. ЕСПД. – М.: Изд-во стандартов, 1996. – 157 с.
8. Бахвалов Н., Жидков Н., Кобельков Г. Численные методы. М.: Лаборатория базовых знаний, 2001.632 с.
9. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений / Пер. с англ. М.: Мир, 1980.177с.
10. Самарский А.А., Гулин А.В. Численные методы: Учебное пособие для ВУЗов. М.: Наука, 1989.432с.