How can I make my stepper error controlled in boost odeint with complex matrices as state types?

166 Views Asked by At

I tried this way, but I got very long compiling error message.

integrate_adaptive( make_controlled(1.E-12,1.E-12,stepper_type() ), matrix_ode() ,
                     x , 0.0 , 15. , 0.01 , write_ofsx );

where stepper_type is:

typedef runge_kutta_dopri5< state_type > stepper_type;

where state_type is:

typedef matrix< complex< double > > state_type;

Some details of the error message which might be interesting:

boost_1_74_0/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:89:40: error: cannot convert 'boost::numeric::odeint::vector_space_norm_inf<boost::numeric::ublas::matrix<std::complex<double> >, void>::result_type' {aka 'std::complex<double>'}
to 'boost::numeric::odeint::default_error_checker<double, boost::numeric::odeint::vector_space_algebra, boost::numeric::odeint::default_operations>::value_type' {aka 'double'} in return
         return algebra.norm_inf( x_err );
                                        ^

and

boost_1_74_0/boost/numeric/odeint/util/ublas_wrapper.hpp:60:55: error: could not convert 'boost::numeric::ublas::norm_inf(const boost::numeric::ublas::matrix_expression<E>&) [with E = boost::numeric::ublas::matrix<std::complex<double> >; typename boost::numeric::ublas::matrix_scalar_unary_traits<E, boost::numeric::ublas::matrix_norm_inf<E> >::result_type = boost::numeric::ublas::matrix_scalar_unary<boost::numeric::ublas::matrix<std::complex<double> >, boost::numeric::ublas::matrix_norm_inf<boost::numeric::ublas::matrix<std::complex<double> > > >]()' from 'boost::numeric::ublas::matrix_scalar_unary_traits<boost::numeric::ublas::matrix<std::complex<double> >, boost::numeric::ublas::matrix_norm_inf<boost::numeric::ublas::matrix<std::complex<double> > > >::result_type' {aka 'boost::numeric::ublas::matrix_scalar_unary<boost::numeric::ublas::matrix<std::complex<double> >, boost::numeric::ublas::matrix_norm_inf<boost::numeric::ublas::matrix<std::complex<double> > > >'} to 'boost::numeric::odeint::vector_space_norm_inf<boost::numeric::ublas::matrix<std::complex<double> >, void>::result_type' {aka 'std::complex<double>'}
             return boost::numeric::ublas::norm_inf( x );
                                                       ^
0

There are 0 best solutions below