Вычисление интеграла методом Ньютона-Котеса (теория и программа на Паскале)
Министерство Высшего Образования РФ.
Московский Институт Электронной Техники
(Технический Университет)
Лицей №1557
КУРСОВАЯ РАБОТА
“Вычисление интеграла методом
Ньютона-Котеса”
Написал: Коноплев А.А.
Проверил: доцент Колдаев В.Д.
Москва, 2001г.
Введение..................................................................................... 3
Теоретическая часть...................................................................4
Алгоритм работы........................................................................8
Код программы.........................................................................17
Модуль K_graph............................................................17
Модуль Graphic.............................................................34
Модуль K_unit...............................................................38
Основная программа....................................................40
Тестовые испытания.................................................................42
Полезные советы по работе с программой.............................42
Окна ввода и вывода программы.............................................
Вывод..........................................................................................43
Список литературы...................................................................44
Математика - одна из самых древних наук. Труды многих ученых вошли в мировой фонд и стали основой современных алгебры и геометрии. В конце XVII в., когда развитие науки шло быстрыми темпами, появились понятия дифференцирование, а вслед за ним и интегрирование. Многие правила нахождения неопределенного интеграла в то время не были известны, поэтому ученые пытались найти другие, обходные пути поиска значений. Первым методом явился метод Ньютона – поиск интеграла через график функции, т.е. нахождение площади под графиком, методом прямоугольников, в последствии усовершенствованный в метод трапеций. Позже был придуман параболический метод или метод Симпсона. Однако часть ученых терзал вопрос: А можно ли объединить все эти методы в один??
Ответ на него был дан одновременно двумя математиками Ньютоном и Котесом. Они вывели общую формулу, названную в их честь. Однако их метод был частично забыт. В этой работе будут изложены основные положения теории, рассмотрены различные примеры, приведены таблицы, полученные при различных погрешностях, и конечно описана работа и код программы, рассчитывающей интеграл методом Ньютона-Котеса.
Пусть некоторая функция f(x) задана в уздах интерполяции:
(i=1,2,3…,n) на отрезке [а,b] таблицей значений:
X0=a |
X1 |
X2 |
… |
XN=b |
Y0=f(x0) |
Y1=f(x1) |
Y2=f(x2) |
… |
YN=f(xN) |
Требуется найти значение интеграла .
Для начала составим интерполяционный многочлен Лагранджа:
Для равноотстоящих узлов интерполяционный многочлен имеет вид:
где q=(x-x0)/h – шаг интерполяции, заменим подынтегральную функцию f(x) интерполяционным многочленом Лагранжа:
Поменяем знак суммирования и интеграл и вынесем за знак интеграла постоянные элементы:
Так как dp=dx/h, то, заменив пределы интегрирования, имеем:
Для равноотстоящих узлов интерполяции на отрезке [a,b] величина шаг определяется как h=(a-b)/n. Представив это выражение для h в формулу (4) и вынося (b-a) за знак суммы, получим:
Положим, что
где i=0,1,2…,n; Числа Hi называют коэффициентами Ньютона-Котеса. Эти коэффиценты не зависят от вида f(x), а являются функцией только по n. Поэтому их можно вычислить заранее. Окончательная формула выглядит так:
Теперь рассмотрим несколько примеров.
Пример 1.
Вычислить с помощью метода Ньютона-Котаса: , при n=7.
Вычисление.
1) Определим шаг: h=(7-0)/7=1.
2)Найдем значения y:
x0=0 |
y0=1 |
x1=1 |
y1=0.5 |
x2=2 |
y2=0.2 |
x3=3 |
y3=0.1 |
x4=4 |
y4=0.0588 |
x5=5 |
y5=0.0384 |
x6=6 |
y6=0.0270 |
x7=7 |
y7=0.02 |
3) Находим коэффициенты Ньютона-Котеса:
H2=H7=0.0435, H2=H6=0.2040, H3=H5=0.0760 ,H3=H4=0.1730
Подставим значения в формулу и получим:
П
ри
подсчете с помощью формулы Ньютона-Лейбница
получим:
Пример 2.
Вычислить при помощи метода Ньютона-Котеса
, взяв n=5;
Вычисление:
Определим шаг h=(8-4)/5=0.8
Найдем значения y:
x0=0 |
y0=-2.61 |
x1=4.8 |
y1=0.42 |
x2=5.6 |
y2=4.34 |
x3=6.4 |
y3=6.35 |
x4=7.2 |
y4=4.38 |
x5=8 |
y5=-0.16 |
Находим коэффициенты Ньютона –Котеса:
H0=H5=0.065972 ;H2=H4=0.260417 ;H3=H3=0.173611 ;
4)Подставим значения в формулу и получим:
Рассмотрим частные случаи формулы Ньйтона-Котеса.
Пусть n=1 тогда
H0=H2=0.5 и конечная формула примет вид:
Тем самым в качестве частного случая нашей формулы мы получили формулу трапеций.
Взяв n=3, мы получим
. Частный случай формулы Ньютона –Котеса – формула Симпсона
Теперь произведем анализ алгоритма и рассмотрим основной принцип работы программы.
Для вычисления интеграла сначала находятся коэффициенты Ньютона-Котеса. Их нахождение осуществляется в процедуре hkoef.
Основной проблемой вычисления коэффициентов является интеграл от произведения множителей. Для его расчета необходимо:
А) посчитать коэффициенты при раскрытии скобок при q
(процедура mnogoclen)
Б) домножить их на 1/n , где n –степень при q (процедура koef)
В) подставить вместо q значение n (функция integral)
Далее вычисляем факториалы (функция faktorial) и перемножаем полученные выражения (функция mainint). Для увеличения быстроты работы вводится вычисление половины от количества узлов интерполяции и последующей подстановкой их вместо неподсчитанных.
Процедура koef(w: массив;n:целый;var e:массив);
Процедура hkoef(n:целый;var h:массив);
Процедура mnogochlen(n,i:целые;var c:массив );
Процедура funktia(n:целая;a,b:вещест.;var y:массив;c:вещест.;f:строка);
Функция facktorial(n:целый):двойной;
Функция integral(w:массив;n:целый):двойной;
Функция mainint(n:целый;a,b:вещест.;y:массив):двойной;
Основная программа
Программа состоит из 8 файлов:
K_main.exe – файл загрузки основной программы
K_unit.tpu – модуль вычислительных процедур и функций
K_graph.tpu – модуль графических процедур
Graphic.tpu – модуль процедур для построения графика
Egavga.bgi – файл графической инициализации
Sans.chr, litt.chr – файлы шрифтов
Keyrus.com (не обязательно) – файл установки русского языка.
Для работы программы с русским интерфайсом желательно запускать ее в режиме DOS.
================================================
==========МОДУЛЬ GRAPH==========
================================================
{$N+}
unit k_graph;
interface
uses
crt,graph,k_unit,graphic;
procedure winwin1;
procedure proline(ea:word);
procedure winwwodab(ea:word);
procedure error1(ea:word);
procedure helpwin(ea:word);
procedure error(ea:word);
procedure newsctext(ea:word);
procedure newsc(ea:word);
procedure win1(ea:word);
procedure win2(ea:word;var k:word);
procedure wwodn(ea:word;var n:integer);
procedure wwodab(ea:word;var a,b:real);
procedure wwod1(ea:word;var y:array of double;var n:integer;var a,b:real);
procedure wwod2(ea:word;var ea1:word;var n:integer;var a,b:real;var st:string);
procedure win3(ea:word;n:integer;a,b:real;int:double;f:string;h:array of double;var k:word);
implementation
procedure proline(ea:word);
{Проседура полосы процесса}
var
i:integer;
f:string;
c:char;
begin
newsc(ea);
setcolor(15);
setfillstyle(1,7);
bar(160,150,460,260);
rectangle(165,155,455,255);
rectangle(167,157,453,253);
case (ea mod 2) of
0: outtextxy(180,170,' Идет работа .Ждите..');
1: outtextxy(180,170,' Working.Please wait..');
end;
setfillstyle(1,12);
setcolor(0);
rectangle(200,199,401,221);
for i:=1 to 9 do
line(200+i*20,200,200+i*20,220);
delay(20000);
for i:=1 to 100 do
begin
if ((i-1) mod 10)=0 then
line(200+((i-1) div 10)*20,200,200+((i-1) div 10)*20,220);
bar(round(200+2*(i-0.5)),200,200+2*i,220);
delay(1100);
setcolor(15);
setfillstyle(1,7);
bar(280,230,323,250);
str(i,f);
f:=f+'%';
outtextxy(290,235,f);
if (i mod 25) =0 then
bar(170,180,452,198);
if (ea mod 2)=0 then
case (i div 25) of
0:
outtextxy(170,190,'Подготовка ');
1:
outtextxy(170,190,'Расчет коеффициентов в многочлене');
2:
outtextxy(170,190,'Расчет коеффициентов Ньютона-Котеса');
3:
outtextxy(170,190,'Расчет интеграла');
end
else
case (i div 25) of
0:
outtextxy(170,190,'Prepearing');
1:
outtextxy(170,190,'Calculation of mnogochlen coeff.');
2:
outtextxy(170,190,'Calculation of Newton-Cotes coeff. ');
3:
outtextxy(170,190,'Calculation of integral');
end;
setfillstyle(1,12);
setcolor(0);
end;
end;
procedure winwwodn(ea:word);
{Окно ввода числа узлов интерполяции}
var
c:char;
f:string;
begin
helpwin(ea);
if (ea mod 2) =0 then
begin
outtextxy(360,140,' В этом окне необходимо ');
outtextxy(360,155,' ввести количество узлов ');
outtextxy(360,170,' интерполяции, от которого ');
outtextxy(360,185,' будет зависить точность ');
outtextxy(360,200,' вычисления интеграл и ');
outtextxy(360,215,' количество зн чений функции.');
outtextxy(360,240,' ВНИМАНИЕ : НАСТОЯТЕЛЬНО ');
outtextxy(360,250,' РЕКОМЕНДУЕТСЯ НЕ ВВОДИТЬ ');
outtextxy(360,260,' ЗНАЧЕНИЕ N БОЛЬШЕ 12 !! ');
end
else
begin
outtextxy(360,140,' In this window you have to ');
outtextxy(360,155,' put into the number. ');
outtextxy(360,170,' The accuracy of calculation ');
outtextxy(360,185,' and the number of function ');
outtextxy(360,200,' parameters will depend on ');
outtextxy(360,215,' this number. ');
outtextxy(360,240,' WARNING: IT IS HARDLY ');
outtextxy(360,250,' RECOMENDED NOT TO PUT IN ');
outtextxy(360,260,' NUMBER MORE THEN 12 !! ');
end;
setcolor(2);
setfillstyle(1,14);
bar(70,200,340,300);
rectangle(75,205,335,295);
rectangle(77,207,333,293);
if (ea mod 2) =0 then
begin
outtextxy(90,227,'Введите количество узлов(n):');
outtextxy(80,270,'ВНИМАНИЕ: При больших n возможна');
outtextxy(80,280,'некорректная работа компьютера!!');
end
else
begin
outtextxy(80,217,'Put in number of');
outtextxy(80,227,' interpolation units:');
outtextxy(80,270,'WARNING:if you use big number ');
outtextxy(80,280,'of units,PC wont work properly!');
end;
setfillstyle(1,0);
bar(190,240,230,255);
end;
procedure wwodn(ea:word;var n:integer);
{Процедура ввода узлов n}
var
ec,p:integer;
k,f:string;
x:integer;
c:char;
begin
newsc(ea);
winwwodn(ea);
repeat
repeat
winwwodn(ea);
gotoxy(25,16);
read(k);
val(k,p,ec);
if ec<>0 then
begin
error1(ea);
readln;
end;
until ec=0;
n:=p;
if n>12 then
begin
if keypressed then
c:=readkey;
c:='r';
setcolor(15);
setfillstyle(1,12);
bar(140,210,490,300);
rectangle(145,215,485,295);
rectangle(147,217,483,293);
if (ea mod 2) =0 then
begin
outtextxy(150,227,' Предупреждение!');
outtextxy(150,237,' Вы дейcтвительно хотите использовать');
outtextxy(150,250,' большое значение N ???');
end
else
begin
outtextxy(150,227,' Warning!! ');
outtextxy(150,237,' Do you realy want to use a big ');
outtextxy(150,250,' number interpolation units(N)??? ');
end;
sound(600);
delay(4000);
nosound;
setfillstyle(1,2);
bar(320,260,350,280);
setfillstyle(1,12);
bar(250,260,280,280);
repeat
if keypressed then
begin
c:=readkey;
if (c=#80) or (c=#72) or (c=#77) or (c=#75) then
x:=x+1;
setfillstyle(1,2);
if (x mod 2)=0 then
begin
bar(250,260,280,280);
setfillstyle(1,12);
bar(320,260,350,280);
end
else
begin
bar(320,260,350,280);
setfillstyle(1,12);
bar(250,260,280,280);
END;
end;
if (ea mod 2) =0 then
begin
outtextxy(255,267,'ДА');
outtextxy(325,267,'НЕТ');
end
else
begin
outtextxy(255,267,'YES');
outtextxy(325,267,'NO');
end;
until c=#13;
if abs(x mod 2)=1 then
begin
n:=0;
setcolor(15);
setfillstyle(1,2);
bar(160,200,460,280);
rectangle(165,205,455,275);
rectangle(167,207,453,273);
if (ea mod 2)=0 then
begin
outtextxy(180,227,'Для работы программы необходимо');
outtextxy(180,237,' заново ввести N.');
outtextxy(180,247,' Нажмите ENTER для продолжения.');
end
else
begin
outtextxy(180,227,' To continue you have to ');
outtextxy(180,237,' again put in N. ');
outtextxy(180,247,' Press ENTER to continue.');
end;
readln;
readln;
end;
end;
until n>0;
end;
procedure winwwodab(ea:word);
{Окно ввода приделов интегрирования}
var
f:string;
begin
helpwin(ea);
if (ea mod 2)=0 then
begin
outtextxy(360,140,' В этом окне необходимо');
outtextxy(360,155,' ввести сначала нижнее');
outtextxy(360,170,' значение интеграл и нажать');
outtextxy(360,185,' ENTER, а затем ввести');
outtextxy(360,200,' верхнее значение интеграла');
outtextxy(360,215,' и снова нажать ENTER.');
end
else
begin
outtextxy(360,140,' In this window you have to:');
outtextxy(360,155,'firstly, put in lower value ');
outtextxy(360,170,'of integral and press ENTER,');
outtextxy(360,185,'then put in higher value');
outtextxy(360,200,'of integral and press ENTER');
end;
setcolor(2);
setfillstyle(1,5);
bar(10,210,335,320);
rectangle(15,215,330,315);
rectangle(17,217,328,313);
settextstyle(0,0,0);
if (ea mod 2)=0 then
begin
outtextxy(20,230,' Введите нижнее значение');
outtextxy(20,244,' интеграл :');
outtextxy(20,262,' Введите верхнее значение');
outtextxy(20,272,'интеграл :');
end
else
begin
outtextxy(20,230,' Put in lower value of');
outtextxy(20,244,' integral:');
outtextxy(20,262,' Put in higher value of');
outtextxy(20,272,'integral:');
end;
end;
procedure wwodab(ea:word;var a,b:real);
{Процедура ввода приделов интегрирования}
var
f:string;
k:string;
ec:integer;
begin
newsc(ea);
winwwodab(ea);
readln;
repeat
winwwodab(ea);
gotoxy(16,16);
read(k);
val(k,a,ec);
if ec<>0 then
error1(ea);
until ec=0;
readln;
repeat
winwwodab(ea);
str(a:4:2,f);
outtextxy(120,244,f);
gotoxy(16,18);
read(k);
val(k,b,ec);
if ec<>0 then
error1(ea);
until ec=0;
end;
procedure helpwin(ea:word);
{основа окна помощи}
begin
setfillstyle(1,3);
bar(350,100,590,380);
setcolor(0);
rectangle(353,103,587,377);
rectangle(355,105,585,375);
setcolor(14);
if (ea mod 2)=0 then
outtextxy(360,115,' ОКНО ПОМОЩИ')
else
outtextxy(360,115,' HELP WINDOW');
end;
procedure error1(ea:word);
begin
setcolor(15);
setfillstyle(1,12);
bar(140,210,490,280);
rectangle(145,215,485,275);
rectangle(147,217,483,273);
if (ea mod 2)=0 then
begin
outtextxy(150,227,' Ошибка! ');
outtextxy(150,237,' Вводимые параметр не число!! ');
outtextxy(150,250,' Проверьте значение и заново введите его.');
end
else
begin
outtextxy(150,227,' Error! ');
outtextxy(150,237,' The value you entered isn`t a quantity!!');
outtextxy(150,250,' Check it and put it in again. ');
end;
sound(600);
delay(4000);
nosound;
readln;
readln;
end;
procedure error(ea:word);
{Процедура ошибки}
begin
setcolor(15);
setfillstyle(1,12);
bar(140,210,490,260);
rectangle(145,215,485,255);
rectangle(147,217,483,253);
if (ea mod 2)=0 then
begin
outtextxy(150,227,' Ошибка!');
outtextxy(150,237,' Недостаток вводимых параметров!!');
end
else
begin
outtextxy(150,227,' Error!');
outtextxy(150,237,' Not all parameters are set!');
end;
sound(600);
delay(4000);
nosound;
readln;
end;
procedure newsctext(ea:word);
{Текст для процедуры newsc}
begin
if ea mod 2 =0 then
begin
settextstyle(0,0,1);
setcolor(15);
outtextxy(400,440,'Язык - Русский. ');
outtextxy(400,450,'Версия 1.0 Последнее издание');
outtextxy(400,460,'й Все права защищены.');
end
else
begin
settextstyle(0,0,1);
setcolor(15);
outtextxy(400,440,'Language - English.');
outtextxy(400,450,'Version 1.0 Final release.');
outtextxy(400,460,'й All rights reserved.');
end;
end;
procedure newsc(ea:word);
{Процедура обновления экрана}
begin
cleardevice;
setfillstyle(10,8);
floodfill(1,1,15);
setcolor(0);
setfillstyle(1,7);
bar(80,10,580,80);
rectangle(82,12,578,78);
rectangle(85,15,575,75);
settextstyle(0,0,2);
setcolor(10);
if ea mod 2 =0 then
begin
settextstyle(0,0,2);
outtextxy(90,20,' Вычисление интеграл ');
outtextxy(90,50,' методом Ньютона-Котеса.');
newsctext(ea);
end
else
begin
settextstyle(3,0,2);
outtextxy(90,20,' Calculeting of integral');
outtextxy(90,47,' using the Newton-Cotes method.');
newsctext(ea);
end;
settextstyle(0,0,1);
end;
procedure winwin1;
{Окно процедуры win1}
begin
setfillstyle(1,7);
bar(160,110,460,380);
setcolor(0);
rectangle(162,113,457,377);
rectangle(165,115,455,375);
end;
procedure win1(ea:word);
{Вводное окно}
begin
settextstyle(0,0,1);
setcolor(10);
if (ea mod 2)=0 then
begin
outtextxy(168,135,'Министерство Высшего образования РФ);
outtextxy(168,150,'Московский Государственный Институт');
outtextxy(168,160,' Электронной Техники ');
outtextxy(168,170,' (Технический лниверситет) ');
outtextxy(168,180,' Лицей №1557 ');
outtextxy(168,210,' КУРСОВАЯ РАБО'А ');
outtextxy(168,230,' «Вычисление интеграла ');
outtextxy(168,245,' метедом Ньютона-Котеса» ');
outtextxy(158,270,' Написал: Коноплев А.А. ');
outtextxy(158,285,' Руководитель: доцент Колдаев В.Д.');
end
else
begin
outtextxy(168,135,' Department of High Education ');
outtextxy(168,150,' Moscow State Institute of ');
outtextxy(168,160,' Electronic Technics ');
outtextxy(168,170,' (Technics University) ');
outtextxy(168,180,' Lyceum №1557 ');
outtextxy(168,210,' COURSE WORK ');
outtextxy(168,230,' «Calculation of integral ');
outtextxy(168,245,' by Newton-Cotes method» ');
outtextxy(158,270,' Author: Konoplev A.A. ');
outtextxy(158,285,' Supervisor:senior lecturer ');
outtextxy(158,300,' Koldaev V.D. ');
end;
end;
procedure win2(ea:word;var k:word);
{Окно выбора способа подсчета }
var
c:char;
x:integer;
f:string;
begin
setcolor(2);
setfillstyle(1,5);
bar(70,200,340,330);
rectangle(75,205,335,325);
rectangle(77,207,333,323);
settextstyle(0,0,0);
setfillstyle(1,15);
bar(80,250,330,270);
setfillstyle(1,5);
bar(80,285,330,305);
if ea mod 2 =0 then
begin
outtextxy(77,220,'Выбирете способ задания значений');
outtextxy(75,230,' функции. ');
outtextxy(70,255,' По таблице(в ручную)');
outtextxy(70,295,' По расчетам(автом т.)');
end
else
begin
outtextxy(77,220,' Choose a method of putting in');
outtextxy(75,230,' the values of function. ');
outtextxy(70,255,' By the table(by hand)');
outtextxy(70,295,' By calculations(automat.)');
end;
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,'В этом способе необходимо');
outtextxy(360,155,'самостоятельно вводить');
outtextxy(360,170,'значения функции.');
end
else
begin
outtextxy(360,140,'In this method you have');
outtextxy(360,155,'to put in values of ');
outtextxy(360,170,'function by yourself.');
end;
x:=0;
repeat
if keypressed then
begin
c:=readkey;
if (c=#80) or (c=#72) then
x:=x+1;
setfillstyle(1,15);
if (x mod 2)=0 then
begin
bar(80,250,330,270);
setfillstyle(1,5);
bar(80,285,330,305);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,'В этом способе необходимо');
outtextxy(360,155,'самостоятельно вводить');
outtextxy(360,170,'значения функции.');
end
else
begin
outtextxy(360,140,'In this method you have');
outtextxy(360,155,'to put in values of ');
outtextxy(360,170,'function by yourself.');
end;
end
else
begin
bar(80,285,330,305);
setfillstyle(1,5);
bar(80,250,330,270);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,'В этом способе компьютер');
outtextxy(360,155,'сам вычесляет значения');
outtextxy(360,170,'функции по вводимой функции.');
end
else
begin
outtextxy(360,140,'In this method PC will');
outtextxy(360,155,'automaticly count the value');
outtextxy(360,170,'of function by the function');
outtextxy(360,185,'you enter ');
end;
end;
setcolor(2);
if ea mod 2 =0 then
begin
outtextxy(70,255,' По таблице(в ручную)');
outtextxy(70,295,' По расчетам(автом т.)');
end
else
begin
outtextxy(70,255,' By the table(by hand)');
outtextxy(70,295,' By calculations(automat.)');
end;
end;
until c=#13;
k:=x mod 2;
end;
procedure wwod1(ea:word;var y:array of double;var n:integer;var a,b:real);
{Окно ручного ввода функции}
var
i,p:integer;
s,f:string;
p1:real;
c:char;
begin
wwodn(ea,n);
if n=0 then
wwodn(ea,n);
newsc(ea);
wwodab(ea,a,b);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,'В этом окне необходимо');
outtextxy(360,155,'постепенно вводить');
outtextxy(360,170,'значения функции.');
outtextxy(360,185,'после каждого ввода');
outtextxy(360,200,'определенного значения');
outtextxy(360,215,'нажмите ENTER.');
end
else
begin
outtextxy(360,140,'In this window you have');
outtextxy(360,155,'to gradually enter the');
outtextxy(360,170,'values of functions.');
outtextxy(360,185,'After each enter press');
outtextxy(360,200,'ENTER key.');
end;
setfillstyle(1,9);
bar(40,200,330,300);
rectangle(45,205,325,295);
rectangle(47,207,323,293);
if ea mod 2 =0 then
outtextxy(56,227,'Введите 0 -е значение финкции:')
else
outtextxy(56,227,' Enter 0 -th value of function:');
for i:=0 to n do
begin
setfillstyle(1,0);
bar(137,250,180,273);
gotoxy(19,17);
setfillstyle(1,9);
read(p1);
y[i]:=p1;
bar(120,227,134,240);
str(i+1,s);
outtextxy(120,227,s);
bar(310,220,320,250);
end;
end;
procedure wwod2(ea:word;var ea1:word;var n:integer;var a,b:real;var st:string);
{Окно 2 меню автомат. подсчета}
var
i:integer;
c,k:char;
x:longint;
f:string;
begin
repeat
x:=-600000;
if keypressed then
c:=readkey;
c:='t';
newsc(ea);
setfillstyle(1,15);
bar(70,120,342,330);
setcolor(12);
rectangle(75,125,337,325);
rectangle(77,127,335,323);
settextstyle(0,0,0);
setfillstyle(1,11);
bar(80,170,330,190);
if ea mod 2 =0 then
begin
outtextxy(80,130,'Меню ввода параметров нахождения');
outtextxy(80,140,' интеграла');
outtextxy(80,180,' Ввести количество узлов(n)');
outtextxy(80,210,' Ввести приделы интегрирования');
outtextxy(80,240,' Ввести функцию');
outtextxy(80,270,' Считать интеграл');
outtextxy(80,300,' Выход ');
end
else
begin
outtextxy(80,130,'Menu of entering the parameters');
outtextxy(80,140,' of integral');
outtextxy(80,180,' Put in the number of units ');
outtextxy(80,210,' Enter the bounds of integral');
outtextxy(80,240,' Enter function');
outtextxy(80,270,' Count integral');
outtextxy(80,300,' Exit ');
end;
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,' Нажмите Enter для');
outtextxy(360,155,' ввода количества узлов');
end
else
begin
outtextxy(360,140,' Press Enter to put');
outtextxy(360,155,' in the number of units');
end;
repeat
if keypressed then
begin
c:=readkey;
case c of
#80:
x:=x-1;
#72:
x:=x+1;
end;
setfillstyle(1,11);
case (abs(x) mod 5) of
0:
begin
bar(80,170,330,190);
setfillstyle(1,15);
bar(80,200,330,220);
bar(80,290,330,310);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,' Нажмите Enter для');
outtextxy(360,155,' ввода количества узлов');
end
else
begin
outtextxy(360,140,' Press Enter to put');
outtextxy(360,155,'in the number of units.');
end;
end;
1:
begin
bar(80,200,330,220);
setfillstyle(1,15);
bar(80,170,330,190);
bar(80,230,330,250);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,' Нажмите ENTER для ввода');
outtextxy(360,155,'приделов интегрирования.');
end
else
begin
outtextxy(360,140,' Press ENTER to put in');
outtextxy(360,155,'the bounds of integral.');
end;
end;
2:
begin
bar(80,230,330,250);
setfillstyle(1,15);
bar(80,200,330,220);
bar(80,260,330,280);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,' Нажмите ENTER для ввода');
outtextxy(360,155,'функции.');
end
else
begin
outtextxy(360,140,' Press ENTER to enter');
outtextxy(360,155,'function.');
end;
end;
3:
begin
bar(80,260,330,280);
setfillstyle(1,15);
bar(80,230,330,250);
bar(80,290,330,310);
helpwin(ea);
if ea mod 2 =0 then
begin
outtextxy(360,140,' Нажмите ENTER для начала');
outtextxy(360,155,'подсчета самого интеграла.');
end
else
begin
outtextxy(360,140,' Press ENTER to begin');
outtextxy(360,155,'integral calculations.');
end;
end;
4:
begin
bar(80,290,330,310);
setfillstyle(1,15);
bar(80,260,330,280);
bar(80,170,330,190);
helpwin(ea);
end;
end;
setcolor(12);
if ea mod 2 =0 then
begin
outtextxy(80,130,'Меню ввода параметров нахождения');
outtextxy(80,140,' интеграла');
outtextxy(80,180,' Ввести количество узлов(n)');
outtextxy(80,210,' Ввести приделы интегрирования');
outtextxy(80,240,' Ввести функцию');
outtextxy(80,270,' Считать интеграл');
outtextxy(80,300,' Выход ');
end
else
begin
outtextxy(80,130,'Menu of entering the parameters');
outtextxy(80,140,' of integral');
outtextxy(80,180,' Put in the number of units ');
outtextxy(80,210,' Enter the bounds of integral');
outtextxy(80,240,' Enter function');
outtextxy(80,270,' Count integral');
outtextxy(80,300,' Exit ');
end;
end;
until c=#13;
c:='t';
case (abs(x) mod 5) of
0:
begin
wwodn(ea,n);
end;
1:
wwodab(ea,a,b);
2:
begin
helpwin(ea);
setcolor(15);
setfillstyle(1,9);
bar(70,200,340,300);
rectangle(75,205,335,295);
rectangle(77,207,333,293);
if ea mod 2 =0 then
begin
outtextxy(86,227,'Введите функцию f(x):');
setcolor(14);
outtextxy(360,140,' В этом окне необходимо');
outtextxy(360,155,' ввести саму функцию.');
outtextxy(360,200,'Примечание: 1.данная программа ');
outtextxy(360,215,'распознает только ');
outtextxy(360,230,'элементарные функции.');
outtextxy(360,245,'(x,cos(x) и др.)');
outtextxy(360,260,’2.При неправильном вводе’);
outtextxy(360,275,’по умолчанию f(x)=x;’);
outtextxy(360,275,’3.Если после нажатия ENTER’);
outtextxy(360,275,’ничего не произошло, то
outtextxy(360,275,’занововведите функцию.’);
end
else
begin
outtextxy(86,227,'Enter function f(x):');
setcolor(14);
outtextxy(360,140,' In this window you have');
outtextxy(360,155,' to enter the function.');
outtextxy(360,200,'Note: This version of ');
outtextxy(360,215,'programm can indentify only ');
outtextxy(360,230,'simple functions, as');
outtextxy(360,245,'x,cos(x) and other.');
end;
setfillstyle(1,0);
bar(86,255,330,275);
readln;
gotoxy(13,17);
read(st);
writeln(st);
readln;
end;
3:if (n<=0)or(a=b)or(st='') then
error(ea);
4:
halt;
end;
until (n>0)and(a<>b)and(st<>'')and((abs(x) mod 5)=3);
end;
procedure win3(ea:word;n:integer;a,b:real;int:double;f:string;h:array of double;var k:word);
{Последнее окно просмотра результатов}
var
i:integer;
c:char;
x:longint;
p1,p:string;
y:array[0..16] of double;
begin
funktia(n,a,b,y,1,f);
f:='('+f+')'+'dx =';
repeat
x:=-600000;
newsc(ea);
setfillstyle(1,2);
bar(170,120,490,360);
setcolor(14);
rectangle(175,125,485,355);
rectangle(177,127,483,353);
settextstyle(0,0,0);
setfillstyle(1,1);
bar(180,170,480,190);
if ea mod 2 =0 then
begin
outtextxy(180,135,Функция распознана.Интеграл подсчитан.');
outtextxy(180,180,' Посмотреть значение интеграла');
outtextxy(180,210,'Посмотреть коэффициенты Ньютона-Котеса');
outtextxy(180,240,' Посмотреть значения функции');
outtextxy(180,270,' Посмотреть график' );
outtextxy(180,300,' Считать снова');
outtextxy(180,330,' Выход ');
end
else
begin
outtextxy(180,135,'Function Indentified.Integral counted.');
outtextxy(180,180,' View value of integral');
outtextxy(180,210,' View Newton-Cotes coefficients');
outtextxy(180,240,' Veiw values of function');
outtextxy(180,270,' View graphik ' );
outtextxy(180,300,' Count again');
outtextxy(180,330,' Exit ');
end;
repeat
if keypressed then
begin
c:=readkey;
case c of
#80:
x:=x-1;
#72:
x:=x+1;
end;
setfillstyle(1,1);
case (abs(x) mod 6) of
0:
begin
bar(180,170,480,190);
setfillstyle(1,2);
bar(180,200,480,220);
bar(180,320,480,340);
end;
1:
begin
bar(180,200,480,220);
setfillstyle(1,2);
bar(180,170,480,190);
bar(180,230,480,250);
end;
2:
begin
bar(180,230,480,250);
setfillstyle(1,2);
bar(180,200,480,220);
bar(180,260,480,280);
end;
3:
begin
bar(180,260,480,280);
setfillstyle(1,2);
bar(180,230,480,250);
bar(180,290,480,310);
end;
4:
begin
bar(180,290,480,310);
setfillstyle(1,2);
bar(180,260,480,280);
bar(180,320,480,340);
end;
5:
begin
bar(180,320,480,340);
setfillstyle(1,2);
bar(180,290,480,310);
bar(180,170,480,190);
end;
end;
if ea mod 2 =0 then
begin
outtextxy(180,135,'Функция распознана.Интеграл подсчитан.');
outtextxy(180,180,' Посмотреть значение интеграла');
outtextxy(180,210,'Посмотреть коэффициенты Ньютона-Котеса');
outtextxy(180,240,' Посмотреть значения функции');
outtextxy(180,270,' Посмотреть график ' );
outtextxy(180,300,' Считать снова');
outtextxy(180,330,' Выход ');
end
else
begin
outtextxy(180,135,'Function Indentified.Integral counted.');
outtextxy(180,180,' View value of integral');
outtextxy(180,210,' View Newton-Cotes coefficients');
outtextxy(180,240,' Veiw values of function');
outtextxy(180,270,' View graphik ' );
outtextxy(180,300,' Count again');
outtextxy(180,330,' Exit ');
end;
end;
until c=#13;
c:='t';
case (abs(x) mod 6) of
0:begin
setcolor(15);
setfillstyle(1,12);
bar(140,200,490,280);
rectangle(145,205,485,275);
rectangle(147,207,483,273);
settextstyle(2,0,1);
setusercharsize(1,1,5,1);
outtextxy(170,210,'S');
settextstyle(2,0,4);
str(a:3:3,p);
outtextxy(160,257,p);
str(b:3:3,p);
outtextxy(160,212,p);
settextstyle(3,0,2);
outtextxy(180,224,f);
p:='';
str(abs(int):7:3,p);
outtextxy(190+length(f)*12,224,p);
readln;
end;
1:
begin
newsc(ea);
setfillstyle(1,2);
bar(170,120,490,180+n*15);
setcolor(14);
rectangle(175,125,485,175+n*15);
rectangle(177,127,483,173+n*15);
if ea mod 2 =0 then
begin
outtextxy(180,130,'Коэффициенты Ньютона-Котеса:');
outtextxy(180,140+(n+1)*15,'Нажмите ENTER для продолжения');
end
else
begin
outtextxy(180,130,'Newton-Cotes coefficients:');
outtextxy(180,140+(n+1)*15,'Press ENTER to continue');
end;
hkoef(n,h);
for i:=0 to n do
begin
str(i,p);str(h[i]:2:4,p1);
p:='H'+p+' = '+p1;
outtextxy(180,140+i*15,p);
end;
readln;
end;
2:begin
newsc(ea);
setfillstyle(1,2);
bar(170,120,490,180+n*15);
setcolor(14);
rectangle(175,125,485,175+n*15);
rectangle(177,127,483,173+n*15);
if ea mod 2 =0 then
begin
outtextxy(180,130,'Значения функции:');
outtextxy(180,140+(n+1)*15,'Нажмите ENTER для продолжения');
end
else
begin
outtextxy(180,130,'Values of function:');
outtextxy(180,140+(n+1)*15,'Press ENTER to continue');
end;
for i:=0 to n do
begin
str(i,p);str(y[i]:2:4,p1);
p:='Y'+p+' = '+p1;
p1:='';
outtextxy(180,140+i*15,p);
str((a+i*(b-a)/n):2:4,p1);
str(i,p);
if ea mod 2 = 0 then
p:=',При '+'X'+p+' = '+p1
else
p:=',When '+'X'+p+' = '+p1;
outtextxy(285,140+i*15,p);
end;
readln;
end;
3:
graphik(ea,a,b,f);
5:
begin
closegraph;
halt;
end;
end;
until (abs(x) mod 6)=4;
k:=abs(x) mod 6;
end;
end.
================================================
========МОДУЛЬ GRAPHIC========
================================================
unit graphic;
interface
uses
k_unit,crt,graph;
procedure hwg(ea:word);
procedure graphik(ea:word;a,b:real;f1:string);
implementation
procedure hwg(ea:word);
{Процедура окна помощи при графике}
var
f:string;
begin
settextstyle(0,0,0);
setfillstyle(1,3);
bar(150,100,390,380);
setcolor(0);
rectangle(153,103,387,377);
rectangle(155,105,385,375);
setcolor(14);
if ea mod 2 =0 then
begin
outtextxy(160,115,' ОКНО ПОМОЩИ');
outtextxy(160,140,' Для работы с графиком');
outtextxy(160,155,' используйте клавиши:');
outtextxy(160,180,' PAGE UP-первоначальный');
outtextxy(160,195,' вид графика;');
outtextxy(160,210,' HOME-начальный масштаб;');
outtextxy(160,225,' INSERT-включить/выключеть');
outtextxy(160,240,' заливку области;');
outtextxy(160,255,' DELETE-включить/выключеть');
outtextxy(160,270,' сетку;');
outtextxy(160,285,' END-показать/убрать цифры');
outtextxy(160,300,' F1- Помощь;');
outtextxy(160,315,' Стрелки ВВЕРХ/ВНИЗ- ');
outtextxy(160,330,' увеличение/уменьшение');
outtextxy(160,345,' масштаб .');
outtextxy(160,360,'Для возрата нажмите ENTER.');
end
else
begin
outtextxy(160,115,' HELP WINDOW');
outtextxy(160,140,' For the work with graphic');
outtextxy(160,155,' use this keys:');
outtextxy(160,180,' PAGE UP-Primery form of');
outtextxy(160,195,' graphik;');
outtextxy(160,210,' HOME-Primery scale;');
outtextxy(160,225,' INSERT-Turn on/off inking');
outtextxy(160,240,' the field;');
outtextxy(160,255,' DELETE-Turn on/off the');
outtextxy(160,270,' net;');
outtextxy(160,285,' END-View/delete the figures');
outtextxy(160,300,' F1- Help;');
outtextxy(160,315,' Arrows UP/DOWN-Increase/ ');
outtextxy(160,330,' lower the scale;');
outtextxy(160,360,'Press ENTER to continue.');
end;
readln;
setcolor(15);
end;
procedure graphik(ea:word;a,b:real;f1:string);
{процедура построения графиков}
var
f,f2:string;
d:char;
i,v,r:integer;
x1,x2,n,p,x:integer;
c,k,k1:longint;
y:array[0..1] of double;
begin
x1:=-240;
x2:=240;
c:=24;
setcolor(15);
n:=0;v:=0;r:=0;
repeat
cleardevice;
settextstyle(0,0,0);
if ea mod 2 =0 then
begin
outtextxy(10,1,'Нажмите F1 для помощи');
str(c/24:2:2,f);
f:='Масштаб '+f+':1';
end
else
begin
outtextxy(10,1,'Press F1 for help');
str(c/24:2:2,f);
f:='Scale '+f+':1';
end;
outtextxy(200,1,f);
settextstyle(3,0,1);
outtextxy(307,10,'y');
outtextxy(574,235,'x');
outtextxy(310,240,'0');
setlinestyle(1,7,100);
line(70,240,580,240);
line(320,20,320,460);
line(320,20,315,25);
line(321,20,326,25);
line(580,239,575,244);
line(580,240,575,235);
line(70,239,580,239);
line(321,20,321,460);
for i:=-9 to 10 do
begin
if ((320+i*24)<561) and ((320+i*24)>71) then
line(320+i*24,240,320+i*24,242);
if ((240+i*24)<461)and(240+i*24>19) then
line(320,240+i*24,322,240+i*24);
end;
setcolor(15);
for x:= -240+round((240+x1)/10) to 240+round((240+x1)/10) do
begin
funktia(1,x-1,x,y,c,f1);
k:=round(240-(y[0])*c);
k1:=round(240-(y[1])*c);
if ((k<480)and(k>0)or(k1<480)and(k1>0)) then
line(319-round((240+x1)/10)+x,k,320-round((240+x1)/10)+x,k1);
end;
if (v mod 2)=0 then
begin
funktia(1,a,b,y,1,f1);
k:=round(240-(y[0])*c);
k1:=round(240-(y[1])*c);
line(320-round((240+x1)/10)+round(a*c),k,320-round((240+x1)/10)+round(a*c),240);
line(320-round((240+x1)/10)+round(b*c),k1,320-round((240+x1)/10)+round(b*c),240);
if 320-round((240+x1)/10)+a*c<80 then
begin
funktia(1,-240/c,240/c,y,1,f1);
k:=round(240-(y[0])*c);
line(80,k,80,240);
end;
if 320-round((240+x1)/10)+b*c>560 then
begin
funktia(1,(-240-round((240+x1)/10))/c,(240-round((240+x1)/10))/c,y,1,f1);
k1:=round(240-(y[1])*c);
line(560,k1,560,240);
end;
for x:= -240 to 240 do
begin
funktia(1,x-1,x,y,c,f1);
k1:=round(240-(y[1])*c);
if ((x/c)>a) and ((x/c)<b) and(k1<>0) then
begin
if (abs(240-k1)>2) then
begin
if k1<240 then
k1:=k1+1
else
k1:=k1-1;
if c>7 then
setfillstyle(6,3)
else
setfillstyle(1,3);
floodfill(320-round((240+x1)/10)+x,k1,15);
end;
end;
end;
end;
str(x1,f2);
outtextxy(1,450,f2);
if (n mod 2)=0 then
for i:=-9 to 10 do
begin
settextstyle(2,0,2);
setcolor(14);
if ((320+i*24)<561) and ((320+i*24)>71)and(i<>0) then
begin
str((i*24+round((240+x1)/10))/c:2:2,f);
p:=247;
outtextxy(310+i*24,p,f);
str(-i*24/c:2:2,f);
outtextxy(330,240+i*24,f);
end;
end;
for i:=-9 to 10 do
begin
setcolor(15);
if ((r mod 2)=1) and (i<>0) then
begin
if ((320+i*24)<561) and ((320+i*24)>71) then
line(320+i*24,20,320+i*24,460);
if ((240+i*24)<461)and(240+i*24>19) then
line(80,240+i*24,560,240+i*24);
end;
end;
setcolor(15);
d:=readkey;
case d of
#75:
begin
x1:=x1-30;
x2:=x2-30;
end;
#77:
begin
x1:=x1+30;
x2:=x2+30;
end;
#80:
if c>1 then
c:=c-1;
#72:
c:=c+1;
#71:
c:=24;
#79:
n:=n+1;
#83:
r:=r+1;
#82:
v:=v+1;
#73:
begin
c:=24;
n:=0;r:=0;v:=0;x1:=-240;x2:=240;
end;
#59:
hwg(ea);
end;
until d=#13;
end;
end.
================================================
==========МОДУЛЬ UNIT==========
================================================
{$N+}
Unit k_unit;
{Модуль нахождения интеграл от многочлена q(q-1)..(q-i+1)(q-i-1)..(q-n),}
{где n-точность интеграла ,i-номер коофициента. }
interface
procedure rasposn(f:string;x:real;var ec:word;var t:real);
procedure hkoef(n:integer;var h:array of double);
procedure funktia(n:integer;a,b:real;var y:array of double;c:real;f:string);
procedure koef(w:array of double;n:integer;var e:array of double);
procedure mnogochlen(n,i:integer;var c:array of double);
function facktorial(n:integer):double;
function integral(w:array of double;n:integer):double;
function mainint(n:integer;a,b:real;y:array of double):double;
implementation
procedure rasposn(f:string;x:real;var ec:word;var t:real);
{Процедура распознования функции}
var
k:word;
begin
k:=pos('x',f);
if k<>0 then
begin {Распознавание функции}
ec:=1; {Код ошибки}
t:=x;
k:=pos('abs(x)',f);
if k<>0 then t:=abs(x);
k:=pos('sin(x)',f);
if k<>0 then t:=sin(x);
k:=pos('cos(x)',f);
if k<>0 then t:=cos(x);
k:=pos('arctg(x)',f);
if k<>0 then t:=arctan(x);
k:=pos('sqr(x)',f);
if k<>0 then t:=x*x;
k:=pos('exp(x)',f);
if k<>0 then t:=exp(x);
k:=pos('cos(x)*x',f);
if k<>0 then t:=cos(x)*x;
k:=pos('ln(x)',f);
if k<>0 then
begin
if x>0 then t:=ln(x)
else
t:=0;
end;
k:=pos('sqrt(x)',f);
if k<>0 then
if x>=0 then t:=sqrt(x)
else t:=0;
k:=pos('arcctg(x)',f);
if k<>0 then t:=pi/2-arctan(x);
k:=pos('sin(x)/x',f);
if k<>0 then if x<>0 then t:=sin(x)/x;
end
else
ec:=0;
end;
procedure funktia(n:integer;a,b:real;var y:array of double;c:real;f:string);
{Процедур подсчет Y-ков и распознавания функции}
var
t,h,x:real;
k,i:integer;
es:word;
begin
h:=(b-a)/n;
for i:=0 to n do
begin
x:=(a+h*i)/c;
rasposn(f,x,es,t);
y[i]:=t;
end;
end;
procedure koef(w:array of double;n:integer;var e:array of double);
{Изменение коофициентов для интеграла}
var
t:integer;
begin
for t:=1 to n do
e[t]:=w[t]/(n-t+2);
end;
procedure mnogochlen(n,i:integer;var c:array of double);
{процедура нахождения коофициентов при Q^n(q в степени n )}
var
k,j:integer;
d:array[1..100] of double;
begin
d[1]:=1;
for j:=1 to n do
begin {Вычисление коэффициентов при раскрытии q*(q-1)*(q-2)*..*(q-n)}
d[j+1]:=d[j]*j*(-1);
if j>1 then
for k:=j downto 2 do
d[k]:=d[k]+d[k-1]*j*(-1);
end;
c[1]:=d[1]; {Деление многочлена на (q-i) по схеме Горнера}
for j:=1 to n+1 do
c[j]:=i*c[j-1]+d[j];
koef(c,n,c); {Изменение коэффициентов при интегрировании}
end;
function facktorial(n:integer):double;
{функция нахождения факториала }
var
t:integer;
s:double;
begin
s:=1;
if n=0 then
s:=1
else
for t:=1 to n do
s:=s*t;
facktorial:=s;
end;
function integral(w:array of double;n:integer):double;
{функция подсчета самого интеграла}
var
t,p:integer;
s,c:double;
begin
s:=0;p:=n;
for t:=0 to p+1 do
s:=s+w[t]*exp((p-t+2)*ln(p)); {Подсчет интеграла}
integral:=s;
end;
procedure hkoef(n:integer;var h:array of double);
{Процедура подсчета коэф. Ньютона-Котеса}
var
p,j,d,c,i:integer;
kq:array[0..20] of double;
s:array[0..20] of double;
begin
p:=n;
if (p mod 2)=1 then {Вычисление половины от всех вычислений коэффициентов}
d:=round((p-1)*0.5)
else
d:=round(0.5*p);
for i:=0 to n do
begin
mnogochlen(p,i,kq);
s[i]:=integral(kq,p); {Формирование массива из интегралов}
end;
for i:=0 to d do
begin
if ((p-i) mod 2) = 0 then
c:=1
else
c:=(-1);
h[i]:=(c*s[i])/(facktorial(i)*facktorial(p-i)*p);
h[p-i]:=h[i];
end;
end;
function mainint(n:integer;a,b:real;y:array of double):double;
{функция подсчета основного интеграла}
var
sum:double;
p,i:integer;
kq,h:array[0..20] of double;
begin
p:=n;
hkoef(n,h);
sum:=0;
for i:=0 to p do
sum:=sum+h[i]*y[i]; {Сумма произведений y-ков на коэффициенты}
mainint:=sum*(b-a);
end;
end.
================================================
=======ОСНОВНАЯ ПРОГРАММА=======
================================================
{$N+}
program Newton_Cotes_metod;{Программа нахождения определенного интеграла}
uses {методом Ньютона-Котеса }
k_unit,k_graph,graph,crt;
const
t=15;
var
c:char;
a1,b1,a,b:real;
n1,v,r,n:integer;
h,y:array[0..t] of double;
ea,k:word;
int:double;
f:string;
begin
ea:=10;
v:=detect;
initgraph(v,r,'');
cleardevice;
newsc(ea);
winwin1;
setcolor(15);
outtextxy(380,430,'Нажмите F2 для смены языка.');
repeat
win1(ea);
settextstyle(3,0,1);
outtextxy(178,340,'Press Enter...');
delay(13000);
bar(178,340,350,365);
delay(13000);
if keypressed then {Смена языка}
begin
c:=readkey;
if c=#60 then
begin
ea:=ea+1;
newsc(ea);
winwin1;
setcolor(15);
if ea mod 2 =0 then
outtextxy(380,430,'Нажмите F2 для смены языка.')
else
outtextxy(380,430,'Press F2 key to change language.');
end;
end;
until c=#13;
repeat
newsc(ea);
win2(ea,k); {Ввод способа задания функции}
case k of
0:
wwod1(ea,y,n,a,b);
1:
begin
wwod2(ea,ea,n1,a1,b1,f);
n:=n1;a:=a1;b:=b1;
k:=4;
end;
end;
if k=4 then
funktia(n,a,b,y,1,f);
int:=mainint(n,a,b,y); {Вычисление интеграла}
hkoef(n,h);
proline(ea);
win3(ea,n,a,b,int,f,h,k); {Последнее меню вывода результатов}
until k<>4;
closegraph;
end.
Рассмотрим результаты тестовых испытаний для функций sin(x) на интервале [-5;3] и exp(x) на интервале [2;8]
n=1 |
n=2 |
n=3 |
n=4 |
n=5 |
n=7 |
|
Sin(x) |
4,040017 |
3,02112 |
0,087629 |
1,779012 |
1,537481 |
1,246 |
Exp(x) |
8965,041 |
3581,999 |
3271,82 |
3002,908 |
2990,644 |
2974,322 |
N=9 |
n=12 |
|||||
1,273561 |
1,27366 |
|||||
2973,593 |
2973,569 |
Видно, что при увеличении числа узлов интерполяции точность растет, однако при больших n (n>15) наблюдался обратный эффект.
Рекомендуемый диапозон n: от 7 до 13.
Интерфейс программы составлен на 2 языках: русском и английском. Переход с одного языка на другой осуществляется в вводном окне путем нажатия клавишы F2. Сменить язык можно только в этой части программы.
При вводе значений функции вручную необходимо вводить только цифры и после каждого ввода нажимать клавишу ENTER.
При испытании программы под разные операционные системы(Dos, Windows 98-2k,NT, из под паскаля) происходил непонятный баг с неверным выводом на экран значений коэффициентов Ньютона-Котеса, хотя интеграл считался верно. Для нормального нахождения их желательно запускать программу через Dos.
При вводе параметров в “Меню задания параметров нахождения интеграла” желательно их вводить постепенно сверху вниз, т.е. сначала ввести количество узлов интерполяции, затем пределы интегрирования, а уж потом вводить саму функцию.
Данная версия программы не способна распознавать все функции. Она может распознать только стандартные функции Турбо Паскаля и еще несколько дотполнительных: sin(x)/x, cos(x)*x ,arcctg(x). Для работы со специфическими функциями необходимо в модуле K-unit в процедуре RASPOSN в конце, перед end else, добавить :
k:=pos(‘Формула f(x)’,f);
if k<>0 then t:= ‘Формула f(x)’;
где ‘Формула f(x)’ – желаемая формула для распознования.
Вся помощь по вводу и работе с пограммой выводится в окне помощи.
Для нахождения интеграла существует много методов, однако, метод Ньютона-Котеса один из самых быстрых: достаточно знать значения коэффициентов для n=4, чтобы с точностью до сотых мгновенно посчитать интеграл. Быстрота и простота –главные части этого метода.
В.И. Грызлов «Турбо Паскаль 7.0» Москва: ДМК 2000г.
Данилина «Численные методы» Москва: Высшая школа 1978г.