Вычисление сумм, произведений и коэффициентовSM10. Вычисление суммы бесконечного ряда с помощью преобразования Эйлера. DFT. Дискретное преобразование Фурье. CNM. Вычисление биномиальных коэффициентов. SM10Программа SM10 вычисляет сумму бесконечного ряда с помощью преобразования Эйлера, которое заключаетсмя в следующем. Если ряд в левой части равенства
Вызов программы SM10(Fct, Eps, Tim) Параметры программы Fct, Eps, 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
Вернуться к оглавлению Скачать SM10 DFTПрограмма DFT вычисляет дискретное (прямое и обратное) быстрое преобразование Фурье с прореживанием по времени. Алгоритм Кули-Тьюки.
Основная идея быстрого преобразования Фурье (БПФ) состоит в разбиении отсчётов сигнала на две части и вычислении БПФ уже для каждой из частей меньшей размерности N/2 (прореживание по времени). Во втором варианте БПФ (прореживание по частоте) на две части разбивается спектр сигнала. Подробное описание обоих алгоритмов можно найти в многочисленной литературе. [Б14]
Вызов программы call DFT(N, S, Error, Dir) Параметры программы N, Dir - входные параметры;
Пример ! Прямое и обратное преобразование Фурье треугольного сигнала 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
Вернуться к оглавлению Скачать DFT 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 - входные параметры;
|