首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定odeint变量

绑定odeint变量
EN

Stack Overflow用户
提问于 2013-01-29 23:11:19
回答 2查看 515关注 0票数 4

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

有没有一种合适的方法将odeint中的变量绑定到特定的范围?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-30 01:08:30

odeint中没有这样的可能性。我猜没有算法可以做到这一点。你必须以某种方式在你的颂歌中编码界限。

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

代码语言:javascript
复制
while( t < tmax )
{
    stepper.do_step( ode , x , t , dt );
    t += dt;
    if( check_bound( x , t ) ) break;
}

两个边节点,也许你的问题就是这样:

  1. 对于具有守恒定律的常微分方程,有一些特殊的算法,算法可以确保守恒定律成立,例如,请参阅辛求解器。
  2. 如果您的ODE中已经以某种方式对边界进行了编码,并且无论如何都达到了边界,则必须缩短求解器的步长。
票数 1
EN

Stack Overflow用户

发布于 2015-12-15 20:15:49

您所需要的有时称为“饱和度”约束,这是动态系统建模中的一个常见问题。你可以很容易地将它编码到你的方程式中:

代码语言:javascript
复制
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] = ....
    ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14586059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档