偏微分方程的数值解
Wolfram 语言中的函数 NDSolve 具备广泛的求解偏微分方程(PDEs)的能力. NDSolve 有一个独特的功能:在用符号形式给出偏微分方程及其求解域之后,NDSolve 会自动选择看上去适合其问题结构的数值方法. 通常情况下,自动算法选择工作得很好,但了解所使用的数值方法,既有利于更好的理解求得的解,也有利于调整方法选项以求得更好的解或更有效的求解.
NDSolve[{eqn1,eqn2,…},u,{x,xmin,xmax},{y,ymin,ymax}] | 求方程组 {eqn1,eqn2,…} 在矩形区域 [xmin,xmax]×[ymin,ymax] 上的数值解 u[x,y] |
NDSolve[{eqn1,eqn2,…},u,{x,y}∈Ω] | 求方程组 {eqn1,eqn2,…} 在区域 Ω 上的数值解 u[x,y] |
NDSolve[{eqn1,eqn2,…},u,{t,tmin,tmax},{x,y}∈Ω] | 求时间依赖性方程组 {eqn1,eqn2,…} 于 tmin 与 tmax 之间在空间区域 Ω 上的解 u[t,x,y]. |
用 NDSolve 求偏微分方程的数值解.
NDSolve 使用有限元和有限差分法来离散化及求解偏微分方程. 数值直线方法则被用于和有限元或有限差分空间离散化方法一起求解时间依赖性方程,关于它的细节在教程“数值直线方法”中有描述. 有限元方法更一般些,详细描述可参见它本身的教程.
上面的输入使用了显式的求导记法. 对有些问题使用运算符形式更具表现力也更正确. 默认情况下,常见运算符 Grad、Div、Curl 和 Laplacian 会自动求值,但通常来说表述偏微分方程最好还是不要自动求值. 使用 Inactive 可以保持运算符形式. 一般情况下,Inactive[f] 表示 f 不进行求值的不活跃形式. Inactive 形式可以用 Activate 重新激活,但像 NDSolve 这样的命令可以直接使用不活跃形式.
值得注意的是不活跃形式保持了运算符可能因为显式求值而丢失的意义,例如,若上式中的 是不连续的,那么它的导数表达式将是不确定的,而如果 的不连续点刚好与 的相对应,那么整个运算符表达式其实是良定义的.
得到不活跃运算符的一个便捷方法是使用 Inactivate,用法是把需要做失活处理的运算符用某种模式表达出来,作为其第二个参数.
也许最方便也肯定是最易读的输入方程的方式是直接使用排版形式. 这些可以通过拷贝粘贴不活跃形式的输出得到,或者使用各运算符的参考页面中提供的转义序列.
在上面的例子中,零边界条件被显式的用方程给出. 另一种方法是用 DirichletCondition[eqn,pred],它指明方程 eqn 应该在其求解域的边界上处处满足谓词 pred 为 True 这一条件. 广义的诺伊曼边界条件可以用 NeumannValue 指明;而因为这是有限元方法专用,所以关于 NeumannValue 的描述可以在有限元方法的教程中找到.
一般而言,空间变量总被限制在某个区域上而 NDSolve 可以识别记法 .
这个解和之前的一样,都是用有限元方法计算的. 对这个例子自动选择这一方法是因为 和 都有边界条件;直线方法要求对其中一个独立变量而言存在初值问题.
有限元方法使用网格来计算求解. 你可以从解中把网格释放出来从而看到它.
有限元方法也可以很好的处理非矩形的几何形状. 解决不同区域上的问题所要做的仅仅是定义这个区域.
一些可视化命令能接受区域记法,于是你可以直接用它们把解可视化.
在某些情况下,可以在绘图时通过设定 Mesh->All 来看到网格.
NDSolve 可以处理有一个独立变量是类似时间变量的方程. 随着时间变化求出解,从而通过使用数值直线方法配合有限差分法或有限元空间离散化方法,指定初始条件中的变量被解出.
考虑这么个问题作为例子:当金属板外部有一个稳定的热源持续作用时,金属板中心到达指定温度需要多长时间. 这可用热传导方程建模.
当区域是矩形时,NDSolve 默认使用有限差分法;也能通过 Method 选项指定空间离散化的类型甚至特定的细节. 关于数值直线方法和有限元方法的教程给出了这些选项的详细信息和许多应用选项的例子.
当空间的几何形状不规则时,NDSolve 会自动使用有限元法.