1. 程式人生 > 其它 >尤拉法解微分方程

尤拉法解微分方程

尤拉法解微分方程

本文介紹如何使用簡單的尤拉法求解微分方程,大部分內容出自吳一東老師在他的B站個人空間釋出的課程

方法介紹

對於一個一般的微分方程:

\[\begin{cases} \begin{aligned} \frac{\mathrm{d} y}{\mathrm{d} t} &= f(y(t), t)\\ y(0) &= y_0 \\ \end{aligned} \end{cases} \]

​ 假如我們很難得到他的解析解或者不存在解析解,那我們可以嘗試使用尤拉法將微分方程利用泰勒展開構造成一個遞推式,通過程式將所有的點求出,進而得到他的數值解。以下說明求法:

  1. 區間劃分

    對於一個微分方程我們只關心函式的一段區域內的數值解。

    \(t \in [0, T]\) 將區間劃成\(N\)​段,則有\(\Delta t = \frac{T}{N}\)

    \(t_1 = 0, t_2 = \Delta t, ..., t_{n} = (n-1)\Delta t ,...,t_{N+1} = T\)

  2. 泰勒展開

    \[\begin{aligned} y(t+\Delta t) &= y(t) + \frac{\mathrm{d} y} {\mathrm{d} t}(t)\Delta t + O(\Delta t^2) \\ &=y(t) + f(y(t), t)\Delta t + O(\Delta t^2) \end{aligned} \]
  3. 得到遞推公式

    \[\begin{aligned} y(t_{n+1}) &= y(t_n + \Delta t)\\ &=y(t_n) + f(y(t_n), t_n)\Delta t + O(\Delta t^2) \end{aligned} \]
  4. 近似計算

    \[y(t_n) \to t_n\\ y_{n + 1} = y_n +f(y_n, t)\Delta t \]

示例

例1:

\[\begin{cases} \begin{aligned} f(y, t) &= y\\ \frac{\mathrm{d} y}{\mathrm{d} t} &= y\\ y(0) &= 1 \end{aligned} \end{cases} \]

由題目其實我們很容易得知,\(y = e^t\)

所以我們可以選擇解析解對數值解方法進行驗證

按上文求解方法我們求其數值解

\(y_{n + 1} = y_n + y_n\Delta t\)

求解程式碼如下:

import numpy as np
import matplotlib.pyplot as plt

# 設定初始條件
T = 5
N = 10000
dt = T / N
t = np.linspace(0, T, N + 1)

# 邊界條件
y = np.zeros(N + 1)
y[0] = 1

for i in range(0, N):
    y[i + 1] = y[i] + y[i] * dt

ex = np.exp(t)
plt.plot(t, y, color='red')
plt.plot(t, ex, color='blue')
plt.show()