求解具有不连续的偏微分方程
这个例子展示了如何解决与材料接口的偏微分方程。材料界面在问题中产生了不连续<年代p一个n class="inlineequation"> ,且初始条件在右边界处存在不连续<年代p一个n class="inlineequation"> .
考虑分段偏微分方程
初始条件是
边界条件为
要在MATLAB中求解这个方程,需要对方程、初始条件和边界条件进行编码,然后在调用求解器之前选择合适的解网格pdepe
.您可以将所需的函数作为本地函数包含在文件的末尾(如这里所做的),或者将它们保存为单独的命名文件,保存在MATLAB路径的目录中。
代码方程
在对方程进行编码之前,您需要确保它的形式是pdepe
解算器的预期。标准形式是pdepe
预计是
.
在这种情况下,偏微分方程是正确的形式,所以你可以读出系数的值。
通量项的值<年代p一个n class="inlineequation"> 源项<年代p一个n class="inlineequation"> 的值而改变<年代p一个n class="inlineequation"> .系数为:
现在您可以创建一个函数来编码这个方程。函数应该具有签名[c,f,s] = pdex2pde(x,t,u,dudx)
:
x
是独立的空间变量。t
是独立时间变量。u
因变量是否被微分x
而且t
.dudx
偏导数是空间导数吗<年代p一个n class="inlineequation"> .输出
c
,f
,年代
对应于标准偏微分方程形式中的系数pdepe
.这些系数是根据输入变量编码的x
,t
,u
,dudx
.
因此,本例中的方程可以用函数表示:
函数年代p一个n>[c,f,s] = pdex2pde(x,t,u,dudx) c = 1;<年代p一个n style="color:#0000FF">如果年代p一个n>X <= 0.5 f = 5*dudx;S = -1000*exp(u);<年代p一个n style="color:#0000FF">其他的年代p一个n>F = dudx;S = -exp(u);<年代p一个n style="color:#0000FF">结束年代p一个n>结束年代p一个n>
(注意:所有函数都作为局部函数包含在示例的末尾。)
代码初始条件
接下来,编写一个返回初始条件的函数。初始条件应用于第一时间值,并提供的值<年代p一个n class="inlineequation">
对于任意值<年代p一个n class="inlineequation">
.使用函数签名U0 = pdex2ic(x)
写出函数。
初始条件是
对应的函数是
函数年代p一个n>U0 = pdex2ic(x)<年代p一个n style="color:#0000FF">如果年代p一个n>X < 1 u0 = 0;<年代p一个n style="color:#0000FF">其他的年代p一个n>U0 = 1;<年代p一个n style="color:#0000FF">结束年代p一个n>结束年代p一个n>
代码边界条件
现在,编写一个计算边界条件的函数。对于间隔上提出的问题<年代p一个n class="inlineequation"> 时,边界条件适用于所有情况<年代p一个n class="emphasis">t,要么<年代p一个n class="inlineequation"> 或<年代p一个n class="inlineequation"> .求解器所期望的边界条件的标准形式是
由于本例具有球面对称性(<年代p一个n class="inlineequation">
),pdepe
求解器自动强制左边界条件在原点处约束解,忽略边界函数中为左边界指定的任何条件。对于左边的边界条件,你可以指定<年代p一个n class="inlineequation">
.对于正确的边界条件,可以用标准形式重写边界条件,并读取的系数值<年代p一个n class="inlineequation">
而且<年代p一个n class="inlineequation">
.
为<年代p一个n class="inlineequation"> ,方程为<年代p一个n class="inlineequation"> .系数为:
边界函数应该使用函数签名[pl,ql,pr,qr] = pdex2bc(xl,ul,xr,ur,t)
:
输入
xl
而且ul
对应于<年代p一个n class="emphasis">u而且<年代p一个n class="emphasis">x对于左边的边界。输入
xr
而且你的
对应于<年代p一个n class="emphasis">u而且<年代p一个n class="emphasis">x对于右边的边界。t
是独立时间变量。输出
pl
而且ql
对应于<年代p一个n class="inlineequation"> 而且<年代p一个n class="inlineequation"> 对于左边界(<年代p一个n class="inlineequation"> 对于这个问题)。输出
公关
而且qr
对应于<年代p一个n class="inlineequation"> 而且<年代p一个n class="inlineequation"> 对于右边界(<年代p一个n class="inlineequation"> 对于这个问题)。
本例中的边界条件由函数表示:
函数年代p一个n>[pl,ql,pr,qr] = pdex2bc(xl,ul,xr,ur,t) pl = 0;Ql = 0;Pr = ur - 1;Qr = 0;<年代p一个n style="color:#0000FF">结束年代p一个n>
选择解决方案网格
空间网格应该包括附近的几个值<年代p一个n class="inlineequation"> 考虑到界面的不连续,以及附近的点<年代p一个n class="inlineequation"> 由于初始值不一致(<年代p一个n class="inlineequation"> )和边界值(<年代p一个n class="inlineequation"> )在那时。解决方案变化迅速,为小<年代p一个n class="inlineequation"> ,所以使用一个时间步长来解决这个急剧的变化。
X = [0 0.1 0.2 0.3 0.4 0.45 0.475 0.5 0.525 0.55 0.6 0.7 0.8 0.9 0.95 0.975 0.99 1];T = [0 0.001 0.005 0.01 0.05 0.1 0.5 1];
解决方程
最后,利用对称性解方程米
, PDE方程,初始条件,边界条件,网格x
而且t
.
M = 2;Sol = pdepe(m,@pdex2pde,@pdex2ic,@pdex2bc,x,t);
pdepe
返回3-D数组中的解索尔
,在那里索尔(i, j, k)
接近k
解的第Th分量<年代p一个n class="inlineequation">
评估在t(我)
而且x (j)
.的大小索尔
是长度(t)
——- - - - - -长度(x)
——- - - - - -长度(情况)
,因为情况
为每个解决方案组件指定初始条件。对于这个问题,u
只有一个组成部分,那么索尔
是一个8 × 18的矩阵,但通常你可以提取k
使用命令的解决方案组件U = sol(:,:,k)
.
从中提取第一个解决方案组件索尔
.
U = sol(:,:,1);
策划解决方案
创建解的曲面图<年代p一个n class="inlineequation"> 在所选网格点上绘制<年代p一个n class="inlineequation"> 而且<年代p一个n class="inlineequation"> .自<年代p一个n class="inlineequation"> 该问题是在具有球面对称的球面几何中提出的,因此解仅在径向上发生变化<年代p一个n class="inlineequation"> 方向。
冲浪(x, t, u)标题(<年代p一个n style="color:#A020F0">非均匀网格的数值解年代p一个n>)包含(<年代p一个n style="color:#A020F0">“距离x”年代p一个n>) ylabel (<年代p一个n style="color:#A020F0">“t”年代p一个n>) zlabel (<年代p一个n style="color:#A020F0">解决你的年代p一个n>)
现在,绘图<年代p一个n class="inlineequation"> 而且<年代p一个n class="inlineequation"> 来获得表面图中等高线的侧面视图。在<年代p一个n class="inlineequation"> 突出材料界面的效果。
情节(x, u, x, u,<年代p一个n style="color:#A020F0">‘*’年代p一个n>) line([0.5 0.5], [-3 1],<年代p一个n style="color:#A020F0">“颜色”年代p一个n>,<年代p一个n style="color:#A020F0">“k”年代p一个n>)包含(<年代p一个n style="color:#A020F0">“距离x”年代p一个n>) ylabel (<年代p一个n style="color:#A020F0">解决你的年代p一个n>)标题(<年代p一个n style="color:#A020F0">“多次的解决方案简介”年代p一个n>)
本地函数
这里列出的是PDE求解器的本地helper函数pdepe
调用来计算解决方案。或者,您可以将这些函数保存为它们自己的文件,保存在MATLAB路径的目录中。
函数年代p一个n>[c,f,s] = pdex2pde(x,t,u,dudx)<年代p一个n style="color:#228B22">%待解方程年代p一个n>C = 1;<年代p一个n style="color:#0000FF">如果年代p一个n>X <= 0.5 f = 5*dudx;S = -1000*exp(u);<年代p一个n style="color:#0000FF">其他的年代p一个n>F = dudx;S = -exp(u);<年代p一个n style="color:#0000FF">结束年代p一个n>结束年代p一个n>%----------------------------------------------年代p一个n>函数年代p一个n>U0 = pdex2ic(x)<年代p一个n style="color:#228B22">%初始条件年代p一个n>如果年代p一个n>X < 1 u0 = 0;<年代p一个n style="color:#0000FF">其他的年代p一个n>U0 = 1;<年代p一个n style="color:#0000FF">结束年代p一个n>结束年代p一个n>%----------------------------------------------年代p一个n>函数年代p一个n>[pl,ql,pr,qr] = pdex2bc(xl,ul,xr,ur,t)<年代p一个n style="color:#228B22">%边界条件年代p一个n>Pl = 0;Ql = 0;Pr = ur - 1;Qr = 0;<年代p一个n style="color:#0000FF">结束年代p一个n>%----------------------------------------------年代p一个n>