Метод Эйлера
Метод Эйлера — простейший численный метод решения систем обыкновенных дифференциальных уравнений. Впервые описан Леонардом Эйлером в 1768 году в работе «Интегральное исчисление»[1]. Метод Эйлера является явным, одношаговым методом первого порядка точности. Он основан на аппроксимации интегральной кривой кусочно-линейной функцией, так называемой ломаной Эйлера.
Описание метода
Пусть дана задача Коши для уравнения первого порядка:
- [math]\displaystyle{ \frac{dy}{dx}=f(x,y), }[/math]
- [math]\displaystyle{ y_{|_{x=x_0}}=y_0, }[/math]
где функция [math]\displaystyle{ f }[/math] определена на некоторой области [math]\displaystyle{ D\subset \mathbb{R}^2 }[/math]. Решение ищется на полуинтервале [math]\displaystyle{ (x_0,b] }[/math]. На этом промежутке введём узлы: [math]\displaystyle{ x_0\lt x_1\lt \dots\lt x_n\le b. }[/math] Приближенное решение в узлах [math]\displaystyle{ x_i }[/math], которое обозначим через [math]\displaystyle{ y_i }[/math], определяется по формуле:
- [math]\displaystyle{ y_i=y_{i-1}+(x_i-x_{i-1})f(x_{i-1},y_{i-1}),\quad i=1,2,3,\dots,n. }[/math]
Эти формулы непосредственно обобщаются на случай систем обыкновенных дифференциальных уравнений.
Оценка погрешности метода на шаге и в целом
Погрешность на шаге или локальная погрешность — это разность между численным решением после одного шага вычисления [math]\displaystyle{ y_i }[/math] и точным решением в точке [math]\displaystyle{ x_i = x_{i-1}+h }[/math]. Численное решение задаётся формулой
- [math]\displaystyle{ y_i = y_{i-1} + h f(x_{i-1}, y_{i-1}). \quad }[/math]
Точное решение можно разложить в ряд Тейлора:
- [math]\displaystyle{ y(x_{i-1} + h) = y(x_{i-1}) + h y'(x_{i-1}) + O(h^2). }[/math]
Локальную ошибку [math]\displaystyle{ L }[/math] получаем, вычитая из второго равенства первое:
- [math]\displaystyle{ L = y(x_{i-1} + h) - y_i = O(h^2) . }[/math]
Это справедливо, если [math]\displaystyle{ y }[/math] имеет непрерывную вторую производную[2]. Другим достаточным условием справедливости этой оценки, из которого вытекает предыдущее и которое обычно может быть легко проверено, является непрерывная дифференцируемость [math]\displaystyle{ f(x, y) }[/math] по обоим аргументам[3].
Погрешность в целом, глобальная или накопленная погрешность — это погрешность в последней точке произвольного конечного отрезка интегрирования уравнения. Для вычисления решения в этой точке требуется [math]\displaystyle{ S/h }[/math] шагов, где [math]\displaystyle{ S }[/math] длина отрезка. Поэтому глобальная погрешность метода [math]\displaystyle{ G = O(h^2S/h)=O(h) }[/math].
Таким образом, метод Эйлера является методом первого порядка — имеет погрешность на шаге [math]\displaystyle{ O(h^2) }[/math] и погрешность в целом [math]\displaystyle{ O(h) }[/math][3].
Значение метода Эйлера
Метод Эйлера являлся исторически первым методом численного решения задачи Коши. О. Коши использовал этот метод для доказательства существования решения задачи Коши. Ввиду невысокой точности и вычислительной неустойчивости для практического нахождения решений задачи Коши метод Эйлера применяется редко. Однако в виду своей простоты метод Эйлера находит своё применение в теоретических исследованиях дифференциальных уравнений, задач вариационного исчисления и ряда других математических проблем.
Модификации и обобщения
Модифицированный метод Эйлера с пересчетом
Повысить точность и устойчивость вычисления решения можно с помощью явного метода Эйлера следующего вида.
Прогноз:
- [math]\displaystyle{ \tilde y_i=y_{i-1}+(x_i-x_{i-1})f(x_{i-1},y_{i-1}) }[/math].
Коррекция:
- [math]\displaystyle{ y_i=y_{i-1}+(x_i-x_{i-1})\frac{f(x_{i-1},y_{i-1})+f(x_i,\tilde y_i)}{2} }[/math].
Для повышения точности корректирующую итерацию можно повторить, подставляя [math]\displaystyle{ \tilde y_i=y_i }[/math] .
Модифицированный метод Эйлера с пересчетом имеет второй порядок точности, однако для его реализации необходимо как минимум дважды вычислять [math]\displaystyle{ f(x, y) }[/math]. Метод Эйлера с пересчетом представляет собой разновидность методов Рунге-Кутты (предиктор-корректор).
Двухшаговый метод Адамса — Башфорта
Другой способ повысить точность метода заключается в использовании не одного, а нескольких вычисленных ранее значений функции:
- [math]\displaystyle{ y_{i+1} = y_i + \tfrac32 h f(x_{i}, y_{i}) - \tfrac12 h f(x_{i-1}, y_{i-1}). }[/math]
Это линейный многошаговый метод.
Реализации на языках программирования
Реализация на языке Си для функции[math]\displaystyle{ f(x,y)=6x^2+5xy }[/math].
#include <stdio.h>
double func(double x, double y)
{
return 6*x*x+5*x*y; // функция первой производной
}
int main(int argc, char** argv)
{
int i, n;
double x, y, h;
h = 0.01; // шаг
n = 10; // количество итераций
x = 1; // x0
y = 1; // y0
for (i = 0; i < n; i++)
{
y += h * func(x, y); // вычисление yi
x += h;
}
return EXIT_SUCCESS;
}
Реализация на языке Python 3.7:
# n - количество итераций, h - шаг, (x, y) - начальная точка
def Euler(n = 10, h = 0.01, x = 1, y = 1):
for i in range(n):
y += h * function(x, y)
x += h
return x, y # решение
def function(x, y):
return 6 * x**2 + 5 * x * y # функция первой производной
print(Euler())
Реализация на языке Lua:
n, h, x, y = 10, 0.01, 1, 1 -- количество итераций, шаг, координаты начальной точки
function f (x, y) return 6*x^2+5*x*y end -- функция первой производной
for i = 1, n do
x, y = x + h, y + h * f(x, y)
end
print('x: '..x..' y: '..y)
См. также
Примечания
- ↑ Эйлер Л. Интегральное исчисление, том 1, раздел 2, гл. 7.
- ↑ Atkinson, Kendall A. (1989), An Introduction to Numerical Analysis (2nd ed.), New York: John Wiley & Sons, с. 342, ISBN 978-0-471-50023-0
- ↑ 3,0 3,1 Математический энциклопедический словарь. — М.: «Сов. энциклопедия », 1988. — С. 641.
Литература
- Эйлер Л. Интегральное исчисление. Том 1. — М.: ГИТТЛ. 1956. [1]
- Бабенко К. И. Основы численного анализа. — М.: Наука. 1986.