研究生课程《应用数值分析》结课了,使用python简单记录了下常微分方程数值解法。
向前欧拉法
{ y i + 1 = y i + h i f ( x i , y i ) y 0 = y ( a ) \left \{ \begin{array}{lr} y_{i+1}=y_i+h_i f(x_i,y_i) \\ y_0=y(a) \end{array} \right .{yi+1=yi+hif(xi,yi)y0=y(a)
from pylab import *
import warnings
warnings.filterwarnings('ignore')
求解初值问题
{ y ′ = x − y + 1 0 ≤ x ≤ 1 y ( 0 ) = 1 \left \{ \begin{array}{lr} y'=x-y+1 & 0\leq x \leq 1 \\ y(0)=1 \end{array} \right .{y′=x−y+1y(0)=10≤x≤1
该微分方程的精确解为:y = x + e x p ( − x ) y=x+exp(-x)y=x+exp(−x)
def f(t,y):
'''
求解的微分方程,
'''
return t-y+1
def euler_forward(f,a=0,b=1,ya=1,h=0.1,verbose=True):
'''向前欧拉法
Args
----------
f: callable function
需要求解的函数
a: float
求解区间起始值
b:float
求解区间终止值
ya:float
起始条件,ya=y(a)
h:float
求解步长(区间[a,b]n等分)
verbose:logical,default is True
显示迭代结果
Returns
----------
res:list like
返回向前欧拉发求解的结果
'''
# i = 0
res = []
xi = a
yi = ya
while xi<=