diff --git a/include/dacex/Taylor.h b/include/dacex/Taylor.h index d4e666d..0e301fe 100644 --- a/include/dacex/Taylor.h +++ b/include/dacex/Taylor.h @@ -198,6 +198,47 @@ class Polynomial : public PolynomialBase { */ friend Polynomial operator/(const double c, const Polynomial &p); + /** @brief Evaluate at polynomial-vector arguments. + * @param args Algebraic-vector argument values. + * @return Evaluated Taylor polynomial. + */ + Polynomial eval(const DACE::AlgebraicVector>& args) const; + /** @brief Evaluate at numeric algebraic-vector arguments. + * @param args Numeric argument values. + * @return Evaluated scalar value. + */ + double eval(const DACE::AlgebraicVector& args) const; + /** @brief Evaluate at numeric vector arguments. + * @param args Numeric argument values. + * @return Evaluated scalar value. + */ + double eval(const std::vector& args) const; + /** @brief Evaluate with generic vector arguments. + * @tparam T Evaluation scalar type. + * @param args Input argument vector. + * @return Evaluated value in type T. + */ + template T eval(const std::vector &args) const { + return m_da.eval(args); + } + /** @brief Evaluate with generic array arguments. + * @tparam T Evaluation scalar type. + * @param args Input argument array. + * @param length Number of array elements. + * @return Evaluated value in type T. + */ + template T eval(const T args[], const unsigned int length) const { + return m_da.eval(args, length); + } + /** @brief Evaluate a single-variable polynomial. + * @tparam T Evaluation scalar type. + * @param arg Input scalar argument. + * @return Evaluated value in type T. + */ + template T evalScalar(const T &arg) const { + return m_da.evalScalar(arg); + } + /** @brief Multiply matching monomials coefficient-wise. * @param p Right-hand side polynomial. * @return Product polynomial. diff --git a/src/Taylor.cpp b/src/Taylor.cpp index a619ecc..8948aca 100644 --- a/src/Taylor.cpp +++ b/src/Taylor.cpp @@ -31,6 +31,26 @@ DACE::AlgebraicVector> Polynomial::gradient() const { return result; } +Polynomial Polynomial::eval(const DACE::AlgebraicVector>& args) const { + std::vector da_args(args.size()); + for (size_t i = 0; i < args.size(); ++i) { + da_args[i] = *args[i].getDA(); + } + return Polynomial(m_da.eval(da_args)); +} + +double Polynomial::eval(const DACE::AlgebraicVector& args) const { + std::vector std_args(args.size()); + for (size_t i = 0; i < args.size(); ++i) { + std_args[i] = args[i]; + } + return m_da.eval(std_args); +} + +double Polynomial::eval(const std::vector& args) const { + return m_da.eval(args); +} + Polynomial& Polynomial::operator=(Polynomial &&p) noexcept {