4

我正在使用 odeint 来模拟一个系统,其中有几个变量不应小于零。

是否有适当的方法将 odeint 中的变量绑定到特定范围?

4

2 回答 2

1

odeint 中没有这种可能性。而且我想没有算法可以做到这一点。您必须以某种方式对 ODE 中的界限进行编码。

如果您只想在系统演化过程中找到一个界限,请使用类似的循环

while( t < tmax )
{
    stepper.do_step( ode , x , t , dt );
    t += dt;
    if( check_bound( x , t ) ) break;
}

两个侧节点,也许这是您的问题的情况:

  1. 对于具有守恒定律的 ODE 有特殊的算法,该算法确保守恒定律成立,例如,参见辛求解器。

  2. 如果您的边界已经在您的 ODE 中以某种方式编码并且无论如何达到了边界,则您必须缩短求解器的步长。

于 2013-01-29T17:08:29.650 回答
1

您需要的有时称为“饱和”约束,这是动态系统建模中的常见问题。您可以轻松地在方程式中对其进行编码:

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] = ....
    ...
}
于 2015-12-15T12:15:49.427 回答