微分方程的数值解

"微分方程数值解的介绍" 中讨论的函数 NDSolve 可用以求微分方程的数值解. NDSolve 既可处理单个微分方程,又可处理联立微分方程组. 它可以处理范围很广的常微分方程以及某些偏微分方程. 在一个常微分方程系统中,可能有任意个未知函数 ,但这些函数都必须依赖于单个独立变量 . 偏微分方程则包含两个或更多的独立变量. NDSolve 也可以处理混合了微分方程和代数方程的微分代数方程.

NDSolve[{eqn1,eqn2,},y,{x,xmin,xmax}]
求在 的区间 上,函数 的数值解
NDSolve[{eqn1,eqn2,},{y1,y2,},{x,xmin,xmax}]
求多个函数 的数值解

求常微分方程的数值解.

NDSolve 将函数 的解表示为 InterpolatingFunction 对象. 这种 InterpolatingFunction 对象提供独立变量 上的 的近似值.

NDSolve 用迭代法求解. 它从某个 值开始,然后进行一系列的步进,最终覆盖从 的整个区域.

要进行计算,必须对 NDSolve 给定 和其导数的适当的初始或边界条件. 这种条件指定在某个点 处的函数值 或者导数值 . 一般可以在任何点 处给定条件,至少对常微分方程如此,NDSolve 将自动覆盖区域 .

这里求在 的区间 上, 的数值解,初始条件为 .
In[1]:=
Click for copyable input
Out[1]=
这里仍然求在 的区间 上的数值解,但是现在的初始条件为 .
In[2]:=
Click for copyable input
Out[2]=
这里是一个简单的边值问题.
In[3]:=
Click for copyable input
Out[3]=

使用 NDSolve 时,给定的初始或者边界条件必须能完全确定 的解. 在使用 DSolve 求微分方程的符号解时,可以指定较少的初始条件. 这是因为 DSolve 自动地插入任意常数 C[i] 来表示相应于未明确指定的初始条件的自由度. 由于NDSolve 必须给出数值解,它不能表示这种附加的自由度. 因此,必须明确指出确定解所需的全部初始和边界条件.

一个典型的情形是 阶微分方程需要给出直到 阶导数的初始条件,或给出在 个点处的边界条件.

对于三阶方程,需要给出直到二阶的初始条件.
In[4]:=
Click for copyable input
Out[4]=
这里画出所得解的图形.
In[5]:=
Click for copyable input
Out[5]=
对于三阶方程,也可以给出在三个点处的边界条件.
In[6]:=
Click for copyable input
Out[6]=
Mathematica 允许使用函数和导数值的适当的线性组合作为边界条件.
In[7]:=
Click for copyable input
Out[7]=

在大多数情况下,给出的初始条件必须包含相同的 值,例如 . 因此,可以不必明确给出 两个值. 当指定 的区域为 时,Wolfram 语言将自动生成 的区域上的解.

这里生成0到2上的解.
In[8]:=
Click for copyable input
Out[8]=

可以用方程形式给定初始条件. 这些方程可能有多个解. 在这种情况下,NDSolve 相应地生成多个解.

此例中的初始条件导致多个解.
In[9]:=
Click for copyable input
Out[9]=
这是所有解的图形.
In[10]:=
Click for copyable input
Out[10]=

可以使用 NDSolve 求解耦合微分方程系统的解.

这里求一对耦合方程的数值解.
In[11]:=
Click for copyable input
Out[11]=
这里画出上述解 的图形.
In[12]:=
Click for copyable input
Out[12]=
使用上述解的 产生一个参数方程的图形.
In[13]:=
Click for copyable input
Out[13]=

微分方程中的未知函数不是必须用单个符号来表示. 当未知函数的数目很多时,把它们命名为 将是更方便的.

这里构造5个耦合微分方程的方程组及初始条件.
In[14]:=
Click for copyable input
Out[14]=
这里求解上述方程组.
In[15]:=
Click for copyable input
Out[15]=
这里是解的图形.
In[16]:=
Click for copyable input
Out[16]=

NDSolve 可以处理值为列表或数组的函数. 如果给出类似 的初始条件,那么 NDSolve 将假定 是值为长度为 的列表的函数.

这里求解4个耦合微分方程的方程组.
In[17]:=
Click for copyable input
Out[17]=
这里是解的图形.
In[18]:=
Click for copyable input
Out[18]=
选项名
默认值
MaxStepsAutomatic 采取的最大步数
StartingStepSizeAutomatic 所用的初始步长
MaxStepSizeAutomatic 所用的最大步长
NormFunctionAutomatic用于误差估计的范数

NDSolve 选择.

NDSolve 有许多方法来求解方程,但是基本上所有的方法都是通过取独立变量 的一系列步进来工作,并且使用自适应程序来决定步长的大小. 一般,如果解在某个区域中变化得很快,那么 NDSolve 将减小步长以便更好地跟踪解.

这里求解的微分方程中,导数有一个不连续点.
In[19]:=
Click for copyable input
Out[19]=
NDSolve 附近取较小的步长,以便准确地产生转折点.
In[20]:=
Click for copyable input
Out[20]=

通过自适应程序,NDSolve 能求解具有若干个 变化速率差别很大的分量的微分方程.

在这些方程中, 变化得比 快得多.
In[21]:=
Click for copyable input
Out[21]=
然而,NDSolve 成功地跟踪了这两个分量.
In[22]:=
Click for copyable input
Out[22]=

NDSolve 遵循这样的一般过程:减小步长的大小直到精确地跟踪解. 然而,当解有奇点时,会出现问题. 此时,NDSolve 可能不断地减小步长大小,而无法终止. 为了避免这个问题,选项 MaxSteps 指定 NDSolve 求解采取的最大步数. 对常微分方程,缺省设置是 MaxSteps->10000.

取10000个步数后,NDSolve 就停止了.
In[23]:=
Click for copyable input
Out[23]=
事实上,该解在 处有一个奇点.
In[24]:=
Click for copyable input
Out[24]=

MaxSteps 的缺省对于大多数具有光滑解的方程来说已足够了. 然而,当解有复杂的结构时,可能必须选择更大的MaxSteps 的值. 当设置为 MaxSteps->Infinity 时,使用的步数没有上限.

对罗伦兹方程要产生解的完整结构,需要给出 MaxSteps 的更大设置.
In[25]:=
Click for copyable input
Out[25]=
这里是上述解的三维图形.
In[26]:=
Click for copyable input
Out[26]=

NDSolve 求解特定微分方程组时,它总是尽量选择适合这些方程的步长. 在有些情况下,NDSolve 采取的第一步的步长可能太大,这样可能丢失解的重要特征. 要避免这个问题,可以明确地设置选项 StartingStepSize 来指定第一步的步长.

对于 NDSolve 给出的方程不必全部涉及导数;它们也可以就是代数形式的. 用户可以使用 NDSolve 来求救许多这种类型的微分代数方程.

这里求解微分代数方程.
In[27]:=
Click for copyable input
Out[27]=
这是解的图形.
In[28]:=
Click for copyable input
Out[28]=
NDSolve[{eqn1,eqn2,},u,{t,tmin,tmax},{x,xmin,xmax},]
求偏微分方程的解
NDSolve[{eqn1,eqn2,},{u1,u2,},{t,tmin,tmax},{x,xmin,xmax},]
求偏微分方程组的解

求偏微分方程的数值解.

这里求波动方程的数值解. 结果是二维插值函数.
In[29]:=
Click for copyable input
Out[29]=
这里生成上述结果的图形.
In[30]:=
Click for copyable input
Out[30]=
这里求非线性波动方程的数值解.
In[31]:=
Click for copyable input
Out[31]=
这里生成上述结果的三维图形.
In[32]:=
Click for copyable input
Out[32]=
这是解的高分辨率的密度图.
In[33]:=
Click for copyable input
Out[33]=
这是方程在2+1维的版本.
In[34]:=
Click for copyable input
Out[34]=
这里求解方程.
In[35]:=
Click for copyable input
Out[35]=
这里生成解的图形列表.
In[36]:=
Click for copyable input
Out[36]=