DL——DDIM

文本介绍DDIM(Denoising Diffusion Implicit Models)的理论介绍


DDPM为什么慢?

  • 采样步数不能太小,否则单次破坏力度过大,不容易恢复?
  • 不能跳步,否则不遵循马尔可夫过程

推导过程

  • 核心是在DDPM的基础上,增加一些设定,解决马尔可夫性导致的无法跳步采样的问题

  • 直观理解

  • 放弃马尔可夫性假设后,我们假设分布 \(p(x_{t-1}|x_t, x_0)\) 服从高斯分布:
    $$
    \begin{align}
    p(x_{t-1}|x_t, x_0) &\sim \mathcal{N}(kx_0+mx_t, \sigma^2) \\
    x_{t-1} &= kx_0+mx_t + \sigma \epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I})
    \end{align}
    $$

  • 在 \( x_t\) 加噪过程中有(详情参见DDPM推导):
    $$ x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I})$$

  • 将 \(x_t\) 带入原始假设分布,并合并同类项有(下面的推导使用到两个高斯分布的混合):
    $$
    \begin{align}
    x_{t-1} &= kx_0+m(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon’) + \sigma \epsilon, \ \text{where} \ \epsilon,\epsilon’ \sim \mathcal{N}(0,\boldsymbol{I}) \\
    x_{t-1} &= (k+m\sqrt{\bar{\alpha}_t})x_0 + \sqrt{m^2(1-\bar{\alpha}_t) + \sigma^2}\epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I})
    \end{align}
    $$

  • 在 \( x_{t-1}\) 加噪过程中有(详情参见DDPM推导):
    $$ x_{t-1} = \sqrt{\bar{\alpha}_{t-1}} x_0 + \sqrt{1-\bar{\alpha}_{t-1}} \epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I})$$

  • 于是,对照两个等式,让对应项相等可得以下方程:
    $$
    \begin{align}
    k+m\sqrt{\bar{\alpha}_t} &= \sqrt{\bar{\alpha}_{t-1}}\\
    \sqrt{m^2(1-\bar{\alpha}_t) + \sigma^2} &= \sqrt{1-\bar{\alpha}_{t-1}}
    \end{align}
    $$

  • 解方程可得:
    $$
    \begin{align}
    m &= \frac{\sqrt{1-\bar{\alpha}_{t-1}-\sigma^2}}{\sqrt{1-\bar{\alpha}_t}} \\
    k &= \sqrt{\bar{\alpha}_{t-1}} - \frac{\sqrt{1-\bar{\alpha}_{t-1}-\sigma^2}}{\sqrt{1-\bar{\alpha}_t}}\sqrt{\bar{\alpha}_t}
    \end{align}
    $$

  • 将结果带回原始假设分布可得:
    $$
    \begin{align}
    x_{t-1} &= (\sqrt{\bar{\alpha}_{t-1}} - \frac{\sqrt{1-\bar{\alpha}_{t-1}-\sigma^2}}{\sqrt{1-\bar{\alpha}_t}}\sqrt{\bar{\alpha}_t})x_0+(\frac{\sqrt{1-\bar{\alpha}_{t-1}-\sigma^2}}{\sqrt{1-\bar{\alpha}_t}})x_t + \sigma \epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I}) \\
    x_{t-1} &= \sqrt{\bar{\alpha}_{t-1}}x_0 - \sqrt{1-\bar{\alpha}_{t-1}-\sigma^2} \frac {x_t - \sqrt{\bar{\alpha}_t}x_0}{\sqrt{1-\bar{\alpha}_t}} + \sigma \epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I}) \\
    \end{align}
    $$

  • 由加噪过程中关系,用 \(x_t\) 表示 \(x_0\) 有(详情见DDPM推导):
    $$
    \begin{align}
    x_0 = \frac{x_t - \sqrt{1-\bar{\alpha}_t} \epsilon_t}{\sqrt{\bar{\alpha}_t} } \\
    \epsilon_t = \frac{x_t - \sqrt{\bar{\alpha}_t}x_0}{\sqrt{1-\bar{\alpha}_t}}
    \end{align}
    $$

  • 将上述结果带入上一步的结论可得:
    $$ x_{t-1} = \sqrt{\bar{\alpha}_{t-1}}\frac{x_t - \sqrt{1-\bar{\alpha}_t} \epsilon_t}{\sqrt{\bar{\alpha}_t} } - \sqrt{1-\bar{\alpha}_{t-1}-\sigma^2} \epsilon_t + \sigma \epsilon, \ \epsilon \sim \mathcal{N}(0,\boldsymbol{I}) $$

    • 其中 \(\epsilon_t = \epsilon_\theta(x_t, t)\),为了跟许多论文对齐,我们后续也可以写成 \(\epsilon_t = \epsilon_\theta(x_t, t) = \epsilon_\theta^{(t)}(x_t)\)
  • 至此,我们还差 \(\sigma\) 的值没有确定:

    • 考虑上式可以写成:
      $$
      q_\sigma(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)
      = \mathcal{N}(\mathbf{x}_{t-1}; \sqrt{\bar{\alpha}_{t-1}} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_{t-1} - \sigma_t^2} \epsilon^{(t)}_\theta(\mathbf{x}_t), \sigma_t^2 \boldsymbol{I})
      $$
    • 且 \(q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_{t-1}; \tilde{\boldsymbol{\mu}}(\mathbf{x}_t, \mathbf{x}_0), \tilde{\beta}_t \boldsymbol{I})\)
    • 于是有:
      $$ \tilde{\beta}_t = \sigma_t^2 = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t $$
    • 实际实验时,可以改写为: \(\sigma_t^2 = \eta’ \cdot \tilde{\beta}_t\) 或直接使用 \(\sigma_t^2 = \eta \cdot \beta_t\),详情见论文实验部分
  • 推导过程中没有一定要求 \(x_{t-1}\) 是 \(x_t\) 的上一步,所以可以用 \(x_s\) 替换 \(x_{t-1}\):
    $$q_{\sigma, s < t}(\mathbf{x}_s \vert \mathbf{x}_t, \mathbf{x}_0)
    = \mathcal{N}(\mathbf{x}_s; \sqrt{\bar{\alpha}_s} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_s - \sigma_t^2} \epsilon^{(t)}_\theta(\mathbf{x}_t), \sigma_t^2 \boldsymbol{I})$$

  • 最后,我们可以得到推导结果:

    • 当采样方差 \(\sigma\) 满足一定条件时,上面的式子会满足马尔可夫过程,即等价于DDPM(注:DDIM采样公式中, \(x_t\) 前面的系数展开以后和DDPM是是一样的)
  • 图示跳步采样(生成)的原理:


训练和推理

DDPM的训练和推理

DDIM的训练和推理

  • 训练过程与DDPM基本一致,但DDIM只需要采样固定间隔的步数即可

    • 如果已经有训练好的DDPM,可以直接用,因为DDPM的训练时间步包含了DDIM的训练时间步
  • 推理过程

  • 推理时,一般会设置 \(\sigma=0\),即DDIM是确定性的,这是DDIM中区别于DDPM的很大的点


实验结果

  • 实验设置
  • 结果展示
  • 结果分析
  • 从图中可以得出结论
    • \(\sigma\) 越小( \(\eta\) 越小,方差越小),即方差越小,效果越好,DDIM最好(DDIM对应 \(\eta=0\) 且 \(\sigma=0\) )
    • 当 \(T=1000\) 时(或者 \(T\) 非常大时),DDPM效果最好(DDPM对应 \(\eta=1\) 且 \(\sigma = \hat{\sigma}\) )
    • 小节:当采样步数少时(即间隔大时),使用DDIM效果更好,DDPM效果非常差;当采样步数很大时,DDPM效果微微好于DDIM

代码亲测

  • 各种 \(\alpha,\beta\) 的定义技巧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    num_steps = 100
    betas = torch.linspace(-6,6,num_steps)
    betas = torch.sigmoid(betas)*(0.5e-2 - 1e-5)+1e-5 # beta逐步递增
    alphas = 1-betas
    print("alphas: %s" % alphas)
    alphas_prod = torch.cumprod(alphas,0) # 连乘
    alphas_bar = alphas_prod
    alphas_prod_p = torch.cat([torch.tensor([1]).float(),alphas_prod[:-1]],0) # previous连乘
    alphas_bar_sqrt = torch.sqrt(alphas_bar)
    one_minus_alphas_bar_log = torch.log(1 - alphas_bar)
    one_minus_alphas_bar_sqrt = torch.sqrt(1 - alphas_bar)

    # 模型定义:model(x, t)
    # 采样方式:torch.randn_like(x)
  • 实现细节(为了清晰表达,对原始采样公式有所修改):
    $$
    x_s = \sqrt{\bar{\alpha}_s}\left(\frac{x_k-\sqrt{1-\bar{\alpha}_k}\epsilon_{\theta}(x_k,k)}{\sqrt{\bar{\alpha}_k}}\right) + \sqrt{1-\bar{\alpha}_s-a_1\sigma_k^2}\epsilon_{\theta}(x_k,k) + a_2\sigma_k \epsilon
    $$

    • 其中: \(\sigma_k^2 = \beta_t\)
    • 注意: \(a_1,a_2\) 是新加的,拆开 \(a_1,a_2\) 的原因是实验发现两者可以设置不同值,且有以下现象:
      • \(a_2=0,a_1=1.0\) 时,此时表示不采样,整个生成过程中没有添加随机值(除了初始样本为随机值外),不影响样本的生成质量,相对有随机值生成效果甚至更好
      • \(a_1=0\) 时,无论 \(a_2\) 值为多少,生成的样本均是类似乱码的图
      • \(a_1>0.5\) 时,无论 \(a_2\) 值是否为0,生成的样本均不错( \(a_1\) 的值不能太小,否则效果会不好)
  • 亲测实验结果与论文有偏差的原因分析:

    • 如果采样步数较少,效果也不好,但当采样间隔为2时,即跳一步采样,效果还可以(不如间隔为1)
      • 采样步数越多,效果越好(与原始论文结果一样)
    • 为什么本人实现的DDIM采样步数不能太少?(跳步10步时效果较差,与原始论文结果不一致)
      • DDIM可能对模型要求很高,本人尝试环境中模型过于简单?训练样本过少?
    • 为什么 \(a_1=0\) 时,效果非常差?
      • 待解答

DDIM对比DDPM

  • DDIM训练流程与DDPM完全相同,只是推理(采样)过程不同
  • DDIM主要解决DDPM采样慢的问题
    • DDPM有符合马尔可夫假设,需要一步步采样,效率慢
    • DDIM没有马尔可夫假设,可以跳步生成图片,且可以不采样(标准的DDIM就是不采样的,论文中,噪音的方差越小,得到的效果越好)
  • DDIM中Implicit名字的来源是什么?
    • Implicit的含义是表示“隐式的”,原论文的DDIM就是特指 \(\sigma_t=0\) 的情形,意思这是一个隐式的概率模型,因为跟其他选择所不同的是,此时从给定的 \(\boldsymbol{x}_T = \boldsymbol{z}\) 出发,得到的生成结果 \(\boldsymbol{x}_0\) 是不带随机性的生成扩散模型漫谈(四):DDIM = 高观点DDPM,科学空间
  • 可以推导:在DDIM的结果中,如果方差 \(\sigma_t\) 取值满足一定条件时,跨度为1的DDIM采样过程会变成DDPM

一些问题和解答

  • DDPM采样时不能去掉噪音,为什么DDIM可以?
    • 回答:因为DDIM采样中,噪音的方差 \(\sigma\) 是通过实验发现效果比较好的
    • 具体原因?
  • 为什么DDPM和DDIM训练逻辑基本一致,但DDPM推断必须遵循马尔可夫性,而DDIM不需要?
    • 回答:
      • 训练时:DDIM和DDPM训练过程都遵循马尔可夫过程。DDIM可以按照一定间隔采样时间步,但实际上也是经过在满足马尔可夫过程的情况下推导出来的,DDPM和DDIM的训练采样公式都是因为方差可以累加实现跳跃采样的
      • 推断时:因为DDPM的采样公式是在满足马尔可夫过程情况下推导出来的, 而DDIM的采样公式是在非马尔可夫过程情况下推导出来的,所以使用DDPM采样公式时,不能跳步;使用DDIM采样公式时(注意:实际上DDIM不采样,直接确定性生成),可以跳步

附录:其他快速推导方式

  • 参考自:What are Diffusion Models?
    $$
    \begin{aligned}
    \mathbf{x}_{t-1}
    &= \sqrt{\bar{\alpha}_{t-1}}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_{t-1}}\boldsymbol{\epsilon}_{t-1} & \\
    &= \sqrt{\bar{\alpha}_{t-1}}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_{t-1} - \sigma_t^2} \boldsymbol{\epsilon}_t + \sigma_t\boldsymbol{\epsilon} & \\
    &= \sqrt{\bar{\alpha}_{t-1}} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_{t-1} - \sigma_t^2} \epsilon^{(t)}_\theta(\mathbf{x}_t) + \sigma_t\boldsymbol{\epsilon} \\
    q_\sigma(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)
    &= \mathcal{N}(\mathbf{x}_{t-1}; \sqrt{\bar{\alpha}_{t-1}} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_{t-1} - \sigma_t^2} \epsilon^{(t)}_\theta(\mathbf{x}_t), \sigma_t^2 \boldsymbol{I})
    \end{aligned}
    $$

附录:DDIM和ODE的关系

  • 常微分方程(Ordinary Differential Equation,ODE)典型的形式表达如下:
    $$ dy = f(x,y) dx $$
  • 由之前的推导已经有:
    $$\mathbf{x}_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_{t-1} - \sigma_t^2} \epsilon^{(t)}_\theta(\mathbf{x}_t) + \sigma_t\boldsymbol{\epsilon}$$
  • 此时令 \(\sigma_t = 0\),可得:
    $$
    \begin{align}
    \mathbf{x}_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_{t-1}} \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \end{align}
    $$
  • 经过变换有:
    $$
    \begin{align}
    \frac{\mathbf{x}_{t-1}}{\sqrt{\bar{\alpha}_{t-1}}} = \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \frac{\sqrt{1 - \bar{\alpha}_{t-1}}}{\sqrt{\bar{\alpha}_{t-1}}} \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \frac{\mathbf{x}_{t-1}}{\sqrt{\bar{\alpha}_{t-1}}} = \frac{\mathbf{x}_t}{\sqrt{\bar{\alpha}_t}} - \frac{\sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} + \frac{\sqrt{1 - \bar{\alpha}_{t-1}}}{\sqrt{\bar{\alpha}_{t-1}}} \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \frac{\mathbf{x}_{t-1}}{\sqrt{\bar{\alpha}_{t-1}}} = \frac{\mathbf{x}_t}{\sqrt{\bar{\alpha}_t}} + \Big(\frac{\sqrt{1 - \bar{\alpha}_{t-1}}}{\sqrt{\bar{\alpha}_{t-1}}} - \frac{\sqrt{1 - \bar{\alpha}_t}}{\sqrt{\bar{\alpha}_t}}\Big) \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \end{align}
    $$
  • 当 \(T\) 足够大时,相邻距离 \(t-1\) 可以用 \(t-\Delta t\) 表示,于是有:
    $$
    \begin{align}
    \frac{\mathbf{x}_{t-\Delta t}}{\sqrt{\bar{\alpha}_{t-\Delta t}}} = \frac{\mathbf{x}_t}{\sqrt{\bar{\alpha}_t}} + \Big(\frac{\sqrt{1 - \bar{\alpha}_{t-\Delta t}}}{\sqrt{\bar{\alpha}_{t-\Delta t}}} - \frac{\sqrt{1 - \bar{\alpha}_t}}{\sqrt{\bar{\alpha}_t}}\Big) \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \end{align}
    $$
  • 进一步作变量替换 \(\sigma = \frac{\sqrt{1-\bar{\alpha}}}{\sqrt{\bar{\alpha}}}\) 和 \(\bar{\mathbf{x}} = \frac{\mathbf{x}}{\sqrt{\bar{\alpha}}}\),则有:
    $$
    \begin{align}
    \bar{\mathbf{x}}_{t-\Delta t} = \bar{\mathbf{x}}_{t} + \Big(\sigma_{t-\Delta t} - \sigma_{t}\Big) \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \end{align}
    $$
  • 进一步变换有:
    $$
    \begin{align}
    \bar{\mathbf{x}}_{t} - \bar{\mathbf{x}}_{t-\Delta t} = \Big(\sigma_{t} - \sigma_{t-\Delta t}\Big) \epsilon^{(t)}_\theta(\mathbf{x}_t) \\
    \end{align}
    $$
  • 写成微分形式有:
    $$
    \begin{align}
    d \bar{\mathbf{x}}_{t} = \epsilon^{(t)}_\theta(\mathbf{x}_t) d\sigma_t \\
    \end{align}
    $$
  • 进一步将 \(\epsilon^{(t)}_\theta(\mathbf{x}_t)\) 中的 \(\mathbf{x}_t\) 替换为 \(\bar{\mathbf{x}_t}\):
    $$
    \begin{align}
    \bar{\alpha} &= \frac{1}{\sigma_t^2 + 1} \\
    \mathbf{x}_t &= \bar{\mathbf{x}} \sqrt{\bar{\alpha}} = \frac{\bar{\mathbf{x}}_t}{\sqrt{\sigma_t^2 + 1}}
    \end{align}$$
  • 最终我们可以得到微分方程如下:
    $$
    \begin{align}
    d \bar{\mathbf{x}}_{t} = \epsilon^{(t)}_\theta\Big(\frac{\bar{\mathbf{x}}_t}{\sqrt{\sigma_t^2 + 1}}\Big) d\sigma_t \\
    \end{align}
    $$
  • 表达成时间的函数形式有:
    $$
    \begin{align}
    d \bar{\mathbf{x}}(t) = \epsilon^{(t)}_\theta\Big(\frac{\bar{\mathbf{x}}(t)}{\sqrt{(\sigma(t))^2 + 1}}\Big) d\sigma(t) \\
    \end{align}
    $$
  • 所以,在给定初始状态为 \(x_T \sim \mathcal{N}(0,\boldsymbol{I})\) 的情况下,求解 \(x_0\) 的过程 \(\mathbf{x}_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \Big( \frac{\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \epsilon^{(t)}_\theta(\mathbf{x}_t)}{\sqrt{\bar{\alpha}_t}} \Big) + \sqrt{1 - \bar{\alpha}_{t-1}} \epsilon^{(t)}_\theta(\mathbf{x}_t)\) 可以等价于利用欧拉方法迭代求解常微分方程 \(d \bar{\mathbf{x}}(t) = \epsilon^{(t)}_\theta\Big(\frac{\bar{\mathbf{x}}(t)}{\sqrt{(\sigma(t))^2 + 1}}\Big) d\sigma(t)\) 离散点的过程,以下描述来自生成扩散模型漫谈(四):DDIM = 高观点DDPM

    而DDPM或者DDIM的迭代过程,对应于该常微分方程的欧拉方法。众所周知欧拉法的效率相对来说是最慢的,如果要想加速求解,可以用Heun方法、R-K方法等。也就是说,将生成过程等同于求解常微分方程后,可以借助常微分方程的数值解法,为生成过程的加速提供更丰富多样的手段


附录:欧拉方法

  • 欧拉方法是求解常微分方程(Ordinary Differential Equation,ODE)数值解的一种基础且直观的方法。其核心思想是利用给定点处的斜率来预测下一个点的位置。这种方法特别适用于那些难以找到解析解或解析解过于复杂的问题
  • (回顾)常微分长程典型的形式表达如下:
    $$ dy = f(x,y) dx $$

欧拉方法的形式及推导

  • 为了理解欧拉方法的工作原理,我们可以从泰勒展开的角度出发。假设我们有一个初值问题:
    $$
    \begin{cases}
    y’(t) = f(t, y(t)), & t \in [a, b] \\
    y(a) = y_0 & \text{; initial }
    \end{cases}
    $$
  • 对于任意一点 \(t_n\),如果我们想要求得 \(t_{n+1} = t_n + h\) 处的 \(y_{n+1}\),可以通过对 \(y(t)\) 在 \(t_n\) 点进行一阶泰勒展开近似得到:
    $$
    y(t_{n+1}) \approx y(t_n) + hy’(t_n) = y(t_n) + hf(t_n, y(t_n))
    $$
  • 这里 \(h\) 是步长,即相邻两个时间点之间的距离。因此,欧拉方法的迭代公式可以写作(下面迭代公式的等号是赋值的意思)下面的形式:
    $$
    y_{n+1} = y_n + hf(t_n, y_n), \quad n=0, 1, 2, \ldots
    $$
    • 这便是向前欧拉公式的定义。通过这种方式,我们可以递归地计算出后续各点的函数值
  • 同理,欧拉公式也可以按照后项定义如下:
    $$
    y_{n} = y_{n+1} - hf(t_n, y_n), \quad n=0, 1, 2, \ldots
    $$

欧拉方法求解函数离散点示例

  • 使用欧拉方法解决实际问题时,首先需要确定的是微分方程的形式以及初始条件。然后选择合适的步长 \(h\) 并应用上述迭代公式逐步计算未来的值。例如,考虑一个简单的例子:
    $$
    y’(t) = \lambda y(t), \quad y(0) = 1
    $$
  • 如果我们设定 \(\lambda = -1\) 和 \(h = 0.1\),那么根据欧拉公式,我们可以写出如下代码片段来实现这个过程:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import numpy as np

    def euler_method(f, y0, t):
    """Simple implementation of Euler's method."""
    y = np.zeros_like(t)
    y[0] = y0
    for i in range(1, len(t)):
    y[i] = y[i-1] + (t[i] - t[i-1]) * f(t[i-1], y[i-1])
    return y

    def f(t, y):
    return -1 * y

    t = np.linspace(0, 5, 51) # 50 steps from 0 to 5
    y0 = 1 # Initial condition

    # Solve using Euler's method
    y_euler = euler_method(f, y0, t)

    print(y_euler[-1]) # Print the last computed value

其他扩展概念

  • 与常微分方程对应的还有一个概念是随机微分方程(Stochastic Differential Equation,SDE),随机微分方程在常微分方程的基础上加入了随机过程作为其中一项,本质也是一个随机过程,示例如下:
    $$\mathrm{d}X_t = \mu(t, X_t)\mathrm{d}t + \sigma(t, X_t)\mathrm{d}W_t$$
  • 这里, \(\mu(t, X_t)\) 被称为漂移系数,表示系统的确定性变化趋势;而 \(\sigma(t, X_t)\) 是扩散系数,反映了系统受随机波动的影响程度; \(W_t\) 用来模拟不可预测的随机扰动。