常微分方程
微分方程
观察下面两个方程
$$ x^2=1$$
$$ \frac{\mathrm{d}y}{\mathrm{d}x}=2x$$
发现下面的方程包含导数,我们称这类包含未知变量(y)对自变量(x)的导数的方程为微分方程,上面的普通方程叫代数方程
此外我们发现,这个微分方程中,最高阶的导数是这个y对x的一阶导数,于是这个微分方程的阶数为1
我们将微分方程分为:
- 常微分方程(ODE),只涉及一个自变量的导数
- 偏微分方程(PDE),涉及多个自变量的偏导数
解析解法
分离变量法
适用于形如 $\frac{dy}{dx} = f(x)g(y)$ 的方程
例:求解 $\frac{dy}{dx} = xy$ ,初始条件 $y(0)=1$
将所有与 y 相关的项移到一边,与 x 相关的项移到另一边:
$$ \frac{dy}{y} = x \, dx$$
对两边积分
$$ \int \frac{1}{y} \, dy = \int x \, dx$$
左边
$$ \int \frac{1}{y} \, dy = \ln|y| + C_1$$
右边
$$ \int x \, dx = \frac{1}{2}x^2 + C_2$$
合并常数
$$ \ln|y| = \frac{1}{2}x^2 + C$$
$$ |y| = e^{\frac{1}{2}x^2 + C} = e^C \cdot e^{\frac{1}{2}x^2}$$
令$A = \pm e^C$
$$ y = A e^{\frac{1}{2}x^2}$$
带入初始条件
$$ y(0) = A e^{\frac{1}{2} \cdot 0^2} = A \cdot 1 = A = 1$$
于是解为
$$ y = e^{\frac{1}{2}x^2}$$
变量替换法
适用于齐次型方程,形如$\frac{dy}{dx}=y(\frac{y}{x})$
例:求解$\frac{dy}{dx} = \frac{x + y}{x - y}$,初始条件$y(0)=1$
经观察,右侧公式可以变形为
$$ \frac{x + y}{x - y} = \frac{1 + \frac{y}{x}}{1 - \frac{y}{x}}$$
我们使用变量进行替换 $v = \frac{y}{x}$
对 $y=vx$ 关于 x求导
$$ \frac{dy}{dx} = v + x \frac{dv}{dx}$$
带入原式
$$ v + x \frac{dv}{dx} = \frac{x + y}{x - y} = \frac{x + vx}{x - vx} = \frac{1 + v}{1 - v}$$
化简得到
$$ v + x \frac{dv}{dx} = \frac{1 + v}{1 - v}$$
得到
$$ x \frac{dv}{dx} = \frac{1 + v^2}{1 - v}$$
得到
$$ \frac{1 - v}{1 + v^2} dv = \frac{1}{x} dx$$
分解积分
$$ \int \frac{1}{1 + v^2} dv - \int \frac{v}{1 + v^2} dv = \frac{1}{x} dx$$
得到
$$ \arctan v - \frac{1}{2} \ln |1 + v^2| = \ln |x| + C$$
带入原变量
$$ \arctan \left( \frac{y}{x} \right) - \frac{1}{2} \ln \left( 1 + \left( \frac{y}{x} \right)^2 \right) = \ln |x| + C$$
$$ \arctan \left( \frac{y}{x} \right) - \frac{1}{2} \left( \ln (x^2 + y^2) - 2 \ln |x| \right) = \ln |x| + C$$
化简
$$ \arctan \left( \frac{y}{x} \right) - \frac{1}{2} \ln (x^2 + y^2) = C$$
应用初始条件,得到
$$ \arctan \left( \frac{0}{1} \right) - \frac{1}{2} \ln (1^2 + 0^2) = \arctan 0 - \frac{1}{2} \ln 1 = 0 - 0 = 0$$
因此 $C=0$
最终解为
$$ \arctan \left( \frac{y}{x} \right) = \frac{1}{2} \ln (x^2 + y^2)$$
伯努利方程
形如
$$ \frac{dy}{dx}=P(x)y + Q(x)y^n , (n \neq 0, 1)$$
欧拉方法
大部分情况下无法解出解析解,而是用数值解模拟出 key-value 对
一阶欧拉方法
欧拉方法是一种简单的数值方法,用于求解ODE的初值问题
假设时间步长为 $\Delta t$ ,则:
$$ x_{t+\Delta t}=x_t + v(x_t, t)\Delta t$$
其物理意义是,每一小段时间都朝着当前方向匀速走一小段时间。
误差量级为 $O(\Delta t^2)$ ,步长要非常小才能控制误差,但是胜在使用便捷,只需要计算一次速度
例子
例:用欧拉方法求下列式子在$[0, 1]$的解,步长为0.2
$$ \frac{dy}{dx} = -2x y, \quad y(0) = 1$$
根据导数的定义
$$ \frac{dy}{dx} \approx \frac{y(x + h) - y(x)}{h}$$
对于方程 $\frac{dy}{dx} = f(x, y)$,欧拉方法的迭代公式为:
$$ y_{n+1} = y_n + h \cdot f(x_n, y_n)$$
步0:根据初始条件 $x_0 = 0, y_0 = 1$,
$$ f(x_0, y_0) = -2 \cdot 0 \cdot 1 = 0$$
$$ y_1 = y_0 + h \cdot f(x_0, y_0) = 1 + 0.2 \cdot 0 = 1$$
步1:$x_1 = 0.2, y_1 = 1$
$$ f(x_1, y_1) = -2 \cdot 0.2 \cdot 1 = -0.4$$
$$ y_2 = y_1 + h \cdot f(x_1, y_1) = 1 + 0.2 \cdot (-0.4) = 1 - 0.08 = 0.92$$
以此类推,得到最终的数值解。当然下面表哥的误差很大,但当步长非常小时,误差就会很小
| 步数 | x | y |
|---|---|---|
| 0 | 0.0 | 1.0 |
| 1 | 0.2 | 1.0 |
| 2 | 0.4 | 0.92 |
| 3 | 0.6 | 0.7728 |
| 4 | 0.8 | 0.587328 |
| 5 | 1.0 | 0.39938304 |
二阶欧拉方法
Heun’s method(改进欧拉方法),核心思想是不仅看当前速度,还要预测未来速度的变化趋势
- 先用欧拉法预测一个临时点
$$ \tilde{x}_{t+\Delta t} = x_t + v(x_t, t) \Delta t$$
- 再估计未来的速度
$$ v_2 = v(\tilde{x}_{t+\Delta t}, t+\Delta t)$$
- 最终结果取平均
$$ x_{t+\Delta t} = x_t + \frac{1}{2}(v(x_t, t) + v_2) \Delta t$$
局部误差降低到 $O(\Delta t^3)$,全局误差 $O(\Delta t^2)$
注意,$\Delta t$ 通常是小于1的数,所以 $\Delta t^3 < \Delta t^2$
四阶
Runge-Kutta 4 ,更高阶的欧拉方法是沿着曲线移动的,用计算次数来换误差,由于大步幅误差也很低,所以可以减少采样次数
$$ \begin{aligned} k_1 &= v(x_t, t) \\ k_2 &= v(x_t + \frac{\Delta t}{2} k_1, t + \frac{\Delta t}{2}) \\ k_3 &= v(x_t + \frac{\Delta t}{2} k_2, t + \frac{\Delta t}{2}) \\ k_4 &= v(x_t + \Delta t k_3, t + \Delta t) \end{aligned}$$
$$ x_{t+\Delta t} = x_t + \frac{\Delta t}{6}(k_1 + 2k_2 + 2k_3 + k_4)$$
误差降低至 $O(\Delta t^5)$