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} {−(∂x2∂2​+∂y2∂2​)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​=(b−a)/N、h2​=(d−c)/M 分别将 x x x 轴上的区间 [ a , b ] 、 y [a, b] 、 y [a,b]、y 轴上的区间 [ c , d ] [c, d] [c,d] 划分为 N 、 M N 、 M N、M 等分, 得 x i = a + i h 1 、 0 ⩽ i ⩽ N x_i=a+i h_1 、 0 \leqslant i \leqslant N xi​=a+ih1​、0⩽i⩽N 和 y j = c + j h 2 、 0 ⩽ j ⩽ M y_j=c+j h_2 、 0 \leqslant j \leqslant M yj​=c+jh2​、0⩽j⩽M 。再根据 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} −[∂x2∂2u(xi​,yj​)​+∂y2∂2u(xi​,yj​)​]=f(xi​,yj​),1⩽i⩽N−1,1⩽j⩽M−1(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} ∂x2∂2u(xi​,yj​)​=h12​1​[u(xi−1​,yj​)−2u(xi​,yj​)+u(xi+1​,yj​)]−12h12​​∂x4∂4u(ξij​,yj​)​,xi−1​<ξ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} ∂y2∂2u(xi​,yj​)​=h22​1​[u(xi​,yj−1​)−2u(xi​,yj​)+u(xi​,yj+1​)]−12h22​​∂y4∂4u(xi​,ηij​)​,yj−1​<ηij​<yj+1​​(2-19)
将以上两式代入式 ( 2 − 17 ) (2-17) (2−17), 忽略小量 O ( h 1 2 + h 2 2 ) O\left(h_1{ }^2+h_2{ }^2\right) O(h1​2+h2​2), 并使用简写 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} −h22​1​ui,j−1​−h12​1​ui−1,j​+2(h12​1​+h22​1​)ui,j​−h12​1​ui+1,j​−h22​1​ui,j+1​=f(xi​,yj​),1⩽i⩽N−1,1⩽j⩽M−1​(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​,…,uN−1,j​)T,0⩽j⩽M(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} Duj−1​+Cuj​+Duj+1​=fj​,1⩽j⩽M−1(2-22)
其中, 矩阵 C 、 D 、 \boldsymbol{C} 、 \boldsymbol{D} 、 C、D、 向量 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(h12​1​+h22​1​)−h12​1​​−h12​1​2(h12​1​+h22​1​)⋱​−h12​1​⋱−h12​1​​⋱2(h12​1​+h22​1​)−h12​1​​−h12​1​2(h12​1​+h22​1​)​ ​(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= ​−h22​1​​−h22​1​​⋱−h22​1​​−h22​1​​ ​,fj​= ​f(x1​,yj​)+h12​1​φ(x0​,yj​)f(x2​,yj​)⋮f(xN−2​,yj​)f(xN−1​,yj​)+h12​1​φ(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} ​CD​DC⋱​D⋱D​⋱CD​DC​ ​ ​u1​u2​⋮uM−2​uM−1​​ ​= ​f1​−Du0​f2​⋮fM−2​fM−1​−DuM​​ ​(2-25)
因此, 矩形 Ω \Omega Ω 上的二维泊松问题就转化为上面形如 A u = f \boldsymbol{A} \boldsymbol{u}=\boldsymbol{f} Au=f 的矩阵问题。对于这类问题, 最直接的解法就是先求 A \boldsymbol{A} A 的逆矩阵 A − 1 \boldsymbol{A}^{-1} A−1, 然后 u = A − 1 f \boldsymbol{u}=\boldsymbol{A}^{-1} \boldsymbol{f} u=A−1f 即可, 这在 Matlab 中可用左除 \ 实现。注意式 (2-22)只针对内结点, 所以 C 、 D \boldsymbol{C} 、 \boldsymbol{D} C、D 均是 N − 1 N-1 N−1 阶方阵, A \boldsymbol{A} A 是 ( N − 1 ) ( M − 1 ) (N-1)(M-1) (N−1)(M−1) 阶方 阵。下面给出一个实际例子。
{ − ( ∂ 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} ⎩ ⎨ ⎧​−(∂x2∂2​+∂y2∂2​)u=(π2−1)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<10⩽y⩽10<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 的非零元素分布情况。

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

  1. matlab二维谐振子,基于有限差分法求解的二维谐振子的MATLAB程序如下。哪位大神能帮我做个注明啊,完全看不懂啊,,急...

    基于有限差分法求解的二维谐振子的MATLAB程序如下.哪位大神能帮我做个注明啊,完全看不懂啊,,急0 ____丿呆呆丶2017.04.15浏览20次分享举报 tic clc clear L=20; W ...

  2. 二维方向图matlab程序,二维点源阵方向图,阵因子matlab

    10x10点源天线阵方向图的MATLAB程序 dx=0.01;%点源间距 f=1e10;%周期 c0=3e8;%波速 lam=c0/f; M=10; Theta=0:0.01*pi:pi; Phi=0 ...

  3. 如何写一个魔方二维动态还原MATLAB仿真程序

    之前文章写过一个魔方二维动态还原MATLAB程序,写得不怎么好,过于复杂,现在重新写了一个,用简单的方法编写MATLAB程序. 1.基础知识 了解魔方表示方法:魔方状态字符串,可以看我之前的文章. 了 ...

  4. matlab晶体能带,matlab平面波展开法的二维光子晶体能带研究+程序

    摘  要 :二维光子晶体可以作为对光子传输控制的新型材料.本文主要通过平面波展开法对二维光子晶体进行数值计算及其性质分析.首先我们介绍了二维光子晶体的基础概念.结构.介电性能等特性.然后基于麦克斯韦方 ...

  5. 泊松方程 matlab,MATLAB编程求解二维泊松方程

    <MATLAB编程求解二维泊松方程>由会员分享,可在线阅读,更多相关<MATLAB编程求解二维泊松方程(3页珍藏版)>请在人人文库网上搜索. 1. 真解 u=sin(pi*x) ...

  6. 二维泊松方程求解-SIP-最速下降法-共轭梯度

    1. 直接解法:LU分解 在前面的内容中曾经提到,使用有限差分或有限体积法通过隐式离散得到Aϕ=QA\phi=QAϕ=Q的求解形式,其中AAA为系数矩阵.在一定条件下,AAA能够通过因式分解为A=LU ...

  7. 微信扫描普通二维码进入小程序

    微信扫描普通二维码进入小程序的方法,和代码没有什么关系,主要是在小程序平台进行设置 1. 开发配置 开发 -- 开发管理 -- 开发设置 -- 扫普通链接二维码打开小程序 2. 配置规则 根据说明配置 ...

  8. AFEPack 使用 Tutorial(二):解带系数二维泊松方程

    AFEPack Step by Step Tutorial 2: solve Coefficient Poisson Equation Coefficient Poisson Equation 的源码 ...

  9. 扫描二维码进入小程序超详细过程

    项目场景: 提示:这里简述项目相关背景:二维码中的参数是文章的id.在微信公众号相关的配置在这就不说明了. 假设配置完成域名为:http://xiaobai.com?id=${id}. 下面主要讲述小 ...

最新文章

  1. 第25章 Pytorch 如何高效使用GPU
  2. php lang无效,详解 Go 中的不可变类型
  3. 你知道我们在等你吗?
  4. 【litrpa专题】首个rpa程序,使用litrpa采集百度地图地铁数据
  5. vue-router 动态路由匹配
  6. 如何对 Kubernetes 进行扩展
  7. 大数据---(3)金融数据架构
  8. 色彩搭配总是显得很乱?配色专辑把色彩简单化
  9. learn go ifelse
  10. init是一个自定义方法名
  11. MVC和MTV初步认识+django的一个简单应用(萌新交流互动,欢迎大家指出错误)
  12. 基于Android P,自定义Android开机动画的方法
  13. 计算机无法连接网络打印机,电脑无法连接网络打印机。怎么办?
  14. 利用NAS打造协同办公系统
  15. android 生成bks_Android 添加 证书(pem,crt,p12,bks,jks)到 keystore.bks
  16. STM32F407 FSMC驱动MT29F4G08A NAND FLASH源代码分享
  17. openssl 开发库下载集合
  18. 魅族便签导出,实践中
  19. 线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现
  20. ubuntu安装显卡驱动记录(未完待续)

热门文章

  1. SAP 详细解析在建工程转固定资产
  2. 第14周 oj 1 数组逆序
  3. spring boot文件下载加水印(pdf,word,pdf,照片,excel)
  4. 虹科分享|硬件加密U盘|居家办公的网络安全:远程员工可以采取的步骤
  5. 流氓软件反复安装怎么办,解决电脑流氓软件问题
  6. 「读书感悟系列」生命的礼物 · 关于爱、死亡及存在的意义
  7. 为什么负负得正,减负数的意义
  8. 财神爷商训---范蠡
  9. 远程桌面控制老家电脑进行修复和设置
  10. JZOJsenior2412.【NOI2005】瑰丽华尔兹