我一直在使用VC ++ 2010 Express,以及Windows SDK 7.1附带的64位编译器。我的升级包版本是boost_1_55_0。
增强包odeint的示例代码位于here,如下所示:
#include <iostream>
#include <boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
/* we solve the simple ODE x' = 3/(2t^2) + x/(2t)
* with initial condition x(1) = 0.
* Analytic solution is x(t) = sqrt(t) - 1/t
*/
void rhs( const double x , double &dxdt , const double t )
{
dxdt = 3.0/(2.0*t*t) + x/(2.0*t);
}
void write_cout( const double &x , const double t )
{
cout << t << '\t' << x << endl;
}
// state_type = double
typedef runge_kutta_dopri5< double > stepper_type;
int main()
{
double x = 0.0;
integrate_adaptive( make_controlled( 1E-12 , 1E-12 , stepper_type() ) ,
rhs , x , 1.0 , 10.0 , 0.1 , write_cout );
}
但是,这不会编译。错误消息如下:
1>------ Build started: Project: LearnBoost, Configuration: Debug x64 ------
1> test_odeint.cpp
1>C:\boost_1_55_0\boost/format/alt_sstream_impl.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
1>C:\boost_1_55_0\boost/range/iterator.hpp(63): error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>'
1> with
1> [
1> C=true,
1> F1=boost::range_const_iterator<double>,
1> F2=boost::range_mutable_iterator<const double>
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(52) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1> with
1> [
1> C=const double
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(81) : see reference to function template instantiation 'void boost::numeric::odeint::range_algebra::for_each3<Err,const State,const Deriv,boost::numeric::odeint::default_operations::rel_error<Fac1>>(S1 &,S2 &,S3 &,Op)' being compiled
1> with
1> [
1> Err=double,
1> State=double,
1> Deriv=double,
1> Fac1=double,
1> S1=double,
1> S2=double,
1> S3=double,
1> Op=boost::numeric::odeint::default_operations::rel_error<double>
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(710) : see reference to function template instantiation 'double boost::numeric::odeint::default_error_checker<Value,Algebra,Operations>::error<StateIn,DerivIn,V,double>(boost::numeric::odeint::range_algebra &,const State &,const Deriv &,Err &,Time) const' being compiled
1> with
1> [
1> Value=double,
1> Algebra=boost::numeric::odeint::range_algebra,
1> Operations=boost::numeric::odeint::default_operations,
1> StateIn=double,
1> DerivIn=double,
1> V=double,
1> State=double,
1> Deriv=double,
1> Err=double,
1> Time=double
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(660) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step<void(__cdecl *)(double,double &,double),StateInOut,DerivInOut,V,V>(System,const StateIn &,const DerivIn &,double &,StateOut &,DerivOut &,double &)' being compiled
1> with
1> [
1> ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1> StateInOut=double,
1> DerivInOut=double,
1> V=double,
1> System=void (__cdecl *)(double,double &,double),
1> StateIn=double,
1> DerivIn=double,
1> StateOut=double,
1> DerivOut=double
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(853) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step<void(__cdecl *)(double,double &,double),StateInOut,V>(System,StateInOut &,DerivInOut &,double &,double &)' being compiled
1> with
1> [
1> ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1> StateInOut=double,
1> V=double,
1> System=void (__cdecl *)(double,double &,double),
1> DerivInOut=double
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(561) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step_v1<void(__cdecl *)(double,double &,double),StateInOut>(System,StateInOut &,double &,double &)' being compiled
1> with
1> [
1> ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1> StateInOut=double,
1> System=void (__cdecl *)(double,double &,double)
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp(98) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step<void(__cdecl *)(double,double &,double),State>(System,StateInOut &,double &,double &)' being compiled
1> with
1> [
1> ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1> State=double,
1> System=void (__cdecl *)(double,double &,double),
1> StateInOut=double
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/integrate/integrate_adaptive.hpp(44) : see reference to function template instantiation 'size_t boost::numeric::odeint::detail::integrate_adaptive<Stepper,void(__cdecl *)(double,double &,double),State,Time,void(__cdecl *)(const double &,double)>(Stepper,System,State &,Time &,Time,Time &,Observer,boost::numeric::odeint::controlled_stepper_tag)' being compiled
1> with
1> [
1> Stepper=boost::numeric::odeint::controlled_runge_kutta<boost::numeric::odeint::runge_kutta_dopri5<double>>,
1> State=double,
1> Time=double,
1> System=void (__cdecl *)(double,double &,double),
1> Observer=void (__cdecl *)(const double &,double)
1> ]
1> test_odeint.cpp(31) : see reference to function template instantiation 'size_t boost::numeric::odeint::integrate_adaptive<boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>,void(__cdecl *)(double,double &,double),double,double,void(__cdecl *)(const double &,double)>(Stepper,System,State &,Time,Time,Time,Observer)' being compiled
1> with
1> [
1> ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1> Stepper=boost::numeric::odeint::controlled_runge_kutta<boost::numeric::odeint::runge_kutta_dopri5<double>>,
1> System=void (__cdecl *)(double,double &,double),
1> State=double,
1> Time=double,
1> Observer=void (__cdecl *)(const double &,double)
1> ]
1>C:\boost_1_55_0\boost/range/iterator.hpp(63): error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>'
1> with
1> [
1> C=false,
1> F1=boost::range_const_iterator<double>,
1> F2=boost::range_mutable_iterator<double>
1> ]
1> C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(52) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1> with
1> [
1> C=double
1> ]
1>C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(52): error C2664: 'boost::numeric::odeint::detail::for_each3' : cannot convert parameter 1 from 'boost::type' to 'boost::type'
1> The target type has no constructors
1>C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(130): error C2664: 'boost::numeric::odeint::detail::reduce' : cannot convert parameter 1 from 'boost::type' to 'boost::type'
1> The target type has no constructors
1> C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(84) : see reference to function template instantiation 'Value boost::numeric::odeint::range_algebra::reduce<double,Err,boost::numeric::odeint::default_operations::maximum<Value>>(const S &,Red,Value)' being compiled
1> with
1> [
1> Value=double,
1> Err=double,
1> S=double,
1> Red=boost::numeric::odeint::default_operations::maximum<double>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
答案 0 :(得分:2)
有效。我用这句话:
// state_type = value_type = deriv_type = time_type = double
typedef runge_kutta_dopri5< double , double , double , double , vector_space_algebra , default_operations , never_resizer > stepper_type;
替换此行:
// state_type = double
typedef runge_kutta_dopri5< double > stepper_type;
现在已经修好了。基本上,该示例已过时,示例代码文件夹具有正确的代码。