Задача
Метод Рунге-Кутта. Найти приближенное решение обыкновенного дифференциального уравнения [latex]y^\prime=f(x,y), y(a)=y_{0}[/latex] методом Рунге-Кутта пятого порядка на отрезке [latex][a,b][/latex] с заданным шагом [latex]h[/latex]. Значения функции [latex]y(x)[/latex] в узловых точках вычисляется по формуле: [latex]y_{i+1}=y_{i}+\frac{h}{6}(k_{1}+2k_{2}+2k_{3}+k_{4}), i=0,1,2,\cdots[/latex], где [latex]k_{1}=f(x_{i},y_{i}); k_{2}=f(x_{i}+\frac{h}{2},y_{i}+\frac{h}{2}k_{1});[/latex][latex]k_{3}=f(x_{i}+\frac{h}{2},y_{i}+\frac{h}{2}k_{2}); k_{4}=f(x_{i}+h,y_{i}+hk_{3})[/latex].
Решим дифференциальное уравнение такого вида: [latex]y^\prime=x+y[/latex] при начальном условии [latex]y(0)=1[/latex] на отрезке [latex][0, 0.5][/latex] с шагом интегрирования [latex]h=0.1[/latex]
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using namespace std; double fdif(double x,double y) { return x+y; } int main() { double k1, k2, k3, k4, dy, x, y0, a, b, h; scanf("%lf %lf %lf %lf", &a, &b, &h, &y0); for ( x ; x <= b ; x += h ) { k1 = fdif (x , y0); k2 = fdif (x + h / 2 , y0 + h / 2 * k1); k3 = fdif (x + h / 2 , y0 + h / 2 * k2); k4 = fdif (x + h , y0 + h * k3); y0 += h * ( k1 + 2 * k2 + 2 * k3 + k4 ) / 6; } printf("%lf", y0); return 0; } |
В программе присутствует функция, которой мы передаем параметры [latex]x, y[/latex] и которая возвращает само дифференциальное уравнение. Далее, в цикле высчитываем значения [latex]k_{1},k_{2},k_{3},k_{4}[/latex], передавая каждый раз параметры в функцию с шагом [latex]h[/latex] до тех пор пока не дойдем до конца промежутка. После завершения цикла выводим значение [latex]y_{0}[/latex].
— Требование набирать все формулы и таблицы связано с тем, что поисковые системы не могут заглянуть в рисунок и проиндексировать тексты и формулы внутри них.
Окажется, что огромная Ваша работа будет фактически недоступна для всего прогрессивного человечества.
Мы ведь не можем этого допустить?
— Нет ссылки да запускаемый код
— Решением дифференциального уравнения является семейство функций. Если задано значение искомой функции в некоторой точке y(a), то решением будет одна функция. Если решение численное, то находится не сама функция, а её значения в точках некоторого интервала. В Вашем случае решением будет не одно число, а табуляция искомой функции. Аналитическое решение для Вашего примера можно увидеть здесь. Для проверки стоит убедиться, что численные значения близки к аналитическим.