У меня проблема с использованием FFTW для решения уравнения Пуассона.Уравнение, которое я пытаюсь решить, выглядит следующим образом:
![equation](https://i.stack.imgur.com/FRd6V.png)
Проблема в том, что я получаю решение, которое больше не является радиально-симметричным, в частности симметриятеряется по осям, как вы можете видеть из выходного графика: ![Output Plot](https://i.stack.imgur.com/YZbEf.png)
Вот код:
double dx = 25. / ( N*1. ), dy = 25. / ( N*1. ), dkx = 2*pi/(N*dx), dky = 2*pi/(N*dy);//define steps in real and Fourier space
double Lx = N*dx, Ly = N*dy, Lkx = N*dkx, Lky = N*dky;//define box sides in real and Fourier space
int i, j, Nh = N/2 + 1;
double *inr, *in2r, *in2d;
fftw_complex *outr;
fftw_complex *outd;
fftw_plan rplan_forward;
fftw_plan dplan_backward;
fftw_plan rplan_backward;
for ( i = 0; i < N; i++ )
{
x[i] = dx*i - Lx/2.;
kx[i] = dkx*i - Lkx/2.;
y[i] = dy*i - Ly/2.;
ky[i] = dky*i - Lky/2.;
}
outd = (fftw_complex*)fftw_malloc ( sizeof ( fftw_complex ) * N * Nh );
inr = ( double * ) malloc ( sizeof ( double ) * N * N );
for ( i = 0; i < N; i++ ) //Initialize ine to rho
{
for ( j = 0; j < N; j++ )
{
inr[i*N+j] = rho[i*N+j] * pow( -1, i + j );
}
}
outr = (fftw_complex*)fftw_malloc ( sizeof ( fftw_complex ) * N * Nh );
rplan_forward = fftw_plan_dft_r2c_2d ( N, N, inr, outr, FFTW_ESTIMATE );
fftw_execute ( rplan_forward ); //fft rho
for ( i = 0; i < N; i++ ) //Evaluate d in Fourier Space according to Poisson eq
{
for ( j = 0; j < Nh; j++ )
{
outd[i*Nh+j][0] = g * outr[i*Nh+j][0] / ( kx[i]*kx[i] + ky[j]*ky[j] );
outd[i*Nh+j][1] = g * outr[i*Nh+j][1] / ( kx[i]*kx[i] + ky[j]*ky[j] );
}
}
outd[Nh*N/2+N/2][0] = 0.; //Avoid singularity at k = 0
outd[Nh*N/2+N/2][1] = 0.;
in2d = ( double * ) malloc ( sizeof ( double ) * N * N );
dplan_backward = fftw_plan_dft_c2r_2d ( N, N, outd, in2d, FFTW_ESTIMATE );
fftw_execute ( dplan_backward ); //Antitrasform d
in2r = ( double * ) malloc ( sizeof ( double ) * N * N );
rplan_backward = fftw_plan_dft_c2r_2d ( N, N, outr, in2r, FFTW_ESTIMATE );
fftw_execute ( rplan_backward ); //Antitrasform rho
for( i = 0; i < N; i++ )
{
for ( j = 0; j < N; j++ )
{
printf( " %le %le %le \n", x[i], y[j], in2d[i*N+j] * pow( -1, i + j ) / ( N*N*1. ) - in2d[0] / ( N*N*1. ) ); //print d in such a way that it is zero at the boundaries
}
}
fftw_destroy_plan ( rplan_forward );
fftw_destroy_plan ( dplan_backward );
fftw_destroy_plan ( rplan_backward );
fftw_free ( outd );
fftw_free ( inr );
fftw_free ( outr );
fftw_free ( in2d );
fftw_free ( in2r);
fftw_cleanup();
Обратите внимание, что я хотел бы получитьрешение, которое идет к нулю на границах.
Подскажите, пожалуйста, в чем проблема?У меня есть подозрение, что это просто численная проблема, но я не уверен в этом.
Здесь приведено увеличение границ (в частности, в области -12,5
![detail](https://i.stack.imgur.com/n2Bhn.png)