Смекни!
smekni.com

Численное интегрирование методом Гаусса (стр. 3 из 3)

Зная , из линейной теперь системы первых (4.2) легко найти коэффициенты . Определитель этой системы есть определитель Вандермонда.

Формулу , в которой - нули полинома Лежандра , а определяют из (3.3), называют квадратурной формулой Гаусса.

Таким образом, алгоритм решения нашей задачи будет таким:

Ввод данных – пределы интегрирования, количество узлов, точность и подынтегральная функция

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

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

3.2 Разработка программы по схеме алгоритма

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

Подпрограммы реализованы в виде функций. Существует главная функция, которая вызывается из основной программы и которая выполняет основные действия (подсчет значения интеграла и вывод на экран результата, вывод графика на экран), вызывая другие подпрограммы.

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

3.3 Разработка инструкции пользования программой

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

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

3.4 Распечатка программы

{$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,'. . &bsol;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.

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

Заключение

В данной работе описана и реализована с помощью блок-схем и языка программирования 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с.