在数学 和计算机科学 中,欧拉方法 (英語:Euler method [ 註 1] ),是一种一阶数值 方法,用以对给定初值的常微分方程 [ 註 2] 求解。
欧拉方法是常微分方程數值方法 中最基本的显式方法 ;也是一个一阶 方法,意味着其局部截断误差[ 註 3] 正比于 步长的平方,并且其全局截断误差正比于步长。[ 註 4]
欧拉方法的图示。待求的曲线为蓝色,它的折線近似为红色。 考虑计算這樣的一个未知曲線的形状:它具有给定的起点并且满足一个给定的微分方程。 这里,所谓“微分方程”可以看作能够通过曲线上任意点的位置而计算出这一点的切线 斜率 的公式。
思路是,一开始只知道曲線的起点(假设为 A 0 {\displaystyle A_{0}} ),曲線其他部份是未知的,不過通过微分方程, A 0 {\displaystyle A_{0}} 的斜率可以被计算出来,也就得到了切线。
顺着切线向前走一小步到点 A 1 {\displaystyle A_{1}} 。如果假设 A 1 {\displaystyle A_{1}} 是曲线上的一点(实际上通常不是),那么同样的道理就可以确定下一条切线,依此类推。在经过几步之后,一条折线 A 0 A 1 A 2 A 3 … {\displaystyle A_{0}A_{1}A_{2}A_{3}\dots } 就被计算出来了。一般情况下,这条折线与原先的未知曲线偏离不远,并且任意小的误差都可以通过减少步长来得到。
图示为方程 y ′ = y , y ( 0 ) = 1 {\displaystyle y'=y,y(0)=1} 的数值积分。蓝色为欧拉法,绿色为中点法 ,红色为精确解 y = e t {\displaystyle y=e^{t}} 。所用步长為 h = 1.0 {\displaystyle h=1.0} 。 图示为同一个方程在步长 h = 0.25 {\displaystyle h=0.25} 时的结果。可以看出中点法比欧拉法收敛更快。 以以下微分方程為例
y ′ ( t ) = f ( t , y ( t ) ) , y ( t 0 ) = y 0 , {\displaystyle y'(t)=f(t,y(t)),\qquad y(t_{0})=y_{0},} 希望用 y 在點 (t0 ,y(t0 )) 附近的線性近似來得到其近似解(也就是 y 的泰勒展開式 的前二項)。利用時間 t n 時的數值,若用單步的欧拉方法,可得到時間 t n+1 = t n + h 時的近似值如下:
y n + 1 = y n + h f ( t n , y n ) . {\displaystyle y_{n+1}=y_{n}+hf(t_{n},y_{n}).\qquad \qquad } 欧拉方法是一種顯型方法,也就是說 y n + 1 {\displaystyle y_{n+1}} 的解是 y i {\displaystyle y_{i}} , i ≤ n {\displaystyle i\leq n} 的顯函數。
欧拉方法可以求解一階的微分方程,而任何 N {\displaystyle N} 階的微分方程都可以表示成一階的微分方程。
對於微分方程
y ( N ) ( t ) = f ( t , y ( t ) , y ′ ( t ) , … , y ( N − 1 ) ( t ) ) {\displaystyle y^{(N)}(t)=f(t,y(t),y'(t),\ldots ,y^{(N-1)}(t))} 可以通過新設輔助變量 z 1 ( t ) = y ( t ) , z 2 ( t ) = y ′ ( t ) , … , z N ( t ) = y ( N − 1 ) ( t ) {\displaystyle z_{1}(t)=y(t),z_{2}(t)=y'(t),\ldots ,z_{N}(t)=y^{(N-1)}(t)} ,得到以下的等價方程
z ′ ( t ) = ( z 1 ′ ( t ) ⋮ z N − 1 ′ ( t ) z N ′ ( t ) ) = ( y ′ ( t ) ⋮ y ( N − 1 ) ( t ) y ( N ) ( t ) ) = ( z 2 ( t ) ⋮ z N ( t ) f ( t , z 1 ( t ) , … , z N ( t ) ) ) {\displaystyle \mathbf {z} '(t)={\begin{pmatrix}z_{1}'(t)\\\vdots \\z_{N-1}'(t)\\z_{N}'(t)\end{pmatrix}}={\begin{pmatrix}y'(t)\\\vdots \\y^{(N-1)}(t)\\y^{(N)}(t)\end{pmatrix}}={\begin{pmatrix}z_{2}(t)\\\vdots \\z_{N}(t)\\f(t,z_{1}(t),\ldots ,z_{N}(t))\end{pmatrix}}} 這是一個以 z ( t ) {\displaystyle \mathbf {z} (t)} 為變量的一階系統,因此可以用歐拉法求解,也可以使用其他的一階數值方法。[ 1]
设微分方程为 y ′ = y {\displaystyle y'=y} ,初始值为 y ( 0 ) = 1 {\displaystyle y(0)=1} ,试用欧拉方法求 y 3 {\displaystyle y_{3}} 的近似值,步长为 h = 1 {\displaystyle h=1} 。
欧拉法為:
y n + 1 = y n + h f ( t n , y n ) . {\displaystyle y_{n+1}=y_{n}+hf(t_{n},y_{n}).} 首先求 f ( t 0 , y 0 ) {\displaystyle f(t_{0},y_{0})} (当 n = 0 {\displaystyle n=0} ), f {\displaystyle f} 的定義為 f ( t , y ) = y {\displaystyle f(t,y)=y} ,因此有
f ( t 0 , y 0 ) = f ( 0 , 1 ) = 1. {\displaystyle f(t_{0},y_{0})=f(0,1)=1.} 透過以上步驟,求得解曲線在点 ( 0 , 1 ) {\displaystyle (0,1)} 的切线斜率。回顾直線斜率的定义: y {\displaystyle y} 变化量和 t {\displaystyle t} 变化量的比值,亦記作 Δ y / Δ t {\displaystyle \Delta y/\Delta t} 。
接著是
h ⋅ f ( y 0 ) = 1 ⋅ 1 = 1. {\displaystyle h\cdot f(y_{0})=1\cdot 1=1.} y 0 + h f ( y 0 ) = y 1 = 1 + 1 ⋅ 1 = 2. {\displaystyle y_{0}+hf(y_{0})=y_{1}=1+1\cdot 1=2.} 重复以上步骤求出 y 2 {\displaystyle y_{2}} 和 y 3 {\displaystyle y_{3}} 的值。
y 2 = y 1 + h f ( y 1 ) = 2 + 1 ⋅ 2 = 4 {\displaystyle y_{2}=y_{1}+hf(y_{1})=2+1\cdot 2=4} y 3 = y 2 + h f ( y 2 ) = 4 + 1 ⋅ 4 = 8 {\displaystyle y_{3}=y_{2}+hf(y_{2})=4+1\cdot 4=8} 由于欧拉法属于递归算法,把運算整理成表格也許有助於避免計算錯誤。
y n {\displaystyle y_{n}} t n {\displaystyle t_{n}} y ′ ( t ) {\displaystyle y'(t)} h {\displaystyle h} d y {\displaystyle dy} y n + 1 {\displaystyle y_{n+1}} 1 0 1 1 1 2 2 1 2 1 2 4 4 2 4 1 4 8
欧拉法的局部截尾误差(Local truncation error, LTE)是指在实施一次欧拉法所产生的误差,是指经过一步的数值解 y 1 {\displaystyle y_{1}} 与在 t 1 = t 0 + h {\displaystyle t_{1}=t_{0}+h} 时精确解的误差。数值解 y 1 {\displaystyle y_{1}} 由以下给出:
y 1 = y 0 + h f ( t 0 , y 0 ) . {\displaystyle y_{1}=y_{0}+hf(t_{0},y_{0}).\quad } 对于精确解,使用泰勒级数展开给出:
y ( t 0 + h ) = y ( t 0 ) + h y ′ ( t 0 ) + 1 2 h 2 y ″ ( t 0 ) + O ( h 3 ) . {\displaystyle y(t_{0}+h)=y(t_{0})+hy'(t_{0})+{\frac {1}{2}}h^{2}y''(t_{0})+O(h^{3}).} 欧拉法的局部截尾误差为:
L T E = y ( t 0 + h ) − y 1 = 1 2 h 2 y ″ ( t 0 ) + O ( h 3 ) . {\displaystyle \mathrm {LTE} =y(t_{0}+h)-y_{1}={\frac {1}{2}}h^{2}y''(t_{0})+O(h^{3}).} 当 y {\displaystyle y} 拥有三阶有界导数时,这个结果是成立的。[ 2]
结果显示:当步长 h {\displaystyle h} 很小时,局部截尾误差近似与 h 2 {\displaystyle h^{2}} 成比例。也就是说,欧拉法没有其他的高阶方法如龙格-库塔法 和线性多步法 精确,这些方法的局部截尾误差与 h p {\displaystyle h^{p}} (p >2)成比例。
全局截尾误差(Global truncation error, GTE)是指在一个固定时间 t {\displaystyle t} 时的误差,但是很多步之后该方法需要以从初始时间到达该时间来计算。全局截尾误差可以看做是一个每一步的局部截尾误差的累积效应。[ 3] 经过的步骤數為 ( t − t 0 ) / h {\displaystyle (t-t_{0})/h} ,而每步的误差则正比于 h 2 {\displaystyle h^{2}} 。因此,可以预期全局截尾误差是正比于 h {\displaystyle h} 的。[ 4]
这个直观的推测可以被嚴謹地證明。如果解 y {\displaystyle y} 存在二阶有界导数,并且 f {\displaystyle f} 關於 y {\displaystyle y} 是利普希茨连续 的,那么全局截尾误差是有界的:
| GTE | ≤ h M 2 L ( e L ( t − t 0 ) − 1 ) {\displaystyle |{\text{GTE}}|\leq {\frac {hM}{2L}}(e^{L(t-t_{0})}-1)\qquad \qquad } 其中 M {\displaystyle M} 是在给定区间内 y {\displaystyle y} 的二阶导数的上界, L {\displaystyle L} 是 f {\displaystyle f} 的利普希茨常数。[ 5]
这种精确的形式其实是没有什么意义的,通常情况下这个上界都會嚴重高估了欧拉法所造成的实际误差。[ 6] 重要的是,这顯示了全局截尾误差是近似正比于 h {\displaystyle h} 的,所以欧拉法被稱为是一阶的。[ 7]
Atkinson, Kendall A., An Introduction to Numerical Analysis 2nd, New York: John Wiley & Sons , 1989, ISBN 978-0-471-50023-0 . Ascher, Uri M.; Petzold, Linda R., Computer Methods for Ordinary Differential Equations and Differential-Algebraic Equations, Philadelphia: Society for Industrial and Applied Mathematics, 1998, ISBN 978-0-89871-412-8 . Butcher, John C., Numerical Methods for Ordinary Differential Equations, New York: John Wiley & Sons , 2003, ISBN 978-0-471-96758-3 . Hairer, Ernst; Nørsett, Syvert Paul; Wanner, Gerhard, Solving ordinary differential equations I: Nonstiff problems, Berlin, New York: Springer-Verlag , 1993, ISBN 978-3-540-56670-0 . Iserles, Arieh, A First Course in the Numerical Analysis of Differential Equations, Cambridge University Press , 1996, ISBN 978-0-521-55655-2 . Lakoba, Taras I., Simple Euler method and its modifications (PDF) (Lecture notes for MATH334, University of Vermont), 2012 [2016-01-02 ] , (原始内容存档 (PDF) 于2012-07-12) .