Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972

Odeint и параметры для дифуров

01.07.2017, 20:51. Показов 2650. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Я столкнулся с такой проблемой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef std::array<double, 2> state_type;
void foo(state_type& x, state_type& dx, double t)
{
   mu = 3.14;   // хотелось бы их тоже передавать
   lya = 2.72;  // в качестве параметров
 
   dx[0] = mu * y[1] - lya * y[0];
   dx[1] = lya *  y[0] - mu * y[1];
}
 
int main()
{
   runge_kutta_dopri5<state_type> stepper;
 
   double t = 0.0, dt = 0.1;
   for (size_t i(1); i <= 10; ++i) {
      stepper.do_step(foo, y, t, dt);   // <- но do_step не принимает лишних параметров
      t += dt;
   }
}
Подскажите, как можно сделать передачу параметров?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.07.2017, 20:51
Ответы с готовыми решениями:

Ограничения для численного решения дифуров
Собственно вопрос, как задать ограничения для решения дифуров? Везде примеры, где условия вида y(0)=0 и \dot{y}(0) = 0, а в моем случае...

не могу написать цикл для системы дифуров
имеется решаемая числовым методом система 6 диф. уравнений (d1, d2, .....d6), все переменные зависят от времени t. дано x,y,z надо найти...

Какой способ лучше для решения данной системы дифуров?
Привет!) У меня проблемка, не могу решить системы дифуров численно. Система: dx/dt=a1*x-b1*x*y dy/dt=-a2*x+b2*x*y где...

8
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.07.2017, 12:18
Лучший ответ Сообщение было отмечено mat_for_c как решение

Решение

mat_for_c, а там что, do_step разве обязательно указатель на функцию нужен? Наверняка можно использовать функтор/забиндить доп. аргументы.
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.07.2017, 14:00  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Наверняка можно использовать функтор/забиндить доп. аргументы
написал через функтор.
C++
1
2
3
4
5
6
7
8
9
10
class diff_eq {
   double mu, lym;
public:
   diff_eq() : mu(0.), lym(0.) {}
 
   void set_mu(double mu) { this->mu = mu; }
   void set_lym(double lym) { this->lym = lym; }
 
   void operator() (const state_type& y, state_type& dydt, const double) const; // <- тут написан диффур
}
Но вот через bind не получилось.
Делал так:
C++
1
2
3
4
5
6
void foo(double mu, double lym, const state_type& y, state_type& dydt, const double) { // диффур }
 
void main() {
   ...
   auto fn_diff_eq = std::bind(foo, std::placeholder::_1, std::placeholder::_2);
   stepper.do_step(fn_diff_eq(0.035, 0,005), y, t, dt); // <- ошибка ((
Ошибка C2672 "std::invoke": не найдена соответствующая перегруженная функция. Что я сделал не так?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.07.2017, 14:31
Цитата Сообщение от mat_for_c Посмотреть сообщение
C++
1
2
auto fn_diff_eq = std::bind(foo, std::placeholder::_1, std::placeholder::_2);
stepper.do_step(fn_diff_eq(0.035, 0,005), y, t, dt);
Что-то тут наоборот всё. Примерно так должно быть:
C++
1
2
3
using namespace std::placeholders;
auto fn_diff_eq = std::bind(foo, .035, .005, _1, _2, _3);   // bind 1-st & 2-nd params
stepper.do_step(fn_diff_eq, y, t, dt);
1
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.07.2017, 15:18  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Примерно так должно быть:
похоже на то, но теперь ругается компоновщик LNK2019 неразрешенный внешний символ на foo.
Я определил foo в другом cpp и в main.cpp указал прототип для bind. Однако, если foo перекинуть в main.cpp, то всё норм Что не так, подскажите, пожалуйста?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.07.2017, 15:27
Цитата Сообщение от mat_for_c Посмотреть сообщение
похоже на то, но теперь ругается компоновщик LNK2019 неразрешенный внешний символ на foo.
Я определил foo в другом cpp и в main.cpp указал прототип для bind.
Т.е. с bind(foo, ...)(...) не линкуется, а c непосредственным вызовом foo(...) линкуется? Не верю)
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.07.2017, 15:41  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Не верю)
Вот так линкуется:
Кликните здесь для просмотра всего текста
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
#include <boost/numeric/odeint.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <array>
 
using namespace boost::numeric::odeint;
using namespace std::placeholders;
 
typedef std::array<double, 15> state_type;
 
void foobar(
   double lya,
   double mu,
   const state_type& y,
   state_type& dy,
   boost::multiprecision::cpp_dec_float_50 t
) { // дифур }
 
void main()
{
   state_type y = { 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. };
 
   const double dt = 8.075;
   runge_kutta_dopri5<state_type> stepper;
 
   double t = 0.0;
   for (size_t i(1); i <= 36; ++i) {
      std::cout << i << "\t" << y[0] << std::endl;
      stepper.do_step(std::bind(foobar, 0.005, 1. / 35., _1, _2, _3), y, t, dt);
      t += dt;
   }
 
   system("pause");
}

а вот так уже нет:
main.cpp
Кликните здесь для просмотра всего текста
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
#include <boost/numeric/odeint.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <array>
 
 
using namespace boost::numeric::odeint;
using namespace std::placeholders;
 
typedef std::array<double, 15> state_type;
 
void foobar(
   double lya,
   double mu,
   const state_type& y,
   state_type& dy,
   boost::multiprecision::cpp_dec_float_50 t
);
 
void main()
{
   state_type y = { 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. };
 
   const double dt = 8.075;
   runge_kutta_dopri5<state_type> stepper;
 
   double t = 0.0;
   for (size_t i(1); i <= 36; ++i) {
      std::cout << i << "\t" << y[0] << std::endl;
      stepper.do_step(std::bind(foobar, 0.005, 1. / 35., _1, _2, _3), y, t, dt);
      t += dt;
   }
 
   system("pause");
}

foobar.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <array>
 
typedef std::array<boost::multiprecision::cpp_dec_float_50, 15> state_type;
 
void foobar(
   double lya,
   double mu,
   const state_type& y,
   state_type& dy,
   boost::multiprecision::cpp_dec_float_50 t
) { // дифур }
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.07.2017, 15:55
mat_for_c, в одном месте
C++
1
typedef std::array<double, 15> state_type;
в другом
C++
1
typedef std::array<boost::multiprecision::cpp_dec_float_50, 15> state_type;
:/ заведи заголовочный файл для объявлений.
1
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.07.2017, 16:00  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
mat_for_c, в одном месте
Цитата Сообщение от gray_fox Посмотреть сообщение
в другом
мда. глаза уже не видят
Цитата Сообщение от gray_fox Посмотреть сообщение
заведи заголовочный файл для объявлений
так и сделаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.07.2017, 16:00
Помогаю со студенческими работами здесь

Подключить библиотеку odeint к Xcode
Здравствуйте, я новичок в Xcode (и вообще в программирований на С++). Подскажите пожалуйста, как подключить библиотеку odeint...

Численное решение ОДУ второго порядка с odeint
Здравствуйте! Решаю диффур \ddot{y}+4y=0 при начальных условиях y(0) = 1, \dot{y}(0) = 1, аналитическим решением которого будет y = \cos...

Решение ОДУ с использованием scipy odeint с массивом значений
Всем доброго времени суток. Имеется ОДУ первого порядка(пример): dn/dt=A*n; n(0)=n0 В случае, когда A константа, оно...

Решение дифуров
Хочу понять как пользоваться солверами в матлаб.Можете показать ,как решить например вот такую систему,используя какой-нибудь из солверов?

Система дифуров
Здравствуйте. Решаю систему 2х диффуров с начальными условиями. Таким образом: sol := dsolve({t0,system}, {f(t), w(t)}) ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru