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

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Определяется функция f(x,y), которая выражает некоторую зависимость
  3. В функции main() инициализируются переменные, которые будут использоваться в расчетах
  4. С помощью функции scanf() вводятся начальные условия для расчета (начальное значение x, y и шаг итерации h)
  5. В цикле while происходит расчет и вывод значений x и y на экран
  6. Выполняются 4 шага метода Рунге-Кутта для приближенного расчета значения функции
  7. Значение переменной y обновляется с учетом предыдущих значений и шага итерации h
  8. Значение переменной x увеличивается на шаг итерации h, счетчик итераций n увеличивается на единицу
  9. Программа завершается после выполнения необходимого количества итераций или при нажатии клавиши Enter

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы