End
{
Made_Integr
}
;
{
}
Begin
ClrScr;
Made_Integr(n);
h:=step;
Ih:=
Integral;
Made_Integr(m);
k:=step;
Ik:=
Integral;
Integral:=
Ih
+
((Ih-Ik)/{((k*k)/(h*h))
- 1)
)
;
Writeln
(' ':20,'For n = ',n,1
and m
=
',m,1
Integral =
',Integral:3:7);
Repeat
Until
KeyPressed;
End.
Результат
работы программы:
For
n =
15 and m
=
80 Intrgral =
-21.9974762;
Действительно,
результат вчисления намного точнее ,
чем в первом примере.
Р
В
этом методе , как
и в предыдущем, призводится разбиение
общего интервала
интегрирования па
множество более мелких отрезков, однако
для вычисления площади под
каждым
из них через три
последовательных ординаты разьиения
проводится квадратичная
парабола.
В результате формула Симпсона дает
точное значение интеграла
при интегрировании
многочленов до
3-го порядка
включительно.
Формула
Симпсона выводится из (4)
при четном п
и при к
2h
и окончательно имеет вид:
Листинг
программы для
считающей значение интеграла по правилу
Симпсона:
{ ЛАБОРАТОРНАЯ
РАБОТА № 3.
"ЧИСЛЕННЫЕ МЕТОДЫ"
"
Численное интегрирование"
Программа
№ 3
: PRAVILO SIMPS0NA }
Program
lab_3_3;
Uses
Crt;
Const
n =
20 ; { n mod 2=0}
a
=
-1.1;
b =
0.8;
Type
Ar =
array[0..N]
of real;
Var
X :
Ar;
Integral,
h
:
real;
i :
byte;
{
}
Function
Func (Xrreal)
:
real;
{
подынтегральная
функция }
(6)3. Правило Симпсона.
Begin
Func:=
0.66*cos(2.31*X)-0.04*exp(-2.61*X)-9.58*X*X*X*X
+
9.4*X*X*X
- 8.96*X*X-5.51;
End {
Func };
{
}
Begin
ClrScr;
h:=
(b-a)/n;
X[0]:=a; X[n]:=b;
For i:=l to n-1
do X[i]:=X[i-l] + h;
Integral:=
0.0;
For i:=0 to n-1
do
If odd(i) then
Integral:=
Integral +
(h/3)*(2*Func(X[i])
+ Func(X[i+1]))
else
Integral:=
Integral +
(h/3)*(Func(X[i])
+ 2*Func(X[i+1]));
Writeln
(' ':20,'For n = ',n,' Integral = Integral:3:7);
Repeat
Until KeyPressed;
End.
Результат
работы программы:
For n = 20 Integral -21.
997 6684.-P
For n = 40 Integral = -21.9974831;
For n = 60 Integral = -21.99747,32;
11оследний
результат очень близок к нашему
«тестовому» значению. Расхождение
на-
блюдается лишь в миллионных долях
числа, что по сути считается очень
высокой точностью по
гребоваиям
данной лабораторной работы.
В
предыдущих
методах использовалось произвольое
разбиение интервала и фактически
оно
производилось на равные отрезки. Гаусс
предложил метод численного интегрирования,
в ко-
тором ошибка ограничения
получалась минимальной при заданном
количестве интервалов, если
располагать
концы интервалов там, где это требуется
из условий достижения максимальной
точ-
ности интегрирования. Так по
этому методу при соответствующем выборе
местоположения двух
ординат получается
точный результат для многочлена третьего
порядка.
Порядок
численного интегрирования по методу
Гаусса следующий:
1.
Изменяем пределы интегрирования
так, чтобы они стали равными (-1,
+1).
Для этого вводим
2х-
(b
+
а) 1 1
u
= х = — • (Ь -
а) • u
+ —
• (Ь
+ а)
новую
переменную b - а так, что 2 2
Интеграл
(1)
после такой подстановки запишется в
виде:
4. Метод Гаусса.
2.
Вычисляем значение искомого интеграла
по формуле:
где
для заданного знаяения п
из соответствующих справочников
(значения указаны в
массивах-константах
нижеприведенного листинга программы)
выбираются ординаты ui
и весо-
вые коэффициенты А,.
В
общем случае ,
при (п+1)
ординате получается точная формула
для нахождения интер-
вала
от многочлена степени
(2п+1).
Листинг
программы:
{ ЛАБОРАТОРНАЯ
РАБОТА № 3.
"ЧИСЛЕННЫЕ МЕТОДЫ"
"
Численное интегрирование"
Программа
№ 4
: METOD
GAUSSA. }
Program
lab_3_4;
Uses
Crt;
Type
Ar =
array[1..6]
of real;
Const
n =
6; { n = only
2 .
.
6 !!!!!!!!!!
}
a
=
-1.1;
b
=
0.8;
Mu2
: Ar = (0.5773502692, -0.5773502692,
0, 0 ,0, 0);
Mu3
: Ar = (0.7745966692, -0.7745966692,
0.000000000, 0, 0, 0)
Mu4
: Ar = (0.8611363116, -0.8611363116,
0.3399810436,
-0.3399810436,
0, 0);
Mu5
: Ar = (0.9061798459, -0.9061798459,
0.5384
693101,
-0.5384693101,
0.0000000000, 0);
Mu6
: Ar = (0.9324695142, -0.9324695142,
0.6612093865,
-0.6612093865,
0.2386191861, 0.2386191861);
Ac2
: Ar = (1.0000000000, 1.0000000000,0,0,0,0);
Ac3
: Ar = (0.5555555556, 0.5555555556,
0.8888888889,0,0,0);
Ac4
: Ar = (0.3478548451, 0.3478548451,
0.6521451549,
0.6521451549,
0, 0);
Ac5
: Ar = (0.2369268851, 0.2369268851,
0.4786286705,
0.4786286705,
0.5688888889,
0);
Ac6
: Ar = (0.1713244924, 0.1713244924,
0.3607615730,
0.3607615730,
0.4679139346, 0.467913934
6);
Var
Mu, Ac :
Ar;
h,
Integral :
real;
i :
byte;
{
}
Function
Func (X:real)
:
real;
Begin
Func:=
0.66*cos(2.31*X)-0.04*exp(-2.61*X)-9.58*X*X*X*X
+
9.4*X*X*X - 8.96*X*X-5.51;
End {
Func } ;
f
}
Function Fi (W
: real) :
real;
Begin
Fi:=
(1/2)*(b-a)*Func((1/2)*(b-a)*W
+ (1/2)*(b+a));
End (
Fi } ;
f
}
Begin
ClrScr;
Integral:=
0.0;
If n=2 then
For i:=l to n do
Begin
Ac[i]
:=Ac2 [
i] ;
Mu[i]:=Mu2
[ i]
End
else if n=3 then
For
i:=l to n do
Begin
Ac[i]:=Ac3[i];
Mu[i]:=Mu3[i]
End
else if n=4
then
For i:=l to n do
Begin
Ac[i]:=Ac4
[ i]
;
Mu[i]
:=Mu4 [i]
End
else if n=5 then
For
i:=l to n do
Begin
Ac[i]:=Ac5
[i] ;
Mu[i]:=Mu5[i]
End
else
For i:=l to n
do
Begin
Ac[i]:=Ac6[i];
Mu[i]:=Mu6[i]
End;
For i:=1
to n
do
Integral:=
Integral + Ac[i]*Fi(Mu[i]);
Writeln
(' ':25,'For n = ',n,
' Integral
= Integral:3:10);
Repeat
Until KeyPressed;
End.
For |
n = 2 |
Integral = |
-21.7430760684; |
For |
n = 3 |
Integral = |
-21.9928666993; |
For |
n = 4 |
Integral = |
-21.9975249206; |
For |
n = 5 |
Integral = |
-21.9974691836; |
For |
n = 6 |
Integral = |
-21.9974707523; |
