Euler(欧拉)方法

在上课期间就没搞明白Runge-Kutta(龙格-库塔)的计算步骤以及使用场景,始终是一个心结。趁有空就认真学习了该方法,俗话说好记性不如烂笔头,记录下来以后也便于复习。也趁这个机会,开一个数值求解方法的学习记录。

这是数值求解算法系列的第二篇,但却是数值求解方法的基础。

Euler(欧拉)方法

1. 基本思想

Euler(欧拉)方法是一种用于求解常微分方程()数值解的简单技术。它是一种基于泰勒级数展开的第一阶数值方法,适用于初值问题。欧拉方法通过使用导数来近似函数的变化,从而足部估计微分方程的解。

假设又一个形如$y’=f(x,y)$的一阶微分方程,并给定初值条件$y(x_0)=y_0$。欧拉方法的基本思路是利用已知点的斜率,沿着该斜率向前推进一小步,以预测下一个点的位置。重复这个过程,以便在整个区间上获得一系列近似值。上述可以表示成 \(\begin{cases} y'=f(x,y), \\ y(x_0)=y_0 \end{cases}\) 点$x_n$处的斜率与其切线处的斜率是一样的,所以斜率表示成

\[k'=y'(x_n)=f(x_n,y_n)=\frac{y_{n+1}-y_n}{x_{n+1}-x_n}\]

即$y_{n+1}$可以表示成

$y_{n+1}=y_n+(x_{n+1}-x_n)\cdot f(x_n,y_n)=y_n+h\cdot f(x_n,y_n)\tag{1}$

其中,$h=x_{n+1}-x_n$表示更新步长。公式(1)即为欧拉公式的迭代过程。

思考:因为有微分方程的表达形式以及初值,期望通过迭代计算某一点的值。那么需要一个迭代公式,以小步长的变量更新(即$x_1=x_0+h$)不断地计算对应的$y(x_1)$,为了便于记录,$y(x_1)$被表示成$y_1$,并由此推出了欧拉公式。

2. 样例学习

3. 代码实现

def func(xn, yn,h=0):
    """欧拉函数更新策略,以例子1为例"""
    return yn + h * (yn - 2 * xn / yn)

def euler_solver(x0, y0, x_end, h):
    xn, yn = x0, y0
    points = []
    while xn < x_end:
        yn = func(xn, yn, h)
        xn = xn + h
        points.append([xn,yn])
   	return points

x0 = 0
y0 = 1
x_end = 2
h = 0.1
euler_solver(x0,y0,x_end,h)

4. 欧拉方法的应用场景与局限性

应用场景

局限性

尽管欧拉方法直观且易于实现,但它只是一阶准确的,意味着误差与步长成正比。因此,为了得到较为准确的结果,可能需要非常小的步长,这会增加计算成本。此外,在一些情况下,尤其是当函数变化迅速时,欧拉方法可能会导致较大的累计误差。为此,存在许多改进的方法,如改进欧拉法,Runge-Kutta方法等,它们提供了更高的精度和更好的稳定性。

5. 参考资料

  1. B站视频
  2. 千问
  3. 知乎
Table of Contents