Я использую odeint для моделирования системы, в которой есть несколько переменных, которые не должны быть меньше нуля.
Есть ли подходящий способ привязать переменную в odeint к определенному диапазону?
В odeint такой возможности нет. И я думаю, что нет алгоритмов, которые могли бы сделать это. Вы должны как-то кодировать границы в вашем ODE.
Если вы хотите найти границу только в процессе развития вашей системы, используйте цикл вроде
while( t < tmax )
{
stepper.do_step( ode , x , t , dt );
t += dt;
if( check_bound( x , t ) ) break;
}
Два боковых узла, может быть, это случай вашей проблемы:
Существуют специальные алгоритмы для ОДУ с законами сохранения, где алгоритм обеспечивает выполнение закона сохранения, см., Например, симплектические решатели.
Если ваша привязка уже каким-то образом закодирована в вашем ODE, и привязка так или иначе достигнута, вы должны сократить размер шага решателя.
То, что вам нужно, иногда называют ограничением «насыщения», распространенной проблемой при моделировании динамических систем. Вы можете легко закодировать это в своем уравнении:
void YourEquation::operator() (const state_type &x, state_type &dxdt, const time_type t)
{
// suppose that x[0] is the variable that should always be greater/equal 0
double x0 = x[0]; // or whatever data type you use
dxdt[0] = .... // part of your equation here
if (x0 <= 0 && dxdt[0] < 0)
{
x0 = 0;
dxdt[0] = 0
}
// the rest of the system equations, use x0 instead of x[0] if necessary, actually it depends on the situation and physical interpretation
dxdt[1] = ....
dxdt[2] = ....
...
}