
- •Тема 5. Алгоритмы решения дифференциальных уравнений. 4 часа
- •5.1 Постановка задачи о численном решении обыкновенного дифференциального уравнения.
- •Метод Эйлера численного решения обыкновенного дифференциального уравнения.
- •Метод Рунге-Кутта численного решения обыкновенного дифференциального уравнения.
- •1Й шаг. Фиксируем точность, с которой нужно найти значение .
Тема 5. Алгоритмы решения дифференциальных уравнений. 4 часа
5.1 Постановка задачи о численном решении обыкновенного дифференциального уравнения.
Обыкновенным дифференциальным уравнением называется равенство
f(x, y, y', y'', ..., y(n)) = 0 (5.1),
в котором x — независимая переменная, изменяющаяся в некотором отрезке [a, b], а y — неизвестная функция от x, которую и надо найти. Различают два типа обыкновенных дифференциальных уравнений — уравнения без начальных условий и уравнения с начальными условиями. Уравнения без начальных условий — это как раз то, что было только что определено. А уравнение с начальными условиями — это записанное выше уравнение относительно функции y, но в котором требуется найти лишь такую функцию y, которая удовлетворяет при некоторомследующим условиям:
y(c) = y0, y'(c) = y'0, y''(c) = y''0, ..., y(n-1)(c) = y(n-1)0, т.е. в точке c функция y и ее первые n-1 производных принимают наперед заданные значения. В этой ситуации число n называется порядком уравнения.
Метод Эйлера численного решения обыкновенного дифференциального уравнения.
Предположим, что порядок уравнения (4.8) равен 1 и, более того, его
можно представить виде:
y' = f(x,y) (4.9)
В случае первого порядка начальные условия превращаются в единственное равенство: y(c) = y0.
Искомая функция при численном подходе к проблеме решения всегда воспринимается через какую-то таблицу своих значений; иными словами, по заданным значениям аргумента надо найти такие y = y0, y1, ..., yn, чтобы таблица
x |
x1 |
x2 |
x3 |
... |
xn |
f(x) |
y1 |
y2 |
y3 |
... |
yn |
оказалась таблицей значений искомой функции. Для этого, в свою очередь, достаточно по заданному значению уметь находить значение в любой точке. Вот метод Эйлера для этого последнего поиска:
1й шаг. Фиксируем точность, с которой нужно найти значение .
Обозначим это число через ε. Поясним, что это означает, что числа, отличающиеся меньше, чем на ε, считаются одинаковыми.
2й шаг. Фиксируем произвольное n и разделим отрезок [a, b] на n равных частей: a = x0 < x1 < ... < xn = b, где , xi = a + i·h, i = 1,2, ..., n.
3й шаг. Построим последовательность чисел
yi = yi-1 + h·f(xi-1, yi-1), i = 1, 2, ..., n, в которой, напомним, y0 = y(c). Обозначим yn через U.
4й шаг. Заменим n на n+1 и повторим шаги 2 и 3. Полученное число yn (т.е. последнее из вычисляемых на шаге 3) обозначим теперь через V.
5й шаг. Если окажется, что числа V и U отличаются друг от друга меньше, чем на ε, то число y(b) считается найденным и равным V. В противном случае переобозначим V через U и вернемся к шагу 4.
Можно доказать, что когда функция f(x, y) представленная на (4.9) имеет непрерывные частные производные, описанный процесс обязательно конечен и ответ находится действительно с любой наперед заданной точностью.
#include <stdafx.h>
#include "eulerm.h"
/*************************************************************************
Модифицированный метод Эйлера решения уравнения первого порядка.
Алгоритм численно интегрирует обыкновенное дифференциальное уравнение с
использованием модифицированного прямого метода Эйлера.
*************************************************************************/
double solveodeeulerm(double x, const double& x1, double y, const int& n)
{
double result;
int i;
double f1;
double h;
double y1;
h = (x1-x)/n;
y1 = y;
i = 1;
do
{
f1 = f(x, y);
x = x+h;
y = y+f1*h;
y = y1+h*(f1+f(x, y))/2;
y1 = y;
i = i+1;
}
while(i<=n);
result = y;
return result;
}