有限差分法的Matlab程序(椭圆型方程)
泊松方程的有限差分法的MATLAB实现

泊松方程的有限差分法的MATLAB实现作者:冯立伟徐涛屈福志来源:《电脑知识与技术》2017年第13期摘要:泊松方程是物理及工程应用领域中一类非常重要的方程,研究其数值求解方法具有重要意义。
给出了使用有限差分法求解泊松方程的计算方法,并讨论了使用MATLAB编写计算程序,使用数值算例和静电场实例进行了数值实验,实验结果与理论一致,检验了算法的有效性。
关键词:泊松方程;五点差分格式;有限差分法中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)13-0233-031概述物理过程,都可用椭圆型方程来描述。
其中最典型的方程是泊松(Poisson)方程。
传热学中带有稳定热源或内部无热源的稳定温度场的温度分布、流体动力学中不可压缩流体的稳定无旋流动、弹性力学中平衡问题及电磁学中静电场的电势等均满足泊松方程,泊松方程也是数值网格生成技术所遵循的基本方程。
因此,研究其数值求解方法具有重要意义。
MATLAB是目前应用最广泛的科学和工程计算软件。
MATLAB基于矩阵运算,具有强大数值运算能力,是方便实用、功能强大的数学软件;同时,MATLAB具有强大的图形绘制功能,用户只需提供绘图数据和指定绘图方式,用很少的程序指令就可得到将计算结果转化为直观、形象的图像。
使用MAT-LAB求解微分方程已有大量的研究。
因此,近些年来,越来越多的人开始使用MATLAB来求解泊松方程。
利用MAT-LAB强大的数值计算能力和图形绘制技术,可以实现使用差分法求解泊松方程并绘制出数值解的二维、三维图像,从而可以更好地理解泊松方程解的物理意义。
本文讨论使用差分法通过MATLAB编程求解二维矩形区域上的泊松方程,并使用两个算例进行检验和对结果进行分析。
边界条件为将未知解函数在内部节点上的值按行排列,组成解向量为:3差分格式的求解为了便于使用MATLAB编写程序,将差分方程转化为矩阵形式:4数值实验算例1:为了分析和比较差分格式在不同步长下的结果,使用2范数意义下的绝对误差和相对误差作为评价指标,表1给出了步长h=0.01取不同值的绝对误差和相对误差从表1可看出随着网格步长h的减小数值解的绝对误差和相对误差在变小。
椭圆型方程

§1
差分逼近的基本概念
考虑二阶微分方程边值问题
d 2u Lu 2 qu f , a x b, dx u (a) , u (b) , (1.1) (1.2)
其中 q,f 为 [ a , b ] 上的连续函数, q 0, , 为给定常数. 将其分成等分,分点为
称
uh 收敛到边值问题的解 u .
对于差分方程
Lhvi fi , i 1, 2,3,L , N 1,
定义1.3
v0 vN 0 , 如果存在与网格 I h 及右端 fh 无关的常数
数 M 和 h0 , 使 || vh || M || f h ||R ,
0 h h0
称差分方程关于右端稳定.
第二章
椭圆形方程的有限差分法
有限差分法和有限元方法是解偏微分方程的两种主要数值
方法.
有限差分法:从定解问题的微分或积分形式出发,用数值 微商或数值积分导出相应的线性代数方程组. 有限元方法:从定解问题的変分形式出发,用RitzGalerkin 方法导出相应的线性代数方程组,但基函数要按
特定方式选取.
取 x(1) x0 a, x(2) x1 , 得
2
(2.9) (2.10)
W (a) W ( x1 ) 2 qudx
d2 du hi 1 hi dx 2 ( p dx ) 12 i
d 3u 2 p O ( h ) dx 3 i
于是得逼近方程 (2.1)~(2.2) 的差分方程:
ui 1 ui ui ui 1 2 p 1 Lhui pi 1 i h h h h i i 1 i 1 i 2 2 i i 1, 2,, N 1 ui 1 ui qiui fi , hi hi 1 u0 , uN
差分法求解偏微分方程MAAB

南京理工大学课程考核论文课程名称:高等数值分析论文题目:有限差分法求解偏微分方程姓名:罗晨学号:成绩:有限差分法求解偏微分方程一、主要内容1.有限差分法求解偏微分方程,偏微分方程如一般形式的一维抛物线型方程:具体求解的偏微分方程如下:2.推导五种差分格式、截断误差并分析其稳定性;3.编写MATLAB程序实现五种差分格式对偏微分方程的求解及误差分析;4.结论及完成本次实验报告的感想。
二、推导几种差分格式的过程:有限差分法(finite-differencemethods )是一种数值方法通过有限个微分方程近似求导从而寻求微分方程的近似解。
有限差分法的基本思想是把连续的定解区域用有限个离散点构成的网格来代替;把连续定解区域上的连续变量的函数用在网格上定义的离散变量函数来近似;把原方程和定解条件中的微商用差商来近似,积分用积分和来近似,于是原微分方程和定解条件就近似地代之以代数方程组,即有限差分方程组,解此方程组就可以得到原问题在离散点上的近似解。
推导差分方程的过程中需要用到的泰勒展开公式如下:()2100000000()()()()()()()......()(())1!2!!n n n f x f x f x f x f x x x x x x x o x x n +'''=+-+-++-+-(2-1)求解区域的网格划分步长参数如下:11k k k kt t x x h τ++-=⎧⎨-=⎩(2-2) 2.1古典显格式2.1.1古典显格式的推导由泰勒展开公式将(,)u x t 对时间展开得2,(,)(,)()()(())i i k i k k k uu x t u x t t t o t t t∂=+-+-∂(2-3) 当1k t t +=时有21,112,(,)(,)()()(())(,)()()i k i k i k k k k k i k i k uu x t u x t t t o t t tuu x t o tττ+++∂=+-+-∂∂=+⋅+∂(2-4)得到对时间的一阶偏导数1,(,)(,)()=()i k i k i k u x t u x t uo t ττ+-∂+∂(2-5) 由泰勒展开公式将(,)u x t 对位置展开得223,,21(,)(,)()()()()(())2!k i k i k i i k i i u uu x t u x t x x x x o x x x x∂∂=+-+-+-∂∂(2-6)当11i i x x x x +-==和时,代入式(2-6)得2231,1,1122231,1,1121(,)(,)()()()()(())2!1(,)(,)()()()()(())2!i k i k i k i i i k i i i i i k i k i k i i i k i i i iu u u x t u x t x x x x o x x x xu u u x t u x t x x x x o x x x x ++++----⎧∂∂=+-+-+-⎪⎪∂∂⎨∂∂⎪=+-+-+-⎪∂∂⎩(2-7) 因为1k k x x h +-=,代入上式得2231,,22231,,21(,)(,)()()()2!1(,)(,)()()()2!i k i k i k i k i k i k i k i ku u u x t u x t h h o h x xu u u x t u x t h h o h x x +-⎧∂∂=+⋅+⋅+⎪⎪∂∂⎨∂∂⎪=-⋅+⋅+⎪∂∂⎩(2-8) 得到对位置的二阶偏导数2211,22(,)2(,)(,)()()i k i k i k i k u x t u x t u x t uo h x h+--+∂=+∂(2-9) 将式(2-5)、(2-9)代入一般形式的抛物线型偏微分方程得(2-10)为了方便我们可以将式(2-10)写成11122k kk k k k i i i i i i u u u u u f h ατ++-⎡⎤--+-=⎢⎥⎣⎦(2-11) ()11122k k k k k k i i i i i i u u uu u f hτατ++----+=(2-12)最后得到古典显格式的差分格式为()111(12)k k k k k i i i i i u ra u r u u f ατ++-=-+++(2-13)2r hτ=其中,古典显格式的差分格式的截断误差是2()o h τ+。
matlab有限差分法

matlab有限差分法一、前言Matlab是一种广泛应用于科学计算和工程领域的计算机软件,它具有简单易学、功能强大、易于编程等优点。
有限差分法(Finite Difference Method)是一种常用的数值解法,它将微分方程转化为差分方程,通过对差分方程进行离散化求解,得到微分方程的数值解。
本文将介绍如何使用Matlab实现有限差分法。
二、有限差分法基础1. 有限差分法原理有限差分法是一种通过将微分方程转化为离散形式来求解微分方程的数值方法。
其基本思想是将求解区域进行网格划分,然后在每个网格点上进行逼近。
假设要求解一个二阶常微分方程:$$y''(x)=f(x,y(x),y'(x))$$则可以将其转化为离散形式:$$\frac{y_{i+1}-2y_i+y_{i-1}}{h^2}=f(x_i,y_i,y'_i)$$其中$h$为网格步长,$y_i$表示在$x_i$处的函数值。
2. 一维情况下的有限差分法对于一维情况下的常微分方程:$$\frac{d^2 y}{dx^2}=f(x,y,y')$$可以使用中心差分法进行离散化:$$\frac{y_{i+1}-2y_i+y_{i-1}}{h^2}=f(x_i,y_i,y'_i)$$这个方程可以写成矩阵形式:$$A\vec{y}=\vec{b}$$其中$A$为系数矩阵,$\vec{y}$为函数值向量,$\vec{b}$为右端项向量。
三、Matlab实现有限差分法1. 一维情况下的有限差分法假设要求解的方程为:$$\frac{d^2 y}{dx^2}=-\sin(x)$$首先需要确定求解区域和网格步长。
在本例中,我们将求解区域设为$[0,2\pi]$,网格步长$h=0.01$。
则可以通过以下代码生成网格:```matlabx = 0:0.01:2*pi;```接下来需要构造系数矩阵和右端项向量。
根据上面的公式,系数矩阵应该是一个三对角矩阵,可以通过以下代码生成:```matlabn = length(x)-2;A = spdiags([-ones(n,1), 2*ones(n,1), -ones(n,1)], [-1 0 1], n, n); ```其中`spdiags`函数用于生成一个稀疏矩阵。
有限差分法的Matlab程序

有限差分法的M a t l a b程序有限差分法的Matlab程序(椭圆型方程)function FD_PDE(fun,gun,a,b,c,d)% 用有限差分法求解矩形域上的Poisson方程tol=10^(-6); % 误差界N=1000; % 最大迭代次数n=20; % x轴方向的网格数m=20; % y轴方向的网格数h=(b-a)/n; % x轴方向的步长l=(d-c)/m; % y轴方向的步长for i=1:n-1x(i)=a+i*h;end % 定义网格点坐标for j=1:m-1y(j)=c+j*l;end % 定义网格点坐标u=zeros(n-1,m-1); %对u赋初值% 下面定义几个参数r=h^2/l^2;s=2*(1+r);k=1;% 应用Gauss-Seidel法求解差分方程while k<=N% 对靠近上边界的网格点进行处理% 对左上角的网格点进行处理z=(-h^2*fun(x(1),y(m-1))+gun(a,y(m-1))+r*gun(x(1),d)+r*u(1,m-2)+u(2,m-1))/s; norm=abs(z-u(1,m-1));u(1,m-1)=z;% 对靠近上边界的除第一点和最后点外网格点进行处理for i=2:n-2z=(-h^2*fun(x(i),y(m-1))+r*gun(x(i),d)+r*u(i,m-2)+u(i+1,m-1)+u(i-1,m-1))/s;if abs(u(i,m-1)-z)>norm;norm=abs(u(i,m-1)-z);endu(i,m-1)=z;end% 对右上角的网格点进行处理z=(-h^2*fun(x(n-1),y(m-1))+gun(b,y(m-1))+r*gun(x(n-1),d)+r*u(n-1,m-2)+u(n-2,m-1))/s; if abs(u(n-1,m-1)-z)>normnorm=abs(u(n-1,m-1)-z);endu(n-1,m-1)=z;% 对不靠近上下边界的网格点进行处理for j=m-2:-1:2% 对靠近左边界的网格点进行处理z=(-h^2*fun(x(1),y(j))+gun(a,y(j))+r*u(1,j+1)+r*u(1,j-1)+u(2,j))/s;if abs(u(1,j)-z)>normnorm=abs(u(1,j)-z);endu(1,j)=z;% 对不靠近左右边界的网格点进行处理for i=2:n-2z=(-h^2*fun(x(i),y(j))+u(i-1,j)+r*u(i,j+1)+r*u(i,j-1)+u(i+1,j))/s;if abs(u(i,j)-z)>normnorm=abs(u(i,j)-z);endu(i,j)=z;end% 对靠近右边界的网格点进行处理z=(-h^2*fun(x(n-1),y(j))+gun(b,y(j))+r*u(n-1,j+1)+r*u(n-1,j-1)+u(n-2,j))/s;if abs(u(n-1,j)-z)>normnorm=abs(u(n-1,j)-z);endu(n-1,j)=z;end% 对靠近下边界的网格点进行处理% 对左下角的网格点进行处理z=(-h^2*fun(x(1),y(1))+gun(a,y(1))+r*gun(x(1),c)+r*u(1,2)+u(2,1))/s;if abs(u(1,1)-z)>normnorm=abs(u(1,1)-z);endu(1,1)=z;% 对靠近下边界的除第一点和最后点外网格点进行处理for i=2:n-2z=(-h^2*fun(x(i),y(1))+r*gun(x(i),c)+r*u(i,2)+u(i+1,1)+u(i-1,1))/s;if abs(u(i,1)-z)>normnorm=abs(u(i,1)-z);endu(i,1)=z;end% 对右下角的网格点进行处理z=(-h^2*fun(x(n-1),y(1))+gun(b,y(1))+r*gun(x(n-1),c)+r*u(n-1,2)+u(n-2,1))/s;if abs(u(n-1,1)-z)>normnorm=abs(u(n-1,1)-z);endu(n-1,1)=z;% 结果输出if norm<=tolfid = fopen('FDresult.txt', 'wt');fprintf(fid,'\n********用有限差分法求解矩形域上Poisson方程的输出结果********\n\n'); fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,' x的值 y的值 u的值 u的真实值 |u-u(x,y)|\n');for i=1:n-1for j=1:m-1fprintf(fid, '%8.3f %8.3f %14.8f %14.8f %14.8f\n', [x(i),y(j),u(i,j),gun(x(i),y(j)),abs(u(i,j)-gun(x(i),y(j)))]);endendfclose(fid);break; % 用来结束while循环endk=k+1;endif k==N+1fid = fopen('FDresult.txt', 'wt');fprintf(fid,'超过最大迭代次数,求解失败!');fclose(fid);endclc[a1 a2 a3 a4] = textread('F:\aa.txt','%f %f %f %f');a = [a1 a2 a3];a=a';b=a4';[pa,mina,maxa,pb,minb,maxb]=premnmx(a,b);net =newrb(pa,pb,0,1.3,24,2);an =sim(net,pa);E = an - pb;m =sse(E)n = mse(E)[f1 f2 f3 f4]= textread('F:\bb.txt','%f %f %f %f');f = [f1 f2 f3];f=f';pf = tramnmx(f,mina,maxa);an2 = sim(net,pf);g =postmnmx(an2,minb,maxb);g= g';E2 = g- f4;mm =sse(E2)nn = mse(E2)。
椭圆型方程

(1.5)
注 此方程组尽管是高阶方程组,但每个方程未知数
最多有3个易于求解.
④ 对方程组 (1.4)~(1.5) 的解分析需要考虑以下几个问题:
(a) 解是否惟一? (b) 当网格无限加密时,即 h 0 时,差分解 ui
是否收敛到真解 u (xi ) ? (c) 在何种度量下收敛? (d) 收敛速度如何? 为了解决如上问题,需要给出如下说明:
于是在 xi 将方程 (1.1) 写成
u (xi1) 2u (xi ) u (xi1) h2
q(xi )
u (xi )
f
(xi )
R
i(u),
(1.3)
其中
R
i(u)
h2 12
d
4u(x) dx4
i
O(h3 ).
舍去 R i(u) 得逼近方程 (1.1) 的差分方程为:
du dx
i
hi1 2
hi
d 2u dx2
i
O(h2
)
(2.3)
p(
x i
1
)
2
u(xi ) u(xi1) hi
p
du dx i1
2
hi2 24
p
d 3u
dx3
i1
2
O(h3)
p
du dx
取 x(1) x0 a, x(2) x1 , 得
2
(2.7) (2.8)
(2.9) (2.10)
W (a) W (x1 ) 2
x1
有限差分法求解偏微分方程MATLAB

南京理工大学课程考核论文课程名称:高等数值分析论文题目:有限差分法求解偏微分方程*名:**学号: 1成绩:有限差分法求解偏微分方程一、主要内容1.有限差分法求解偏微分方程,偏微分方程如一般形式的一维抛物线型方程:22(,)()u uf x t t xαα∂∂-=∂∂其中为常数具体求解的偏微分方程如下:22001(,0)sin()(0,)(1,)00u u x t x u x x u t u t t π⎧∂∂-=≤≤⎪∂∂⎪⎪⎪=⎨⎪⎪==≥⎪⎪⎩2.推导五种差分格式、截断误差并分析其稳定性;3.编写MATLAB 程序实现五种差分格式对偏微分方程的求解及误差分析;4.结论及完成本次实验报告的感想。
二、推导几种差分格式的过程:有限差分法(finite-difference methods )是一种数值方法通过有限个微分方程近似求导从而寻求微分方程的近似解。
有限差分法的基本思想是把连续的定解区域用有限个离散点构成的网格来代替;把连续定解区域上的连续变量的函数用在网格上定义的离散变量函数来近似;把原方程和定解条件中的微商用差商来近似,积分用积分和来近似,于是原微分方程和定解条件就近似地代之以代数方程组,即有限差分方程组,解此方程组就可以得到原问题在离散点上的近似解。
推导差分方程的过程中需要用到的泰勒展开公式如下:()2100000000()()()()()()()......()(())1!2!!n n n f x f x f x f x f x x x x x x x o x x n +'''=+-+-++-+- (2-1)求解区域的网格划分步长参数如下:11k k k kt t x x h τ++-=⎧⎨-=⎩ (2-2) 2.1 古典显格式2.1.1 古典显格式的推导由泰勒展开公式将(,)u x t 对时间展开得 2,(,)(,)()()(())i i k i k k k uu x t u x t t t o t t t∂=+-+-∂ (2-3) 当1k t t +=时有21,112,(,)(,)()()(())(,)()()i k i k i k k k k k i k i k uu x t u x t t t o t t tuu x t o tττ+++∂=+-+-∂∂=+⋅+∂ (2-4)得到对时间的一阶偏导数1,(,)(,)()=()i k i k i k u x t u x t uo t ττ+-∂+∂ (2-5) 由泰勒展开公式将(,)u x t 对位置展开得223,,21(,)(,)()()()()(())2!k i k i k i i k i i u uu x t u x t x x x x o x x x x∂∂=+-+-+-∂∂ (2-6)当11i i x x x x +-==和时,代入式(2-6)得2231,1,1122231,1,1121(,)(,)()()()()(())2!1(,)(,)()()()()(())2!i k i k i k i i i k i i i i i k i k i k i i i k i i i iu uu x t u x t x x x x o x x x x u u u x t u x t x x x x o x x x x ++++----⎧∂∂=+-+-+-⎪⎪∂∂⎨∂∂⎪=+-+-+-⎪∂∂⎩(2-7) 因为1k k x x h +-=,代入上式得2231,,22231,,21(,)(,)()()()2!1(,)(,)()()()2!i k i k i k i k i k i k i k i ku uu x t u x t h h o h x xu u u x t u x t h h o h x x +-⎧∂∂=+⋅+⋅+⎪⎪∂∂⎨∂∂⎪=-⋅+⋅+⎪∂∂⎩ (2-8) 得到对位置的二阶偏导数2211,22(,)2(,)(,)()()i k i k i k i k u x t u x t u x t u o h x h+--+∂=+∂ (2-9) 将式(2-5)、(2-9)代入一般形式的抛物线型偏微分方程得21112(,)(,)(,)2(,)(,)(,)()i k i k i k i k i k i k u x t u x t u x t u x t u x t f x t o h h αττ++---+⎡⎤-=++⎢⎥⎣⎦(2-10)为了方便我们可以将式(2-10)写成11122k kk k k k i i i i i i u u u u u f h ατ++-⎡⎤--+-=⎢⎥⎣⎦(2-11) ()11122k k k k k k i i i i i i u u uu u f h τατ++----+= (2-12)最后得到古典显格式的差分格式为()111(12)k k k k k i i i i i u ra u r u u f ατ++-=-+++ (2-13)2r h τ=其中,古典显格式的差分格式的截断误差是2()o h τ+。
热传导方程有限差分法的MATLAB实现

热传导方程有限差分法的MATLAB实现
史策
【期刊名称】《咸阳师范学院学报》
【年(卷),期】2009(24)4
【摘要】对于有界热传导齐次方程的混合问题,用分离变量法求解往往很复杂.为了更好地理解热传导方程的解,使用MATLAB软件将方程的解用图像表示出来.通过区域转换的思想,利用MATLAB编程实现一定区域内热传导方程的有限差分方法,数值表明了方法的可行性和稳定性.
【总页数】4页(P27-29,36)
【作者】史策
【作者单位】西安建筑科技大学,理学院,陕西,西安,710055
【正文语种】中文
【中图分类】O552
【相关文献】
1.有限差分法解薛定谔方程与MATLAB实现 [J], 刘晓军
2.放射性气体扩散方程有限差分法的MATLAB实现 [J], 龙亮;张振华;姜林;周科廷;莫懿新
3.泊松方程的有限差分法的MATLAB实现 [J], 冯立伟;徐涛;屈福志
4.拉普拉斯方程有限差分法的MATLAB实现 [J], 谢焕田;吴艳
5.基于MATLAB的电磁场二维场域有限差分法分析 [J], 林向会;谢本亮
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有限差分法的Matlab程序(椭圆型方程)
function FD_PDE(fun,gun,a,b,c,d)
% 用有限差分法求解矩形域上的Poisson方程
tol=10^(-6); % 误差界
N=1000; % 最大迭代次数
n=20; % x轴方向的网格数
m=20; % y轴方向的网格数
h=(b-a)/n; % x轴方向的步长
l=(d-c)/m; % y轴方向的步长
for i=1:n-1
x(i)=a+i*h;
end % 定义网格点坐标
for j=1:m-1
y(j)=c+j*l;
end % 定义网格点坐标
u=zeros(n-1,m-1); %对u赋初值
% 下面定义几个参数
r=h^2/l^2;
s=2*(1+r);
k=1;
% 应用Gauss-Seidel法求解差分方程
while k<=N
% 对靠近上边界的网格点进行处理
% 对左上角的网格点进行处理
z=(-h^2*fun(x(1),y(m-1))+gun(a,y(m-1))+r*gun(x(1),d)+r*u(1,m-2)+u(2,m-1))/s;
norm=abs(z-u(1,m-1));
u(1,m-1)=z;
% 对靠近上边界的除第一点和最后点外网格点进行处理
for i=2:n-2
z=(-h^2*fun(x(i),y(m-1))+r*gun(x(i),d)+r*u(i,m-2)+u(i+1,m-1)+u(i-1,m-1))/s;
if abs(u(i,m-1)-z)>norm;
norm=abs(u(i,m-1)-z);
end
u(i,m-1)=z;
end
% 对右上角的网格点进行处理
z=(-h^2*fun(x(n-1),y(m-1))+gun(b,y(m-1))+r*gun(x(n-1),d)+r*u(n-1,m-2)+u(n-2,m-1))/s;
if abs(u(n-1,m-1)-z)>norm
norm=abs(u(n-1,m-1)-z);
end
u(n-1,m-1)=z;
% 对不靠近上下边界的网格点进行处理
for j=m-2:-1:2
% 对靠近左边界的网格点进行处理
z=(-h^2*fun(x(1),y(j))+gun(a,y(j))+r*u(1,j+1)+r*u(1,j-1)+u(2,j))/s;
if abs(u(1,j)-z)>norm
norm=abs(u(1,j)-z);
end
u(1,j)=z;
% 对不靠近左右边界的网格点进行处理
for i=2:n-2
z=(-h^2*fun(x(i),y(j))+u(i-1,j)+r*u(i,j+1)+r*u(i,j-1)+u(i+1,j))/s;
if abs(u(i,j)-z)>norm
norm=abs(u(i,j)-z);
end
u(i,j)=z;
end
% 对靠近右边界的网格点进行处理
z=(-h^2*fun(x(n-1),y(j))+gun(b,y(j))+r*u(n-1,j+1)+r*u(n-1,j-1)+u(n-2,j))/s;
if abs(u(n-1,j)-z)>norm
norm=abs(u(n-1,j)-z);
end
u(n-1,j)=z;
end
% 对靠近下边界的网格点进行处理
% 对左下角的网格点进行处理
z=(-h^2*fun(x(1),y(1))+gun(a,y(1))+r*gun(x(1),c)+r*u(1,2)+u(2,1))/s;
if abs(u(1,1)-z)>norm
norm=abs(u(1,1)-z);
end
u(1,1)=z;
% 对靠近下边界的除第一点和最后点外网格点进行处理
for i=2:n-2
z=(-h^2*fun(x(i),y(1))+r*gun(x(i),c)+r*u(i,2)+u(i+1,1)+u(i-1,1))/s;
if abs(u(i,1)-z)>norm
norm=abs(u(i,1)-z);
end
u(i,1)=z;
end
% 对右下角的网格点进行处理
z=(-h^2*fun(x(n-1),y(1))+gun(b,y(1))+r*gun(x(n-1),c)+r*u(n-1,2)+u(n-2,1))/s; if abs(u(n-1,1)-z)>norm
norm=abs(u(n-1,1)-z);
end
u(n-1,1)=z;
% 结果输出
if norm<=tol
fid = fopen('FDresult.txt', 'wt');
fprintf(fid,'\n********用有限差分法求解矩形域上Poisson方程的输出结果********\n\n');
fprintf(fid,'迭代次数: %d次\n\n',k);
fprintf(fid,' x的值y的值u的值u的真实值|u-u(x,y)|\n');
for i=1:n-1
for j=1:m-1
fprintf(fid, '%8.3f %8.3f %14.8f %14.8f %14.8f\n',
[x(i),y(j),u(i,j),gun(x(i),y(j)),abs(u(i,j)-gun(x(i),y(j)))]);
end
end
fclose(fid);
break; % 用来结束while循环
end
k=k+1;
end
if k==N+1
fid = fopen('FDresult.txt', 'wt');
fprintf(fid,'超过最大迭代次数,求解失败!');
fclose(fid);
end。