2013-03-11 28 views
0

我正在求解泊松方程,並想繪製精確解與網格點數的誤差。我的代碼是:我想了解爲什麼這個計算的尺寸是錯誤的?

function [Ntot,err] = poisson(N) 


nx = N;    % Number of steps in space(x) 
ny = N;    % Number of steps in space(y)  
Ntot = nx*ny; 
niter = 1000;   % Number of iterations 
dx = 2/(nx-1);   % Width of space step(x) 
dy = 2/(ny-1);   % Width of space step(y) 
x = -1:dx:1;    % Range of x(-1,1) 
y = -1:dy:1;    % Range of y(-1,1) 
b = zeros(nx,ny);  
dn = zeros(nx,ny);  


% Initial Conditions 
d = zeros(nx,ny);     
u = zeros(nx,ny); 

% Boundary conditions 
d(:,1) = 0; 
d(:,ny) = 0; 
d(1,:) = 0;     
d(nx,:) = 0; 


% Source term 
b(round(ny/4),round(nx/4)) = 3000; 
b(round(ny*3/4),round(nx*3/4)) = -3000; 


i = 2:nx-1; 
j = 2:ny-1; 

% 5-point difference (Explicit) 
for it = 1:niter 
    dn = d; 
    d(i,j) = ((dy^2*(dn(i + 1,j) + dn(i - 1,j))) + (dx^2*(dn(i,j + 1) + dn(i,j - 1))) - (b(i,j)*dx^2*dy*2))/(2*(dx^2 + dy^2)); 
    u(i,j) = 2*pi*pi*sin(pi*i).*sin(pi*j); 

    % Boundary conditions 
    d(:,1) = 0; 
    d(:,ny) = 0; 
    d(1,:) = 0;     
    d(nx,:) = 0; 
end 


%  
% 
% err = abs(u - d); 

我得到的錯誤是:

下標的轉讓尺寸不匹配。

錯誤泊松(39行)

u(i,j) = 2*pi*pi*sin(pi*i).*sin(pi*j); 

我不知道爲什麼它不是在每個網格點計算ü。我試圖把它從for循環中取出,但這沒有幫助。任何想法,將不勝感激。

回答

0

這是因爲ij均爲1逐(N-2)的載體,所以u(i, j)是一個(N-2)-by-(N-2)矩陣。然而,表達式2*pi*pi*sin(pi*i).*sin(pi*j)是1-by-(N-2)載體
尺寸顯然不匹配,因此錯誤。

我不知道,但我猜你的意思是要做到以下幾點:

u(i,j) = 2 * pi * pi * bsxfun(@times, sin(pi * i), sin(pi * j)'); 

或者,你可以使用基本的矩陣乘法來產生(N-2)-by-( N-2)像這樣:

u(i, j) = 2 * pi * pi * sin(pi * i') * sin(pi * j); %// Note the transpose 

PS:it is recommended not to use "i" and "j" as names for variables

相關問題