解释一维泊松求解器之间的区别

计算科学 有限差分 泊松 谱法
2021-12-03 05:59:05

在此处输入图像描述我比较了 2 种方法来解决一维泊松方程。一种是有限差分法,来自http://www.cs.berkeley.edu/~demmel/cs267/lecture24/lecture24.html的“Successive Overrelaxation” ;另一种方法是 FFT 的光谱法,它的速度要快得多。以下是我生成图片中解决方案的matlab/octave代码。显然,传统的有限差分法(中图)更容易接受!为什么 FFT 方法看起来像这样?FFT解决方案是否可以正确执行?谢谢!!

以下是我的matlab代码:::

clear all;

x=1:1000;

vort=exp(-(x-600).^2/50^2);% right hand side of poisson eq

% construct the wave number series, dx = 1 in this case
kx=(x-1);
jj=find(kx>500);
kx(jj)=kx(jj)-1000;
kx=2*pi/1000*kx;

subplot(311);plot(x,vort);title('rhs of Poisson eq','fontsize',20)

% ------------S.O.R solver----------

psi=zeros(1,1000);

for n=1:100
    for i=2:999

        r=(psi(i-1)+psi(i+1)-vort(i))*0.5-psi(i);
        psi(i)=psi(i)+1.2*r;

    end
end

subplot(312);plot(x,psi);title('Successive Overrelaxation','fontsize',20)

% ------ FFT solver -----%

slice=-fft(vort)./(kx.^2);

slice(1)=0;

subplot(313);plot(real(ifft(slice)));;title('FFT method','fontsize',20)
1个回答

首先,为了清楚起见,一些符号。我们正在谈论解决uxx=f(x). 所以u是解决方案和f是右手边。

是什么让您认为您的解决方案是正确的或不正确的?
要检查您的结果,只需计算解决方案的两个导数(使用有限差分或 FFT,任一个)并与f. 在你的例子中,f总是积极的,所以解决方案应该到处都是凹的。在这种情况下,它们与您的任何一个解决方案都不匹配。现在你需要弄清楚为什么。如果要比较两个解决方案,还应该使用一致的边界条件。您正在使用边界条件u(1)=u(1000)=0对于 SOR 解,但谱 (FFT) 解意味着周期性边界条件。

SOR 解显然在几个区间上是凹的,因为它没有收敛。这个问题的收敛速度非常慢,您可能需要几十万次 SOR 迭代,而不仅仅是 100 次。考虑到在 SOR 中,每次迭代时信息只能向左移动 1 个网格点,而您的域约为 1000 个点。显然 100 次迭代是不够的。

FFT 解意味着平滑、周期性的边界条件,但函数不可能是平滑的、周期性的并且总是向上凹的。由于您的右手边不是严格周期性的,因此您可能在边界附近也有一些小问题。我相信您的 FFT 方法是正确的(尽管您应该使用ifft(...,'symmetric')而不是real()确保真正的结果),但是问题不成立。您得到的解决方案不是预期的解决方案,而是错误分布在整个域中的解决方案。这就是为什么解在预计接近线性的地方是凹的。事实上,二阶导数的误差在整个域中是一致的,并且是一个常数差11000f(x)dx/10000.0886在您的解决方案的二阶导数中。这种转变(平均f) 在您设置时会丢失,slice(1)=0;并反映了以下事实:uxx必须为零才能获得平滑的周期性解。换句话说,为您添加任何常量值f对谱法中的解没有影响,因为该方法强制执行平滑周期性,这意味着导数的均值为零u.


作为参考,可以使用具有以下代码的直接求解器找到解决方案(具有二阶中心有限差分和零边界条件):

% Generate sparse matrix for the linear system:
i = [2:999, 2:999, 2:999, 1, 1000];
j = [1:998, 2:999, 3:1000, 1, 1000]; 
s = [ones(1,998), -2*ones(1,998), ones(1,998), 1, 1];
M = sparse(i,j,s);

% Generate right hand side:
x = (1:1000)';
rhs = [0; exp(-(x(2:999)-600).^2/50^2); 0];

% Solve:
y = M\rhs;

% Plot:
figure, plot(x,y)

应该是这样的:

泊松方程的解

请注意,除了在区间 [500, 700] 中,解近似线性,其中f具有最大值,所以u明显是凹起来的。