Решение ДУ методом Рунге-Кутта - 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