簡介
最近 無聊看了一下 數值解法
已知 \(\frac{dy}{dx} = y\) 我們知道其有一個解析解爲 \(y = e^x\)
同時我們知道 其初值 \(y(0) = 1\), x 的範圍爲 \(0<= x <= 1\)
我們需要求解其數值解,也就是\(y\) 值在 \(0<= x <= 1\) 的分佈
我們猜想顯示歐拉是由 泰勒展開式進行構建的
也就是可以簡單等同於求解
但是關於 \(\frac{dy}{dx(x == 0)}\) 比較難以求解,採用 \(\frac{\mathbf{y}\left( k+1 \right)-\mathbf{y}\left( k \right)}{h}\) 來近似求解
其中 h 即步長步長越小帶來的精度越來,同時帶來的計算量越大
這裏比較特殊由於題目中已知了\(\frac{dy}{dx} = y\)所以我們可以使用
那麼我們對於其數值解就可以比較簡單求解出來了
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