东南大学_数值分析_第七章_偏微分方程数值解法
- 格式:doc
- 大小:150.50 KB
- 文档页数:5
偏微分方程数值解法
偏微分方程数值解法是一种利用计算机技术获取偏微分方程数值解的方法,它主要目标是解决微分方程的精确、快速、可靠的数值解。
偏微分方程数值解法交叉应用于分析数学、力学、电磁学等不同领域的各种模型,能够大大提高解决微分方程的效率。
偏微分方程数值解法大致分为两个方面:一是求解偏微分方程的离散数值解法;二是精确解对分解数值解法,如多阶谱方法、牛顿法和共轭梯度法等。
其中,离散数值解法是把偏微分方程抽象成一系列数值求解问题,并进行递推叠加求解,而精确解对分解数值解法则是通过优化问题方式求解微分方程精确解,以达到精确求解的目的。
偏微分方程数值解法的有效解决的方法,给科学与技术研究带来了很大的帮助。
它不但克服了无法精确解决某些复杂偏微分方程的困难,而且有更快的求解效率,也可以很好地满足实际科技应用的需要。
偏微分方程数值解法的应用已经普遍发挥出重要的作用,不仅可以解决物理科学问题,还可以解决经济学、商业投资、财务分析等复杂的数学模型。
因此,偏微分方程数值解法的应用已在各个领域得到了广泛的应用,为科学与技术研究提供了很大的帮助,在微分方程求解方面产生了重要的影响。
偏微分方程组数值解法
偏微分方程组是描述自然、科学和工程问题的重要数学工具。
由于解析解通常难以获得,因此需要使用数值方法来解决这些方程组。
本文将介绍偏微分方程组的一些数值解法,包括有限差分法、有限元法、谱方法和边界元法等。
有限差分法是一种基本的数值方法,将偏微分方程转化为差分方程,然后使用迭代算法求解。
该方法易于理解和实现,但对网格的选择和精度的控制要求较高。
有限元法是目前广泛使用的数值方法之一,它将偏微分方程转化为变分问题,并通过对函数空间的逼近来求解。
该方法对复杂几何形状和非线性问题有很好的适应性,但需要对网格进行精细的划分,计算量较大。
谱方法是一种高精度的数值方法,它将偏微分方程转化为特征值问题,并使用级数逼近来求解。
该方法在高精度求解、解析性质研究和数值计算效率方面具有优势,但需要对函数的光滑性和周期性有较高的要求。
边界元法是一种基于边界积分方程的数值方法,它将偏微分方程转化为边界积分方程,并使用离散化方法求解。
该方法适用于求解边界问题和无穷域问题,但对边界的光滑性和边界积分算子的性质有较高的要求。
总之,在实际问题中选择合适的数值方法需要综合考虑问题的性质、计算资源、精度要求等因素。
第七章 偏微分方程数值解法——Crank-Nicolson 格式****(学号) *****(姓名)上机题目要求见教材P346,10题。
一、算法原理本文研究下列定解问题(抛物型方程)22(,) (0,0)(,0)() (0)(0,)(), (1,)() (0)u ua f x t x l t T t x u x x x l u t t u t t t T ϕαβ⎧∂∂-=<<≤≤⎪∂∂⎪=≤≤⎨⎪==<≤⎪⎩(1)的有限差分法,其中a 为正常数,,,,f ϕαβ为已知函数,且满足边界条件和初始条件。
关于式(1)的求解,采用离散化方法,剖分网格,构造差分格式。
其中,网格剖分是将区域{}0,0D x l t T =≤≤≤≤用两簇平行直线(0)(0)i k x x ih i M t t k k N τ==≤≤⎧⎨==≤≤⎩ 分割成矩形网格,其中,l Th M Nτ==分别为空间步长和时间步长。
将式(1)中的偏导数使用不同的差商代替,将得到不同的差分格式,如古典显格式、古典隐格式、Crank-Nicolson 格式等。
其中,Crank-Nicolson 格式具有更高的收敛阶数,应用更广泛,故本文采用Crank-Nicolson 格式求解抛物型方程。
Crank-Nicolson 格式推导:在节点(,)2i k x t τ+处考虑式(1),有22(,)(,)(,)222i k i k i k u u x t a x t f x t t x τττ∂∂+-+=+∂∂ (2)对偏导数(,)2i k u x t t τ∂+∂用中心差分展开 []2311+131(,)(,)(,)(,) ()224k k i k i k i k i i k i k u ux t u x t u x t x t t t t ττηητ++∂∂+=--<<∂∂ (3) 将22(,)2i k u x t x τ∂+∂在节点(,)i k x t 和1(,)i k x t +表示为222+122224+1221(,)=(,)+(,)22 (,) ()8i k i k i k k k i i k i k u u ux t x t x t x x x ux t t x tττηη⎡⎤∂∂∂+⎢⎥∂∂∂⎣⎦∂-<<∂∂ (4)对以上两个偏导数用二阶差分展开[]2112224i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k kk i k i i u x t u x t u x t u x t x hh u t x x x ξξ+-∂=-+∂∂-<<∂ (5)[]211111122241i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k k ki k i i u x t u x t u x t u x t x hh u t x x xξξ++++-++∂=-+∂∂-<<∂ (6)将式(4)(5)(6)分别代入式(3),略去高阶小量,用k i u 代替(,)i k u x t 并化简得()()()2111111112122,22k k k k k k k k i i i i i i i i i k a u u u u u u u u f x t h ττ+++++-+-⎛⎫⎡⎤---++-+=+ ⎪⎣⎦⎝⎭ (7) 令2/r a h τ=,将式(7)联合式(1)初始条件和边界条件,用矩阵的形式表示为:11112212211111221122221122221122 k k k k k kM M k k M M r r r r u u r r r r r ru u r r r r u u r r u u r r r r +++--+--⎡⎤⎡⎤+---⎢⎥⎢⎥⎢⎥⎢⎥⎡⎤⎡⎤⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎢⎥⎢⎥⎢⎥⎢⎥-+-⎢⎥⎢⎥⎣⎦⎣⎦()()()()()()112211,22,2 ,2,22k k k k M k M k k k r f x t t t f x t f x t r f x t t t ττααττττττββ+--+⎡⎤⎛⎫+++ ⎪⎢⎥⎝⎭⎢⎥⎢⎥⎛⎫+ ⎪⎢⎥⎝⎭⎢⎥+⎢⎥⎢⎥⎛⎫⎢⎥+ ⎪⎢⎥⎝⎭⎢⎥⎛⎫⎢⎥+++ ⎪⎢⎥⎝⎭⎣⎦(8) Crank-Nicolson 格式的截断误差为22()R O h τ=+,具有较高的精度。
偏微分方程数值解法偏微分方程(Partial Differential Equations,简称PDE)是数学中重要的研究对象,其在物理学、工程学、经济学等领域有广泛的应用。
然而,对于大多数偏微分方程而言,很难通过解析方法得到精确解,因此需要借助数值解法来求解。
本文将介绍几种常见的偏微分方程数值解法。
一、有限差分法(Finite Difference Method)有限差分法是一种常见且直观的偏微分方程数值解法。
其基本思想是将偏微分方程中的导数通过差分近似来表示,然后通过离散化的方式转化为代数方程组进行求解。
对于一维偏微分方程,可以通过将空间坐标离散化成一系列有限的格点,并使用中心差分格式来近似原方程中的导数项。
然后,将时间坐标离散化,利用差分格式逐步计算每个时间步的解。
最后,通过迭代计算所有时间步,可以得到整个时间域上的解。
对于二维或高维的偏微分方程,可以将空间坐标进行多重离散化,利用多维的中心差分格式进行近似,然后通过迭代计算得到整个空间域上的解。
二、有限元法(Finite Element Method)有限元法是另一种重要的偏微分方程数值解法。
其基本思想是将求解区域分割成有限数量的子区域(单元),然后通过求解子区域上的局部问题来逼近整个求解区域上的解。
在有限元法中,首先选择适当的形状函数,在每个单元上构建近似函数空间。
然后,通过构建变分问题,将原偏微分方程转化为一系列代数方程。
最后,通过求解这些代数方程,可以得到整个求解区域上的解。
有限元法适用于各种复杂的边界条件和几何构型,因此在实际工程问题中被广泛应用。
三、谱方法(Spectral Methods)谱方法是一种基于特定基函数(如切比雪夫多项式、勒让德多项式等)展开解的偏微分方程数值解法。
与有限差分法和有限元法不同,谱方法在整个求解区域上都具有高精度和快速收敛的特性。
在谱方法中,通过选择适当的基函数,并利用其正交性质,可以将解在整个求解区域上展开为基函数系数的线性组合。
偏微分方程的数值解法偏微分方程(Partial Differential Equation,PDE)是描述物理、化学、工程学等许多科学领域中变化的方程。
由于PDE的求解通常是困难的,因此需要使用数值方法。
本文将介绍偏微分方程的数值解法。
一般来说,求解PDE需要求得其解析解。
然而,对于复杂的PDE,往往不存在解析解,因此需要使用数值解法求解。
数值解法可以分为两类:有限差分法和有限元法。
有限差分法是将计算区域分成网格,利用差分公式将PDE转化为离散方程组,然后使用解线性方程组的方法求解。
有限元法则是将计算区域分成有限数量的单元,每个单元内使用多项式函数逼近PDE的解,在单元之间匹配边界条件,得到整个区域上的逼近解。
首先讨论有限差分法。
常见的差分公式包括前向差分、后向差分、中心差分等。
以一维热传导方程为例,其偏微分方程形式为:$$ \frac{\partial u}{\partial t}=\frac{\partial^2 u}{\partial x^2} $$其中,$u(x,t)$表示物理量在时刻$t$和位置$x$处的值。
将其离散化,可得到:$$ \frac{u(x_i,t_{j+1})-u(x_i,t_j)}{\Delta t}=\frac{u(x_{i+1},t_j)-2u(x_i,t_j)+u(x_{i-1},t_j)}{\Delta x^2} $$其中,$x_i=i\Delta x$,$t_j=j\Delta t$,$\Delta x$和$\Delta t$分别表示$x$和$t$上的网格大小。
该差分方程可以通过简单的代数操作化为:$$ u_{i,j+1}=u_{i,j}+\frac{\Delta t}{\Delta x^2}(u_{i+1,j}-2u_{i,j}+u_{i-1,j}) $$其中,$u_{i,j}$表示在网格点$(x_i,t_j)$处的数值解。
由于差分方程中一阶导数的差分公式只具有一阶精度,因此需要使用两个网格点来逼近一阶导数。
偏微分方程数值求解方法引言偏微分方程是数学中研究复杂现象的重要工具之一,它在许多领域都有广泛的应用,例如物理学、工程学和生物学等。
通过求解偏微分方程,我们可以获得系统的解析解或数值解,从而揭示底层的物理规律或实现工程设计。
在本文中,我们将介绍偏微分方程数值求解的常见方法,包括有限差分法、有限元法和谱方法等。
我们将详细介绍这些方法的基本原理、数值算法和实际应用。
有限差分法基本原理有限差分法是偏微分方程数值求解中最常用的方法之一。
它将连续的偏微分方程离散化为差分方程,通过计算差分方程的解来近似原方程的解。
有限差分法的基本思想是将求解域划分为离散的网格,然后在网格点上近似表示原方程。
数值算法有限差分法的数值算法主要包括离散化、边界条件处理和迭代求解三个步骤。
首先,我们将连续的偏微分方程在空间和时间上进行离散化,将其转化为差分方程。
然后,我们需要确定边界条件,即在边界上如何近似表示原方程。
最后,通过迭代计算差分方程的解,直到满足收敛条件。
实际应用有限差分法在许多领域都有广泛的应用。
例如,在流体力学中,它可以用来模拟气体或液体的流动。
在热传导方程中,它可以用来求解物体的温度分布。
此外,有限差分法还可以用来模拟结构力学中的弹性变形和振动问题等。
有限元法基本原理有限元法是一种基于分片线性函数空间的数值方法,用于求解偏微分方程。
它将求解域划分为离散的小单元,然后在每个单元上构造局部基函数,通过组合这些基函数来近似表示原方程的解。
数值算法有限元法的数值算法主要包括离散化、单元刚度矩阵的计算和全局方程的组装三个步骤。
首先,我们将连续的偏微分方程在空间上进行离散化,将其转化为离散的代数方程。
然后,针对每个单元,我们需要计算其对应的刚度矩阵和载荷向量。
最后,通过组装所有单元的刚度矩阵和载荷向量,得到全局方程,并通过求解全局方程来计算原方程的近似解。
实际应用有限元法在结构力学、固体力学和流体力学等领域有广泛的应用。
例如,在结构力学中,它可以用来计算材料的应力和变形分布。
偏微分数值解法
偏微分数值解法是一种用数值方法处理区域内的偏微分方程的技术。
这种方法广泛应用于物理学、工程学、数学和计算机科学等领域。
偏微分方程是一类描述空间变量和时间变量之间关系的方程。
其中,偏微分方程包含多个独立变量,且每个变量都与其他变量相关联。
因此,解决偏微分方程需要在空间中求解方程,而非在时间轴上。
数值解法通过将偏微分方程的解转换为离散的数值解,使得计算机可以运算,从而解决偏微分方程。
这个过程中,空间域网格化和时间域离散化是至关重要的。
具体来说,偏微分数值解法可以通过以下步骤实现:
1.将所研究问题的空间区域网格化。
2.确定方程的边界条件和初值条件。
3.将偏微分方程转换为差分方程。
4.利用数值方法求解差分方程。
5.通过比较数值解和解析解,评估数值解的准确性。
6.可视化数值解,将结果呈现出来。
偏微分数值解法中的一个重要技术是有限差分法(FD法)。
FD法通过近似微分算子的方法,将一个偏微分方程转化为一个差分方程。
这种方法将矢量函数转换为数字表格中的数值,并对数值进行操作。
通过操作这些数字,FD法计算系统中每个节点的准确解。
另一个常见的偏微分数值解法是有限元方法(FEM)。
它基于物理量在连续媒质中的变分原理,将媒质分解为小的空间单元。
通过将媒质问题分解成更简单的问题,FEM可以通过计算单元之间的相互作用,求得整个媒质的解。
偏微分⽅程的数值解法偏微分⽅程的数值解法
主要总结常见椭圆形、双曲型、抛物型偏微分⽅程的数值解法
椭圆偏微分⽅程
拉普拉斯⽅程是最简单的椭圆微分⽅程
∂2u ∂x2+∂2u
∂y2=0
确定偏微分⽅程的边界条件主要采⽤固定边界条件:u|Γ=U1(x,y) 即在边界Γ上给定u的值U1(x,y)五点差分格式
五点差分格式的形式为:
u i+1,j+u i−1,j+u i,j+1+u i,j−1=4u i,j
以u i,j为中⼼向其上下左右做差分,并⽤这些近似的代替u i,j
运⽤五点差分法可以求出下列边值问题
∂2u ∂x2+∂2u
∂x2=0
u(x1,y)=g1(x),u(x2,y)=g2(x)
u(x,y1)=f1(y),u(x,y2)=f2(y)
x1≤x≤x2,y1≤y≤y2
求解过程如下:
对求解区域进⾏分割:将x min≤x≤x max范围内的的x轴等分成NX段,同理将y轴等分成NY段
将边界条件离散到格点上
⽤五点差分格式建⽴求解⽅程,求出各个格点的函数值
程序设计:
实现函数格式为u = peEllip5(nx, minx, maxx, ny, miny, maxy)
变量名变量作⽤
nx x⽅向上的节点数
minx求解区间x的左端
maxx求解区间x的右端
ny y⽅向的节点数
miny求解区间y的左端
maxy求解区间y的右端
u求解区间上的数值解
建⽴边界条件函数
``
{
Processing math: 100%。
偏微分方程的数值解法1.peEllip5 用五点差分格式解拉普拉斯方程function u = peEllip5(nx,minx,maxx,ny,miny,maxy) format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);u0 = zeros(nx,ny);for j=1:nyu0(j,1) = EllIni2Uxl(minx,miny+(j-1)*hy);u0(j,nx) = EllIni2Uxr(maxx,miny+(j-1)*hy);endfor j=1:nxu0(1,j) = EllIni2Uyl(minx+(j-1)*hx,miny);u0(ny,j) = EllIni2Uyr(minx+(j-1)*hx,maxy);endA = -4*eye((nx-2)*(ny-2),(nx-2)*(ny-2));b = zeros((nx-2)*(ny-2),1);for i=1:(nx-2)*(ny-2)if mod(i,nx-2) == 1if i==1A(1,2) = 1;A(1,nx-1) = 1;b(1) = - u0(1,2) - u0(2,1);elseif i == (ny-3)*(nx-2)+1A(i,i+1) = 1;A(i,i-nx+2) = 1;b(i) = - u0(ny-1,1) - u0(ny,2);elseA(i,i+1) = 1;A(i,i-nx+2) = 1;A(i,i+nx-2) = 1;b(i) = - u0(floor(i/(nx-2))+2,1);endendelseif mod(i,nx-2) == 0if i == nx-2A(i,i-1) = 1;A(i,i+nx-2) = 1;b(i) = - u0(1,nx-1) - u0(2,nx);elseif i == (ny-2)*(nx-2)A(i,i-1) = 1;A(i,i-nx+2) = 1;b(i) = - u0(ny-1,nx) - u0(ny,nx-1);elseA(i,i-1) = 1;A(i,i-nx+2) = 1;A(i,i+nx-2) = 1;b(i) = - u0(floor(i/(nx-2))+1,nx);endendelseif i>1 && i< nx-2A(i,i-1) = 1;A(i,i+nx-2) = 1;A(i,i+1) = 1;b(i) = - u0(1,i+1);elseif i > (ny-3)*(nx-2) && i < (ny-2)*(nx-2)A(i,i-1) = 1;A(i,i-nx+2) = 1;A(i,i+1) = 1;b(i) = - u0(ny,mod(i,(nx-2))+1);elseA(i,i-1) = 1;A(i,i+1) = 1;A(i,i+nx-2) = 1;A(i,i-nx+2) = 1;endendendendendul = A\b;for i=1:(ny-2)for j=1:(nx-2)u(i,j) = ul((i-1)*(nx-2)+j);endendformat short;2.peEllip5m 用工字型差分格式解拉普拉斯方程function u = peEllip5m(nx,minx,maxx,ny,miny,maxy) format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);u0 = zeros(nx,ny);for j=1:nyu0(j,1) = EllIni2Uxl(minx,miny+(j-1)*hy);u0(j,nx) = EllIni2Uxr(maxx,miny+(j-1)*hy);endfor j=1:nxu0(1,j) = EllIni2Uyl(minx+(j-1)*hx,miny);u0(ny,j) = EllIni2Uyr(minx+(j-1)*hx,maxy);endA = -4*eye((nx-2)*(ny-2),(nx-2)*(ny-2));b = zeros((nx-2)*(ny-2),1);for i=1:(nx-2)*(ny-2)if mod(i,nx-2) == 1if i==1A(1,nx) = 1;b(1) = - u0(1,1) - u0(3,1) - u0(1,3);elseif i == (ny-3)*(nx-2)+1A(i,i-nx+1) = 1;b(i) = - u0(ny,1) - u0(ny,3) - u0(ny-2,1);elseA(i,i-nx+3) = 1;A(i,i+nx-1) = 1;b(i) = - u0(floor(i/(nx-2))+1,1) - u0(floor(i/(nx-2))+3,1);endendelseif mod(i,nx-2) == 0if i == nx-2A(i,i+nx-1) = 1;b(i) = - u0(1,nx-2) - u0(1,nx) - u0(3,nx);elseif i == (ny-2)*(nx-2)A(i,i-nx+1) = 1;b(i) = - u0(ny,nx) - u0(ny,nx-2) - u0(ny-2,nx);elseA(i,i-nx+1) = 1;A(i,i+nx-3) = 1;b(i) = - u0(floor(i/(nx-2)),nx) - u0(floor(i/(nx-2))+2,nx);endendelseif i>1 && i< nx-2A(i,i+nx-1) = 1;A(i,i+nx-3) = 1;b(i) = - u0(1,i) - u0(1,i+2);elseif i > (ny-3)*(nx-2) && i < (ny-2)*(nx-2)A(i,i-nx+3) = 1;A(i,i-nx+1) = 1;b(i) = - u0(ny,mod(i,(nx-2))) -u0(ny,mod(i,(nx-2))+2);elseA(i,i-nx+3) = 1;A(i,i+nx-1) = 1;A(i,i+nx-3) = 1;A(i,i-nx+1) = 1;endendendendendul = A\b;for i=1:(ny-2)for j=1:(nx-2)u(i,j) = ul((i-1)*(nx-2)+j);endendformat short;3.peHypbYF 用迎风格式解对流方程function u = peYF(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);if a>0for j=1:(n+M)u0(j) = IniU(minx+(j-M-1)*h);endelsefor j=1:(n+M)u0(j) = IniU(minx+(j-1)*h);endendu1 = u0;for k=1:Mif a>0for i=(k+1):n+Mu1(i) = -dt*a*(u0(i)-u0(i-1))/h+u0(i);endelsefor i=1:n+M-ku1(i) = -dt*a*(u0(i+1)-u0(i))/h+u0(i);endendu0 = u1;endif a>0u = u1((M+1):M+n);elseu = u1(1:n);endformat long;4.peHypbLax 用拉克斯-弗里德里希斯格式解对流方程function u = peHypbLax(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ku1(i) = -dt*a*(u0(i+1)-u0(i-1))/h/2+(u0(i+1)+u0(i-1))/2;endu0 = u1;endu = u1((M+1):(M+n));format short;4.peHypbLaxW 用拉克斯-温德洛夫格式解对流方程function u = peLaxW(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ku1(i) = dt*dt*a*a*(u0(i+1)-2*u0(i)+u0(i-1))/2/h/h - ...dt*a*(u0(i+1)-u0(i-1))/h/2+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;6.peHypbBW 用比姆-沃明格式解对流方程function u = peBW(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-2*M-1)*h);endu1 = u0;for k=1:Mfor i=2*k+1:n+2*Mu1(i) = u0(i)-dt*a*(u0(i)-u0(i-1))/h-a*dt*(1-a*dt/h)* ...(u0(i)-2*u0(i-1)+u0(i-2))/2/h;endu0 = u1;endu = u1((2*M+1):(2*M+n));format short;7.peHypbRich 用Richtmyer多步格式解对流方程function u = peRich(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+4*M)u0(j) = IniU(minx+(j-2*M-1)*h);endfor k=1:Mfor i=2*k+1:n+4*M-2*ktmpU1 = -dt*a*(u0(i+2)-u0(i))/h/4+(u0(i+2)+u0(i))/2;tmpU2 = -dt*a*(u0(i)-u0(i-2))/h/4+(u0(i)+u0(i-2))/2;u1(i) = -dt*a*(tmpU1-tmpU2)/h/2+u0(i);endu0 = u1;endu = u1((2*M+1):(2*M+n));format short;8.peHypbMLW 用拉克斯-温德洛夫多步格式解对流方程function u = peMLW(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ktmpU1 = -dt*a*(u0(i+1)-u0(i))/h/2+(u0(i+1)+u0(i))/2;tmpU2 = -dt*a*(u0(i)-u0(i-1))/h/2+(u0(i)+u0(i-1))/2;u1(i) = -dt*a*(tmpU1-tmpU2)/h+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;9.peHypbMC 用MacCormack多步格式解对流方程function u = peMC(a,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = IniU(minx+(j-M-1)*h);endfor k=1:Mfor i=k+1:n+2*M-ktmpU1 = -dt*a*(u0(i+1)-u0(i))/h+u0(i);tmpU2 = -dt*a*(u0(i)-u0(i-1))/h+u0(i-1);u1(i) = -dt*a*(tmpU1-tmpU2)/h/2+(u0(i)+tmpU1)/2;endu0 = u1;endu = u1((M+1):(M+n));format short;10.peHypb2LF 用拉克斯-弗里德里希斯格式解二维对流方程的初值问题function u = pe2LF(a,b,dt,nx,minx,maxx,ny,miny,maxy,M)%啦-佛format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);for i=1:nx+2*Mfor j=1:(ny+2*M)u0(i,j) = Ini2U(minx+(i-M-1)*hx,miny+(j-M-1)*hy);endendu1 = u0;for k=1:Mfor i=k+1:nx+2*M-kfor j=k+1:ny+2*M-ku1(i,j) = (u0(i+1,j)+u0(i-1,j)+u0(i,j+1)+u0(i,j-1))/4 ...-a*dt*(u0(i+1,j)-u0(i-1,j))/2/hx ...-b*dt*(u0(i,j+1)-u0(i,j-1))/2/hy;endendu0 = u1;endu = u1((M+1):(M+nx),(M+1):(M+ny));format short;11.peHypb2FL 用拉克斯-弗里德里希斯格式解二维对流方程的初值问题function u = pe2FL(a,b,dt,nx,minx,maxx,ny,miny,maxy,M)format long;hx = (maxx-minx)/(nx-1);hy = (maxy-miny)/(ny-1);for i=1:nx+4*Mfor j=1:(ny+4*M)u0(i,j) = Ini2U(minx+(i-2*M-1)*hx,miny+(j-2*M-1)*hy);endendu1 = u0;for k=1:Mfor i=2*k+1:nx+4*M-2*kfor j=2*k-1:ny+4*M-2*k+2tmpU(i,j) = u0(i,j) - a*dt*(u0(i+1,j)-u0(i-1,j))/2/hx + ...(a*dt/hx)^2*(u0(i+1,j)-2*u0(i,j)+u0(i-1,j))/2;endendfor i=2*k+1:nx+4*M-2*kfor j=2*k+1:nx+4*M-2*ku1(i,j) = tmpU(i,j) - b*dt*(tmpU(i,j+1)-tmpU(i,j-1))/2/hy + ...(b*dt/hy)^2*(tmpU(i,j+1)-2*tmpU(i,j)+tmpU(i,j-1))/2;endendu0 = u1;endu = u1((2*M+1):(2*M+nx),(2*M+1):(2*M+ny));format short;12.peParabExp 用显式格式解扩散方程的初值问题function u = peParabExp(c,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = PrIniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-ku1(i) = dt*c*(u0(i+1)-2*u0(i)+u0(i-1))/h/h+u0(i);endendu = u1((M+1):(M+n));format short;13.peParabTD 用跳点格式解扩散方程的初值问题function u = peParabTD(c,dt,n,minx,maxx,M)%跳点format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = PrIniU(minx+(j-M-1)*h);endu1 = u0;for k=1:Mfor i=k+1:n+2*M-kif mod(n+i,2) == 0u1(i) = u0(i) + c*dt*(u0(i+1) - 2*u0(i) + u0(i-1))/h/h;if i > 2u1(i-1) =(u0(i-1) + c*dt*(u1(i) + u1(i-2))/h/h)/(1 + 2*c*dt/h/h);endendendu0 = u1;endu = u1((M+1):(M+n));format short;14.peParabImp 用隐式格式解扩散方程的初边值问题function u = peParabImp(c,dt,n,minx,maxx,lbu,rbu,M)format long;h = (maxx-minx)/(n-1);u0(1) = lbu;u0(n) = rbu;for j=2:n-1u0(j) = PrIniU(minx+(j-1)*h);endu1 = u0;for k=1:MA = zeros(n-2,n-2);cb = - transpose(u0(2:(n-1)));cb(1) = cb(1) - dt*c*lbu/h/h;cb(n-2) = cb(n-2) - dt*c*rbu/h/h;A(1,1) = -2*dt*c/h/h -1;A(1,2) = dt*c/h/h ;for i=2:n-3A(i,i-1) = dt*c/h/h ;A(i,i) = - 2*dt*c/h/h -1 ;A(i,i+1) = dt*c/h/h ;endA(n-2,n-2) = -2*dt*c/h/h -1;A(n-2,n-3) = dt*c/h/h;u1(2:(n-1)) = A\cb;u0 = u1;endu = u1;format short;15.peParabKN 用克拉克-尼科尔森格式解扩散方程的初边值问题function u = peParabKN(c,dt,n,minx,maxx,lbu,rbu,M)format long;h = (maxx-minx)/(n-1);u0(1) = lbu;u0(n) = rbu;for j=2:n-1u0(j) = PrIniU(minx+(j-1)*h);endu1 = u0;for k=1:MA = zeros(n-2,n-2);cb = zeros(n-2,1);cb(1) = -u0(2) -(u0(3)-2*u0(2)+u0(1))*dt*c*lbu/h/h/2 - dt*c*lbu/h/h/2;cb(n-2) = -u0(n-1) -(u0(n)-2*u0(n-1)+u0(n-2))*dt*c*lbu/h/h/2 - dt*c*rbu/h/h/2;for i=2:n-3cb(i) = -u0(i+1) -(u0(i+2)-2*u0(i+1)+u0(i))*dt*c*lbu/h/h/2;endA(1,1) = -dt*c/h/h -1;A(1,2) = dt*c/h/h/2 ;for i=2:n-3A(i,i-1) = dt*c/h/h/2 ;A(i,i) = - dt*c/h/h -1 ;A(i,i+1) = dt*c/h/h/2 ;endA(n-2,n-2) = -dt*c/h/h -1;A(n-2,n-3) = dt*c/h/h/2;u1(2:(n-1)) = A\cb;u0 = u1;endu = u1;format short;16.peParabWegImp 用加权隐式格式解扩散方程的初边值问题function u = peParabWegImp(c,sita,dt,n,minx,maxx,lbu,rbu,M)format long;h = (maxx-minx)/(n-1);u0(1) = lbu;u0(n) = rbu;for j=2:n-1u0(j) = PrIniU(minx+(j-1)*h);endu1 = u0;for k=1:MA = zeros(n-2,n-2);cb = zeros(n-2,1);cb(1) = -u0(2) -(1 - sita)*(u0(3)-2*u0(2)+u0(1))*dt*c*lbu/h/h/2 ...- sita*dt*c*lbu/h/h;cb(n-2) = -u0(n-1) -(1 - sita)*(u0(n)-2*u0(n-1)+u0(n-2))*dt*c*lbu/h/h/2 ...- sita*dt*c*rbu/h/h;for i=2:n-3cb(i) = -u0(i+1) -(1 - sita)*(u0(i+2)-2*u0(i+1)+u0(i))*dt*c*lbu/h/h;endA(1,1) = -2*sita*dt*c/h/h -1;A(1,2) = sita*dt*c/h/h ;for i=2:n-3A(i,i-1) = sita*dt*c/h/h ;A(i,i) = - 2*sita*dt*c/h/h -1 ;A(i,i+1) = sita*dt*c/h/h ;endA(n-2,n-2) = - 2*sita*dt*c/h/h -1;A(n-2,n-3) = sita*dt*c/h/h;u1(2:(n-1)) = A\cb;u0 = u1;endu = u1;format short;17.peDKExp 用指数型格式解对流扩散方程的初值问题function u = peDKExp(a,b,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = DKIniU(minx+(j-M-1)*h);endu1 = u0;coff = (exp(a*h/2/b)+exp(-a*h/2/b))/(exp(a*h/2/b)-exp(-a*h/2/b));coff = dt*coff*a*h/2;for k=1:Mfor i=k+1:n+2*M-ku1(i) = coff*(u0(i+1)-2*u0(i)+u0(i-1))+a*dt*(u0(i+1)-u0(i-1))/h/2+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;18.peDKSam 用萨马尔斯基格式解对流扩散方程的初值问题function u = peDKSam(a,b,dt,n,minx,maxx,M)format long;h = (maxx-minx)/(n-1);for j=1:(n+2*M)u0(j) = DKIniU(minx+(j-M-1)*h);endu1 = u0;coff = dt*b/(1+a*h/b/2);for k=1:Mfor i=k+1:n+2*M-ku1(i) = coff*(u0(i+1)-2*u0(i)+u0(i-1))+a*dt*(u0(i)-u0(i-1))/h+u0(i);endu0 = u1;endu = u1((M+1):(M+n));format short;。
偏微分方程数值解流程1.网格划分:将求解域划分为网格,这是将偏微分方程离散化的基础。
可以使用等距网格或非等距网格,具体取决于问题的特点。
2.离散化:根据偏微分方程的类型和边界条件,将偏微分方程的导数转换为离散的差分或有限差分格式。
常用的数值离散化方法有前向差分,后向差分和中心差分等。
3.初值条件:根据问题的初始状态,确定在初始时间步骤上网格点的值。
常用的方法是根据问题的初始条件进行数值插值。
4.边界条件:确定在边界网格点上的值。
根据问题的边界条件,可以采用数值插值法或手动设置边界值。
5. 迭代求解:根据离散化的差分方程,通过迭代方法求解离散化的方程组。
常用的迭代方法有Jacobi方法,Gauss-Seidel方法,SOR方法等。
6.收敛性判断:根据设定的收敛准则,判断数值解是否达到了预期的精度。
通常可以通过比较相邻两次迭代的差异来判断收敛性。
7.后处理:根据求解得到的数值解,计算并绘制出感兴趣的物理量。
还可以评估数值方法的误差和稳定性,并进行必要的修正。
8.参数选择:在数值解的迭代过程中,可能需要选择合适的参数,如网格大小和时间步长等。
这需要根据问题的特性和数值方法的准则进行选择。
9.优化和改进:根据数值解的结果和收敛性,可以对数值方法进行改进和优化。
可能需要调整离散化方法,调整网格布局或改进迭代算法。
总之,偏微分方程的数值解流程是一个迭代过程,通过将偏微分方程离散化为差分方程,并进行迭代求解和收敛性判断,获得问题的数值解。
这个过程需要认真的数值计算和对问题的物理背景知识的深刻理解。
偏微分方程数值解法的计算方法偏微分方程(Partial Differential Equations, PDEs)是描述物理现象的一个有力工具,它可以描述复杂系统中物质、能量和动量的行为。
由于解析解十分困难或者甚至不存在,数值模拟是解决PDE问题的重要方法之一。
现今,许多物理和生物学领域的实际应用中,PDE的数值解法已经发挥了重要作用。
本文将介绍PDE的数值解法计算方法。
1.有限差分法(Finite Difference Method)有限差分法是PDE数值解法中最广泛应用的一种方法,其基本思想是用离散网格来逼近连续的PDE问题。
用有限差分法求解PDE问题可以分为以下几步:首先,将求解区域离散化,建立一个离散网格;然后,在网格上构造符合原始问题条件的差分方程;最后,将差分方程解出来,得到离散的数值解。
有限差分法的优点是简单易行,对于解决一些简单问题非常有效。
但由于精度受限,难以处理复杂问题,例如边界条件比较复杂、域的形状不规则等问题,效果不是很理想。
此外,如果PDE包含时间变量,用有限差分法求解的效果也不是很好,容易产生数值震荡现象。
2.有限体积法(Finite Volume Method)有限体积法是一种在控制体上积分求解PDE的方法。
所谓的控制体是指PDE求解区域的一个子集。
有限体积法与有限差分法的思想是相似的,它们都是将求解域分成若干个小的控制体,然后在每个控制体上构造差分方程来近似PDE。
和有限差分法相比,有限体积法的主要优势在于能够更好的处理不规则域和复杂边界条件,并且数值解更为准确。
3.有限元法(Finite Element Method)有限元法是PDE数值解法中的一种重要方法,其基本思想是通过将求解域分成若干个小三角形、四边形等有限元来逼近实际域。
有限元法与有限差分法和有限体积法的不同之处在于,它使用基函数来逼近原始问题中的未知函数。
在求解过程中,有限元法需要对基函数进行插值,从而方便地求出未知函数在任意点的近似值。
偏微分方程的数值解法偏微分方程(Partial Differential Equation, PDE)是数学和物理学中的重要概念,广泛应用于工程、科学和其他领域。
在很多情况下,准确解析解并不容易获得,因此需要利用数值方法求解偏微分方程。
本文将介绍几种常用的数值解法。
1. 有限差分法(Finite Difference Method)有限差分法是最常见和经典的数值解法之一。
基本思想是将偏微分方程在求解域上进行离散化,然后用差分近似代替微分运算。
通过求解差分方程组得到数值解。
有限差分法适用于边界条件简单且求解域规则的问题。
2. 有限元法(Finite Element Method)有限元法是适用于不规则边界条件和求解域的数值解法。
将求解域划分为多个小区域,并在每个小区域内选择适当的形状函数。
通过将整个域看作这些小区域的组合来逼近原始方程,从而得到一个线性代数方程组。
有限元法具有较高的灵活性和适用性。
3. 有限体积法(Finite Volume Method)有限体积法是一种较新的数值解法,特别适用于物理量守恒问题。
它通过将求解域划分为多个控制体积,并在每个体积内计算守恒量的通量,来建立离散的方程。
通过求解这个方程组得到数值解。
有限体积法在处理守恒律方程和非结构化网格上有很大优势。
4. 局部网格法(Local Grid Method)局部网格法是一种多尺度分析方法,适用于具有高频振荡解的偏微分方程。
它将计算域划分为全局细网格和局部粗网格。
在全局细网格上进行计算,并在局部粗网格上进行局部评估。
通过对不同尺度的解进行耦合,得到更精确的数值解。
5. 谱方法(Spectral Method)谱方法是一种基于傅里叶级数展开的高精度数值解法。
通过选择适当的基函数来近似求解函数,将偏微分方程转化为代数方程。
谱方法在处理平滑解和周期性边界条件的问题上表现出色,但对于非平滑解和不连续解的情况可能会遇到困难。
6. 迭代法(Iterative Method)迭代法是一种通过多次迭代来逐步逼近精确解的求解方法。
偏微分方程的数值解法
微分方程作为数学分析的一部分,一直以来是一个重要的研究课题,用于描述物理、化学、生物等复杂系统的解决方案。
微分方程的研究可以追溯到古希腊,直到20世纪60年代之前,由于计算手段有限,其解决方案主要凭借手算来解决,往往需要花费大量的精力。
随着计算机技术的发展,解决微分方程的耗时越来越短,这就伴随着微分方程的数值解法的出现——即将微分方程转变为一种计算机可以识别的数学形式,这就是数值解法。
数值解法指的是通过数值方法来研究微分方程的解决方案,这种方法包括各种求解方法技术,如梯形法、改进梯形法、辛普森-简化积分、扩展梯形法等,这些都是用数值方法求解微分方程的主要方法。
将数值解法应用于微分方程也有重要意义,可以使人们更容易理解微分方程,同时降低应用研究负担,提高研究质量,是分析研究和解决复杂问题的重要手段。
应用数值解法,除了解决微分方程外,还可以用于传热、流体力学以及各种复杂的工程问题,特别是在工程和科学研究中,帮助人们更精确地计算研究结果,从而更好地理解和改进系统的性能。
今天,数值解法仍在广泛应用于高校的教学科研工作中,它不仅可以帮助教师和学生更自如地进行计算机数值建模,而且还可以为高等教育发展提供有效的解决方案,使教学课程更加高效和全面。
综上所述,数值解法在解决微分方程方面具有重要意义,在高等教育中,它的使用能帮助人们更全面理解复杂问题,为其据取准确结果,也为高等教育发展和提供有效的支持。
偏微分方程的数值解法在科学和工程领域中,偏微分方程(Partial Differential Equations,简称PDEs)被广泛应用于描述自然现象和工程问题。
由于许多复杂的PDE难以找到解析解,数值方法成为了求解这些方程的重要途径之一。
本文将介绍几种常见的偏微分方程数值解法,并探讨其应用。
一、有限差分法有限差分法是求解偏微分方程最常用的数值方法之一。
其基本思想是将空间和时间连续区域离散化成有限个点,通过差分逼近偏微分方程中的导数,将偏微分方程转化为差分方程。
然后,利用差分方程的迭代计算方法,求解近似解。
以一维热传导方程为例,其数值解可通过有限差分法得到。
将空间区域离散化为若干个网格点,时间区域离散化为若干个时间步长。
通过差分逼近热传导方程中的导数项,得到差分方程。
然后,利用迭代方法,逐步更新每个网格点的数值,直到达到收敛条件。
最终得到近似解。
二、有限元法有限元法是另一种常用于求解偏微分方程的数值方法。
它将连续的空间区域离散化为有限个单元,将PDE转化为每个单元内的局部方程。
然后,通过将各个单元的局部方程组合起来,构成整个区域的方程组。
最后,通过求解这个方程组来获得PDE的数值解。
有限元法的优势在于可以适应复杂的几何形状和边界条件。
对于二维或三维的PDE问题,有限元法可以更好地处理。
同时,有限元法还可以用于非线性和时变问题的数值求解。
三、谱方法谱方法是利用一组基函数来表示PDE的解,并将其代入PDE中得到一组代数方程的数值方法。
谱方法具有高精度和快速收敛的特点,在某些问题上比其他数值方法更具优势。
谱方法的核心是选择合适的基函数,常用的基函数包括Legendre多项式、Chebyshev多项式等。
通过将基函数展开系数与PDE的解相匹配,可以得到代数方程组。
通过求解这个方程组,可以得到PDE的数值解。
四、有限体积法有限体积法是将空间域划分为有限个小体积单元,将PDE在每个小体积单元上进行积分,通过适当的数值通量计算来近似描述流体在边界上的净流量。
第七章 偏微分方程数值解法——Crank-Nicolson 格式****(学号) *****(姓名)上机题目要求见教材P346,10题。
一、算法原理本文研究下列定解问题(抛物型方程)22(,) (0,0)(,0)() (0)(0,)(), (1,)() (0)u ua f x t x l t T t x u x x x l u t t u t t t T ϕαβ⎧∂∂-=<<≤≤⎪∂∂⎪=≤≤⎨⎪==<≤⎪⎩(1)的有限差分法,其中a 为正常数,,,,f ϕαβ为已知函数,且满足边界条件和初始条件。
关于式(1)的求解,采用离散化方法,剖分网格,构造差分格式。
其中,网格剖分是将区域{}0,0D x l t T =≤≤≤≤用两簇平行直线(0)(0)i k x x ih i M t t k k N τ==≤≤⎧⎨==≤≤⎩ 分割成矩形网格,其中,l Th M Nτ==分别为空间步长和时间步长。
将式(1)中的偏导数使用不同的差商代替,将得到不同的差分格式,如古典显格式、古典隐格式、Crank-Nicolson 格式等。
其中,Crank-Nicolson 格式具有更高的收敛阶数,应用更广泛,故本文采用Crank-Nicolson 格式求解抛物型方程。
Crank-Nicolson 格式推导:在节点(,)2i k x t τ+处考虑式(1),有22(,)(,)(,)222i k i k i k u u x t a x t f x t t x τττ∂∂+-+=+∂∂ (2)对偏导数(,)2i k u x t t τ∂+∂用中心差分展开 []2311+131(,)(,)(,)(,) ()224k k i k i k i k i i k i k u ux t u x t u x t x t t t t ττηητ++∂∂+=--<<∂∂ (3) 将22(,)2i k u x t x τ∂+∂在节点(,)i k x t 和1(,)i k x t +表示为222+122224+1221(,)=(,)+(,)22 (,) ()8i k i k i k k k i i k i k u u ux t x t x t x x x ux t t x tττηη⎡⎤∂∂∂+⎢⎥∂∂∂⎣⎦∂-<<∂∂ (4)对以上两个偏导数用二阶差分展开[]2112224i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k kk i k i i u x t u x t u x t u x t x hh u t x x x ξξ+-∂=-+∂∂-<<∂ (5)[]211111122241i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k k ki k i i u x t u x t u x t u x t x hh u t x x xξξ++++-++∂=-+∂∂-<<∂ (6)将式(4)(5)(6)分别代入式(3),略去高阶小量,用k i u 代替(,)i k u x t 并化简得()()()2111111112122,22k k k k k k k k i i i i i i i i i k a u u u u u u u u f x t h ττ+++++-+-⎛⎫⎡⎤---++-+=+ ⎪⎣⎦⎝⎭ (7) 令2/r a h τ=,将式(7)联合式(1)初始条件和边界条件,用矩阵的形式表示为:11112212211111221122221122221122 k k k k k kM M k k M M r r r r u u r r r r r ru u r r r r u u r r u u r r r r +++--+--⎡⎤⎡⎤+---⎢⎥⎢⎥⎢⎥⎢⎥⎡⎤⎡⎤⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎢⎥⎢⎥⎢⎥⎢⎥-+-⎢⎥⎢⎥⎣⎦⎣⎦()()()()()()112211,22,2 ,2,22k k k k M k M k k k r f x t t t f x t f x t r f x t t t ττααττττττββ+--+⎡⎤⎛⎫+++ ⎪⎢⎥⎝⎭⎢⎥⎢⎥⎛⎫+ ⎪⎢⎥⎝⎭⎢⎥+⎢⎥⎢⎥⎛⎫⎢⎥+ ⎪⎢⎥⎝⎭⎢⎥⎛⎫⎢⎥+++ ⎪⎢⎥⎝⎭⎣⎦(8) Crank-Nicolson 格式的截断误差为22()R O h τ=+,具有较高的精度。
二、计算代码Crank_Nicolson 格式完整代码function U=Crank_Nicolson(f,a,x0,xn,dx,t0,tm,dt,g,s0,sn) %采用Crank_Nicolson 格式求解抛物线型偏微分方程 % du/dt-a*d2u/dx2=f(x,t) %Input - f 抛物方程右端函数 % - a 为二阶导系数 % - x0 and xn 空间域端点 % - t0 and tm 时间域端点 % - dx 为空间步长,dt 为时间步长 % - g 为初始条件函数 % - s0,sn 为边界条件函数%Output - U 输出,横坐标为空间,纵坐标为时间 M=(tm-t0)/dt;N=(xn-x0)/dx;%网格数 x=x0+dx:dx:xn-dx; t=t0:dt:tm; u=feval(g,x);u=u'; r=a*dt/dx/dx;%步长比%Crank-Nicolson 格式:A*u_(k+1)=B*u_k+CA=-r/2*[zeros(1,N-1);eye(N-2,N-2),zeros(N-2,1)]-r/2* ...[zeros(N-2,1),eye(N-2,N-2);zeros(1,N-1)]+(1+r)*eye(N-1,N-1); A=inv(A);B=r/2*[zeros(1,N-1);eye(N-2,N-2),zeros(N-2,1)]+r/2* ...[zeros(N-2,1),eye(N-2,N-2);zeros(1,N-1)]+(1-r)*eye(N-1,N-1); U=[]; for k=1:MC=dt*feval(f,x,t(k)+0.5*dt); C=C';C(1)=C(1)+r/2*(feval(s0,t(k))+feval(s0,t(k+1))); C(N-1)=C(N-1)+r/2*(feval(sn,t(k))+feval(sn,t(k+1))); u=A*(B*u+C); U=[U;u']; end三、计算结果及分析对于定解问题2210 (01,01)(,0) (01)(0,), (1,) (01)x t t u ux t t x u x e x u t e u t e t +⎧∂∂-=<<≤≤⎪∂∂⎪=≤≤⎨⎪==<≤⎪⎩(9)取空间步长1/x M ∆=,时间步长1/t N ∆=,采用Crank_Nicolson 格式计算,并将计算结果与精确值()x t y x e +=作比较,计算调用程序Crank_Nicolson.m ,如下clcformat longf=inline('0*x+0*t');%抛物方程右端函数 g=inline('exp(x)');%初始条件函数s0=inline('exp(t)');sn=inline('exp(t+1)');%边界条件函数 a=1;x0=0;xn=1;t0=0;tm=1; M=40;N=40; err=[]; kk=4; for ii=1:kkdx=1/N;dt=(tm-t0)/M;%空间步长,时间步长U=Crank_Nicolson(f,a,x0,xn,dx,t0,tm,dt,g,s0,sn);%调用Crank_Nicolson 函数 U_CN=U(length(U),N/5:N/5:4*N/5); %在四个目标点处的数值解 fu=inline('exp(x+t)'); %精确方程 xx=0.2:0.2:0.8;tt=1.0;U_real=feval(fu,xx,tt); %在四个目标点处的精确解 %abs(U_CN-U_real)err=[err,sqrt((U_CN-U_real)*(U_CN-U_real)')]; %平方误差和开方 M=M*2;N=N*2;%步长反复二分 end for ii=2:kkerr(ii)/err(ii-1)%误差观察 endfprintf('%16.15f ', err)在MATLAB 中运行以上程序,计算结果如表1所示表1 Crank_Nicolson 格式计算结果及其误差(40M N ==)从表1可以看出,在空间步长和时间步长均为0.25时,采用Crank_Nicolson 格式计算抛物线方程(5)的数值解与精确解之间的误差达到了410-,故很好的实现偏微分方程的数值解法,且具有较高的精度和较低的运算复杂度。
同时,为了比较不同的步长所带来的计算精度,本文通过将步长反复二分,观察四个输出点的误差均方和减小的规律,如表2所示。
表2 不同步长下的误差及其规律从表2可以看出,随着空间步长和时间步长的减小,数值计算的误差呈下降趋势,说明,随着时间步长和空间步长的减小,计算结果可以收敛到精确解。
同时,通过观察表2最后一列,可见,时间步长和空间步长同时减半,计算误差降低为原来的四分之一,这与Crank_Nicolson 格式的截断误差22()R O h τ=+(其中为τ时间步长,h 为空间步长)是符合一致的。
四、结论本文介绍了偏微分方程求解的Crank_Nicolson 方法,其主要思想是用离散的、只含有限个未知数的差分方程去近似代替连续变量的微分方程和边界条件,并将相应的差分方程的解作为原问题的近似解。
Crank_Nicolson 格式是一种隐格式,是绝对稳定的。
同时,本文考察了其收敛性,实验证明,Crank_Nicolson 格式是收敛的,且具有二阶收敛性。