Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 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, 13:11  [ТС]
Студворк — интернет-сервис помощи студентам
mat_for_c,
C++
1
cpp_bin_float_quad
а на это нужно будет и функции менять и все, что в функциях ?

Добавлено через 37 секунд
mat_for_c, просто были и типы const double

Добавлено через 3 минуты
mat_for_c,
C++
1
2
3
 double dy0dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3){
    return 8.85E6 - y_2*y_0*((1.2 - 1 - y_0) / (1 - y_1)) + y_0 / 1e-8;
}
то теперь это должно быть как
C++
1
cpp_bin_float_quad  dy0dt(const cpp_bin_float_quad t, const cpp_bin_float_quad y_0 .. )
?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 13:12
Цитата Сообщение от ElKros Посмотреть сообщение
просто были и типы const double
весь double на нужный вам тип

Добавлено через 13 секунд
Цитата Сообщение от ElKros Посмотреть сообщение
то теперь это должно быть как
ага
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 13:14  [ТС]
mat_for_c, у меня так не работает, пишет ошибки
Ошибка 1 error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "dy0dt"
Ошибка 2 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 13:21
Цитата Сообщение от ElKros Посмотреть сообщение
у меня так не работает, пишет ошибки
все там работает, потеряли ; где-то.
можно откатиться обратно к double и прописать #define double cpp_bin_float_dec и не париться

Добавлено через 3 минуты
и в параметры функций тяжелые типы cpp_bin_float передавайте по ссылке
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 13:23  [ТС]
mat_for_c, после того, как я написала #define double cpp_bin_float_dec, то у меня 143 ошибки
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 13:29
опечатался я
cpp_bin_float_quad

все типы cpp_bin_float из коробки
все типы cpp_dec_float из коробки
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 13:42  [ТС]
mat_for_c, все равно ошибки не уходят...(

Добавлено через 1 минуту
mat_for_c, в основном все переменные как необъявленный идентификатор
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 13:44
using namespace boost::multiprecision; ?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 13:47  [ТС]
mat_for_c,
C++
1
size_t max_iter = (max_t - t0) / h;
Ошибка 1 error C2440: инициализация: невозможно преобразовать "boost::multiprecision::number<boost::mu ltiprecision::backends::cpp_bin_float<11 3,digit_base_2,void,int16_t,49154,16383> ,et_off>" в "size_t"
3 IntelliSense: не существует подходящей функции преобразования из "boost::multiprecision::number<boost::mu ltiprecision::backends::cpp_bin_float<11 3U, boost::multiprecision::backends::digit_b ase_2, void, int16_t, (int16_t)(-16382), (int16_t)16383>, boost::multiprecision::et_off>" в "size_t"
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 13:50
ну перепишите цикл в таком формате:
C++
1
2
3
4
while (t < max_t) {
   ... // решаем диффур
   t += h;
}
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 13:53  [ТС]
mat_for_c, так на max_iter мы же шаг просчитываем, разве можно будет без него ?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 13:59  [ТС]
mat_for_c, при таком изменении вот такое получается
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 14:05
Цитата Сообщение от ElKros Посмотреть сообщение
при таком изменении вот такое получается
я же вам уже говорил, что ваш дифур не решается до 2е-5
делайте шаг куда меньше ну и играйтесь с параметрами cpp_dec_float
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 14:11  [ТС]
mat_for_c, даже, если не до 2е-5, он совсем ничего не хочет выводить..

Добавлено через 3 минуты
mat_for_c, #define double cpp_dec_float_quad ?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 14:13
Цитата Сообщение от ElKros Посмотреть сообщение
если не до 2е-5, он совсем ничего не хочет выводит
так у вас шаг 1e-6, а оно решиться до 1e-7. вас ничего не смущает???

Добавлено через 1 минуту
Цитата Сообщение от ElKros Посмотреть сообщение
mat_for_c, #define double cpp_dec_float_quad ?
и что тут?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 14:17  [ТС]
mat_for_c, с шагом 1е-12 такой же результат, а у вас хоть что-то, но выводилось
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 14:22  [ТС]
mat_for_c, #define double cpp_dec_float_quad и #define double cpp_dec_float аналогичные ошибки, их 90 штук, предыдущему типу
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 14:24
вставьте сюда код уже
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
18.03.2018, 14:27  [ТС]
mat_for_c,
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <functional>
#include <vector>
#include <cmath>
#include <boost/multiprecision/cpp_bin_float.hpp>
//#define double cpp_bin_float_quad
#define double cpp_dec_float_quad
 
using namespace std;
using namespace boost::multiprecision;
 
/*// для системы 2х уравнений
/*double dx1dt(const double t, const double x1, const double x2) {
    return 3 * x1 + 2 * x2 + 4 * pow(2.718, (5 * t));
}
 
double dx2dt(const double t, const double x1, const double x2) {
    return x1 + 2 * x2;
}
 
//для системы 3х уравнений
double dX1dt(const double t, const double x1, const double x2, const double x3) {
    return x1 - x2 + x3;
}
 
double dX2dt(const double t, const double x1, const double x2, const double x3) {
    return x1 + x2 - x3;
}
 
double dX3dt(const double t, const double x1, const double x2, const double x3) {
    return 2 * x1 - 2 * x2;
}*/
 
// для главной системы 4х уравнений
 
double dy0dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3){
    return 8.85E6 - y_2*y_0*((1.2 - 1 - y_0) / (1 - y_1)) + y_0 / 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 1E30*(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_t - t0) / h); 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) = 1e-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;   // = 2e-5
 
    cout << "Input step: "; cin >> step; // = 1e-12
 
    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;
}
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.03.2018, 14:31
Цитата Сообщение от ElKros Посмотреть сообщение
#define double cpp_dec_float_quad и #define double cpp_dec_float аналогичные ошибки
нет таких типов вообще. я вам привел ссылки на типы данных из коробки

Добавлено через 1 минуту
cpp_bin_float_quad - с ним же компилится? сделайте шаг 1e-8 и ждите окончания вычислений
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2018, 14:31

Метод Рунге-Кутта 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...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
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