Bonjour
Je suis en peine avec la library fftw et fft de Matlab.
Je doit reprendre dans une modélisation l'équation w = laplacien(phi). Je connais w, et dois remonter à phi. Je souhaite travailler en spectral pour avoir des conditions de bords périodiques.
Le problème est en 2D.
L'idée est la suivante :
FFT(w)=FFT(laplacien(phi))=FFT( -( (kx)²+(ky)² )*(phi) )
Et donc :
phi =iFFT ( - FFT (w) / ( (kx)²+(ky)² ) ).
Dans le principe, ca marche, avec kx et ky ls vecteurs d'ondes associés aux deux dimentions x et y.
Sauf que. Je suis complètement incapable de réaliser la division de FFT(w) par les bons vecteurs d'ondes, car je n'arrive pas à réaliser la surface de kx et ky correctement. Et ceci à cause de l'ordre dans lequel la fonction fft place les coefficients d'amplitudes et à cause de la parité de ma grille.
Ma routine de test ressemble à cela pour l'instant : elle est en 1D car avant de faire gros, il faut faire petit.
C'est réalisé sous QTOctave, je suis débutant avec fourier et apparement : la fonction finale ne ressemble pas à la fonction initiale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 %test fft1D lx=1000; LX=2^nextpow2(lx); dx=1; %calcul d'une perturbation initiale m,n en A. i=1:lx; A(i)=sin(1*i*pi*2/lx); subplot(1,6,1) plot(A); %calcul du laplacien de la perturbation A. DELA=diff(A,2); subplot(1,6,2) plot(DELA); %calcul de la fft du laplacien de la perturbation A. FTDELA=fft(DELA,LX)/lx; subplot(1,6,3) plot(abs(FTDELA),'+'); %calcul de la fft de A a partir de la fft du laplacien de A. k = 1/(dx*2)*linspace(0,1,LX/2+1); m= 1/(dx*2)*linspace(-1,0,LX/2+1); for i=2:LX/2+1; FTA(i)=-FTDELA(i)/(k(i)*k(i)*(4*pi*pi)); end; for i=LX/2+2:LX FTA(i)= -FTDELA(i)/(m(i-LX/2)*m(i-LX/2)*(4*pi*pi)); end subplot(1,6,4) plot(abs(FTA),'+'); %vérification de la tete de ce que l'on devrait avoir en fft de A FTA2=fft(A,LX)/lx; subplot(1,6,5) plot(abs(FTA2),'+'); %calcul de la perturbation A à nouveau. B=ifft(FTA,LX)*lx; subplot(1,6,6) plot(abs(B));
Partager