【发布时间】:2015-10-25 19:27:49
【问题描述】:
我想用 odeint 解决一个僵硬的 ode。我在关注this(rosenbrock4_dense_output stepper),但是我的函数增长很快,所以如果 x(t)>xMAX,我想停止积分。
在这个question 中,他们有一个解决方案,但由于我是 C++ 新手,我不知道在使用 rosenbrock4_dense_output 步进器时如何实现它。
我想看看如何专门为 rosenbrock4_dense_output 步进器编写此代码。
【问题讨论】:
-
就在上周,我添加了一个示例,该示例可以找到越过某个阈值的确切点:github.com/headmyshoulder/odeint-v2/blob/master/examples/…,它使用 odeint 的迭代器接口和 find_if 来在越过阈值时停止。然后它对交叉点进行二等分,但您可能不需要。要适应 Rosenbrock,您只需更改步进器和 rhs 函数。
-
这似乎正是我需要的,但我不知道如何使它与 rosenbrock4_dense_output 步进器一起工作。只需将 runge_kutta_dopri5 更改为 rosenbrock4_dense_output,而不是使用 vector_type 的 state_type:其中定义了 vector_Type: typedef boost::numeric::ublas::vector vector_type;不是全部。你介意解释一下我的具体情况会如何改变吗?
-
您还需要调整 rhs,例如自动颂歌= make_pair(stiff_system(),stiff_system_jacobi()); - 另见下面 headmyshould 的回答