MATLAB 数学应用 微分方程 一维偏微分方程 求解单个PDE

本文说明了单个 PDE 的解的构成以及如何对解进行计算和绘图。

以如下偏微分方程为例

π 2 ∂ u ∂ t = ∂ 2 u ∂ 2   x π^2\dfrac{∂u}{∂t} = \dfrac{∂^{2}u}{∂^{2} x} π2tu=2x2u

该方程的定义区间为 0≤x≤1,时间 t≥0。在 t=0 时,解满足初始条件

u ( x , 0 ) = s i n ( π x ) . u(x,0)=sin(πx). u(x,0)=sin(πx).

此外,在 x=0 和 x=1 时,解满足边界条件

u ( 0 , t ) = 0 , u(0,t)=0, u(0,t)=0,

π e − t + ∂ u ∂ x ( 1 , t ) = 0. πe^{−t}+\dfrac{∂u}{∂x}(1,t)=0. πet+xu(1,t)=0.

要在 MATLAB 中求解该方程,您需要对方程、初始条件和边界条件编写代码,然后在调用求解器 pdepe 之前选择合适的解网格。您可以将所需的函数作为局部函数包含在文件末尾,或者将它们作为单独的命名文件保存在 MATLAB 路径上的目录中。

编写方程代码

在编写方程代码之前,您需要按照 pdepe 求解器所需的形式对其进行重写。pdepe 所需的标准形式是

c ( x , t , u , ∂ u ∂ x ) ∂ u ∂ t = x − m ∂ ∂ x ( x m f ( x , t , u , ∂ u ∂ x ) ) + s ( x , t , u , ∂ u ∂ x ) 。 c(x,t,u,\dfrac{∂u}{∂x})\dfrac{∂u}{∂t}=x^{−m}\dfrac{∂}{∂x}(x^mf(x,t,u,\dfrac{∂u}{∂x}))+s(x,t,u,\dfrac{∂u}{∂x})。 c(x,t,u,xu)tu=xmx(xmf(x,t,u,xu))+s(x,t,u,xu)

以这种形式编写的 PDE 变为

π 2 ∂ u ∂ t = x 0 ∂ ∂ x ( x 0 ∂ u ∂ x ) + 0 。 π^2\dfrac{∂u}{∂t}=x^0\dfrac{∂}{∂x}(x^0\dfrac{∂u}{∂x})+0。 π2tu=x0x(x0xu)+0

将方程写作适当形式后,可知相关各项为:

m = 0 m=0 m=0

c ( x , t , u , ∂ u ∂ x ) = π 2 c(x,t,u,\dfrac{∂u}{∂x})=π^2 c(x,t,u,xu)=π2

f ( x , t , u , ∂ u ∂ x ) = ∂ u ∂ x f(x,t,u,\dfrac{∂u}{∂x})=\dfrac{∂u}{∂x} f(x,t,u,xu)=xu

s ( x , t , u , ∂ u ∂ x ) = 0 s(x,t,u,\dfrac{∂u}{∂x})=0 s(x,t,u,xu)=0

现在,您可以创建一个函数以编写方程代码。该函数应具有签名 [c,f,s] = pdex1pde(x,t,u,dudx):

  • x 是独立的空间变量。
  • t 是独立的时间变量。
  • u 是关于 x 和 t 微分的因变量。
  • dudx 是偏空间导数 ∂u/∂x。
  • 输出 c、f 和 s 对应于 pdepe 所需的标准 PDE 形式中的系数。根据输入变量 x、t、u 和 dudx 对这些系数编写代码。

因此,此示例中的方程可以由以下函数表示:

function [c,f,s] = pdex1pde(x,t,u,dudx)
c = pi^2;
f = dudx;
s = 0;
end

(注意:所有函数都作为局部函数包含在示例的末尾。)

代码初始条件

接下来,编写一个返回初始条件的函数。初始条件应用于第一个时间值 tspan(1)。该函数应具有签名 u0 = pdex1ic(x)。

对应的函数是

function u0 = pdex1ic(x)
u0 = sin(pi*x);
end

编写边界条件代码

现在,编写一个计算边界条件的函数。对于在区间 a≤x≤b 上提出的问题,边界条件应用于所有 t 以及 x=a 或 x=b。求解器所需的边界条件的标准形式是

p ( x , t , u ) + q ( x , t ) f ( x , t , u , ∂ u ∂ x ) = 0. p(x,t,u)+q(x,t)f(x,t,u,\dfrac{∂u}{∂x})=0. p(x,t,u)+q(x,t)f(x,t,u,xu)=0.

以这种标准形式重写边界条件,并读取系数值。

对于 x=0,方程为

u ( 0 , t ) = 0   →   u + 0 ⋅ ∂ u ∂ x = 0. u(0,t)=0 → u+0⋅\dfrac{∂u}{∂x}=0. u(0,t)=0u+0xu=0.

系数是:

  • p(0,t,u)=u
  • q(0,t)=0

对于 x=1,方程为

π e − t + ∂ u ∂ x ( 1 , t ) = 0   → π e − t + 1 ⋅ ∂ u ∂ x ( 1 , t ) = 0. πe^{−t}+\dfrac{∂u}{∂x}(1,t)=0 →πe^{−t}+1⋅\dfrac{∂u}{∂x}(1,t)=0. πet+xu(1,t)=0πet+1xu(1,t)=0.

系数是:

  • p ( 1 , t , u ) = π e − t p(1,t,u)=πe^{−t} p(1,t,u)=πet
  • q ( 1 , t ) = 1 q(1,t)=1 q(1,t)=1

由于边界条件函数以 f ( x , t , u , ∂ u ∂ x ) f(x,t,u,\dfrac{∂u}{∂x}) f(x,t,u,xu) 形式表示,并且此项已在主 PDE 函数中定义,因此不需要在边界条件函数中指定方程的此部分。您只需在每个边界处指定 p ( x , t , u ) p(x,t,u) p(x,t,u) q ( x , t ) q(x,t) q(x,t) 的值。

边界函数应使用函数签名 [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t):

  • 对于左边界,输入 xl 和 ul 对应于 u 和 x。
  • 对于右边界,输入 xr 和 ur 对应于 u 和 x。
  • t 是独立的时间变量。
  • 对于左边界,输出 pl 和 ql 对应于 p(x,t,u) 和 q(x,t)(对于此问题,x=0)。
  • 对于右边界,输出 pr 和 qr 对应于 p(x,t,u) 和 q(x,t)(对于此问题,x=1)。

此示例中的边界条件由以下函数表示:

function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t)
pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;
end

选择解网格

在求解方程之前,需要指定希望用 pdepe 计算解的网格点 (t,x)。将点指定为向量 t 和 x。向量 t 和 x 在求解器中的作用不同。尤其是解的成本和精确度很大程度上依赖于向量 x 的长度。然而,计算对向量 t 中的值并不敏感。

对于此问题,请使用一个网格,该网格具有 20 个位于空间区间 [0,1] 中的等距点、5 个位于时间区间 [0,2] 中的 t 值。

x = linspace(0,1,20);
t = linspace(0,2,5);

求解方程

最后,使用对称性值 m、PDE 方程、初始条件、边界条件以及 x 和 t 的网格来求解方程。

m = 0;
sol = pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,x,t);

pdepe 以三维数组 sol 形式返回解,其中 sol(i,j,k) 是在 t(i) 和 x(j) 处计算的解 u k u_k uk 的第 k 个分量的逼近值。sol 的大小是 length(t)×length(x)×length(u0),因为 u0 为每个解分量指定初始条件。对于此问题,u 只有一个分量,因此 sol 是 5×20 矩阵,但通常您可以使用命令 u = sol(:,:,k) 提取第 k 个解分量。

从 sol 中提取第一个解分量。

u = sol(:,:,1);

对解进行绘图

创建解的曲面图。

surf(x,t,u)
title('Numerical solution computed with 20 mesh points')
xlabel('Distance x')
ylabel('Time t')

在这里插入图片描述

选择此问题的初始条件和边界条件,以得到解析解,由下式给出

u ( x , t ) = e − t     s i n ( π x ) . u(x,t)=e^{−t}  sin(πx). u(x,t)=etsin(πx).

绘制采用相同网格点的解析解。

surf(x,t,exp(-t)'*sin(pi*x))
title('True solution plotted with 20 mesh points')
xlabel('Distance x')
ylabel('Time t')

在这里插入图片描述

现在,比较在 t f t_f tf(即 t 的最终值)处的数值解和解析解。在此示例中, t f = 2 。 t_f=2。 tf=2

plot(x,u(end,:),'o',x,exp(-t(end))*sin(pi*x))
title('Solution at t = 2')
legend('Numerical, 20 mesh points','Analytical','Location','South')
xlabel('Distance x')
ylabel('u(x,2)')

在这里插入图片描述

局部函数

此处列出 PDE 求解器 pdepe 为计算解而调用的局部辅助函数。您也可以将这些函数作为它们自己的文件保存在 MATLAB 路径上的目录中。

function [c,f,s] = pdex1pde(x,t,u,dudx) % Equation to solve
c = pi^2;
f = dudx;
s = 0;
end
%----------------------------------------------
function u0 = pdex1ic(x) % Initial conditions
u0 = sin(pi*x);
end
%----------------------------------------------
function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t) % Boundary conditions
pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;
end
%----------------------------------------------
  • 6
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结冰架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值