偏微分方程的数值解

Wolfram 语言中的函数 NDSolve 具备广泛的求解偏微分方程(PDEs)的能力. NDSolve 有一个独特的功能:在用符号形式给出偏微分方程及其求解域之后,NDSolve 会自动选择看上去适合其问题结构的数值方法. 通常情况下,自动算法选择工作得很好,但了解所使用的数值方法,既有利于更好的理解求得的解,也有利于调整方法选项以求得更好的解或更有效的求解.

NDSolve[{eqn1,eqn2,},u,{x,xmin,xmax},{y,ymin,ymax}]求方程组 在矩形区域 上的数值解
NDSolve[{eqn1,eqn2,},u,{x,y}Ω]求方程组 在区域 Ω 上的数值解
NDSolve[{eqn1,eqn2,},u,{t,tmin,tmax},{x,y}Ω]求时间依赖性方程组 之间在空间区域 Ω 上的解 .

NDSolve 求偏微分方程的数值解.

NDSolve 使用有限元和有限差分法来离散化及求解偏微分方程. 数值直线方法则被用于和有限元或有限差分空间离散化方法一起求解时间依赖性方程,关于它的细节在教程数值直线方法中有描述. 有限元方法更一般些,详细描述可参见它本身的教程.

下面的例子简要介绍了可以怎样输入方程和算法的自动选择.

载入一个便于检验解的包.
In[1]:=
Click for copyable input
求解矩形区域上边界条件全为零的双变量泊松方程.
In[2]:=
Click for copyable input
Out[2]=
In[3]:=
Click for copyable input
Out[3]=

上面的输入使用了显式的求导记法. 对有些问题使用运算符形式更具表现力也更正确. 默认情况下,常见运算符 GradDivCurlLaplacian 会自动求值,但通常来说表述偏微分方程最好还是不要自动求值. 使用 Inactive 可以保持运算符形式. 一般情况下,Inactive[f] 表示 f 不进行求值的不活跃形式. Inactive 形式可以用 Activate 重新激活,但像 NDSolve 这样的命令可以直接使用不活跃形式.

微分运算符的已求值和 Inactive 形式.
In[4]:=
Click for copyable input
Out[4]=
In[5]:=
Click for copyable input
Out[5]=

值得注意的是不活跃形式保持了运算符可能因为显式求值而丢失的意义,例如,若上式中的 是不连续的,那么它的导数表达式是不确定的,然而若 的不连续点刚好与 的相对应那么整个运算符表达式其实是良定义的.

得到不活跃运算符的一个便捷方法是使用 Inactivate,用法是把需要做失活处理的运算符用某种模式表达出来,作为其第二个参数.

使用 Inactivate.
In[6]:=
Click for copyable input
Out[6]=

也许最方便也肯定是最易读的输入方程的方式是直接使用排版形式. 这些可以通过拷贝粘贴不活跃形式的输出得到,或者使用各运算符的参考页面中提供的转义序列.

拉普拉斯算符的排版形式.
In[7]:=
Click for copyable input
Out[7]=
In[8]:=
Click for copyable input
Out[8]=

在上面的例子中,零边界条件被显式的用方程给出. 另一种方法是用 DirichletCondition[eqn,pred],它指明方程 eqn 应该在其求解域的边界上处处满足谓词 predTrue 这一条件. 广义的诺伊曼边界条件可以用 NeumannValue 指明;而因为这是有限元方法专用,所以关于 NeumannValue 的描述可以在有限元方法的教程中找到.

一般而言,空间变量总被限制在某个区域上而 NDSolve 可以识别记法 .

求解排版良好的泊松方程.
In[9]:=
Click for copyable input
In[10]:=
Click for copyable input
Out[10]=

这个解和之前的一样,都是用有限元方法计算的. 对这个例子自动选择这一方法是因为 都有边界条件;直线方法要求对其中一个独立变量而言存在初值问题.

有限元方法使用网格来计算求解. 你可以从解中把网格释放出来从而看到它.

从解中得到网格并展示其线框.
In[11]:=
Click for copyable input
Out[11]=
In[12]:=
Click for copyable input
Out[12]=

有限元方法也可以很好的处理非矩形的几何形状. 解决不同区域上的问题所要做的仅仅是定义这个区域.

求解单位圆上的泊松方程.
In[13]:=
Click for copyable input
In[14]:=
Click for copyable input
Out[14]=

一些可视化命令能接受区域记法,于是你可以直接用它们把解可视化.

显示解.
In[15]:=
Click for copyable input
Out[15]=
显示用于求解的网格.
In[16]:=
Click for copyable input
Out[16]=

在某些情况下,可以在绘图时通过设定 Mesh->All 来看到网格.

显示解曲面及其网格的图.
In[17]:=
Click for copyable input
Out[17]=

NDSolve 可以处理有一个独立变量是类似时间变量的方程. 在这种情况下从这一变量的特定初值开始形成的解是用数值直线方法配合有限差分法或有限元空间离散化方法求解的.

考虑这么个问题作为例子:当金属板外部有一个稳定的热源持续作用时,金属板中心到达指定温度需要多长时间. 这可用热传导方程建模.

求解矩形金属板的加热问题.
In[18]:=
Click for copyable input
Out[18]=
绘制终止时的解.
In[19]:=
Click for copyable input
Out[19]=

当区域是矩形时 NDSolve 默认使用有限差分法;也能通过 Method 选项指定空间离散化的类型甚至特定的细节. 关于数值直线方法有限元方法的教程给出了这些选项的详细信息和许多应用选项的例子.

用有限元方法求解矩形金属板的加热问题.
In[20]:=
Click for copyable input
Out[20]=

当空间的几何形状不规则时,NDSolve 会自动使用有限元法.

求解圆形金属板.
In[21]:=
Click for copyable input
In[22]:=
Click for copyable input
Out[22]=
绘制终止时圆形金属板的解.
In[23]:=
Click for copyable input
Out[23]=
Translate this page: