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. 样例学习
-
例题1:求解初值问题: \(\begin{cases} y'=y-\frac{2x}{y}, 0<x<1 \\ y(0)=1 \end{cases}\) 当h=0.1时,计算迭代10次后的结果。
解:由$y(0)=1$知,$x=0,y=1$,$y_{n+1}=y_n+h\cdot f(x,y)$
n $x_n$ $y_n$ 0 0 1 1 0.1 1.1 2 0.2 1.1918 3 0.3 1.2774 4 0.4 1.3582 5 … … … -
例题2:一曲线通过点(1,2),且在该曲线上任一点M(x,y)处的切线斜率为2x,求该曲线方程。
解:设所求曲线为$y=y(x)$,由已知条件可得微分方程如下: \(\begin{cases} \frac{dy}{dx}=2x,\\ y|_{x=1}=2 \end{cases}\) 即有$dy=2xdx => \int dy=\int 2xdx => y=x^2 + c$,$c$为积分常数
将已知点带入方程中可得:$y _{x=1}=2=>2=1^2+c=>c=1$ 故函数解析表达式为:$y=x^2+1$
-
例题3:列车在平直路上以20m/s的速度形式,当制动时,列车获得加速度-0.4$m/s^2$,求从制动开始到停止所需的时间$t$以及列车滑行距离$s$的关系。
解:由已知条件可得 \(\begin{cases} \frac{d^2S}{dt^2}=-0.4 , \\ S|_{t=0}=0,(\frac{dS}{dt})_{t=0}=20 \end{cases}\) $\frac{d^2S}{dt^2}=-0.4=>\int \frac{d^2S}{dt^2}=\int -0.4t=>\frac{dS}{dt}=-0.4t+c_1$
$=>\int \frac{dS}{dt}dt=\int (-0.4t+c_1)dt => S=-0.2t^2+c_1t + c_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方法等,它们提供了更高的精度和更好的稳定性。