NDSolve 的 "Composition" 和 "Splitting" 方法
引言
在某些情况下,把微分系统分裂成子系统,并且使用适当的积分方法求解每个子系统是有用的. 重新组合每个单独的解往往允许保留某些动力学属性,比如体积(volume). 关于分裂和组合的更多信息可以参考 [MQ02, HLW02],而与 NDSolve 相关的具体方面在 [SS05, SS06] 中进行了讨论.
定义
"Composition"
与在外推法中所用的 Aitken-Neville 算法相反,组合可以保留基本积分方法的几何属性(如辛属性(symplecticity).
"Splitting"
一个
-级分裂法是组合方法的一个推广,其中
以加法形式分解:
这里的基本要点是,求解涉及
而不是
的问题往往具有计算优势.
每种基本积分方法现在只求解问题的一部分,但是一个适当的组合仍然可以给出具有优越属性的数值方案.
如果向量场
是可积的,那么精确解或者流
可以用来代替一个数值积分方法.
一个例子是 Lie-Trotter 分裂 [T59]:
实现
我们需要对于新的 NDSolve 框架作一些改变,以便执行分裂和组合方法.
嵌套方法
简化
在前面的例子中,可以使用流的群属性并且直接调用方法
来得到一个更加有效的积分器.
示例
下面的例子将使用一个被称为 Strang 分裂的二阶对称分裂 [S68], [M68]. 分裂系数从方程结构中自动确定.
| In[2]:= |
| In[3]:= |
辛分裂
辛 Leapfrog
是求解具有良好的长期动力学性质的可分离哈密顿系统
的有效方法.
是一个更为通用的方法,但是它可以用来构建分区辛方法(虽然效率比
稍微低一些).
| In[6]:= |
| In[11]:= |
| Out[14]= |
方法
本来也可以只指定一次,因为第二和第三次是以循环的形式填入的.
| In[15]:= |
Out[15]//InputForm= | |
| In[16]:= |
| Out[16]= |
| In[17]:= |
Out[17]//InputForm= | |
辛蛙跳的组合
| In[18]:= |
| Out[20]= |
| In[21]:= |
Out[21]//InputForm= | |
| In[22]:= |
| Out[23]= |
| In[24]:= |
Out[24]//InputForm= | |
混合方法
虽然解析解往往在整个向量场上不存在,但在某些情况下有可能解析地对向量场的某部分求解微分方程组.
当使用 DSolve 可以找到一个解时,可以使用直接数值计算来局部推进解.
该思想在方法 "LocallyExact" 中实现.
谐振子测试示例
混合数值-符号分裂法(ABC 流)
| In[39]:= |
| Out[39]= | ![]() |
当直接使用时,一个保持体积的积分器一般将不会保持对称性. 一个保持对称性的积分器,如隐式中点规则,不会保持体积.
的系统通过 DSolve 精确可解,所以用户可以使用 "LocallyExact" 方法.
但是
不是可解的,因此用户需要使用一个合适的数值积分器来获得分裂方法中所期望的属性.
Lotka-Volterra 方程
这个系统的各种数值积分器在 "求解 Lotka-Volterra 方程的数值方法" 中进行了比较.
欧拉方程
欧拉方程的各种数值积分器在 "刚体求解器" 中作了比较.
非自治向量场
选项总结
默认时,
中系数选择是根据用 Method 选项指定的方法特性,尝试在
和
之间自动选择.
选项名 | 默认值 | |
| "Coefficients" | Automatic | 指定在合成法中使用的系数 |
| "DifferenceOrder" | Automatic | 指定方法的局部准确度的阶数 |
| Method | None | 指定在数值积分中使用的基本方法 |























