极坐标形式的 Poisson 方程差分方法的 MATLAB 编程实现。
极坐标形式的 Poisson 方程
其中 $r=\sqrt{x^{2}+y^{2}},~\tan \theta =y / x$, $r \theta$ 平面半带形域 $\{0 \leqslant r < \infty, 0 \leqslant \theta \leqslant 2\pi \}$.
方程的系数于 $r=0$ 处奇异, 因此只当 $r>0$ 时有意义。在 $r=0$ 需补充 $u$ 为光滑的条件 (原点是可去奇点). 由 $u(0, \theta)=u(r, \theta)-r u_{r}(r, \theta)+O(r^{2})$, $r \rightarrow 0$, 则知
差分格式
对变量 $r, \theta$ 分别取等步长 $h_r$ 和 $h_{\theta}$. 令
则半带形域的网格节点为 $(r_i,\theta_j)$, 它们在 $r\theta$ 平面上的分布如图
差分方程:
下面是关于点 $(r_0, \theta_{j})$ 的差分方程
这样就得到 $N~(i=0,1,\cdots,N-1)$ 个方程的方程组.
注意: 实际计算时, 取 $(N+h_r/2)$ 为边界比较合适.
数值例子 1
单位圆上的 Poisson 方程边值问题:
方程的真解:
差分格式推导:
计算数值解
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 44
|
clear all; close all; N=50; M=100; dr=1/(N+1/2); dthe=2*pi/M; r=(dr/2:dr:1)'; the=(dthe:dthe:2*pi)';
[The,R]=meshgrid(the,r);
f=ones(M,N);
e=[2/dr^2+8/(dr^2*dthe^2);(2./(dthe^2*r(2:N).^2)+2/dr^2)]; e1=[-2/dr^2;-(r(2:N-1)+dr/2)./(dr^2*r(2:N-1))]; e2=-(r(2:N)-dr/2)./(dr^2*r(2:N)); C=diag(e)+diag(e1,1)+diag(e2,-1); D=diag([-4/(dr^2*dthe^2);-1./(dthe^2*r(2:N).^2)]); E=diag([-4/(dr^2*dthe^2);-1./(dthe^2*r(2:N).^2)]); A=kron(eye(M),C)+kron(diag(ones(M-1,1),1)+diag(1,1-M),D)... +kron(diag(ones(M-1,1),-1)+diag(1,M-1),E);
f=f'; uh=reshape(A\f(:),N,M); un=[uh;zeros(1,M)]; ue=(1-R.^2)/4;
Err=abs(un-ue);
MaxErr=max(max(abs(un-ue)))
[X,Y] = pol2cart(The,R); mesh(X,Y,un) set(gca,'fontsize',12) xlabel('x','fontsize', 16) ylabel('y','fontsize',16) zlabel('u','fontsize',16,'Rotation',0)
|
输出结果
当我取不同的步长 $h_r$, 误差总是这么小, 是解的性质太好还是其他方面有问题, 还值得思考.
数值例子 2
单位圆上的 Poisson 方程边值问题:
方程的真解:
计算数值解
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 44 45 46 47 48 49 50 51 52
|
clear all; close all; N=50; M=100; dr=1/(N+1/2);
dthe=2*pi/M; r=(dr/2:dr:1)'; the=(0:dthe:2*pi)';
[The,R]=meshgrid(the,r);
The1=The(1:N,2:end); R1=R(1:N,2:end); f=2*R1.*(sin(The1)+cos(The1)); f=f';
e=[2/dr^2+8/(dr^2*dthe^2);(2./(dthe^2*r(2:N).^2)+2/dr^2)]; e1=[-2/dr^2;-(r(2:N-1)+dr/2)./(dr^2*r(2:N-1))]; e2=-(r(2:N)-dr/2)./(dr^2*r(2:N)); C=diag(e)+diag(e1,1)+diag(e2,-1); D=diag([-4/(dr^2*dthe^2);-1./(dthe^2*r(2:N).^2)]); E=diag([-4/(dr^2*dthe^2);-1./(dthe^2*r(2:N).^2)]); A=kron(eye(M),C)+kron(diag(ones(M-1,1),1)+diag(1,1-M),D)... +kron(diag(ones(M-1,1),-1)+diag(1,M-1),E);
f=f';
uh=reshape(A\f(:),N,M); un=[uh;zeros(1,M)]; un=[un(:,end),un]; ue=(1-R.^2).*R.*(sin(The)+cos(The))/4;
Err=abs(un(1:N,2:end)-ue(1:N,2:end));
MaxErr=max(max(abs(un-ue)))
[X,Y] = pol2cart(The,R); mesh(X,Y,ue) set(gca,'fontsize',12) xlabel('x','fontsize', 16) ylabel('y','fontsize',16) zlabel('u','fontsize',16) view(36,24)
|
参考书籍