Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583

СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее

10.03.2018, 20:50. Показов 2706. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
double dy0dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3){
    return 8.85*pow(10, 6) - y_2*y_0*((1.2 - 1 - y_0) / (1 - y_1)) + y_0 / pow(10, -8);
}
 
double dy1dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3){
    return y_0 * y_2;
}
 
double dy2dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3){
    return y_0 * y_3;
}
 
double dy3dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3){
    return pow(10, 30)*(sqrt(y_0))*(exp(-0.25 / y_0));
}
void rungeKutta_by_4(double y0, double y1, double y2, double y3, double t0, double max_t, double h){
 
    double k1[4], k2[4], k3[4], k4[4];
 
    double t = t0;
 
    vector<function<double(double, double, double, double, double) >> vfunc;
    vfunc.push_back(dy0dt);
    vfunc.push_back(dy1dt);
    vfunc.push_back(dy2dt);
    vfunc.push_back(dy3dt);
 
    size_t max_iter = (max_t - t0) / h;
 
    for (int i = 0; i < max_iter; i++)
    {
        cout << t << "\t" << setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << endl;
 
        for (int j = 0; j < 4; ++j) {
            k1[j] = h*vfunc[j](t, y0, y1, y2, y3);
        }
 
        for (int j = 0; j < 4; ++j) {
            k2[j] = h*vfunc[j](t + 0.5*h, y0 + 0.5*k1[0], y1 + 0.5*k1[1], y2 + 0.5*k1[2], y3 + 0.5*k1[3]);
        }
 
        for (int j = 0; j < 4; ++j) {
            k3[j] = h*vfunc[j](t + 0.5*h, y0 + 0.5*k2[0], y1 + 0.5*k2[1], y2 + 0.5*k2[2], y3 + 0.5*k3[3]);
        }
 
        for (int j = 0; j < 4; ++j) {
            k4[j] = h*vfunc[j](t + h, y0 + k3[0], y1 + k3[1], y2 + k3[2], y3 + k3[3]);
        }
 
        y0 += (k1[0] + 2 * k2[0] + 2 * k3[0] + k4[0]) / 6;
        y1 += (k1[1] + 2 * k2[1] + 2 * k3[1] + k4[1]) / 6;
        y2 += (k1[2] + 2 * k2[2] + 2 * k3[2] + k4[2]) / 6;
        y3 += (k1[3] + 2 * k2[3] + 2 * k3[3] + k4[3]) / 6;
 
        t = t + h;
    }
    cout << t << setprecision(5) << "\t" << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << endl;
}
int main() {
 
    double x0, y0, z0, y1, y2, y3, beg_time, max_time, step;
 
    cout << "Input y0: "; cin >> y0;          // = 10^(-10) = 10e-10
    cout << "Input y1: "; cin >> y1;          // = 0
    cout << "Input y2: "; cin >> y2;          // = 0
    cout << "Input y3: "; cin >> y3;          // = 0
 
    cout << "Input begin: "; cin >> beg_time; // = 0
    cout << "Input end: "; cin >> max_time;   // = 1
 
    cout << "Input step: "; cin >> step; // = 0.1
 
    cout << "\n** \t Runge-Kutta for a system of 3 equations: \t **" << endl << endl;
    rungeKutta_by_4(y0, y1, y2, y3, beg_time, max_time, step);
 
    cout << endl;
    system("pause");
    return 0;
}
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее   СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2018, 20:50
Ответы с готовыми решениями:

Рунге-Кутта 4го порядка из книги (The Art of Scientific Computing)
Доброго всем дня! Нашел в сети книгу с исходниками, если кому нужно могу скинуть. Press W.H., Teukolsky S.A., Vetterling W.T., Flannery...

Метод Рунге-Кутта 4-го порядка
Правильно ли я записал выражения для коэффициентов моего уравнения(система Лоренца) #include &lt;math.h&gt; #include...

Метод Рунге-Кутта 4-го порядка
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x, double y) { ...

58
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 14:35  [ТС]
Студворк — интернет-сервис помощи студентам
mat_for_c, все равно будет выводить на первом шаге единственное значение для у3
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 14:51
Цитата Сообщение от ElKros Посмотреть сообщение
все равно будет выводить на первом шаге единственное значение для у3
c шагом 1e-10 норм
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 14:57  [ТС]
mat_for_c, какие вы вводили значения ? у меня постоянно выводит только одно значение для у3
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 15:00  [ТС]
mat_for_c,
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 15:04
C++
1
2
3
double y_0(1e-10), y_1(0), y_2(0), y_3(0);
double beg_time(0), max_time(2e-5);
double step(1e-10);
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 15:06  [ТС]
mat_for_c, у меня выводит только одно значение, как на фото выше
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 15:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <iomanip>
#include <functional>
#include <vector>
#include <boost/multiprecision/cpp_bin_float.hpp>
 
using namespace boost::multiprecision;
 
typedef number<cpp_bin_float<200>> cpp_dec_float_unlim;
 
#define double cpp_dec_float_unlim
 
// для главной системы 4х уравнений
 
double dy0dt(const double& t, const double& y_0, const double& y_1, const double& y_2, const double& y_3) {
   return double(8.85e6) - y_2*y_0*((double(0.2) - y_0) / (double(1.) - y_1)) + y_0 / double(1e-8);
}
 
double dy1dt(const double& t, const double& y_0, const double& y_1, const double& y_2, const double& y_3) {
   return y_0 * y_2;
}
 
double dy2dt(const double& t, const double& y_0, const double& y_1, const double& y_2, const double& y_3) {
   return y_0 * y_3;
}
 
double dy3dt(const double& t, const double& y_0, const double& y_1, const double& y_2, const double& y_3) {
   return double(1e30)*sqrt(y_0)*exp(double(-0.25) / y_0);
}
void rungeKutta_by_4(double& y0, double& y1, double& y2, double& y3, double& t0, double& max_t, double& h) {
 
   double k1[4], k2[4], k3[4], k4[4];
 
   double t = t0;
 
   std::vector<std::function<double(double, double, double, double, double) >> vfunc;
   vfunc.push_back(dy0dt);
   vfunc.push_back(dy1dt);
   vfunc.push_back(dy2dt);
   vfunc.push_back(dy3dt);
 
   //size_t max_iter = (max_t - t0) / h;
 
   for (int i = 0; i < ((max_t - t0) / h); i++)
   {
      std::cout << t << "\t" << std::setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << std::endl;
 
      for (int j = 0; j < 4; ++j) {
         k1[j] = h*vfunc[j](t, y0, y1, y2, y3);
      }
 
      for (int j = 0; j < 4; ++j) {
         k2[j] = h*vfunc[j](t + double(0.5)*h, y0 + double(0.5)*k1[0], y1 + double(0.5)*k1[1], y2 + double(0.5)*k1[2], y3 + double(0.5)*k1[3]);
      }
 
      for (int j = 0; j < 4; ++j) {
         k3[j] = h*vfunc[j](t + double(0.5)*h, y0 + double(0.5)*k2[0], y1 + double(0.5)*k2[1], y2 + double(0.5)*k2[2], y3 + double(0.5)*k3[3]);
      }
 
      for (int j = 0; j < 4; ++j) {
         k4[j] = h*vfunc[j](t + h, y0 + k3[0], y1 + k3[1], y2 + k3[2], y3 + k3[3]);
      }
 
      y0 += (k1[0] + double(2.) * k2[0] + double(2.) * k3[0] + k4[0]) / double(6.);
      y1 += (k1[1] + double(2.) * k2[1] + double(2.) * k3[1] + k4[1]) / double(6.);
      y2 += (k1[2] + double(2.) * k2[2] + double(2.) * k3[2] + k4[2]) / double(6.);
      y3 += (k1[3] + double(2.) * k2[3] + double(2.) * k3[3] + k4[3]) / double(6.);
 
      t = t + h;
   }
   std::cout << t << std::setprecision(5) << "\t" << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << std::endl;
}
 
void foo() {
   std::cout << "\nfoo\n";
 
   double y_0(1e-10), y_1(0), y_2(0), y_3(0);
 
   std::cout << y_0;
 
   double beg_time(0), max_time(2e-5);
   double step(1e-11);
 
   rungeKutta_by_4(y_0, y_1, y_2, y_3, beg_time, max_time, step);
}
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 15:36  [ТС]
mat_for_c, Ошибка 1 error LNK1561: точка входа должна быть определена
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 15:39
ElKros, вы не способны написать main()????
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 15:41  [ТС]
mat_for_c, я вписала, а в результате тоже самое. не знаю как у вас оно что-то еще может выводить
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 15:44
Цитата Сообщение от ElKros Посмотреть сообщение
я вписала, а в результате тоже самое
ну тут я уже хз. у меня все пишет.
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 15:47
Цитата Сообщение от ElKros Посмотреть сообщение
не знаю как у вас оно что-то еще может выводить
проверяйте везде данные через cout, ибо у вас фейл с какой-то операцией математической. для начала перед ретурном ф-ии уравнения сделайте вывод всего выражения. если - nan - то уже по частям выводите его. ищите, что у вас не так работает
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 15:50  [ТС]
mat_for_c, это может от самой студии зависеть ? у меня выводит только nan

Добавлено через 38 секунд
mat_for_c, я скопировала ваш код только что и тоже самое выводит

Добавлено через 25 секунд
mat_for_c, а какая у вас студия ?

Добавлено через 1 минуту
mat_for_c, у вас после 1е-100 идет 1е-10, а у меня почему-то 1е-11
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 15:57
Цитата Сообщение от ElKros Посмотреть сообщение
а какая у вас студия ?
15
Цитата Сообщение от ElKros Посмотреть сообщение
у вас после 1е-100 идет 1е-10, а у меня почему-то 1е-11
потому что я у себя начал уже тестить шаг 1е-10, а скидывал код с шагом 1е-11
ps у меня буст 1.64

Добавлено через 2 минуты
C++
1
2
3
4
double dy0dt(const double& t, const double& y_0, const double& y_1, const double& y_2, const double& y_3) {
   std::cout << double(8.85e6) - y_2*y_0*((double(0.2) - y_0) / (double(1.) - y_1)) + y_0 / double(1e-8);
   return double(8.85e6) - y_2*y_0*((double(0.2) - y_0) / (double(1.) - y_1)) + y_0 / double(1e-8);
}
переписываете все в таком формате и ищете, что не так через вывод
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 16:06  [ТС]
mat_for_c, изначально выводит значения функций, а потом снова nan. попробую другой буст, может поможет
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 16:10
Цитата Сообщение от ElKros Посмотреть сообщение
а потом снова nan
ну, dy2dt = nan, что соответствует k3. начинайте алализ составных частей. применяйте метод разделяй и властвуй
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
22.03.2018, 22:04  [ТС]
mat_for_c, после переустановки среды начало работать. Спасибо вам большое за помощь !!!
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.03.2018, 22:07
Цитата Сообщение от ElKros Посмотреть сообщение
после переустановки среды
VS в добавок переставили?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
23.03.2018, 00:08  [ТС]
mat_for_c, пепеставила vs на 17 версию вместо 13 и поменяла boost на 1.64
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2018, 00:08

Метод Рунге-Кутта 2-го порядка
Написал код программы. С компиляцией вроде бы нет проблем. А цикл for воспринимать не хочет. Программа просто его пропускает. Помогите...

Метод рунге-кутта 3 порядка
дана функция d(y(x))/dx=e^x-2y(x) Нач. условия y(0)=e Код#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; float...

Метод Рунге-Кутта 4 порядка
Помогите найти ошибку в методе рунге-Кутта 4 порядка System::System(double m, const Vector3D&amp; g, double C, double f, double p, double S,...

Метод Рунге-Кутта 3 порядка
Начерикал что-то,вроде бы работает,но не уверен,да и не доходит,как под условия сделать задачи,тыкните,пожалуйста #include...

Метод Рунге-Кутта второго порядка
В общем есть задание. Задание к-е на скрине: Ток в электрической цепи описывается дифференциальным уравнением (которое на скрине),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru