本文介绍了使用boost :: odeint与本征::矩阵状态向量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想利用的利用本征3 作为的错误,第一个是
在文件从/usr/include/boost/mpl/aux_/begin_end_impl.hpp:20:0包括,
从/usr/include/boost/mpl/begin_end.hpp:18,
从/usr/include/boost/mpl/is_sequence.hpp:19,
从/usr/include/boost/fusion/support/detail/is_mpl_sequence.hpp:12,
从/usr/include/boost/fusion/support/tag_of.hpp:13,
从/usr/include/boost/fusion/support/is_sequence.hpp:11,
从/usr/include/boost/fusion/sequence/intrinsic_fwd.hpp:12,
从/usr/include/boost/fusion/sequence/intrinsic/front.hpp:10,
从/usr/include/boost/fusion/include/front.hpp:10,
从/usr/include/boost/numeric/odeint/util/is_resizeable.hpp:26,
从/usr/include/boost/numeric/odeint/util/state_wrapper.hpp:25,
从/usr/include/boost/numeric/odeint/stepper/base/explicit_error_stepper_fsal_base.hpp:27,
从/usr/include/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp:24,
从/home/tlycken/exjobb/$c$c/alpha-orbit-follower/test/algebra/algebra-tests.cpp:2:
/usr/include/boost/mpl/eval_if.hpp:在结构提升实例:: MPL :: eval_if_c<真,提振:: range_const_iterator<本征::矩阵和LT;双,3,1> >中的boost :: range_mutable_iterator<常量征::矩阵和LT;双,3,1> > >':
/usr/include/boost/range/iterator.hpp:63:63:从结构的boost :: range_iterator&LT必需的; 3,1&GT双; const的本征::矩阵和LT; >'
/usr/include/boost/range/begin.hpp:112:61:通过模板&LT替代需要;类T>类型名的boost :: range_iterator<常量T> ::类型boost :: range_adl_barrier ::开始(常量T&安培;)与T =本征::矩阵和LT;双,3,1>]
/usr/include/boost/numeric/odeint/algebra/range_algebra.hpp:52:45:从静态无效升压所需::数字:: odeint :: range_algebra :: for_each3(S1和放大器,S2放大器,S3放;,欧普)与S1 =本征::矩阵和LT;双,3,1取代; S2 =常数本征::矩阵和LT;双,3,1取代; S3 =常数本征::矩阵和LT;双,3,1取代; OP =的boost ::数字:: odeint :: default_operations :: scale_sum2<双层,双>]
/usr/include/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp:128:9:从'无效升压所需::数字:: odeint :: runge_kutta_dopri5<状态,价值,DERIV,时间,代数,运营,调整器> :: do_step_impl(系统,常量StateIn和放大器;,常量DerivIn&放;,提高::数字:: odeint :: runge_kutta_dopri5<状态,价值,DERIV,时间,代数,运营,调整器> :: time_type,StateOut和放大器;,DerivOut和放大器;,提振::数字:: odeint :: runge_kutta_dopri5<状态,价值,DERIV,时间,代数,运营,调整器> :: time_type)与系统主=():: __ lambda0; StateIn =本征::矩阵和LT;双,3,1取代; DerivIn =本征::矩阵和LT;双,3,1取代; StateOut =本征::矩阵和LT;双,3,1取代; DerivOut =本征::矩阵和LT;双,3,1取代;状态=本征::矩阵和LT;双,3,1取代;值=双; DERIV =本征::矩阵和LT;双,3,1取代;时间=双;代数=提高::数字:: odeint :: range_algebra;操作=提高::数字:: odeint :: default_operations;调整器=提高::数字:: odeint :: initially_resizer;提高::数字:: odeint :: runge_kutta_dopri5<状态,价值,DERIV,时间,代数,运营,调整器> :: time_type =双重]'
/usr/include/boost/numeric/odeint/stepper/base/explicit_error_stepper_fsal_base.hpp:167:9:从'typename的提升需要:: disable_if<提高:: is_same< StateInOut,时间&gt ;,无效> ::类型boost ::数字:: odeint :: explicit_error_stepper_fsal_base<步进,秩序,StepperOrder,ErrorOrder,国家,价值,DERIV,时间,代数,运营,调整器> :: do_step(系统,常量StateIn&放;,提高::数字:: odeint :: explicit_error_stepper_fsal_base&LT ;步进,秩序,StepperOrder,ErrorOrder,国家,价值,DERIV,时间,代数,运营,调整器> :: time_type,StateOut和放大器;,提高::数字:: odeint :: explicit_error_stepper_fsal_base<步进,秩序,StepperOrder,ErrorOrder,国家,价值,DERIV,时间,代数,运营,调整器> :: time_type)与系统主=():: __ lambda0; StateIn =本征::矩阵和LT;双,3,1取代; StateOut =本征::矩阵和LT;双,3,1取代;步进=的boost ::数字:: odeint :: runge_kutta_dopri5<本征::矩阵和LT;双,3,1>取代;短期无符号整型令= 5U;短期无符号整型StepperOrder = 5U;短期无符号整型ErrorOrder = 4U;状态=本征::矩阵和LT;双,3,1取代;值=双; DERIV =本征::矩阵和LT;双,3,1取代;时间=双;代数=提高::数字:: odeint :: range_algebra;操作=提高::数字:: odeint :: default_operations;调整器=提高::数字:: odeint :: initially_resizer;类型名的boost :: disable_if<提高:: is_same< StateInOut,时间&gt ;,无效> ::类型=无效;提高::数字:: odeint :: explicit_error_stepper_fsal_base<步进,秩序,StepperOrder,ErrorOrder,国家,价值,DERIV,时间,代数,运营,调整器> :: time_type =双重]'
/home/tlycken/exjobb/$c$c/alpha-orbit-follower/test/algebra/algebra-tests.cpp:21:137:从这里需要
/usr/include/boost/mpl/eval_if.hpp:60:31:错误:没有键入'助推名为'类型':: MPL :: eval_if_c<真,提振:: range_const_iterator<本征::矩阵和LT;双,3 ,1> >中的boost :: range_mutable_iterator<常量征::矩阵和LT;双,3,1> > > :: {F_又名结构的boost :: range_const_iterator<本征::矩阵和LT;双,3,1> >}'
的typedef typename的˚F_ :: type类型;
我试图钻进去,但我没有足够的理解发生了什么事情才能够解决我的code的。由于odeint库文档明确
I believe this shouldn't be too hard to get working even if odeint doesn't support Eigen natively.
解决方案
You only need to replace the definition of the stepper by
runge_kutta_dopri5<state,double,state,double,vector_space_algebra> stepper;
Eigen should work out of the Box with the vector_space_algebra
but you need to specify them manually. In the next odeint version we have a mechanism for automatically detecting the algebra.
Btw. youe definition of the ODE is not correct, you need a reference for the derivatve
stepper.do_step([](const state &x, state &dxdt, const double t) -> void {
dxdt = x;
}, X0, 0.0, xout, 0.01);
这篇关于使用boost :: odeint与本征::矩阵状态向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!