FFTW:1 / cosh函数的正向变换的逆变换是错误的

时间:2015-10-05 18:26:45

标签: fortran gfortran fftw

我试图在Fortran 90和fftw中对复杂的1D阵列正向变换进行逆变换。然而,我从逆变换接收的输出有时与原始输入完全不同,而某些值具有不正确的实部,但正确的虚部和少数几个完全匹配原始值。

我注意到如果dx(x值之间的间距)减少到0.01,这个问题就会消失。增加n以补偿x范围内的这种减少然后导致问题重新铺设。

此时,我认为问题在于输入数组的1 / cosh段,因为我已经能够将其替换为其他复杂输入而没有任何问题。 此代码改编自MATLAB文件,其中输入的形式仅因MATLAB使用sech而不是1 / cosh而不同。

Fortran不是去了'所以我很想知道我是否因为熟悉python / matlab而犯了一些明显的错误。

关于产出的更多细节,

此代码的matlab版本为in数组生成相同的值,但正向变换和逆变换的运算产生不同的结果,

Matlab

out2(2) = 5.5511e-17 + 6.9389e-18i
out2(3) = 5.5511e-17 - 1.3878e-17i
out2(4) = 5.5511e-17 + 2.7756e-17i
out2(1024) = 0.9938 + 0.0994i
out2(2048) = 0 - 1.3878e-17i

Fortran

out2(2) = -5.5511151231257827E-017 - 6.9388939039072284E-018i
out2(3) = 0.0000000000000000 + 1.3877787807814457E-017i
out2(4) = 0.0000000000000000 + 0.0000000000000000i
out(1024) = 0.99380163159683255 + 9.9410098890158616E-002i
out2(2048) = -5.5511151231257827E-017 - 6.9388939039072284E-018i

PROGRAM FFTEXAMPLE
implicit none
include 'fftw3.f'

INTEGER :: n, j, nindex, i
REAL :: dx
DOUBLE COMPLEX, ALLOCATABLE :: in(:), out(:), in2(:), out2(:)
REAL(kind = 8), ALLOCATABLE :: x(:)
INTEGER*8 :: plan, plan2

nindex = 11
n = 2 ** nindex
dx = 0.05   ! Spacing between x array values

allocate( in(n), out(n), x(n), in2(n), out2(n) )


CALL dfftw_plan_dft_1d( plan, n, in, out, FFTW_FORWARD, FFTW_ESTIMATE )
CALL dfftw_plan_dft_1d( plan2, n, in2, out2, FFTW_BACKWARD, FFTW_ESTIMATE )

x = (/ (-dx*n/2 + (i-1)*dx, i=1, n) /)  ! Seeds x array from -51.2 to 51.15

! Create values for the input array
DO j = 1, n, 1
    in(j) = 1/cosh ( x(j)/1.0040 ) * exp( (0.0, -1.0) * 1.9940 * x(j) )
END DO

CALL dfftw_execute_dft( plan, in, out ) ! FWD transform

!DO j = 1, n, 1
!   in2(j) = cmplx(REAL(out(j)), AIMAG(out(j)))
!END DO

in2 = out

CALL dfftw_execute_dft( plan2, in2, out2 ) ! Inverse transform

out2 = out2/n  ! Divide output by n to normalise

CALL dfftw_destroy_plan( plan )
CALL dfftw_destroy_plan( plan2 )

END PROGRAM

0 个答案:

没有答案