离散余弦变换区分实际对称函数

时间:2017-04-15 20:54:04

标签: python numpy fft dct fluid-dynamics

我希望区分(0,2 * pi)上的实数周期函数,该函数也使用离散傅里叶变换对称于x = pi。我编写了一个使用FFT / IFFT执行此操作的Python代码,但这并未考虑函数的对称性,因此有点浪费。

(总体目标是制作一个伪谱流体流动求解器,其中一个方向的周期性和对称性应该允许我仅使用傅里叶级数的余弦部分来扩展该方向的变量)

我知道我需要使用离散余弦变换(DCT)来做到这一点,但无法解决有关我的域(x),波数矢量(k)和DCT / IDCT的实现需要更改的内容。前两个应该是长度的一半。

import sympy as sp
import numpy as np
import matplotlib.pylab as plt
from scipy.fftpack import fft, ifft

# Number of grid points
N = 2**5 

# Test function to check results with (using SymPy)
w = 3.; X = sp.Symbol('x'); Y=sp.cos(w*X)

# Domain of regularly spaced points in [0,2pi)
x=(2*np.pi/N)*np.arange(0,N)

# Calc exact derivatives using SymPy then turn into functions
dY      = Y.diff(X)
d2Y     = dY.diff(X)
d3Y     = d2Y.diff(X)
f       = sp.lambdify(X, Y,'numpy')
df_ex   = sp.lambdify(X, dY, 'numpy')
d2f_ex  = sp.lambdify(X, d2Y, 'numpy')
d3f_ex  = sp.lambdify(X, d3Y, 'numpy')

# Wavenumber vector
k=np.hstack(( np.arange(0,N/2), 0, np.arange(-N/2+1,0) )); 
k2=k**2; k3=k**3;

# Trans. to Fourier domain, diff, then return to phyical space
F   = fft(f(x))
df  = np.real(ifft(1j*k*F))
d2f = np.real(ifft( -k2*F))
d3f = np.real(ifft(-1j*k3*F))

# Plot result
fh=plt.figure(figsize=(8,4)); ah=fh.add_subplot(111)
plt.plot(x,f(x),'b-',x,df_ex(x), 'r-',x,d2f_ex(x),'g-',x,d3f_ex(x),'k-')
plt.plot(x,df,'ro',x,d2f,'go',x,d3f,'ko')
plt.xlim([0,2*np.pi])

0 个答案:

没有答案