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

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

以如下偏微分方程为例

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

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

u(x,0)=sin(π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(xmf(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=x0∂∂x(x0∂u∂x)+0。π^2\dfrac{∂u}{∂t}=x^0\dfrac{∂}{∂x}(x^0\dfrac{∂u}{∂x})+0。π2tu=x0x(x0xu)+0

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

m=0m=0m=0

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

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

s(x,t,u,∂u∂x)=0s(x,t,u,\dfrac{∂u}{∂x})=0s(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−tp(1,t,u)=πe^{−t}p(1,t,u)=πet
  • q(1,t)=1q(1,t)=1q(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) 处计算的解 uku_kuk 的第 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  sin(π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')

在这里插入图片描述

现在,比较在 tft_ftf(即 t 的最终值)处的数值解和解析解。在此示例中,tf=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
%----------------------------------------------
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

结冰架构

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

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

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

打赏作者

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

抵扣说明:

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

余额充值