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