Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
1

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

10.03.2018, 20:50. Просмотров 561. Ответов 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;
}
0
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее   СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2018, 20:50
Ответы с готовыми решениями:

Рунге-Кутта 4го порядка из книги (The Art of Scientific Computing)
Доброго всем дня! Нашел в сети книгу с исходниками, если кому нужно могу...

Метод Рунге-Кутта 4 порядка
Помогите найти ошибку в методе рунге-Кутта 4 порядка System::System(double m,...

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

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

Метод Рунге-Кутта 4-го порядка
Правильно ли я записал выражения для коэффициентов моего уравнения(система...

58
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
10.03.2018, 22:01  [ТС] 2
подскажите, пожалуйста в чем ошибка или что сделать, чтобы решить систему ? очень нужна помощь

Добавлено через 1 час 9 минут
как можно реализовать может метод эйлера ? или с ним тоже может не сработать ?
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
15.03.2018, 19:12  [ТС] 3
ребят, подскажите пожалуйста, очень нужно ?
0
VTsaregorodtsev
535 / 490 / 68
Регистрация: 19.02.2010
Сообщений: 1,794
15.03.2018, 22:36 4
Готтсподи...
Зачем Вы на КАЖДОЙ итерации ВЫЧИСЛЯЕТЕ одни и те же КОНСТАНТЫ через pow() ?
Это чисто к умению программировать замечание.

Превратите все константы и множители, которые у Вас сейчас выглядят как целые, в плавучие. Т.е. вместо 1 - сделайте 1. или 1.0, и т.д.

Ну и проконтролируйте аргумент, передаваемый в exp(). Там если аргумент >=709 - то возникает переполнение результата (невозможно будет вместить значение в double-тип возвращаемого функцией значения).

Дальше лень с кодом разбираться.
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
16.03.2018, 07:16  [ТС] 5
VTsaregorodtsev, а как иначе записывать большие степени, если не через pow ? А какой тип тогда лучше использовать, чтобы он больше вместил И не было переполнения ?
0
zss
Модератор
Эксперт С++
7415 / 6804 / 4303
Регистрация: 18.12.2011
Сообщений: 17,975
Завершенные тесты: 1
16.03.2018, 08:08 6
Цитата Сообщение от ElKros Посмотреть сообщение
8.85*pow(10, 6)
Цитата Сообщение от ElKros Посмотреть сообщение
pow(10, -8);
Такие константы пишутся так
8.85E6
1e-8
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
16.03.2018, 08:58  [ТС] 7
VTsaregorodtsev, с плавающей точкой все точно также работает

Добавлено через 4 минуты
zss, а как использовать библиотеку cpp_bin_float ? Как ее подключить и на что нужно менять тип ?
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
16.03.2018, 10:22 8
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Ну и проконтролируйте аргумент, передаваемый в exp(). Там если аргумент >=709 - то возникает переполнение результата (невозможно будет вместить значение в double-тип возвращаемого функцией значения).
если внимательно посмотреть на степень экспоненты, то она меньше 0 идет, т.е. там не особо важна проверка на >= 709. Там проблема другая, в некий момент времени переменная y0 становится меньше 0, а корень от отрицательного числа подсчитать весьма проблематично в поле действительных чисел.

Добавлено через 4 минуты
Цитата Сообщение от ElKros Посмотреть сообщение
а как использовать библиотеку cpp_bin_float
это не библиотека, это тип данных из нее. бублиотека называется boost. вам нужен раздел multiprecision. вроде он header-only, поэтому предварительно не нужно компилировать этот модуль
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
16.03.2018, 12:07  [ТС] 9
mat_for_c, я когда подключила библиотеку, то у меня ее не считало..

Добавлено через 12 минут
mat_for_c, то есть после подключения нужно будет тип double менять на cpp_bin_float ? Или копировать модуль ?
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
16.03.2018, 12:43 10
Цитата Сообщение от ElKros Посмотреть сообщение
mat_for_c, я когда подключила библиотеку, то у меня ее не считало..
и как мы должны понять, как же вы ее подключали, что у вас не считало?? больше конкретики
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
16.03.2018, 16:30  [ТС] 11
mat_for_c, библиотеку boost нужно скачивать ?

Добавлено через 6 минут
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
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <boost/math/special_functions/gamma.hpp>
#include <iostream>
 
int main()
{
   using namespace boost::multiprecision;
 
   // Operations at fixed precision and full numeric_limits support:
   cpp_bin_float_100 b = 2;
   std::cout << std::numeric_limits<cpp_bin_float_100>::digits << std::endl;
   std::cout << std::numeric_limits<cpp_bin_float_100>::digits10 << std::endl;
   // We can use any C++ std lib function, lets print all the digits as well:
   std::cout << std::setprecision(std::numeric_limits<cpp_bin_float_100>::max_digits10)
      << log(b) << std::endl; // print log(2)
   // We can also use any function from Boost.Math:
   std::cout << boost::math::tgamma(b) << std::endl;
   // These even work when the argument is an expression template:
   std::cout << boost::math::tgamma(b * b) << std::endl;
   // And since we have an extended exponent range we can generate some really large 
   // numbers here (4.0238726007709377354370243e+2564):
   std::cout << boost::math::tgamma(cpp_bin_float_100(1000)) << std::endl;
   return 0;
}
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
16.03.2018, 17:00 12
Цитата Сообщение от ElKros Посмотреть сообщение
библиотеку boost нужно скачивать ?
конечно
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
17.03.2018, 10:37  [ТС] 13
mat_for_c, у меня нет папки stage, которую нужно добавить в компоновщики
0
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
17.03.2018, 13:01 14
Цитата Сообщение от ElKros Посмотреть сообщение
у меня нет папки stage, которую нужно добавить в компоновщики
она вам не нужна в данном случае. достаточно указать в дополнительных библиотеках путь до папки, в которой лежит папка boost
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
18.03.2018, 12:42  [ТС] 15
mat_for_c, я подключила boost. потом ввела
C++
1
2
#include <boost\any.hpp>
using namespace boost;
а после этого нужно менять тип double на что-то другое или что нужно делать?

Добавлено через 3 минуты
mat_for_c, если пишу
C++
1
2
#include <boost/numeric/ublas/vector.hpp>
using namespace boost::numeric::ublas;
то выдает ошибки:
Ошибка 5 error C2039: push_back: не является членом "boost::numeric::ublas::vector<std::function<double (double,double,double,double,double)>,boost::numeric::ublas::unbounded_array<T,std::allocator<T>>>"
Ошибка 1 error C2872: vector: неоднозначный символ
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
18.03.2018, 12:52 16
если все читает и не ругается, то подключайте #include <boost/multiprecision/cpp_bin_float.h> и меняйте double на cpp_bin_float_quad. можете поиграться с параметрами под свою точность - вдруг получится, а также потестить cpp_dec_float.

Добавлено через 2 минуты
Цитата Сообщение от ElKros Посмотреть сообщение
если пишу
зачем вам сейчас вектор из буста???
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
18.03.2018, 12:54  [ТС] 17
mat_for_c, Ошибка 1 error C1083: Не удается открыть файл включение: boost/multiprecision/cpp_bin_float.h: No such file or directory

Добавлено через 42 секунды
mat_for_c, я думала, что вектор нужно тоже как-то менять..

Добавлено через 1 минуту
mat_for_c, нужно полностью прописывать путь к папке multiprecision ?
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
18.03.2018, 12:54 18
Цитата Сообщение от ElKros Посмотреть сообщение
No such file or directory
вы путь прописали в свойствах проекта?
0
ElKros
0 / 0 / 1
Регистрация: 14.02.2018
Сообщений: 245
18.03.2018, 12:57  [ТС] 19
mat_for_c, я вот так прописывала
0
Миниатюры
СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее   СОДУ как сделать, если метод рунге-кутта 4го порядка не решает ее  
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
18.03.2018, 13:04 20
*.hpp у хидеров буста такое расширение
0
18.03.2018, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2018, 13:04

Метод Рунге-Кутта 4-го порядка
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace...

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

Метод Рунге-Кутта четвертого порядка
Доброго времени суток. Задание по выч. мату. координаты х рассчитываются просто...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru