顯示歐拉法求解 y' = y 問題

簡介

最近 無聊看了一下 數值解法

已知 \(\frac{dy}{dx} = y\) 我們知道其有一個解析解爲 \(y = e^x\)
同時我們知道 其初值 \(y(0) = 1\), x 的範圍爲 \(0<= x <= 1\)
我們需要求解其數值解,也就是\(y\) 值在 \(0<= x <= 1\) 的分佈

我們猜想顯示歐拉是由 泰勒展開式進行構建的

\[f(x) = f(x_0) +f'(x_0)(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+···+\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+R_n(x) \]

也就是可以簡單等同於求解

\[y(x) = y(0) + \frac{dy}{dx(x == 0)}(x - 0) + 餘項(即誤差) \]

但是關於 \(\frac{dy}{dx(x == 0)}\) 比較難以求解,採用 \(\frac{\mathbf{y}\left( k+1 \right)-\mathbf{y}\left( k \right)}{h}\) 來近似求解
其中 h 即步長步長越小帶來的精度越來,同時帶來的計算量越大
這裏比較特殊由於題目中已知了\(\frac{dy}{dx} = y\)所以我們可以使用

\[y_{n+1} = y_{n} + h(y') \]

\[y_{n+1} = y_{n} + h y_{n} \]

那麼我們對於其數值解就可以比較簡單求解出來了

code

import math
from matplotlib import pyplot as plt

t_0 = 0
y_0 = 1
tau = 0.01
i = 1
solve = []
Euler = []
t = []
while i < 1000:
    if i == 1:
        y_n = y_0
        t_n = t_0
    Euler.append(y_n)
    solve.append(math.exp(t_n)) # 精確解
    t.append(t_n)
    func = y_n
    y_n = y_n + tau * func
    t_n = t_n + tau
    i += 1

plt.plot(t, Euler, c='green', label=' Euler method')
plt.plot(t, solve, c='red', label=' accuracy')
plt.fill_between(t, solve, Euler, facecolor='blue', alpha=0.2)
plt.title('Euler method', fontsize=19)
plt.xlabel('t', fontsize=19)
plt.ylabel('y', fontsize=19)
plt.legend()
plt.show()

img


其中紫色部分是誤差

參考鏈接

https://zhuanlan.zhihu.com/p/131303043
https://zhuanlan.zhihu.com/p/422074759

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章