# 常微分方程

一个初值问题 (initial value problem, IVP) 由一个 ODE 和初始条件组成:

{y=f(x,y),y(x0)=y0.\begin{cases} y' = f(x, y), \\ y(x_0) = y_0. \end{cases}

这里的 yy 可以是标量,也可以是向量。但是只能随一个变量 xx 变化。

# One-step Methods

# Euler's Method

就是使用泰勒级数展开。基于泰勒级数的一阶展开,有

y(x+h)=y(x)+hy(x)+ϵ(h2).y(x+h) = y(x) + hy'(x) + \epsilon(h^2).

于是对 n>0n>0, 有

yn+1=yn+hf(xn,yn).y_{n+1} = y_n + h f(x_n, y_n).

该形式称为前向欧拉方法 (Forward Euler method), 简称欧拉法 (Euler method).

这实际上与 ResNet 也就是前馈含残差的神经网络形式类似。

欧拉法的精度是 O(h)O(h) 的,误差是 ϵ(h2)\epsilon(h^2) 的。这样,当 hh 较大时,会产生不稳定的问题 (insteablity problem).

这里的精度指的是迭代的步长。步长越小,精度越高。

如果将前向欧拉法的 f(xn,yn)f(x_n, y_n) 中的 yny_n 替换为 yn+1y_{n+1}, 则称为后向欧拉方法 (Backward Euler method). 这样,yn+1y_{n+1} 实际上是隐式的,需要使用优化方法求解,例如使用牛顿法求解。这样每一次求解实际上都需要一次内部的迭代,这与循环神经网络 (RNN) 类似。

# Runge-Kutta Methods

Runge-Kutta 方法是数值求解 ODE 的经典方法,其基本思想是使用泰勒级数展开,然后使用更高阶的项来近似 y(x+h)y(x+h).

以四阶 Runge-Kutta 方法为例,其基本形式为

yn+1=yn+h6(k1+2k2+2k3+k4),y_{n+1} = y_n + \frac{h}{6} \left( k_1 + 2k_2 + 2k_3 + k_4 \right),

其中

{k1=f(xn,yn),k2=f(xn+h2,yn+h2k1),k3=f(xn+h2,yn+h2k2),k4=f(xn+h,yn+hk3).\begin{cases} k_1 = f(x_n, y_n), \\ k_2 = f \left( x_n + \frac{h}{2}, y_n + \frac{h}{2} k_1 \right), \\ k_3 = f \left( x_n + \frac{h}{2}, y_n + \frac{h}{2} k_2 \right), \\ k_4 = f \left( x_n + h, y_n + h k_3 \right). \end{cases}

其精度是 O(h4)O(h^4) 的,误差是 ϵ(h5)\epsilon(h^5) 的。