Добавил:
t.me я просто люблю помогать людямrnrngym a.k.a regym. S 2021 NA VE4NO rnrn♡♡♡ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
21.10.2024
Размер:
402 Кб
Скачать
☆
  1. Численное решение заданного ду методом Эйлера.

Численное решение заданного ОДУ методом Эйлера ( с данным шагом и интервалом записывается в виде с общей формулой определения значения функции Высчитанные значения представлены в таблице 4.1.

Таблица 4.1. – Значения ДУ по методу Эйлера.

  1. Значения погрешностей метода Эйлера.

Значения погрешность вычисляются по формуле . Они перенесены в таблицу 5.1.

Таблица 5.1. – Значения погрешностей.

  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. – Расчёт на ПК.


Соседние файлы в папке ЛР-0005 (Методы решения обыкновенных дифференциальных уравнений)