Добавил:
t.me я просто люблю помогать людям gym a.k.a regym. S 2021 NA VE4NO ♡♡♡ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
21.10.2024
Размер:
1.68 Кб
Скачать
#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);
}
Соседние файлы в папке ЛР-0005 (Методы решения обыкновенных дифференциальных уравнений)