Для заданного дифференциального уравнения с начальным условием
найти приближенное решение, используя метод Predictor-Corrector.
Метод Предиктор-Корректор:
Метод предиктор-корректор также известен как метод Модифицированного Эйлера .
В методе Эйлера касательная рисуется в точке, а наклон рассчитывается для заданного размера шага. Таким образом, этот метод лучше всего работает с линейными функциями, но для других случаев остается ошибка усечения. Для решения этой проблемы введен модифицированный метод Эйлера. В этом методе вместо точки среднее арифметическое наклона за интервал используется.
Таким образом, в методе Predictor-Corrector для каждого шага прогнозируемое значение сначала рассчитывается по методу Эйлера, а затем наклоны в точках
и
рассчитывается и среднее арифметическое этих склонов добавляются к
рассчитать скорректированное значение
,
здесь h — размер шага для каждого приращения
Как и в этом методе, используется средний уклон, поэтому ошибка значительно уменьшается. Также мы можем повторить процесс коррекции сходимости. Таким образом, на каждом шаге мы уменьшаем ошибку, таким образом, улучшая значение y.
Примеры:
The final value of y at x = 1 is y=2.18147
Реализация: здесь мы рассматриваем дифференциальное уравнение:
// C ++ код для решения дифференциального уравнения
// используя метод Predictor-Corrector или Modified-Euler
// с заданными условиями, y (0) = 0,5, размер шага (h) = 0,2
// найти y (1)
using namespace std;
// рассмотрим дифференциальное уравнение
// для заданных x и y возвращаем v
double f( double x, double y)
double v = y — 2 * x * x + 1;
// предсказывает следующее значение для данного (x, y)
// и размер шага h с использованием метода Эйлера
double predict( double x, double y, double h)
// возвращается значение следующего y (прогнозируемого)
double y1p = y + h * f(x, y);
// исправляет прогнозируемое значение
// используя модифицированный метод Эйлера
double correct( double x, double y,
double x1, double y1,
// (x, y) предыдущего шага
// и x1 — увеличенный x для следующего шага
// и у1 прогнозируется у для следующего шага
double e = 0.00001;
y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
> while ( fabs (y1c — y1) > e);
// каждая итерация корректирует значение
// of y используя средний уклон
void printFinalValues( double x, double xn,
double y, double h)
double x1 = x + h;
double y1p = predict(x, y, h);
double y1c = correct(x, y, x1, y1p, h);
// на каждой итерации сначала значение
// для следующего шага сначала прогнозируется
// а затем исправлено.
cout «The final value of y at x = «
// здесь x и y являются начальными
// заданное условие, поэтому x = 0 и y = 0.5
double x = 0, y = 0.5;
// конечное значение x, для которого требуется y
printFinalValues(x, xn, y, h);
// Java-код для решения дифференциала
// уравнение с использованием Predictor-Corrector
// или модифицированный метод Эйлера с
// заданные условия, y (0) = 0,5, шаг
// размер (h) = 0,2, чтобы найти y (1)
// рассмотрим дифференциальное уравнение
// для заданных x и y возвращаем v
static double f( double x, double y)
double v = y — 2 * x * x + 1 ;
// предсказывает следующее значение для данного (x, y)
// и размер шага h с использованием метода Эйлера
static double predict( double x, double y, double h)
// возвращается значение следующего y (прогнозируемого)
double y1p = y + h * f(x, y);
// исправляет прогнозируемое значение
// используя модифицированный метод Эйлера
static double correct( double x, double y,
double x1, double y1,
// (x, y) предыдущего шага
// и x1 — увеличенный x для следующего шага
// и у1 прогнозируется у для следующего шага
double e = 0.00001 ;
y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
while (Math.abs(y1c — y1) > e);
// каждая итерация корректирует значение
// of y используя средний уклон
static void printFinalValues( double x, double xn,
double y, double h)
double x1 = x + h;
double y1p = predict(x, y, h);
double y1c = correct(x, y, x1, y1p, h);
// на каждой итерации сначала значение
// для следующего шага сначала прогнозируется
// а затем исправлено.
DecimalFormat df = new DecimalFormat( «#.#####» );
System.out.println( «The final value of y at x = » +
x + » is : » +df.format(y));
public static void main (String[] args)
// здесь x и y являются начальными
// заданное условие, поэтому x = 0 и y = 0.5
double x = 0 , y = 0.5 ;
// конечное значение x, для которого требуется y
printFinalValues(x, xn, y, h);
// Этот код предоставлен mits
# Python3 код для решения дифференциального уравнения
# с использованием метода Predictor-Corrector или Modified-Euler
# с заданными условиями, y (0) = 0,5, размер шага (h) = 0,2
# найти y (1)
# рассмотрим дифференциальное уравнение
# для заданных x и y, вернуть v
v = y — 2 * x * x + 1 ;
# предсказывает следующее значение для данного (x, y)
# и размер шага h методом Эйлера
def predict(x, y, h):
# значение следующего y (прогнозируемого) возвращается
y1p = y + h * f(x, y);
# исправляет прогнозируемое значение
# с использованием модифицированного метода Эйлера
def correct(x, y, x1, y1, h):
# (x, y) предыдущего шага
# и x1 — увеличенный x для следующего шага
# и y1 прогнозируется y для следующего шага
while ( abs (y1c — y1) > e + 1 ):
y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
# каждая итерация корректирует значение
# у, используя средний наклон
def printFinalValues(x, xn, y, h):
y1p = predict(x, y, h);
y1c = correct(x, y, x1, y1p, h);
# на каждой итерации сначала значение
# для следующего шага сначала прогнозируется
# а затем исправлено.
print ( «The final value of y at x =» ,
if __name__ = = ‘__main__’ :
# здесь x и y являются начальными
# заданное условие, поэтому x = 0 и y = 0.5
# конечное значение x, для которого требуется y
printFinalValues(x, xn, y, h);
# Этот код предоставлен Rajput-Ji
// C # код для решения дифференциала
// уравнение с использованием Predictor-Corrector
// или модифицированный метод Эйлера с
// заданные условия, y (0) = 0,5, шаг
// размер (h) = 0,2, чтобы найти y (1)
// рассмотрим дифференциальное уравнение
// для заданных x и y возвращаем v
static double f( double x, double y)
double v = y — 2 * x * x + 1;
// предсказывает следующее значение для данного (x, y)
// и размер шага h с использованием метода Эйлера
static double predict( double x, double y, double h)
// возвращается значение следующего y (прогнозируемого)
double y1p = y + h * f(x, y);
// исправляет прогнозируемое значение
// используя модифицированный метод Эйлера
static double correct( double x, double y,
double x1, double y1,
// (x, y) предыдущего шага
// и x1 — увеличенный x для следующего шага
// и у1 прогнозируется у для следующего шага
double e = 0.00001;
y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
while (Math.Abs(y1c — y1) > e);
// каждая итерация корректирует значение
// of y используя средний уклон
static void printFinalValues( double x, double xn,
double y, double h)
double x1 = x + h;
double y1p = predict(x, y, h);
double y1c = correct(x, y, x1, y1p, h);
// на каждой итерации сначала значение
// для следующего шага сначала прогнозируется
// а затем исправлено.
Console.WriteLine( «The final value of y at x = » +
x + » is : » + Math.Round(y, 5));
static void Main()
// здесь x и y являются начальными
// заданное условие, поэтому x = 0 и y = 0.5
double x = 0, y = 0.5;
// конечное значение x, для которого требуется y
printFinalValues(x, xn, y, h);
// Этот код предоставлен mits
// PHP-код для решения дифференциального уравнения
// используя Predictor-Corrector или Modified-Euler
// метод с заданными условиями, y (0) = 0,5,
// размер шага (h) = 0,2, чтобы найти y (1)
// рассмотрим дифференциальное уравнение
// для заданных x и y возвращаем v
function f( $x , $y )
$v = $y — 2 * $x * $x + 1;
// предсказывает следующее значение для данного (x, y)
// и размер шага h с использованием метода Эйлера
function predict( $x , $y , $h )
// возвращается значение следующего y (прогнозируемого)
$y1p = $y + $h * f( $x , $y );
// исправляет прогнозируемое значение
// используя модифицированный метод Эйлера
function correct( $x , $y , $x1 , $y1 , $h )
// (x, y) предыдущего шага и
// х1 — увеличенный х для следующего шага
// и у1 прогнозируется у для следующего шага
$y1c = $y + 0.5 * $h * (f( $x , $y ) +
> while ( abs ( $y1c — $y1 ) > $e );
// каждая итерация корректирует
// значение y с использованием среднего наклона
function printFinalValues( $x , $xn , $y , $h )
$y1p = predict( $x , $y , $h );
$y1c = correct( $x , $y , $x1 , $y1p , $h );
// на каждой итерации сначала значение
// для следующего шага сначала прогнозируется
// а затем исправлено.
echo «The final value of y at x = » . $x .
» is : » . round ( $y , 5) . «n» ;
// здесь x и y являются начальными
// заданное условие, поэтому x = 0 и y = 0.5
// конечное значение x, для которого требуется y
printFinalValues( $x , $xn , $y , $h );
// Этот код предоставлен mits
?>
Видео:Решение системы дифференциальных уравнений методом ЭйлераСкачать
Метод Эйлера модифицированный.
Для уменьшения погрешности вычислений часто используется модифицированный метод Эйлера. Этот метод имеет так же следующие названия: метод Эйлера-Коши или метод Рунге-Кутта второго порядка точности.
Пусть дано дифференциальное уравнение первого порядка
с начальным условием:
Выберем шаг h и введём обозначения:
yi — значение интегральной функции в узлах.
При использовании модифицированного метода Эйлера шаг h делится на два отрезка.
Иллюстрации к решению приведены на рисунке 4.
|
Рисунок 4. Метод Эйлера модифицированный.
Проведем решение в несколько этапов:
2. Через точку А проведем прямую под углом α, где tg α = f(xi, yi);
3. На этой прямой найдем точку С(хi + h/2, yi + h/2 ∙ f(xi, yi));
4. Через точку С проведем прямую под углом α1, где tg α1 = f(xi + h/2,yi + h/2 ∙ f(xi, yi));
5. Через точку А проведем прямую, параллельную последней прямой;
7. После проведения вычислений, аналогичных вычислениям, описанным в методе Эйлера, получим формулу для определения значения уi+1:
Модифицированный метод Эйлера дает меньшую погрешность. На рисунке 4 это хорошо видно. Так величина εl характеризует погрешность метода Эйлера, а ε — погрешность метода Эйлера модифицированного.
Блок-схема процедуры решения дифференциального уравнения методом Эйлера модифицированным приведена на рисунке 5.
|
F(x, у) — заданная функция — должна
быть описана отдельно.
|
Входные параметры:
Х0, XК — начальное и конечное
|
значения независимой
переменной;
|
Y0 – значение y0 из начального условия
y(x0)=y0;
|
N — количество отрезков разбиения;
Y — массив значений искомого решения
|
в узлах сетки.
Рисунок 5. Блок-схема процедуры решения дифференциального уравнения методом Эйлера модифицированным.
Решение поставленной задачи методами Эйлера и Эйлера модифицированного.
Метод Эйлера.
1. Строим оси координат;
2. Отмечаем A(0; -1.8) – первую точку интегральной кривой;
3. Ищем угол наклона касательной к графику в точке A:
4. Строим касательную l0 в точке А под углом α0;
5. Находим х1 по формуле: xi = х0 + ih, где h – шаг интегрирования
6. Проводим прямую x = x1 = 1,2 до пересечения с прямой l0, отмечаем точку B(x1; y1);
7. Ищем y точки B:
Из прямоугольного треугольника ABC ,
Следовательно, точка B имеет координаты (1.2; -1.8).
Видео:Линейное дифференциальное уравнение Коши-ЭйлераСкачать
Модифицированный метод эйлера решения дифференциальных уравнений
Variant 19 (Sukach Maxim, BS17-03)
Найдем
В итоге, наше решение принимает вид:
Метод Эйлера дает возможность приближенно выразить функцию теоретически с любой наперед заданной точностью. Суть метода Эйлера в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Метод Эйлера является методом 1-го порядка точности и называется методом ломаных.
Для вычисления используются следующие формулы:
Метод Эйлера и точное решение при x0 = 0, xf = 9, y0 = 1, h = 0.1
Метод Эйлера и точное решение при x0 = 0, xf = 3, y0 = 1, h = 0.1
Метод Эйлера и точное решение при x0 = 0, xf = 1, y0 = 1, h = 0.1
Усовершенствованный метод Эйлера
Суть усовершенствованного метода Эйлера в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Усовершенствованный метод Эйлера является методом 2-го порядка точности и называется модифицированным методом Эйлера.
Разница между данным методом и методом Эйлера минимальна и заключается в использовании следующих формул:
Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 9, y0 = 1, h = 0.1
Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 3, y0 = 1, h = 0.1
Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 1, y0 = 1, h = 0.1
Классический метод Рунге-Кутты
Суть метода Рунге-Кутты в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Классический метод Рунге-Кутты является методом 4-го порядка точности и называется методом Рунге-Кутты 4-го порядка точности.
Ну и как обычно, формулы:
Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 9, y0 = 1, h = 0.1
Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 3, y0 = 1, h = 0.1
Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 1, y0 = 1, h = 0.1
Сравнение методов для заданной задачи
Размер ошибки всех методов на промежутке [0, 9] с шагом 0.1
Размер ошибки всех методов на промежутке [0, 3] с шагом 0.1
Размер ошибки всех методов на промежутке [0, 1] с шагом 0.1
Очевидно что, классический метод Рунге-Кутты справляется с задачей аппроксимации в случае данного уравнения намного лучше чем Метод Эйлера и Усовершенствованный метод Эйлера.
График глобальной средней ошибки
Глобальная ошибка в зависимости от размера шага H на промежутке от 0.01 до 0.91 для x0 = 1, xf = 9
📺 Видео
Метод ЭйлераСкачать
Численное решение задачи Коши методом ЭйлераСкачать
Дифференциальное уравнение. Формула ЭйлераСкачать
Пример решения задачи Коши методом Эйлера. Метод Эйлера с пересчетом.Скачать
Дифференциальные уравнения. Задача Коши. Метод Эйлера.Скачать
МЗЭ 2022 Численное решение дифференциальных уравнений. Неявный метод Эйлера. Ложкин С.А.Скачать
метод Эйлера для решения ОДУСкачать
Видеоурок "Системы диф. уравнений. Метод Эйлера"Скачать
5 Численное решение дифференциальных уравнений Part 1Скачать
МЗЭ 2022 Численное решение дифференциальных уравнений Метод Эйлера Ложкин С. А.Скачать
Метод Эйлера. Решение систем ДУСкачать
ШОК! Решение ДУ методом Эйлера! ПОХИЩЕНИЕ С СЮРПРИЗОМ!Скачать
Системы дифференциальных уравнений.Метод исключения.Метод Эйлера.Скачать
Метод Эйлера для дифурСкачать
Численные методы решения ДУ: метод ЭйлераСкачать
БРП3 МК52 решение ДУ метод ЭйлераСкачать
5 Численное решение дифференциальных уравнений Part 1Скачать