有限差分法-二维泊松方程及其Matlab程序实现

2.2 偏微分方程的差分解法

2.2.1 二维泊松方程

考虑区域 Ω \Omega Ω 上的二维泊松问题:

{ − ( ∂ 2 ∂ x 2 + ∂ 2 ∂ y 2 ) u = f ( x , y ) , ( x , y ) ∈ Ω u ∣ ∂ Ω = φ ( x , y ) , (2-16) \left\{\begin{array}{l} -\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right) u=f(x, y), \quad(x, y) \in \Omega \\ \left.u\right|_{\partial \Omega}=\varphi(x, y), \end{array}\right.\tag{2-16} { (x22+y22)u=f(x,y),(x,y)ΩuΩ=φ(x,y),(2-16)
其中, ∂ Ω \partial \Omega Ω 为区域 Ω \Omega Ω 的边界, f ( x , y ) f(x, y) f(x,y) φ ( x , y ) \varphi(x, y) φ(x,y) 为已知函数。 u ∣ ∂ Ω = φ ( x , y ) u\mid_{\partial \Omega}=\varphi(x, y) uΩ=φ(x,y) 描述了函数 u u u 在 边界上的取值, 即所谓的边界条件。为简单起见, 这里仅讨论 Ω \Omega Ω 为矩形的情况, 即 a < x < b a<x<b a<x<b, c < y < d c<y<d c<y<d 。首先, 用间隔 h 1 = ( b − a ) / N 、 h 2 = ( d − c ) / M h_1=(b-a) / N 、 h_2=(d-c) / M h1=(ba)/Nh2=(dc)/M 分别将 x x x 轴上的区间 [ a , b ] 、 y [a, b] 、 y [a,b]y 轴上的区间 [ c , d ] [c, d] [c,d] 划分为 N 、 M N 、 M NM 等分, 得 x i = a + i h 1 、 0 ⩽ i ⩽ N x_i=a+i h_1 、 0 \leqslant i \leqslant N xi=a+ih10iN y j = c + j h 2 、 0 ⩽ j ⩽ M y_j=c+j h_2 、 0 \leqslant j \leqslant M yj=c+jh20jM 。再根据 x i x_i xi y j y_j yj 对矩形 区域进行网格剖分, 如下图所示。横线与坚线的交点就是网格结点, 称位于边界 ∂ Ω \partial \Omega Ω 上的 结点为边界结点, 其余结点为内结点。
矩形区域的网格剖分

在内结点处考虑泊松问题:
− [ ∂ 2 u ( x i , y j ) ∂ x 2 + ∂ 2 u ( x i , y j ) ∂ y 2 ] = f ( x i , y j ) , 1 ⩽ i ⩽ N − 1 , 1 ⩽ j ⩽ M − 1 (2-17) -\left[\frac{\partial^2 u\left(x_i, y_j\right)}{\partial x^2}+\frac{\partial^2 u\left(x_i, y_j\right)}{\partial y^2}\right]=f\left(x_i, y_j\right), \quad 1 \leqslant i \leqslant N-1, \quad 1 \leqslant j \leqslant M-1\tag{2-17} [x22u(xi,yj)+y22u(xi,yj)]=f(xi,yj),1iN1,1jM1(2-17)
由泰勒公式, 有:
∂ 2 u ( x i , y j ) ∂ x 2 = 1 h 1 2 [ u ( x i − 1 , y j ) − 2 u ( x i , y j ) + u ( x i + 1 , y j ) ] − h 1 2 12 ∂ 4 u ( ξ i j , y j ) ∂ x 4 , x i − 1 < ξ i j < x i + 1 (2-18) \begin{gathered} \frac{\partial^2 u\left(x_i, y_j\right)}{\partial x^2}=\frac{1}{h_1^2}\left[u\left(x_{i-1}, y_j\right)-2 u\left(x_i, y_j\right)+u\left(x_{i+1}, y_j\right)\right]-\frac{h_1^2}{12} \frac{\partial^4 u\left(\xi_{i j}, y_j\right)}{\partial x^4}, \\ x_{i-1}<\xi_{i j}<x_{i+1} \end{gathered}\tag{2-18} x22u(xi,yj)=h121[u(xi1,yj)2u(xi,yj)+u(xi+1,yj)]12h12x44u(ξij,yj),xi1<ξij<xi+1(2-18)
∂ 2 u ( x i , y j ) ∂ y 2 = 1 h 2 2 [ u ( x i , y j − 1 ) − 2 u ( x i , y j ) + u ( x i , y j + 1 ) ] − h 2 2 12 ∂ 4 u ( x i , η i j ) ∂ y 4 , y j − 1 < η i j < y j + 1 (2-19) \begin{gathered} \frac{\partial^2 u\left(x_i, y_j\right)}{\partial y^2}=\frac{1}{h_2^2}\left[u\left(x_i, y_{j-1}\right)-2 u\left(x_i, y_j\right)+u\left(x_i, y_{j+1}\right)\right]-\frac{h_2^2}{12} \frac{\partial^4 u\left(x_i, \eta_{i j}\right)}{\partial y^4}, \\ y_{j-1}<\eta_{i j}<y_{j+1} \end{gathered}\tag{2-19} y22u(xi,yj)=h221[u(xi,yj1)2u(xi,yj)+u(xi,yj+1)]12h22y44u(xi,ηij),yj1<ηij<yj+1(2-19)
将以上两式代入式 ( 2 − 17 ) (2-17) (217), 忽略小量 O ( h 1 2 + h 2 2 ) O\left(h_1{ }^2+h_2{ }^2\right) O(h12+h22), 并使用简写 u i j = u ( x i , y j ) u_{i j}=u\left(x_i, y_j\right) uij=u(xi,yj), 得到差分 格式 (2-20)。所谓差分格式, 就是用几个相邻数值点的差商来替代方程中的导数或偏导数 的近似算法。
− 1 h 2 2 u i , j − 1 − 1 h 1 2 u i − 1 , j + 2 ( 1 h 1 2 + 1 h 2 2 ) u i , j − 1 h 1 2 u i + 1 , j − 1 h 2 2 u i , j + 1 = f ( x i , y j ) , 1 ⩽ i ⩽ N − 1 , 1 ⩽ j ⩽ M − 1 (2-20) \begin{gathered} -\frac{1}{h_2^2} u_{i, j-1}-\frac{1}{h_1^2} u_{i-1, j}+2\left(\frac{1}{h_1^2}+\frac{1}{h_2^2}\right) u_{i, j}-\frac{1}{h_1^2} u_{i+1, j}-\frac{1}{h_2^2} u_{i, j+1}=f\left(x_i, y_j\right), \\ 1 \leqslant i \leqslant N-1, \quad 1 \leqslant j \leqslant M-1 \end{gathered}\tag{2-20} h221ui,j1h121ui1,j+2(h121+h221)ui,jh121ui+1,jh221ui,j+1=f(xi,yj),1iN1,1jM1(2-20)
先定义向量 u j : \boldsymbol{u}_j: uj:
u j = ( u 1 j , u 2 j , … , u N − 1 , j ) T , 0 ⩽ j ⩽ M (2-21) \boldsymbol{u}_j=\left(u_{1 j}, \quad u_{2 j}, \quad \ldots, \quad u_{N-1, j}\right)^{\mathrm{T}}, \quad 0 \leqslant j \leqslant M\tag{2-21} uj=(u1j,u2j,,uN1,j)T,0jM(2-21)
再将差分格式 (2-20) 写为矩阵形式:
D u j − 1 + C u j + D u j + 1 = f j , 1 ⩽ j ⩽ M − 1 (2-22) \boldsymbol{D} \boldsymbol{u}_{j-1}+\boldsymbol{C} \boldsymbol{u}_j+\boldsymbol{D} \boldsymbol{u}_{j+1}=\boldsymbol{f}_j, \quad 1 \leqslant j \leqslant M-1\tag{2-22} Duj1+Cuj+Duj+1=fj,1jM1(2-22)
其中, 矩阵 C 、 D 、 \boldsymbol{C} 、 \boldsymbol{D} 、 CD 向量 f j \boldsymbol{f}_j fj 的定义如下, 注意向量 f j \boldsymbol{f}_j fj 的首尾元素已包含了 x = a x=a x=a x = b x=b x=b 处的边界条件。

C = ( 2 ( 1 h 1 2 + 1 h 2 2 ) − 1 h 1 2 − 1 h 1 2 2 ( 1 h 1 2 + 1 h 2 2 ) − 1 h 1 2 ⋱ ⋱ ⋱ − 1 h 1 2 2 ( 1 h 1 2 + 1 h 2 2 ) − 1 h 1 2 − 1 h 1 2 2 ( 1 h 1 2 + 1 h 2 2 ) ) (2-23) \boldsymbol{C}=\left(\begin{array}{ccccc} 2\left(\frac{1}{h_1^2}+\frac{1}{h_2^2}\right) &-\frac{1}{h_1^2} & & & \\ -\frac{1}{h_1^2} & 2\left(\frac{1}{h_1^2}+\frac{1}{h_2^2}\right) & -\frac{1}{h_1^2} & & \\ & \ddots & \ddots & \ddots & \\ & & -\frac{1}{h_1^2} & 2\left(\frac{1}{h_1^2}+\frac{1}{h_2^2}\right) & -\frac{1}{h_1^2} \\ & & & -\frac{1}{h_1^2} & 2\left(\frac{1}{h_1^2}+\frac{1}{h_2^2}\right) \end{array}\right)\tag{2-23} C= 2(h121+h221)h121h1212(h121+h221)h121h1212(h121+h221)h121h1212(h121+h221) (2-23)
D = ( − 1 h 2 2 − 1 h 2 2 ⋱ − 1 h 2 2 − 1 h 2 2 ) , f j = ( f ( x 1 , y j ) + 1 h 1 2 φ ( x 0 , y j ) f ( x 2 , y j ) ⋮ f ( x N − 2 , y j ) f ( x N − 1 , y j ) + 1 h 1 2 φ ( x N , y j ) ) (2-24) \boldsymbol{D}=\left(\begin{array}{cccc} -\frac{1}{h_2^2} & & & \\ & -\frac{1}{h_2^2} & & \\ & & \ddots & \\ & & -\frac{1}{h_2^2} & \\ & & & -\frac{1}{h_2^2} \end{array}\right), \boldsymbol{f}_j=\left(\begin{array}{c} f\left(x_1, y_j\right)+\frac{1}{h_1^2} \varphi\left(x_0, y_j\right) \\ f\left(x_2, y_j\right) \\ \vdots \\ f\left(x_{N-2}, y_j\right) \\ f\left(x_{N-1}, y_j\right)+\frac{1}{h_1^2} \varphi\left(x_N, y_j\right) \end{array}\right)\tag{2-24} D= h221h221h221h221 ,fj= f(x1,yj)+h121φ(x0,yj)f(x2,yj)f(xN2,yj)f(xN1,yj)+h121φ(xN,yj) (2-24)
式 (2-22) 还可以进一步写成如下的矩阵形式, 注意等号右边向量的首尾元素加入了 y = c y=c y=c y = d y=d y=d 处的边界条件。

( C D D C D ⋱ ⋱ ⋱ D C D D C ) ( u 1 u 2 ⋮ u M − 2 u M − 1 ) = ( f 1 − D u 0 f 2 ⋮ f M − 2 f M − 1 − D u M ) (2-25) \left(\begin{array}{ccccc} C & D & & & \\ D & C & D & & \\ & \ddots & \ddots & \ddots & \\ & & D & C & D \\ & & & D & C \end{array}\right)\left(\begin{array}{c} \boldsymbol{u}_1 \\ \boldsymbol{u}_2 \\ \vdots \\ \boldsymbol{u}_{M-2} \\ \boldsymbol{u}_{M-1} \end{array}\right)=\left(\begin{array}{c} \boldsymbol{f}_1-\boldsymbol{D} \boldsymbol{u}_0 \\ \boldsymbol{f}_2 \\ \vdots \\ \boldsymbol{f}_{M-2} \\ \boldsymbol{f}_{M-1}-\boldsymbol{D} \boldsymbol{u}_M \end{array}\right)\tag{2-25} CDDCDDCDDC u1u2uM2uM1 = f1Du0f2fM2fM1DuM (2-25)
因此, 矩形 Ω \Omega Ω 上的二维泊松问题就转化为上面形如 A u = f \boldsymbol{A} \boldsymbol{u}=\boldsymbol{f} Au=f 的矩阵问题。对于这类问题, 最直接的解法就是先求 A \boldsymbol{A} A 的逆矩阵 A − 1 \boldsymbol{A}^{-1} A1, 然后 u = A − 1 f \boldsymbol{u}=\boldsymbol{A}^{-1} \boldsymbol{f} u=A1f 即可, 这在 Matlab 中可用左除 \ 实现。注意式 (2-22)只针对内结点, 所以 C 、 D \boldsymbol{C} 、 \boldsymbol{D} CD 均是 N − 1 N-1 N1 阶方阵, A \boldsymbol{A} A ( N − 1 ) ( M − 1 ) (N-1)(M-1) (N1)(M1) 阶方 阵。下面给出一个实际例子。
{ − ( ∂ 2 ∂ x 2 + ∂ 2 ∂ y 2 ) u = ( π 2 − 1 ) e x sin ⁡ ( π y ) , 0 < x < 2 , 0 < y < 1 u ( 0 , y ) = sin ⁡ ( π y ) , u ( 2 , y ) = e 2 sin ⁡ ( π y ) , 0 ⩽ y ⩽ 1 u ( x , 0 ) = 0 , u ( x , 1 ) = 0 , 0 < x < 2 (2-26) \left\{\begin{array}{lll} -\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right) u=\left(\pi^2-1\right) \mathrm{e}^x \sin (\pi y), & 0<x<2, & 0<y<1 \\ u(0, y)=\sin (\pi y), & u(2, y)=\mathrm{e}^2 \sin (\pi y), & 0 \leqslant y \leqslant 1 \\ u(x, 0)=0, & u(x, 1)=0, & 0<x<2 \end{array}\right.\tag{2-26} (x22+y22)u=(π21)exsin(πy),u(0,y)=sin(πy),u(x,0)=0,0<x<2,u(2,y)=e2sin(πy),u(x,1)=0,0<y<10y10<x<2(2-26)
根据式 (2-25) 求解这个泊松问题, 代码如下:

主程序代码如下

clear; close all;
%生成网格上的坐标
h=0.1; x=[0:h:2]'; y=[0:h:1]';
N=length(x)-1; M=length(y)-1;
[X,Y]=meshgrid(x,y);
%解析解
u_analytical=exp(X).*sin(pi*Y);
X=X(2:M,2:N); Y=Y(2:M,2:N);
%生成f(x,y)的矩阵
f=(pi^2-1)*exp(X).*sin(pi*Y);
f(:,1)=f(:,1)+sin(pi*y(2:M))/h^2;
f(:,end)=f(:,end)+exp(2)*sin(pi*y(2:M))/h^2;
%构造矩阵D、C、A
e=ones(N-1,1);
C=1/h^2*spdiags([-e 4*e -e],[-1 0 1],N-1,N-1);
D=-1/h^2*eye(N-1);
e=ones(M-1,1);
A=kron(eye(M-1),C)+kron(spdiags([e e],[-1 1],M-1,M-1),D);
%左除求解
f=f'; u=zeros(M+1,N+1);
u(2:M,2:N)=reshape(A\f(:),N-1,M-1)';
u(:,1)=sin(pi*y); u(:,end)=exp(2)*sin(pi*y);
%画图
figure(1), spy(A,5)
figure(2), subplot(2,2,1), mesh(x,y,u)
xlabel x, ylabel y, zlabel u
subplot(2,2,2), mesh(x,y,u-u_analytical)
axis([0 2 0 1 0 0.04])
xlabel x, ylabel y, zlabel Error

程序输出结果如图所示, 左图为 h 1 = h 2 = 0.1 h_1=h_2=0.1 h1=h2=0.1 时泊松问题 (2-26) 的数值解, 右图为数值解与解析解 u = e x sin ⁡ ( π y ) u=\mathrm{e}^x \sin (\pi y) u=exsin(πy) 之间的误差。当然, 进一步缩小 h 1 h_1 h1 h 2 h_2 h2 会以增加运算量为代价降低这个误差。
数值结果 (左图) 和误差 (右图)

为了使读者产生直观的理解, 下图显示了 h 1 = h 2 = 0.2 h_1=h_2=0.2 h1=h2=0.2 时方阵 A \boldsymbol{A} A 的非零元素分布情况。
方阵A的非零元素分布

猜你喜欢

转载自blog.csdn.net/qq_42818403/article/details/129280788