微分方程的数值解
"微分方程数值解的介绍" 中讨论的函数 NDSolve 可用以求微分方程的数值解. NDSolve 既可处理单个微分方程,又可处理联立微分方程组. 它可以处理范围很广的常微分方程以及某些偏微分方程. 在一个常微分方程系统中,可能有任意个未知函数
,但这些函数都必须依赖于单个"独立变量"
. 偏微分方程则包含两个或更多的独立变量. NDSolve 也可以处理混合了微分方程和代数方程的微分代数方程.
| NDSolve[{eqn1,eqn2,...},y,{x,xmin,xmax}] |
| 求在 的区间 到 上,函数 的数值解 |
| NDSolve[{eqn1,eqn2,...},{y1,y2,...},{x,xmin,xmax}] |
| 求多个函数 的数值解 |
求常微分方程的数值解.
NDSolve 将函数
的解表示为 InterpolatingFunction 对象. 这种 InterpolatingFunction 对象提供独立变量
从
到
上的
的近似值.
NDSolve 用迭代法求解. 它从某个
值开始,然后进行一系列的步进,最终覆盖从
到
的整个区域.
要进行计算,必须对 NDSolve 给定
和其导数的适当的初始或边界条件. 这种条件指定在某个点
处的函数值
或者导数值
. 一般可以在任何点
处给定条件,至少对常微分方程如此,NDSolve 将自动覆盖区域
到
.
这里求在

的区间

到

上,

的数值解,初始条件为

.
| Out[1]= |  |
这里仍然求在

的区间

到

上的数值解,但是现在的初始条件为

.
| Out[2]= |  |
| Out[3]= |  |
使用 NDSolve 时,给定的初始或者边界条件必须能完全确定
的解. 在使用 DSolve 求微分方程的符号解时,可以指定较少的初始条件. 这是因为 DSolve 自动地插入任意常数 C[i] 来表示相应于未明确指定的初始条件的自由度. 由于NDSolve 必须给出数值解,它不能表示这种附加的自由度. 因此,必须明确指出确定解所需的全部初始和边界条件.
一个典型的情形是 
阶微分方程需要给出直到 
阶导数的初始条件,或给出在
个点处的边界条件.
| Out[4]= |  |
| Out[5]= |  |
| Out[6]= |  |
Mathematica 允许使用函数和导数值的适当的线性组合作为边界条件.
| Out[7]= |  |
在大多数情况下,给出的初始条件必须包含相同的
值,例如
. 因此,可以不必明确给出
和
两个值. 当指定
的区域为
时,Mathematica 将自动生成
到
的区域上的解.
| Out[8]= |  |
可以用方程形式给定初始条件. 这些方程可能有多个解. 在这种情况下,NDSolve 相应地生成多个解.
| Out[9]= |  |
| Out[10]= |  |
可以使用 NDSolve 求解耦合微分方程系统的解.
| Out[11]= |  |
这里画出上述解

的图形.
| Out[12]= |  |
使用上述解的

和

产生一个参数方程的图形.
| Out[13]= |  |
微分方程中的未知函数不是必须用单个符号来表示. 当未知函数的数目很多时,把它们命名为
将是更方便的.
| Out[14]= |  |
| Out[15]= |  |
| Out[16]= |  |
NDSolve 可以处理值为列表或数组的函数. 如果给出类似
的初始条件,那么 NDSolve 将假定
是值为长度为
的列表的函数.
| Out[17]= |  |
| Out[18]= |  |
NDSolve 选择.
NDSolve 有许多方法来求解方程,但是基本上所有的方法都是通过取独立变量
的一系列步进来工作,并且使用自适应程序来决定步长的大小. 一般,如果解在某个区域中变化得很快,那么 NDSolve 将减小步长以便更好地跟踪解.
| Out[19]= |  |
| Out[20]= |  |
通过自适应程序,NDSolve 能求解具有若干个
变化速率差别很大的分量的微分方程.
在这些方程中,

变化得比

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

处有一个奇点.
| Out[24]= |  |
MaxSteps 的缺省对于大多数具有光滑解的方程来说已足够了. 然而,当解有复杂的结构时,可能必须选择更大的MaxSteps 的值. 当设置为 MaxSteps->Infinity 时,使用的步数没有上限.
| Out[25]= |  |
| Out[26]= |  |
当 NDSolve 求解特定微分方程组时,它总是尽量选择适合这些方程的步长. 在有些情况下,NDSolve 采取的第一步的步长可能太大,这样可能丢失解的重要特征. 要避免这个问题,可以明确地设置选项 StartingStepSize 来指定第一步的步长.
对于 NDSolve 给出的方程不必全部涉及导数;它们也可以就是代数形式的. 用户可以使用 NDSolve 来求救许多这种类型的微分代数方程.
| Out[27]= |  |
| Out[28]= |  |
| NDSolve[{eqn1,eqn2,...},u,{t,tmin,tmax},{x,xmin,xmax},...] |
| 求偏微分方程的解  |
| NDSolve[{eqn1,eqn2,...},{u1,u2,...},{t,tmin,tmax},{x,xmin,xmax},...] |
| 求偏微分方程组的解  |
求偏微分方程的数值解.
| Out[29]= |  |
| Out[30]= |  |
| Out[31]= |  |
| Out[32]= |  |
| Out[33]= |  |
| Out[34]= |  |
| Out[35]= |  |
| Out[36]= |  |