gpt4 book ai didi

c++ - 使用僵硬的 ode 停止在 odeint 中的集成

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:09 24 4
gpt4 key购买 nike

我想用 odeint 解决一首僵硬的颂歌。我在关注 this (rosenbrock4_dense_output 步进器)但是,我的函数可以增长得非常快,所以如果 x(t)>xMAX,我想停止集成。

在此question ,他们有一个解决方案,但由于我是 c++ 的新手,我不知道如何在使用 rosenbrock4_dense_output 步进器时实现它。

我想看看如何专门为 rosenbrock4_dense_output 步进器编写这个。

最佳答案

目前,odeint 还不容易做到这一点。如果可以使用范围库 here您可以结合使用 for_eachfind_if 算法。

否则你需要自己写循环,这也不难,应该是这样的:

auto stepper = make_dense_output< rosenbrock4< double > >( 1.0e-12 , 1.0e-12 );
auto ode = make_pair( stiff_system() , stiff_system_jacobi() );

double t = 0.0;
double const end_time = 50.0;
double const dt = 0.01;
vector_type x( 2 , 1.0 );
const double y_min = 1.0;

stepper.initialize( x , t , dt );
cout << t << " " << x[0] << " " << x[1] << endl; // or some other output
t += dt;
while( t < end_time )
{
if( t > stepper.current_time() )
{
// perform a real step
stepper.do_step( ode );
}
else
{
// perform a dense output step
stepper.calc_state( t , x );
cout << t << " " << x[0] << " " << x[1] << endl; // or some other output
t += dt;
}
if( x[1] < y_min ) // or some other condition
{
cout << "Bound reached." << endl;
break;
}
}

关于c++ - 使用僵硬的 ode 停止在 odeint 中的集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33334073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com