正方形領域
における Poisson 方程式の
Dirichlet 境界値問題
を差分法で解くには、.... 差分法でどういう連立1次方程式が導かれるかについては、 『Poisson方程式に対する差分解』 を見よ。
の場合に解くには、次のようなプログラムを用いれば良い。
| report_poisson.m |
% report_poisson.m
% 正方形領域で -△u=f, 同次Dirichlet境界値問題を解く
% 正方形の各辺を n 等分
function u = report_poisson(n)
h=1/n;
J=diag(ones(n-2,1),1)+diag(ones(n-2,1),-1);
Id=eye(n-1,n-1);
A=-4*kron(Id,Id)+kron(J,Id)+kron(Id,J);
% b_{ij}=-h^2 f(x_i,y_j)
b=-h*h*ones((n-1)*(n-1),1);
U=A\b;
u=zeros(n+1,n+1);
for j=1:n-1
u(2:n,j+1)=U((j-1)*(n-1)+1:j*(n-1));
end
%endfunction
|
このプログラムは、効率について無頓着な書き方をされているので、
程度しか解けない (
とすると、未知数の個数は約
万で、
小さいコンピューターで解くのは困難である)。
oyabun% octave GNU Octave, version 2.0.16 (i386-unknown-freebsd3.4). Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton. This is free software with ABSOLUTELY NO WARRANTY. For details, type `warranty'. octave:1> n=10; u=report_poisson(n); octave:2> x=0:1/n:1; y=x; contour(u,10,x,y); octave:3> mesh(x,y,u); octave:4> n=20; tic; u=report_poisson(n); toc ans = 1.1213 octave:5> x=0:1/n:1; y=x; contour(u,10,x,y); octave:6> mesh(x,y,u); octave:7> n=40; tic; u=report_poisson(n); toc ans = 16.870 octave:8> x=0:1/n:1; y=x; contour(u,10,x,y); octave:9> quit oyabun% |
係数行列の表現を、少し一般化して
と変更した (やはり http://nalab.mind.meiji.ac.jp/~mk/labo/text/poisson.pdf を見よ)。 それを元に書いたのが次の solve_poisson.m である。
| solve_poisson.m |
% solve_poisson.m --- 正方形領域における Poisson方程式 (2010/2/11)
function solve_poisson(nx,ny)
hx=1/nx;
hy=1/ny;
m=nx-1;
n=ny-1;
Im=eye(m,m);
In=eye(n,n);
Jm=diag(ones(m-1,1),1)+diag(ones(m-1,1),-1);
Jn=diag(ones(n-1,1),1)+diag(ones(n-1,1),-1);
Lx=(2*Im-Jm)/(hx*hx);
Ly=(2*In-Jn)/(hy*hy);
A=kron(Ly,Im)+kron(In,Lx);
f=ones(m*n,1);
U=zeros(m,n);
U(:)=A\f;
%
u=zeros(nx+1,ny+1);
u(2:nx,2:ny)=U;
%
x=0:1/nx:1;
y=0:1/ny:1;
%
colormap hsv
subplot(1,2,1);
mesh(x,y,u);
colorbar
%
subplot(1,2,2);
contour(x,y,u);
%
disp('saving graphs');
print -depsc2 solve_poisson.eps
|