Решение ДУ методом Рунге-Кутта - C (СИ)
Формулировка задачи:
Необходимо решить дифференциальное уравнение dy / dx = 2 * x / exp(y - x*x) методом Рунге-Кутта. Написанная программа выводит y как -1.#INF00 или -1.#IND00, хотя с более простыми уравнениями справляется. Замена float на double или long double не помогла. Помогите решить проблему!
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> float f(float x, float y) { return 2 * x / exp(y - x*x); } int main(void) { float y=9, x, h=0.5, a=-3, b=3, k1, k2, k3, k4; int n = 0; //printf("Interval: "); //scanf("%f %f", &a, &b); //printf("Shag: "); //scanf("%f", &h); //printf("Nachal'noe uslovie: y(%f)= ", a); //scanf("%f", &y); x = a; printf("| x | y |\n"); while (x <= b){ printf("| %f | %f |\n", x, y); k1 = f(x, y); k2 = f(x + h / 2, y + k1 / 2); k3 = f(x + h / 2, y + k2 / 2); k4 = f(x + h, y + k3); y = y + h / 6 * (k1 + 2*k2 + 2*k3 + k4); x = x + h; //printf("%f %f %f %f",k1, k2, k3, k4); } getch(); return 0; }
Решение задачи: «Решение ДУ методом Рунге-Кутта»
textual
Листинг программы
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> double f(double x, double y) { return 2 * x / exp(y - x*x); } int main(void) { float h = 0.5, a = -3, b = 3; double y, x, k1, k2, k3, k4; int n = 0, i = 100; printf("Interval: "); scanf("%f %f", &a, &b); printf("Shag: "); scanf("%f", &h); printf("Nachal'noe uslovie: y(%f)= ", a); scanf("%lf", &y); x = a; h = h / i; printf(" x y \n"); while (x <= b){ if (n%i==0) printf("%f %f\n", x, y); k1 = f(x, y); k2 = f(x + h / 2, y + k1*h / 2); k3 = f(x + h / 2, y + k2*h / 2); k4 = f(x + h, y + k3*h); y = y + h / 6 * (k1 + 2*k2 + 2*k3 + k4); x = x + h; n++; } getch(); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется функция f(x,y), которая выражает некоторую зависимость
- В функции main() инициализируются переменные, которые будут использоваться в расчетах
- С помощью функции scanf() вводятся начальные условия для расчета (начальное значение x, y и шаг итерации h)
- В цикле while происходит расчет и вывод значений x и y на экран
- Выполняются 4 шага метода Рунге-Кутта для приближенного расчета значения функции
- Значение переменной y обновляется с учетом предыдущих значений и шага итерации h
- Значение переменной x увеличивается на шаг итерации h, счетчик итераций n увеличивается на единицу
- Программа завершается после выполнения необходимого количества итераций или при нажатии клавиши Enter
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д