我正在尝试编写一段FORTRAN代码,使用FFTW3库计算高斯函数 f(r)=exp(-(r^2))
的快速傅里叶变换。众所周知,高斯函数的傅里叶变换是另一个高斯函数。
我考虑在球坐标中计算高斯函数的傅里叶变换积分。
因此,得到的积分可以简化为[r*exp(-(r^2))*sin(kr)]dr
的积分。
我编写了以下FORTRAN代码,用于评估由纯实数输入数组执行的离散正弦变换DST,其中DST通过FFTW3
中现有的C_FFTW_RODFT00执行,考虑到位置空间中的离散值为r=i*delta (i=1,2,...,1024),而DST的输入数组为函数r*exp(-(r^2))
而不是高斯函数。积分[r*exp(-(r^2))*sin(kr)]dr
中的正弦函数是由对球坐标的积分导致的,并且它不是一般情况下进行解析傅里叶变换时出现的exp(ik.r)
的虚部。
然而,结果在动量空间中不是高斯函数。
Module FFTW3
use, intrinsic :: iso_c_binding
include 'fftw3.f03'
end module
program sine_FFT_transform
use FFTW3
implicit none
integer, parameter :: dp=selected_real_kind(8)
real(kind=dp), parameter :: pi=acos(-1.0_dp)
integer, parameter :: n=1024
real(kind=dp) :: delta, k
real(kind=dp) :: numerical_F_transform
integer :: i
type(C_PTR) :: my_plan
real(C_DOUBLE), dimension(1024) :: y
real(C_DOUBLE), dimension(1024) :: yy, yk
integer(C_FFTW_R2R_KIND) :: C_FFTW_RODFT00
my_plan= fftw_plan_r2r_1d(1024,y,yy,FFTW_FORWARD, FFTW_ESTIMATE)
delta=0.0125_dp
do i=1, n !inserting the input one-dimension position function
y(i)= 2*(delta)*(i-1)*exp(-((i-1)*delta)**2)
! I multiplied by 2 due to the definition of C_FFTW_RODFT00 in FFTW3
end do
call fftw_execute_r2r(my_plan, y,yy)
do i=2, n
k = (i-1)*pi/n/delta
yk(i) = 4*pi*delta*yy(i)/2 !I divide by 2 due to the definition of
!C_FFTW_RODFT00
numerical_F_transform=yk(i)/k
write(11,*) i,k,numerical_F_transform
end do
call fftw_destroy_plan(my_plan)
end program
执行上述代码将生成如下图所示,该图不是高斯函数的结果。
![enter image description here](https://istack.dev59.com/31f4D.webp)
FFTW3
引起的。也许我在边界条件上没有正确使用它。