Метод Рунге-Кутта и метод Милна(поиск шага интегрирования)

Мне нужно написать метод Рунге Кутта(4 порядка) и метод Милна для решения задачи Коши, сами методы несложные, а вот подбор шага интегрирования поставил меня в тупик, я так понял, что нужно найти решение задачи Коши в точке x0 + h0 и x0 + 2* h0, затем, путем увеличения или уменьшения в 2 раза шага h, нужно подобрать максимальное значение h0, при котором выполняется неравенство (1/15)* |y - y'| < eps, где eps задается с клавиатуры, y - Решение задачи Коши в точке x0 + h0, y` - решение задачи Коши в точке x0 + 2*h0. Я написал код для вычисления шага интегрирования, но просто не могу продвинуться дальше, как мне выполнять сравнение и все же, возвращать найденный максимальный шаг интегрирования?

Задание звучит так:

  1. найти шаг интегрирования h для решения задачи Коши с точностью eps.

2.Решить на отрезке [a;b] задачу Коши методом Рунге-Кутта (4 порядка) и методом Милна с найденным шагом h.

double GetTheStep(double eps, double h0, double a, double b) {
double k1, k2, k3, k4, k11, k21, k31, k41;
double h = h0 * 2;
double x[22], y[22], y0[22], x0[22];
x[0] = a;
y[0] = 1.0;
x0[0] = a;
y0[0] = 1.0;
int i = 1;
do {
    k1 = h0 * f(x[i - 1], y[i - 1]);
    k2 = h0 * f(x[i - 1] + h0 / 2, y[i - 1] + k1 / 2);
    k3 = h0 * f(x[i - 1] + h0 / 2, y[i - 1] + k2 / 2);
    k4 = h0 * f(x[i - 1] + h0, y[i - 1] + k3);
    x[i] = x[i - 1] + h0;
    y[i] = y[i - 1] + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
    //---------------------------------------------//
    k11 = h * f(x0[i - 1], y0[i - 1]);
    k21 = h * f(x0[i - 1] + h / 2, y0[i - 1] + k11 / 2);
    k31 = h * f(x0[i - 1] + h / 2, y0[i - 1] + k21 / 2);
    k41 = h * f(x0[i - 1] + h, y0[i - 1] + k31);
    x0[i] = x0[i - 1] + h;
    y0[i] = y0[i - 1] + (k11 + 2 * k21 + 2 * k31 + k41) / 6;
    h0 *= 2;
    h *= 2;
    ++i;
} while ((1. / 15.) * abs(y[i] - y0[i]) > eps);
return h0; 
}

Изначально, шаг h0 вычисляется как корень 4 степени из eps, которое вводится с клавиатуры


Ответы (0 шт):