1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
| uses graphABC;
var a, b, { Границы отрезка }
r, r2, { Предыдущее и текущее приближенные значения интеграла}
tch: Real; { Точность вычисления }
i,
n: Integer; { Счетчик }
{ Интегрируемая функция }
Function f (x: real): real;
begin
f:= sin (x) / sqrt (x);{сама функция}
end;
Function simpson (a, b: real; n: integer): real;
var
s: real; { Сумма }
h: real; { Шаг }
m: integer; { Счетчик }
mn: integer; { Множитель }
begin
h:= (b - a) / (n - 1); { Рассчитывается шаг }
s:= f (a) + f (b); { Начальное значение шага }
mn:= 4; { Первый множдитель - 4 }
{ Суммирование остальных элементов }
for m:= 1 to n - 2 do
begin
s:= s + mn * f (a + h * m);
if (mn= 4) then mn:= 2
else mn:= 4; { Именение множителя 2<>4 }
end;
simpson:= s * h / 3; { Возвращается вычисленное значение }
end;
{ Процедура вычисления порядка числа }
Procedure norm (a: real);
var n: real;
begin { Если число слишком мало - возвращается ноль }
if (a < 0.00001)then n:= 0
else
begin { Если число меньше единицы }
if (a < 1) then
begin
n:= 1;
repeat
a:= a * 10;
n:= n / 10;
until (trunc(a) <> 0);
end
else
begin { Если число больше единицы }
n:= 1;
repeat
a:=a / 10;
n:=n * 10;
until (trunc(a) = 0);
end;
end;
a := n;
end;
{ Построение графика функции }
Procedure out_grp (xmin, xmax, ymin, ymax: Real);
var mx, my: Real; { Масштабы по осям }
xx, yy: Real; { Текущие координаты }
sx: Real; { Шаг по оси X }
dltx, dlty: Integer;{ Приращение на графике при смещении графика }
s: string; { Строка }
begin
clearwindow;
{ Выяснение порядков минимумов и максимумов }
norm(xmax);
norm(ymax);
norm(ymin); ymin:= ymin / 10;
norm(xmin); ymin:= ymin / 10;
if (xmin / xmax) > 0.01 then dltx:= 20
else dltx:= 0;
if (ymin / ymax) > 0.01 then dlty:= 20
else dlty:= 0;
{ Расчет масштабов }
mx:= (windowwidth-100) / (xmax - xmin);
my:= (windowheight-100) / (ymax - ymin);
{ Расчет приращения по X }
sx:= (xmax - xmin) / 550;
{ Вывод системы координат }
xx:= xmin;
repeat
setpencolor(clBlack);
line(trunc(40+mx*(xx-xmin)+dltx),20,trunc(40+mx*(xx-xmin)+dltx),469);
str(xx:4:1,s);
setpencolor(clBlue);
textout(trunc(40+mx*(xx-xmin)+dltx),475,s);
xx:=xx+50*sx;
until (xx > (xmax + 50 * sx));
yy:=ymin+(ymax-ymin)/10;
repeat
setpencolor(clBlack);
line(41,trunc(470-my*(yy-ymin)-dlty),630,trunc(470-my*(yy-ymin)-dlty));
str(yy:4:1,s);
setfontcolor(clBlue);
textout(20,trunc(470-my*(yy-ymin)-dlty),s);
yy:=yy+(ymax-ymin)/10;
until (yy > (ymax + (ymax - ymin) / 10));
line(40,0,40,480);
line(0,470,640,470);
line(40,0,38,10);
line(40,0,42,10);
line(640,470,630,472);
line(640,470,630,468);
{ Вывод графика }
xx:=xmin;
repeat
yy:=f(xx);
setpixel(trunc(40+mx*(xx-xmin)+dltx),trunc(470-my*(yy-ymin)-dlty),clRed);
xx:=xx+sx;
until (xx>xmax);
end;
begin
writeln ('Введите левую границу: ');
readLn (a);
while a <= 1 do
begin
writeln('Левая граница должна быть больше 1! Повторите ввод: ');
readln (a);
end;
writeln ('Введите правую границу:');
readln (b);
while b <= a do
begin
write ('Правая граница должна быть правее левой!');
write (' Повторите ввод: ');
readLn (b)
end;
{ Вычисляется интеграл }
writeln ('Введите на сколько отрезков разбить интеграл: ');
readln(n);
r:= simpson(a,b,n); { Начальное значение }
for i:=1 to n do
begin
r2:= r; { Запоминается предыдущее значение }
r:= simpson(a,b,n); { Рассчитывается новое значение }
end; {точности }
{ Вывод результатов }
writeLn (' Результат по методу Симпсона равен: ',r:6:3);
writeLn ('Нажмите любую клавишу для продолжения');
readln;
{ Выводится график функции }
out_grp (a,b,f(b),f(a));
end. |