SM10
Программа SM10 вычисляет сумму бесконечного ряда с помощью преобразования Эйлера, которое заключаетсмя в следующем. Если ряд в левой части равенства
∞∞
∑ ai = ∑ (∆ia0)/2i+1
i=0i=0
сходится, то это равенство справедливо и ряд в правой части равенства сходится быстрее. Здесь ∆ia0 обозначает разность вперед i-го порядка для a0
∆a0 = a1 - a0
∆1a0 = ∆a1 - ∆a0
∆2a0 = ∆1a1 - ∆1a0
. . . . . . . . . .
Программа особенно эффективна в случае медленно сходящихся, а также расходящихся знакопеременных рядов. Суммирование прекращается, как только Tim раз подряд абсолютные значения членов преобразованного ряда будут меньше, чем Eps.
Вызов программы
SM10(Fct, Eps, Tim)
Параметры программы
Fct, Eps, Tim - входные параметры;
Real SM10 - возвращаемое значение;
Real Fct(Integer i) - функция, вычисляющая значения членов ряда;
Real Eps - погрешность вычисления суммы;
Integer Tim - параметр повторения.
Пример
!Вычисление суммы знакопеременного ряда program TestSM10 use NML implicit none real, parameter:: pi=3.1415926, Eps=1.E-8 integer, parameter:: Tim=4 real:: S, E !begin S=SM10(Pi4, Eps, Tim) E=0.25*pi print 10, S, E 10 format(/' Summa =',E18.10/' pi/4 =',E18.10) !end contains real function Pi4(i) integer, intent(in):: i Pi4=1.0/float(2*i+1) if(mod(i,2) /= 0) Pi4=-Pi4 return end function Pi4 end program TestSM10 Summa = 0.7853981256E+00 pi/4 = 0.7853981256E+00
DFT
Программа DFT вычисляет дискретное (прямое и обратное) быстрое преобразование Фурье с прореживанием по времени. Алгоритм Кули-Тьюки.
Прямое и обратное дискретное преобразование Фурье задаётся формулами
где s(n) - исходный сигнал, S(k) - его Фурье-образ, j - мнимая единица. Предполагается, что сигнал s(n) - периодический, в этом случае Фурье-образ будет тоже периодическим с тем же периодом.
Основная идея быстрого преобразования Фурье (БПФ) состоит в разбиении отсчётов сигнала на две части и вычислении БПФ уже для каждой из частей меньшей размерности N/2 (прореживание по времени). Во втором варианте БПФ (прореживание по частоте) на две части разбивается спектр сигнала. Подробное описание обоих алгоритмов можно найти в многочисленной литературе.
[Б14]
Вызов программы
call DFT(N, S, Error, Dir)
Параметры программы
N, Dir - входные параметры;
S - входной и выходной параметр;
Error - выходной параметр;
Integer N - количество отсчётов сигнала или Фурье-образа, N должно быть степенью числа 2, большей нуля;
Complex S[0:N-1] - массив с отсчётами;
Integer Dir - направление преобразования, Dir>0 или отсутствует - прямое преобразование Фурье, Dir<0 - обратное преобразование Фурье;
Integer Error - индикатор ошибки, Error=0 в случае нормального завершения программы, Error>0 если размерность массива S не является степенью числа 2.
Пример
! Прямое и обратное преобразование Фурье треугольного сигнала
program DigitalFourierTransform
use NML
implicit none
! Variables
integer, parameter:: n=8, n1=n-1
complex S(0:n1)
real Arg(0:n1), X(0:n1)
real a, b, h, t
integer k, err
data a/0.0/, b/2.0/
! Body of DigitalFourierTransform
h=(b-a)/n;
do k=0, n1
Arg(k)=a+h*k
if(k<=n/2) X(k)=h*k
if(k>n/2) X(k)=X(k-1)-h
S(k)=cmplx(X(k), 0.0)
enddo
print *, 'Original signal'
print 10, (k, Arg(k), X(k), k=0, n1)
call DFT(n, S, err)
print *, 'Error=',err
print *, 'The direct transform signal'
print 11, (k, Arg(k), Real(S(k)), Aimag(S(k)), k=0, n1)
call DFT(n, S, err, -1)
print *, 'The inverse transform signal'
print 11, (k, Arg(k), Real(S(k)), Aimag(S(k)), k=0, n1)
10 format(I2,' Arg=',F4.2,F10.5)
11 format(I2,' Arg=',F4.2,' Re=',F10.6,' Im=',F10.6)
end program DigitalFourierTransform
Original signal
0 Arg=0.00 0.00000
1 Arg=0.25 0.25000
2 Arg=0.50 0.50000
3 Arg=0.75 0.75000
4 Arg=1.00 1.00000
5 Arg=1.25 0.75000
6 Arg=1.50 0.50000
7 Arg=1.75 0.25000
Error= 0
The direct transform signal
0 Arg=0.00 Re= 4.000000 Im= 0.000000
1 Arg=0.25 Re= -1.707107 Im= 0.000000
2 Arg=0.50 Re= 0.000000 Im= 0.000000
3 Arg=0.75 Re= -0.292893 Im= -0.000000
4 Arg=1.00 Re= 0.000000 Im= 0.000000
5 Arg=1.25 Re= -0.292893 Im= 0.000000
6 Arg=1.50 Re= 0.000000 Im= 0.000000
7 Arg=1.75 Re= -1.707107 Im= 0.000000
The inverse transform signal
0 Arg=0.00 Re= 0.000000 Im= 0.000000
1 Arg=0.25 Re= 0.250000 Im= -0.000000
2 Arg=0.50 Re= 0.500000 Im= 0.000000
3 Arg=0.75 Re= 0.750000 Im= -0.000000
4 Arg=1.00 Re= 1.000000 Im= 0.000000
5 Arg=1.25 Re= 0.750000 Im= 0.000000
6 Arg=1.50 Re= 0.500000 Im= 0.000000
7 Arg=1.75 Re= 0.250000 Im= 0.000000
CNM
Программа CNM вычисляет биномиальные коэффициенты Cnm = n!/(m!(n-m)!) по рекуррентной формуле Cni+1 = (n-i)/(i+1)Cni для i = 0, 1, ..., m-1, причем Cn0 = 1.
Вызов программы
CNM(n, m)
Параметры программы
Integer n, m - входные параметры;
Integer CNM - возвращаемое значение.
