лаба5
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра «Информатика»
Лабораторная работа №5
«Методы решения обыкновенных дифференциальных уравнений»
Выполнил: ---------------------------------------------
Проверил:
Москва, 2023 г.
Индивидуальное задание к работе
№ |
Уравнение |
|
|
|
a |
|
8 |
y' = (x – 1)2 y2 |
0 |
-1 |
0.5 |
0 |
5 |
где – дифференциальное уравнение
[a, b]– интервал, где ищется решение дифференциального уравнения
, – начальные условия
– шаг интегрирования
Выполнение задания:
Решение ОДУ аналитическим методом
Найдем точное аналитическое решение заданного дифференциального уравнения методом разделения переменных. Для этого запишем уравнение в виде и проинтегрируем с учетом начальных условий
Вычислим значения полученного решения y(xi) на отрезке [0;5] с шагом изменения аргумента h=0.5:
xi |
y(xi) |
0 |
0 |
0.5 |
0.5906 |
1 |
1 |
1.5 |
1.68 |
2 |
3.25 |
2.5 |
11.94 |
3 |
-10.14 |
3.5 |
-3.956 |
4 |
-2.58 |
4.5 |
-1.98 |
5 |
-1.64 |
Решение ОДУ методом Эйлера
Вычислим значение численного решение ОДУ методом Эйлера в точках отрезка [1;2] с шагом h=0.2. Общая формула для определения очередного значения функции по методу Эйлера , где
x₀ = 0, y₀ = -1 (начальные условия)
- x₁ = 1.2, y₁ = y₀ + h*f(x₀, y₀) = 1 + 0.2*(1^2)/1 = 1.2
- x₂ = 1.4, y₂ = y₁ + h*f(x₁, y₁) = 1.2 + 0.2*(1.2^2)/1.2
- x₃ = 1.6, y₃ = y₂ + h*f(x₂, y₂) = 1.44 + 0.2*(1.44^2)/1.6
- x₄ = 1.8, y₄ = y₃ + h*f(x₃, y₃) = 1.698 + 0.2*(1.698^2)/1.8
- x₅ = 2.0, y₅ =y₄+ h*f(x₄, y₄) = 2.01 + 0.2*(2.01^2)/2
xi |
y(xi) |
1 |
1 |
1.2 |
1.222 |
1.4 |
1.507 |
1.6 |
1.8868 |
1.8 |
2.4259 |
2.0 |
3.258 |
xi |
|
1 |
1 |
1.2 |
1.2 |
1.4 |
1.44 |
1.6 |
1.736 |
1.8 |
2.113 |
2.0 |
2.609 |
Вычислим значение погрешностей для
xi |
Ei |
1 |
0 |
1.2 |
0.0222 |
1.4 |
0.067 |
1.6 |
0.1508 |
1.8 |
0.3129 |
2.0 |
0.649 |
Решение ОДУ методом Рунге-Кутта 4-го порядка
Вычислим в программе значения численного решения ОДУ с точностью 10-4, и получим решение в точках отрезка [1;2]с шагом h=0.2 ( ) методом Рунге-Кутта 4-го порядка, используя формулы:
где
xi |
y(xi) |
1 |
1 |
1.2 |
1.222 |
1.4 |
1.507 |
1.6 |
1.8868 |
1.8 |
2.4259 |
2.0 |
3.258 |
xi |
|
1 |
1 |
1.2 |
1.222957 |
1.4 |
1.511 |
1.6 |
1.886795 |
1.8 |
2.425903 |
2.0 |
3.258821 |
Вычислим в сценарии значения погрешностей
xi |
|
1 |
1 |
1.2 |
0 |
1.4 |
0.004 |
1.6 |
0.000 |
1.8 |
0.000 |
2.0 |
0.000 |
Сделаем сводку решений ОДУ всеми методами в одну таблицу.
xi |
y(xi) |
|
Ei |
|
|
1 |
1 |
1 |
0 |
1 |
1 |
1.2 |
1.222 |
1.2 |
0.0222 |
1.22 |
0 |
1.4 |
1.507 |
1.44 |
0.067 |
1.511 |
0.004 |
1.6 |
1.8868 |
1.736 |
0.1508 |
1.886795 |
0.000 |
1.8 |
2.4259 |
2.113 |
0.3129 |
2.425903 |
0.000 |
2.0 |
3.258 |
2.609 |
0.649 |
3.258821 |
0.000 |
Решение ОДУ с помощью языка программирования C++
#include <iostream>
#include <vector>
#include <cmath>
double f(double x, double y) {
return pow((x - 1), 2) * pow(y, 2);
}
std::vector<std::pair<double, double>> Euler(double x0, double y0, double h, double a, double b) {
double x = x0;
double y = y0;
std::vector<std::pair<double, double>> result = { {x, y} };
while (x < b) {
double y_new = y + h * f(x, y);
x += h;
y = y_new;
result.push_back({ x, y });
}
return result;
}
int main() {
double x[] = { 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 };
double y[11];
for (int i = 0; i < 11; i++) {
y[i] = -1 / (log(fabs(x[i])) - 1);
}
for (int i = 0; i < 11; i++) {
std::cout << "x = " << x[i] << ", y = " << y[i] << std::endl;
}
std::vector<std::pair<double, double>> result = Euler(0, -1, 0.5, 0, 5);
for (auto& p : result) {
std::cout << "x = " << p.first << ", y = " << p.second << std::endl;
}
return 0;
}
Вывод
Выполняя эту лабораторную работу, мы изучили методы решения обыкновенных дифференциальных уравнений и рассчитали погрешности. При выполнении ручного расчета ОДУ результаты совпали с машинным вычислением.