/*
|
boost/numeric/odeint/stepper/detail/pid_step_adjuster_coefficients.hpp
|
|
[begin_description]
|
Coefficients for the PID stepsize controller.
|
[end_description]
|
|
Copyright 2017 Valentin Noah Hartmann
|
|
Distributed under the Boost Software License, Version 1.0.
|
(See accompanying file LICENSE_1_0.txt or
|
copy at http://www.boost.org/LICENSE_1_0.txt)
|
*/
|
|
#ifndef BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_PID_STEP_ADJUSTER_COEFFICIENTS_HPP_INCLUDED
|
#define BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_PID_STEP_ADJUSTER_COEFFICIENTS_HPP_INCLUDED
|
|
#include <boost/array.hpp>
|
|
namespace boost {
|
namespace numeric {
|
namespace odeint {
|
namespace detail {
|
|
enum adjuster_type{
|
BASIC,
|
H0211,
|
H211b,
|
H211PI,
|
H0312,
|
H312b,
|
H312PID,
|
H0321,
|
H321
|
};
|
|
template<int Type>
|
class pid_step_adjuster_coefficients;
|
|
template<>
|
class pid_step_adjuster_coefficients<BASIC> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0;
|
(*this)[1] = 0.0;
|
(*this)[2] = 0.0;
|
(*this)[3] = 0.0;
|
(*this)[4] = 0.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H0211> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 2.0;
|
(*this)[1] = 1.0 / 2.0;
|
(*this)[2] = 0.0;
|
(*this)[3] = 1.0 / 2.0;
|
(*this)[4] = 0.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H211b> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 5.0;
|
(*this)[1] = 2.0 / 5.0;
|
(*this)[2] = 0.0;
|
(*this)[3] = 1.0 / 5.0;
|
(*this)[4] = 0.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H211PI> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 6.0;
|
(*this)[1] = 2.0 / 6.0;
|
(*this)[2] = 0.0;
|
(*this)[3] = 0.0;
|
(*this)[4] = 0.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H0312> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 4.0;
|
(*this)[1] = 2.0 / 2.0;
|
(*this)[2] = 1.0 / 4.0;
|
(*this)[3] = 3.0 / 4.0;
|
(*this)[4] = 1.0 / 4.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H312b> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 6.0;
|
(*this)[1] = 2.0 / 6.0;
|
(*this)[2] = 1.0 / 6.0;
|
(*this)[3] = 3.0 / 6.0;
|
(*this)[4] = 1.0 / 6.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H312PID> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 18.0;
|
(*this)[1] = 2.0 / 9.0;
|
(*this)[2] = 1.0 / 18.0;
|
(*this)[3] = 0.0;
|
(*this)[4] = 0.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H0321> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 5.0 / 4.0;
|
(*this)[1] = 1.0 / 2.0;
|
(*this)[2] = -3.0 / 4.0;
|
(*this)[3] = -1.0 / 4.0;
|
(*this)[4] = -3.0 / 4.0;
|
}
|
};
|
|
template<>
|
class pid_step_adjuster_coefficients<H321> : public boost::array<double, 5>
|
{
|
public:
|
pid_step_adjuster_coefficients()
|
: boost::array<double, 5>()
|
{
|
(*this)[0] = 1.0 / 3.0;
|
(*this)[1] = 1.0 / 18.0;
|
(*this)[2] = -5.0 / 18.0;
|
(*this)[3] = -5.0 / 16.0;
|
(*this)[4] = -1.0 / 6.0;
|
}
|
};
|
|
} // detail
|
} // odeint
|
} // numeric
|
} // boost
|
|
#endif
|