DF40
Программа DF40 вычисляет множество z1, z2, ..., zn
значений интегралов
xi
zi = ∫ y(x)dx (i=1, 2, ..., n)
x1
от функции y(x)
, заданной множествами неравноотстоящих точек x1, x2, ..., xn
упорядоченных по возрастанию или убыванию значений аргумента и y1, y2, ..., yn
соответствующих значений функции.
Учитывая, что z1=0
, последовательные значения интегралов вычисляются по формуле трапеций:
zi = zi-1 + ½(xi-xi-1)(yi+yi-1) (i=2, 3, ..., n)
.
Вызов программы
CALL DF40(X, Y, IY)
Параметры программы
X, Y
- входные параметры;
IY
- выходной параметр;
Real X(1:N), Y(1:N)
- массивы, задающие значения аргумента и функции.
Real IY(1:N)
- массив, содержащий вычисленные значения интеграла. При вызове массив можно совмещать в памяти с массивом X
или Y
.
DF42
Программа DF42 вычисляет множество z1, z2, ..., zn
значений интегралов
xi
zi = ∫ y(x)dx (i=1, 2, ..., n)
x1
от функции y(x)
, заданной множеством y1, y2, ..., yn
ее значений в равноотстоящих точках x1, x2, ..., xn
с шагом изменения аргумента h
. Предполагается, что функция непрерывна и, по крайней мере, дважды дифференцируема.
Учитывая, что z1=0
, последовательные значения интегралов вычисляются по формуле трапеций:
zi = zi-1 + ½ h(yi+yi-1) (i=2, 3, ..., n)
.
Вызов программы
CALL DF42(Y, H, IY)
Параметры программы
Y, H
- входные параметры;
IY
- выходной параметр;
Real Y(1:N)
- массив, содержащий значения функции;
Real H
- шаг изменения аргумента;
Real IY(1:N)
- массив, содержащий вычисленные значения интеграла. При вызове массив можно совмещать в памяти с массивом Y
.
DF43
Программа DF43 вычисляет множество z1, z2, ..., zn
значений интегралов
xi
zi = ∫ y(x)dx (i=1, 2, ..., n)
x1
от функции y(x)
, заданной множеством y1, y2, ..., yn
ее значений в равноотстоящих точках x1, x2, ..., xn
с шагом изменения аргумента h
. Предполагается, что функция непрерывна и дифференцируема пять раз.
В зависимости от значения n
для вычисления интегралов при различных значениях i
в программе используется формула трапеций (1), формула Симпсона (2) и (3), формула "трех восьмых" (4), (5) и (6) или формула Боде (7), (8), (9) и (10).
z1 = 0 | |
z2 = (h/2)•(y1+y2) | (1) |
z2 = (h/12)•(5y1+8y2-y3) | (2) |
z3 = (h/3)•(y1+4y2+y3) | (3) |
z2 = (h/24)•(9y1+19y2-5y3+y4) | (4) |
z3 = (h/3)•(y1+4y2+y3) | (5) |
z4 = (3h/8)•(y1+3y2+3y3+y4) | (6) |
z2 = (h/720)•(251y1+646y2-264y3+106y4-19y5) | (7) |
z3 = (h/90)•(29y1+124y2+24y3+4y4-y5) | (8) |
z4 = (h/80)•(27y1+102y2+72y3+42y4-3y5) | (9) |
zi = zi-4 + (2h/45)•(7yi-4+32yi-3+12yi-2+32yi-1+7yi) (i=5, ..., n) | (10) |
Вызов программы
CALL DF43(Y, H, IY)
Параметры программы
Y, H
- входные параметры;
IY
- выходной параметр;
Real Y(1:N)
- массив, содержащий значения функции;
Real H
- шаг изменения аргумента;
Real IY(1:N)
- массив, содержащий вычисленные значения интеграла. При вызове массив можно совмещать в памяти с массивом Y
.
DF47
Программа DF47 вычисляет множество z1, z2, ..., zn
значений интегралов
xi
zi = ∫ y(x)dx (i=1, 2, ..., n)
x1
от функции y(x)
, заданной множеством x1, x2, ..., xn
упорядоченных по возрастанию или убыванию значений аргумента и множествами y1, y2, ..., yn
и y'1, y'2, ..., y'n
соответствующих значений функции и ее первой производной. Предполагается, что интегрируемая функция непрерывна и дифференцируема четыре раза.
Учитывая, что z1=0
, последовательные значения интегралов вычисляются по формуле:
zi = zi-1 + (1/2)(xi-xi-1)[yi-1 + yi + (1/6)(xi-xi-1)(y'i-1-y'i)] (i=2, 3, ..., n)
.
Вызов программы
CALL DF47(X, Y, DY, IY)
Параметры программы
X, Y, DY
- входные параметры;
IY
- выходной параметр;
Real X(1:N), Y(1:N), DY(1:N)
- массивы, содержащие значения аргумента, функции и ее первой производной;
Real IY(1:N)
- массив, содержащий вычисленные значения интеграла. При вызове массив можно совмещать в памяти с массивом X
, Y
или DY
.
DF48
Программа DF48 вычисляет множество z1, z2, ..., zn
значений интегралов
xi
zi = ∫ y(x)dx (i=1, 2, ..., n)
x1
от функции y(x)
, заданной множеством y1, y2, ..., yn
ее значений и множеством y'1, y'2, ..., y'n
значений ее производной в равноотстоящих точках с шагом изменения аргумента h
. Предполагается, что интегрируемая функция непрерывна и дифференцируема четыре раза.
Учитывая, что z1=0
, последовательные значения интегралов вычисляются по формуле:
zi = zi-1 + (1/2)h[yi-1 + yi + (1/6)h(y'i-1-y'i)] (i=2, 3, ..., n)
.
Вызов программы
CALL DF48(Y, DY, H, IY)
Параметры программы
Y, DY, H
- входные параметры;
IY
- выходной параметр;
Real Y(1:N), DY(1:N)
- массивы, содержащие значения функции и ее первой производной;;
Real H
- шаг изменения аргумента;
Real IY(1:N)
- массив, содержащий вычисленные значения интеграла. При вызове массив можно совмещать в памяти с массивом Y
или DY
.
DF60
Программа DF60 интегрирует функцию f(x)
, заданную аналитически с автоматическим выбором величины шага исходя из оценки погрешности интегрирования на каждом шаге. Погрешность интегрирования оценивается на основе анализа двух квадратурных формул
I0 = (h/90)[7f(x) + 32f(x+h/4) + 12f(x+h/2) + 32f(x+3h/4) + 7f(x+h)]
I1 = (h/9450)[455f(x) + 1536f(x+h/8) + 3584f(x+3h/8) - 420f(x+h/2) +
+ 3584f(x+3h/4) + 711f(x+h)]
,
для которых справедливы следующие асимптотические оценки погрешности:
R0 = I - I0 = -(8/945)•(h/4)7•f(VI)(ξ)
R1 = I - I1 = -(26/4725)•(h/4)7•f(VI)(ξ)
,
где I
обозначает точное (неизвестное) значение интеграла. За приближение к точному значению интеграла принимается I0
, а общая погрешность интегрирования оценивается по правилу Рунге
I1 - I0 = R0 - R1 = [1 - (26/4725)•(945/8)]•[-(8/945)•(h/4)7•f(VI)(ξ)] = (7/20)R0
,
откуда R0 = (20/7)(I1 - I0)
, где
I1 - I0 = (h/4725)[-140f(x) + 768f(x+h/8) + 1792f(x+3h/8) - 1680f(x+h/4) -
- 840f(x+h/2) + 112f(x+3h/4) - 12f(x+h)]
.
Шаг интегрирования программа выбирает автоматически. Если вычисленная погрешность R0
превосходит заданное значение ε
, то шаг интегрирования уменьшается вдвое, причем вычисленные значения функции запоминаются для последующего использования. Если погрешность R0
удовлетворяет заданной точности, то вычисленное значение I0
принимается за значение интеграла на данном шаге, а величина следующего шага hnew
рассчитывается по формуле:
7 ______
hnew = hold•√ ε/R0
.
Программа наиболее эффективна для быстро меняющихся (быстро растущих или убывающих) или осциллирующих функций.
Вызов программы
CALL DF60(Fun, X, Xout, H, Eps, SI, SE, Error)
Параметры программы
Fun, Xout
- входные параметры;
X, H, Eps
- входные и выходные параметры;
SI, SE, Error
- выходные параметры;
Real Fun(Real X)
- интегрируемая функция f(x)
;
Real X, Xout
- начальная и конечная точки интегрирования;
Real H
- начальный шаг интегрирования, с которым программе предлагается начать вычисления. Допустимо задать абсолютное значение, даже если шаг должен быть отрицательным. На выходе переменная содержит величину шага в конце промежутка интегрирования;
Real Eps
- требуемая точность интегрирования на каждом шаге;
Real SI
- вычисленное значение интеграла;
Real SE
- сумма оценок погрешностей интегрирования на каждом шаге;
Integer Error
- индикатор ошибки;
Error=0
, если интеграл вычислен и погрешность интегрирования на каждом шаге удовлетворяет заданной точности;
Error=1
, если интегрирование нельзя начать, т.к. значение |Xout-X|
меньше минимально-допустимой величины шага hmin
, которая вычисляется программой. Параметр H
приобретает значение hmin
;
Error=2
, если интегрирование нельзя начать, т.к. заданное значение Eps
меньше минимально-допустимой величины εmin
, которая вычисляется программой. Параметр Eps
приобретает значение εmin
;
Error=65
, если программа прекратила вычисления, т.к. интеграл не может быть вычислен с заданной точностью Eps
. Переменная X
получает значение аргумента, при котором произошло прекращение вычислений. Интеграл от начального значения X
до его значения при выходе из программы вычислен правильно.
Пример
! Интерирование функции Fun(x) с автоматическим ! выбором величины шага интегрирования. program Test_DF60 use NML implicit none real:: A, B, H, E, Eps, S1, S2 integer Er, Count !begin Count=0 Eps=1.0E-7 A=-1.0; B=1.0; H=0.0625 E=10.0*(atan(10.0)-atan(-10.0)) call DF60(Fun, A, B, H, Eps, S1, S2, Er) print 10, Er, E, S1, S2, Count 10 format(/' Error =',I3/' E =',F12.7 & /' S1 =',F12.7/' S2 =',E16.7/' Count =',I5) contains real function Fun(x) real, intent(in):: x Fun=1.0/(x*x+0.01) Count=Count+1 return end function Fun end program Test_DF60 Error = 0 E = 29.4225521 S1 = 29.4225521 S2 = 0.8375608E-05 Count = 121
DF63
Программа DF63 интегрирует функцию f(x)
, заданную таблично массивом значений F[1..N]
на равномерной сетке x = A + (i - 1)*H, i = 1, ..., N
с шагом H
по квадратурной формуле Симпсона, точной для многочленов второй степени.
A
- нижний предел интегрирования, верхний предел интегрирования определяется из равенства B = A + H*(N - 1)
Вызов программы
DF63(F, H)
Параметры программы
F, H
- входные параметры;
Real DF63
- возвращаемое значение, содержащее вычисленное значение интеграла;
Real F(1:N)
- значения интегрируемой функции;
Real H
- шаг сетки.
Пример
! Интегрирование функции F, заданнной таблично на равномерной сетке, по формуле Симпсона ! A, B - нижний и верхний пределы интегрирования program Test_DF63 use NML implicit none integer, parameter:: N=120 real F(N), A, B, H, X, RF, EF data A/-1.0/, B/1.0/ integer i !begin H=(B-A)/(N-1) do i=1, N X=A+H*(i-1) F(i)=1.0/(X*X+0.01) enddo RF=DF63(F, H) EF=10.0*(atan(10.0)-atan(-10.0)) print*, 'N=',N print*, 'Calculated value',RF print*, 'Exact value',EF !end end program Test_DF63 Вывод программы: N= 40 Calculated value 29.42225 Exact value 29.42255
DF64
Программа DF64 интегрирует функцию f(x)
, заданную таблично массивом значений F[1..N]
на равномерной сетке x = A + (i - 1)*H, i = 1, ..., N
с шагом H
, по формуле Грегори пятого порядка точности.
A
- нижний предел интегрирования, верхний предел интегрирования определяется из равенства B = A + H*(N - 1)
Вызов программы
DF64(F, H)
Параметры программы
F, H
- входные параметры;
Real DF64
- возвращаемое значение, содержащее вычисленное значение интеграла;
Real F(1:N)
- значения интегрируемой функции;
Real H
- шаг сетки.
Пример
! Интегрирование функции F, заданнной таблично, по формуле Грегори ! A, B - нижний и верхний пределы интегрирования program Test_DF64 use NML implicit none integer, parameter:: N=40 real F(N), A, B, H, X, RF, EF data A/-1.0/, B/1.0/ integer i !begin H=(B-A)/(N-1) do i=1, N X=A+H*(i-1) F(i)=1.0/(X*X+0.01) enddo RF=DF64(F, H) EF=10.0*(atan(10.0)-atan(-10.0)) print*, 'N=',N print*, 'Calculated value',RF print*, 'Exact value',EF !end end program Test_DF64 Вывод программы: N= 40 Calculated value 29.42224 Exact value 29.42255
GA2 GA4 GA8 GA16 GA32 GA64
Программы интегрируют функцию f(x)
, заданную аналитически, по квадратурным формулам Гаусса с n
узлами в промежутке [a, b]
:
n
I = (b-a)•∑ ½ck•f(½(b-a)dk + ½(b+a))
,
k=1
где dk
- абсциссы (узлы) квадратурной формулы Гаусса n
-го порядка для промежутка [-1,1]
, ck - коэффициенты этой формулы.
Число узлов квадратурной формулы, используемых для вычисления интеграла, отражено в названии программы.
Вызов программы
GAn(Fun, AX, BX)
, n
равно 2, 4, 8, 16, 32 или 64;
Параметры программы
Fun, AX, BX
- входные параметры;
Real GAn
- возвращаемое значение, содержащее вычисленное значение интеграла;
Real Fun(Real X)
- интегрируемая функция f(x)
;
Real AX, BX
- начальная и конечная точки интегрирования.
DF67
Программа DF67 интегрирует функцию f(x)
, заданную таблично массивом значений F[1..N]
на неравномерной сетке xi, i = 1, ..., N
, по формуле трапеций.
A = x1
и B = xN
- нижний и верхний пределы интегрирования.
Вызов программы
DF67(X, F)
Параметры программы
X, F
- входные параметры;
Real DF67
- возвращаемое значение, содержащее вычисленное значение интеграла;
Real X(1:N)
- значения аргумента в узлах сетки;
Real F(1:N)
- значения подъинтегральной функции;
Пример
! Интегрирование функции F, заданнной таблично на неравномерной сетке, по формуле трапеций ! A, B - нижний и верхний пределы интегрирования program Test_DF67 use NML implicit none integer, parameter:: N=40 real X(N), F(N), A, B, H, XX, RF, EF, D data A/-1.0/, B/1.0/, D/0.125/ integer i !begin H=(B-A)/(N-1); D=D*H do i=2, N-1 X(i)=A+H*(i-1) if(mod(i,2)==0) then; X(i)=X(i)+D ! смещение чётных точек вправо else; X(i)=X(i)-D ! смещение нечётных точек влево endif F(i)=1.0/(X(i)*X(i)+0.01) enddo X(1)=A; F(1)=1.0/(X(1)*X(1)+0.01) X(N)=B; F(N)=1.0/(X(N)*X(N)+0.01) RF=DF67(X, F) EF=10.0*(atan(10.0)-atan(-10.0)) print*, 'N=',N print*, 'Calculated value',RF print*, 'Exact value',EF !end end program Test_DF67 Вывод программы: N= 40 Calculated value 29.47384 Exact value 29.42255