计算方法B.裴玉茹.09.常微分方程(3)

  • 数值分析课本第 6 章(常微分方程) + PPT(常微分方程)

常微分方程

5. 可变步长方法

  • 最常见的是使用两个不同阶的方法,称为嵌入对(embedded pair)

5.1 龙格-库塔嵌入对

  • 可变步长方法的关键思想是检测当前步生成的误差
  • 思路:用户设置的容差需要在当前步满足
    • 如果超出容差,则拒绝误差,并且将步长减小
    • 如果满足容差,则接受,并选择下一步适合的步长
      • 例如如果误差小于容差的 \(\dfrac{1}{10}\),则在接受本步之后加大步长
  • 容差设置
    • 绝对误差:\(e_i\)
    • 相对误差:\(\dfrac{e_i}{w_i}\)
    • 混合方式:\(\dfrac{e_i}{\max\{w_i,\theta\}}\)
      • 避免过小的 \(w_i\)
  • 改变步长最简单的方式:\(\dfrac{h}{2},2h\)
  • 选择合适步长的方式和求解器相关
  • \(p\) 阶求解器,局部截断误差 \(O(h^{p+1})\)
  • \(T\) 为每步中用户允许的相对容差
    • 要求 \(\dfrac{e_i}{w_i}<T\)

减小步长

  • 满足的条件下,如何选择下一步步长?
    • 这里使用相对误差,可以修改为混合误差表示
  • 假设存在常数 \(c\) 满足下式

\[ e_i\approx ch^{p+1} \]

  • 满足条件的最优步长

\[ T\vert{w_i}\vert=ch^{p+1} \]

  • 解得
    • \(0.8\) 表示我们使用更保守的方法

\[ h_{\ast}={\color{red}0.8}\left(\dfrac{T\vert{w_i}\vert}{e_i}\right)^{1/(p+1)}h_i \]

增大步长

  • 不满足容差要求则反复测试,增大步长(例如 \(2h\) ),直至满足容差要求

龙格-库塔嵌入对

  • 在运行当前求解器的同时,运行更高阶的求解器
    • 当前估计:\(w_{i+1}\)
    • 更高阶的估计:\(z_{i+1}\)
    • \(e_{i+1}=\vert{z_{i+1}-w_{i+1}}\vert\) 用于估计从 \(t_i\) 步到 \(t_{i+1}\) 步的误差
  • 如何降低计算代价:共享必要的计算

RK 2/3

  • 尽管步长策略对于 \(w_{i+1}\) 可行,但是使用更高阶的 \(z_{i+1}\) 继续做这步会更有意义,因为已经得到了这个高阶估计,这被称为局部外推

Bogacki-Shampine 2/3 嵌入对

5.2 4/5 阶方法

RKF 4/5

Dormand-Prince 4/5

刚性方程

  • stiff
  • 虽然似乎可变步长的龙格-库塔方法是 ode 求解器中最好的一个,但是仍然有几类方程它们也不能很好处理

  • 使用 ode23 步数更少

6. 隐式方法与刚性方程

  • 显式方法:新的近似 \(w_{i+1}\) 有一个由已知数据表示的显式公式
  • 某些问题是用显示方法求解效果很差
    • 例如上面的问题,复杂的可变步长的求解器一直在正确解周围过调
    • 原因:在正确解附近 \(h\) 区间的起点和终点斜率变化剧烈

6.1隐式方法与刚性方程

刚性现象

  • 还是上面的例子:\(f(t,y)=10(1-y)\)

  • 欧拉方法

\[ w_{i+1}=w_i+h10(1-w_i)=w_i(1-10h)+10h \]

  • 看成是不动点迭代方法,如果斜率小于 \(1\),就能收敛
    • \(0<h<0.2\)
  • 因此调整步长大于 \(0.2\) 的时候,很快的从正确解附近离开了 ,这是因为在正确解的附近,斜率变化太快导致的
  • 刚性方程
    • 具有这种性质的微分方程,即吸引解被附近的更快变化的解所包围,被称为刚性方程
    • 这通常是系统具有多时间尺度的标志
    • 定量地讲,这对应微分方程右侧函数 \(f\) 对于 \(y\) 的线性部分,这部分很大并且是负的
      • 对于方程组,这对应很大并且负的线性部分的特征值
    • 这个定义是相对的,但这是刚性的本质,即越负,步长就必须越小以避免过调

后向欧拉方法

\[ \begin{aligned} w_0&=y_0\\ w_{i+1}&=w_i+hf(t_{i+1},w_{i+1})\\ \end{aligned} \]

  • 不同于欧拉方法使用步长区间左侧的斜率,后向欧拉则穿过区间使用右侧的斜率
  • 隐式方法
  • 对于上面的例子,我们能够很快的得到表达式
    • 因为是线性的

\[ w_{i+1}=w_i+10h(1-w_{i+1})\Longrightarrow w_{i+1}=\dfrac{w_i+10h}{1+10h} \]

  • 但是对于一般的例子,我们很难很快求得隐式方法的解析式,需要采用间接的方式
后向欧拉方法求解的例子
  • IVP 如下

\[ \begin{aligned} y'&=y+8y-9y^3\\ y(0)&=\dfrac{1}{2}\\ t&\in[0,3]\\ \end{aligned} \]

  • 平衡解:\(y=1\)(令 \(y'=0\)
    • 偏导数为 \(-10\)
    • 刚性问题
      • 欧拉方法 + 带有上界的 \(h\)
      • 后向欧拉方法
  • 后向欧拉方法迭代公式

\[ w_{i+1}=w_i+h(w_{i+1}+8w_{i+1}^2-9w_{i+1}^3) \]

  • 重写

\[ z=w_i+h(z+8z^2-9z^3) \]

  • 牛顿法迭代求解(看成不动点迭代问题)
    • 初始估计
      • 前面近似的 \(w_i\)
      • 欧拉方法得到的 \(w_{i+1}\)
        • 对于刚性问题而言并不是一个好的初始估计
  • 牛顿迭代公式

\[ z_{new}=z-\dfrac{9hz^3-8hz^2+(1-h)z-w_i}{27hz^2-16hz+1-h} \]

  • 对于每一个欧拉后向步,都需要使用牛顿法迭代求解
评价
  • 被称为刚性求解器的方法,诸如后向欧拉方法,允许在相对较大的步长中具有足够的误差控制,以及更好的效率