系列文章目录
1.二阶椭圆型方程的五点差分格式-MATLAB实现
2.抛物线型方程的向前差分格式
3.双曲型方程最简差分格式
文章目录
前言
本文主要介绍求解抛物型方程的最简差分格式(explicit format),包括其理论基础及相应的MATLAB代码实现。
一、问题介绍
本文主要介绍如下双曲型方程的最简差分格式以及其数值解的求解:
∂
2
u
∂
t
2
−
a
∂
2
u
∂
x
2
=
0
,
(
x
,
t
)
∈
Ω
,
Ω
=
{
(
x
,
t
)
,
0
<
x
<
1
,
0
<
t
<
1
)
}
\frac{\partial^2u}{\partial t^2}-a\frac{\partial ^2u}{\partial x^2}=0,(x,t)\in\Omega,\Omega=\begin{Bmatrix} {(x,t),0<x<1,0<t<1)} \end{Bmatrix}
∂t2∂2u−a∂x2∂2u=0,(x,t)∈Ω,Ω={(x,t),0<x<1,0<t<1)}
相应的初边值条件为:
{
u
(
x
,
0
)
=
φ
(
x
)
,
∂
∂
t
u
(
x
,
0
)
=
ψ
(
x
)
,
0
⩽
x
⩽
1
u
(
0
,
t
)
=
a
(
t
)
,
u
(
1
,
t
)
=
β
(
t
)
,
0
⩽
t
⩽
1
\left\{\begin{matrix} u(x,0)=\varphi (x),\frac{\partial }{\partial t}u(x,0)=\psi (x),0\leqslant x\leqslant 1& \\ u(0,t)=a(t),u(1,t)=\beta(t),0\leqslant t\leqslant 1& \end{matrix}\right.
{u(x,0)=φ(x),∂t∂u(x,0)=ψ(x),0⩽x⩽1u(0,t)=a(t),u(1,t)=β(t),0⩽t⩽1
二、最简差分格式
1.网格剖分
对区域 Ω \Omega Ω进行矩形网格剖分:用平行直线族 x = j h ( j = 0 , 1 , 2 , … , M ) , y = k t ( k = 0 , 1 , 2 , … , N ) x=jh(j=0,1,2,…,M),y=kt(k=0,1,2,…,N) x=jh(j=0,1,2,…,M),y=kt(k=0,1,2,…,N)对区域 Ω \Omega Ω作矩形网格剖分,网点 ( x j , t k ) 简记为 ( j , k ) (x_{j},t_{k})简记为(j,k) (xj,tk)简记为(j,k),其中 t 和 h t和h t和h为正常数,分别成为时间步长和空间步长,且 h = 1 M , t = 1 N h=\frac{1}{M},t=\frac{1}{N} h=M1,t=N1。
2.差商代替导数
将上述方程利用的二阶偏导数,用二阶中心差商去代替,可以得到如下的最简差分格式:
u
j
k
+
1
=
r
2
(
u
j
−
1
k
+
u
j
+
1
k
)
+
2
(
1
−
r
2
)
u
j
k
−
u
j
k
−
1
u_{j}^{k+1}=r^2(u_{j-1}^k+u_{j+1}^{k})+2(1-r^2)u_{j}^{k}-u_{j}^{k-1}
ujk+1=r2(uj−1k+uj+1k)+2(1−r2)ujk−ujk−1
3.初值条件的处理
对于上述给出的初值条件:
{
u
(
x
,
0
)
=
φ
(
x
)
∂
∂
t
u
(
x
,
0
)
=
ψ
(
x
)
\left\{\begin{matrix} u(x,0)=\varphi (x) & \\ \frac{\partial }{\partial t}u(x,0)=\psi (x)& \end{matrix}\right.
{u(x,0)=φ(x)∂t∂u(x,0)=ψ(x)
我们将其进行如下处理:
{
u
j
0
=
φ
j
u
j
1
=
r
2
2
[
φ
j
−
1
+
φ
j
+
1
]
+
(
1
−
r
2
)
φ
j
+
t
ψ
j
\left\{\begin{matrix} u_{j}^{0}=\varphi _j & \\ u_{j}^1=\frac{r^2}{2}[\varphi_{j-1}+\varphi_{j+1}]+(1-r^2)\varphi_{j}+t\psi _{j}& \end{matrix}\right.
{uj0=φjuj1=2r2[φj−1+φj+1]+(1−r2)φj+tψj
4.稳定性及收敛性
最简差分格式稳定的充要条件是 r < 1 r<1 r<1,Courant条件为 r ⩽ 1 r\leqslant1 r⩽1,局部截断的的收敛阶为 R j k = O ( h 2 + t 2 ) R_{j}^{k}=O(h^2+t^2) Rjk=O(h2+t2)
三.实例及MATLAB代码
例题:
∂
2
u
∂
t
2
−
∂
2
u
∂
x
2
=
0
,
(
x
,
t
)
∈
Ω
,
Ω
=
{
(
x
,
t
)
,
0
<
x
<
1
,
0
<
t
<
1
)
}
\frac{\partial^2u}{\partial t^2}-\frac{\partial ^2u}{\partial x^2}=0,(x,t)\in\Omega,\Omega=\begin{Bmatrix} {(x,t),0<x<1,0<t<1)} \end{Bmatrix}
∂t2∂2u−∂x2∂2u=0,(x,t)∈Ω,Ω={(x,t),0<x<1,0<t<1)}
相应的初边值条件为:
{
u
(
x
,
0
)
=
s
i
n
(
π
x
)
,
∂
∂
t
u
(
x
,
0
)
=
0
,
0
⩽
x
⩽
1
u
(
0
,
t
)
=
u
(
1
,
t
)
=
0
,
0
⩽
t
⩽
1
\left\{\begin{matrix} u(x,0)=sin(\pi x),\frac{\partial }{\partial t}u(x,0)=0,0\leqslant x\leqslant 1& \\ u(0,t)=u(1,t)=0,0\leqslant t\leqslant 1& \end{matrix}\right.
{u(x,0)=sin(πx),∂t∂u(x,0)=0,0⩽x⩽1u(0,t)=u(1,t)=0,0⩽t⩽1
对于此问题的数值解的求解方法,本文用MATLAB实现如下:
function [Uh,e]=format(M,N,a,b,c,d,k,c1,c2)
%向前差分格式
%M,N分别为x轴和t轴方向的剖分份数
%对应的区域为[a,b]×[c,d]
%k为方程中对应的常数a
%c1,c2为对应的边值条件
%Uh为数值解,e为误差,r为网比,uh为精确解
%步长
h=(b-a)/M;
t=(d-c)/N;
r=sqrt(k)*t/h;%网比
if r>=1
error("网比大于1不稳定")
end
Uh=zeros(N+1,M+1);%数值解
uh=zeros(N+1,M+1);%精确解
%计算精确解uh
for i=1:N+1
for j=1:M+1
uh(i,j)=cos(pi*(i-1)*t)*sin(pi*(j-1)*h);%问题一
end
end
%赋边界条件
Uh(2:N+1,1)=c1;
Uh(2:N+1,M+1)=c2;
%赋初始条件
Uh(1,1:M+1)=fg1(a:h:b);
Uh(2,1:M+1)=fg2(a:h:b,r,h,t);
%计算内点上的数值解Uh
for i=3:N+1
for j=2:M
Uh(i,j)=(r^2)*(Uh(i-1,j-1)+Uh(i-1,j+1))+2*(1-r^2)*Uh(i-1,j)-Uh(i-2,j);
end
end
e=norm(Uh-uh);%误差
初值计算函数:
function y=fg1(x)%初值条件的处理
y=sin(pi*x);%问题一
end
function y=fg2(x,r,h,t)%初值条件的处理
y=((r^2)/2)*(sin((x-h)*pi)+sin((x+h)*pi))+(1-r^2)*sin(x*pi);%问题一
end
对于数值解的图像绘制可以使用如下代码:
x=a:h:b;
y=c:t:d;
[X,Y]=meshgrid(x,y);
surf(X,Y,Uh);