- •«Московский Технический Университет Связи и Информатики»
- •«Методы решения обыкновенных дифференциальных уравнений»
- •«Численные методы»
- •Индивидуальное задание.
- •Точное аналитическое решение заданного дифференциального уравнения.
- •Значение точного оду.
- •Численное решение заданного ду методом Эйлера.
- •Значения погрешностей метода Эйлера.
- •Значения погрешностей метода Рунге-Кутта.
Численное решение заданного ду методом Эйлера.
Численное решение заданного ОДУ методом
Эйлера (
с данным шагом и интервалом записывается
в виде
с общей формулой определения значения
функции
Высчитанные значения представлены в
таблице 4.1.
Таблица 4.1. – Значения ДУ по методу Эйлера.
Значения погрешностей метода Эйлера.
Значения погрешность вычисляются по
формуле
.
Они перенесены в таблицу 5.1.
Таблица 5.1. – Значения погрешностей.
Схема алгоритма и программа решения ОДУ методом Рунге-Кутты 4-ого порядка с автоматическим выбором шага.
Программный код данной программы представлен в листинге 6.1.
#include <iostream>
#include <cmath>
double f(double x, double y)
{
return pow(y, 2)*cos(x);
};
double RFunction(double x, double y, double h, int m)
{
double k1, k2, k3, k4;
for (int k = 1; k <= m; k++)
{
k1 = f(x, y);
k2 = f(x + h / 2, y + h * k1 / 2);
k3 = f(x + h / 2, y + h * k2 / 2);
k4 = f(x + h, y + h * k3);
y = y + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
x = x + h;
}
return y;
}
void RungeKun(double x0, double y0, double h0, double eps, double b)
{
int n = (b - x0) / h0;
int m;
double h, y, y1, x;
std::cout << "\n\n\n[x0 = " << round(x0*10000)/10000 << "]\t[y0 = " << round(y0*10000)/10000 << "]\t\t[h0 = " << h0 << "]\n";
for (int k = 1; k <= n; k++)
{
h = h0;
m = 1;
y = RFunction(x0, y0, h, m);
do
{
y1 = y;
h = h / 2;
x = x0;
y = y0;
m = 2 * m;
y = RFunction(x0, y0, h, m);
}
while (fabs(y - y1) >= eps);
x0 = x0 + h0;
y0 = y;
std::cout << "[x0 = " << round(x0*10000)/10000 << "]\t[y0 = " << round(y0*10000)/10000 << "]\t\t[h = " << h << "]\t[m = " << m << "]\n";
}
}
int main()
{
double x0, y0, b, h;
std::cout<< "[x0] Задайте начальный x: ";
std::cin >> x0;
std::cout<< "[y0] Задайте начальный y: ";
std::cin >> y0;
std::cout<< "[b] Задайте конечную точку b: ";
std::cin >> b;
std::cout<< "[h] Задайте шаг разбиения: ";
std::cin >> h;
double eps = pow(10, -4);
RungeKun(x0, y0, h, eps, b);
}
Листинг 6.1. – Прогаммный код.
Значения функции
c заданной точностью
представлены
в таблице 6.1.
Таблица 6.1. – Расчёт на ПК.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
