Skip to content
Snippets Groups Projects
Commit a626af8e authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Improve constructors

This simplifies the creation of polynomials from their coefficients.

Also clean-up slightly the Polynomial class
parent 2e4f5dc5
No related branches found
No related tags found
No related merge requests found
...@@ -9,7 +9,7 @@ class Polynomial ...@@ -9,7 +9,7 @@ class Polynomial
private: private:
using Coefficients = TinyVector<N + 1, double>; using Coefficients = TinyVector<N + 1, double>;
Coefficients m_coefficients; Coefficients m_coefficients;
static_assert((N >= 0), "Polynomial degree must be non-negative"); static_assert(N >= 0, "Polynomial degree must be non-negative");
public: public:
PUGS_INLINE PUGS_INLINE
...@@ -18,6 +18,7 @@ class Polynomial ...@@ -18,6 +18,7 @@ class Polynomial
{ {
return N; return N;
} }
PUGS_INLINE PUGS_INLINE
constexpr size_t constexpr size_t
realDegree() const realDegree() const
...@@ -29,37 +30,32 @@ class Polynomial ...@@ -29,37 +30,32 @@ class Polynomial
} }
return 0; return 0;
} }
PUGS_INLINE PUGS_INLINE
constexpr const TinyVector<N + 1>& constexpr const Coefficients&
coefficients() const coefficients() const
{ {
return m_coefficients; return m_coefficients;
} }
PUGS_INLINE PUGS_INLINE
constexpr TinyVector<N + 1>& constexpr Coefficients&
coefficients() coefficients()
{ {
return m_coefficients; return m_coefficients;
} }
template <size_t M>
PUGS_INLINE constexpr bool PUGS_INLINE constexpr bool
operator==(const Polynomial<M>& q) const operator==(const Polynomial& q) const
{ {
if (M != N) return m_coefficients == q.m_coefficients;
return false;
if (m_coefficients != q.coefficients()) {
return false;
}
return true;
} }
PUGS_INLINE PUGS_INLINE
constexpr bool constexpr bool
operator!=(const Polynomial<N>& q) const operator!=(const Polynomial& q) const
{ {
return not this->operator==(q); return not(*this == q);
} }
template <size_t M> template <size_t M>
...@@ -81,12 +77,10 @@ class Polynomial ...@@ -81,12 +77,10 @@ class Polynomial
return P; return P;
} }
PUGS_INLINE constexpr Polynomial<N> PUGS_INLINE constexpr Polynomial
operator-() const operator-() const
{ {
Polynomial<N> P; return Polynomial{-m_coefficients};
P.coefficients() = -coefficients();
return P;
} }
template <size_t M> template <size_t M>
...@@ -109,7 +103,7 @@ class Polynomial ...@@ -109,7 +103,7 @@ class Polynomial
} }
template <size_t M> template <size_t M>
PUGS_INLINE constexpr Polynomial<N>& PUGS_INLINE constexpr Polynomial&
operator=(const Polynomial<M>& Q) operator=(const Polynomial<M>& Q)
{ {
coefficients() = zero; coefficients() = zero;
...@@ -124,7 +118,7 @@ class Polynomial ...@@ -124,7 +118,7 @@ class Polynomial
} }
template <size_t M> template <size_t M>
PUGS_INLINE constexpr Polynomial<N>& PUGS_INLINE constexpr Polynomial&
operator+=(const Polynomial<M>& Q) operator+=(const Polynomial<M>& Q)
{ {
static_assert(N >= M, "Polynomial degree to small in affectation addition"); static_assert(N >= M, "Polynomial degree to small in affectation addition");
...@@ -135,7 +129,7 @@ class Polynomial ...@@ -135,7 +129,7 @@ class Polynomial
} }
template <size_t M> template <size_t M>
PUGS_INLINE constexpr Polynomial<N>& PUGS_INLINE constexpr Polynomial&
operator-=(const Polynomial<M>& Q) operator-=(const Polynomial<M>& Q)
{ {
static_assert(N >= M, "Polynomial degree to small in affectation addition"); static_assert(N >= M, "Polynomial degree to small in affectation addition");
...@@ -160,14 +154,14 @@ class Polynomial ...@@ -160,14 +154,14 @@ class Polynomial
} }
template <size_t M> template <size_t M>
PUGS_INLINE constexpr Polynomial<N>& PUGS_INLINE constexpr Polynomial&
operator*=(const Polynomial<M>& Q) operator*=(const Polynomial<M>& Q)
{ {
static_assert(N >= M, "Degree to small in affectation product"); static_assert(N >= M, "Degree to small in affectation product");
for (size_t i = N - M + 1; i <= N; ++i) { for (size_t i = N - M + 1; i <= N; ++i) {
Assert(coefficients()[i] == 0, "Degree of affectation product greater than the degree of input polynomial"); Assert(coefficients()[i] == 0, "Degree of affectation product greater than the degree of input polynomial");
} }
Polynomial<N> P(zero); Polynomial P(zero);
for (size_t i = 0; i <= N - M; ++i) { for (size_t i = 0; i <= N - M; ++i) {
for (size_t j = 0; j <= M; ++j) { for (size_t j = 0; j <= M; ++j) {
P.coefficients()[i + j] += coefficients()[i] * Q.coefficients()[j]; P.coefficients()[i + j] += coefficients()[i] * Q.coefficients()[j];
...@@ -178,12 +172,10 @@ class Polynomial ...@@ -178,12 +172,10 @@ class Polynomial
} }
PUGS_INLINE PUGS_INLINE
constexpr Polynomial<N> constexpr Polynomial
operator*(const double& lambda) const operator*(const double& lambda) const
{ {
TinyVector<N + 1> mult_coefs = lambda * m_coefficients; return Polynomial(lambda * m_coefficients);
Polynomial<N> M(mult_coefs);
return M;
} }
template <size_t M> template <size_t M>
...@@ -268,36 +260,22 @@ class Polynomial ...@@ -268,36 +260,22 @@ class Polynomial
} }
PUGS_INLINE PUGS_INLINE
constexpr friend Polynomial<N> constexpr friend Polynomial
operator*(const double& lambda, const Polynomial<N> P) operator*(const double& lambda, const Polynomial& P)
{ {
return P * lambda; return P * lambda;
} }
// evaluation using Horner's method https://en.wikipedia.org/wiki/Horner's_method
PUGS_INLINE
constexpr double
evaluate(const double& x) const
{
TinyVector<N + 1> coefs = this->coefficients();
double bcoef = coefs[N];
for (size_t i = N; i > 0; --i) {
bcoef *= x;
bcoef += coefs[i - 1];
}
return bcoef;
}
PUGS_INLINE PUGS_INLINE
constexpr double constexpr double
operator()(const double x) const operator()(double x) const
{ {
TinyVector<N + 1> coefs = this->coefficients(); double p_x = m_coefficients[N];
double bcoef = coefs[N];
for (size_t i = N; i > 0; --i) { for (size_t i = N; i > 0; --i) {
bcoef *= x; p_x *= x;
bcoef += coefs[i - 1]; p_x += m_coefficients[i - 1];
} }
return bcoef; return p_x;
} }
template <size_t M> template <size_t M>
...@@ -321,7 +299,7 @@ class Polynomial ...@@ -321,7 +299,7 @@ class Polynomial
PUGS_INLINE PUGS_INLINE
constexpr friend Polynomial<N + 1> constexpr friend Polynomial<N + 1>
primitive(const Polynomial<N>& P) primitive(const Polynomial& P)
{ {
TinyVector<N + 2> coefs; TinyVector<N + 2> coefs;
for (size_t i = 0; i < N + 1; ++i) { for (size_t i = 0; i < N + 1; ++i) {
...@@ -333,7 +311,7 @@ class Polynomial ...@@ -333,7 +311,7 @@ class Polynomial
PUGS_INLINE PUGS_INLINE
constexpr friend std::ostream& constexpr friend std::ostream&
operator<<(std::ostream& os, const Polynomial<N>& P) operator<<(std::ostream& os, const Polynomial& P)
{ {
// os << "P(x) = "; // os << "P(x) = ";
bool all_coef_zero = true; bool all_coef_zero = true;
...@@ -412,16 +390,36 @@ class Polynomial ...@@ -412,16 +390,36 @@ class Polynomial
return P; return P;
} }
PUGS_INLINE constexpr Polynomial(const TinyVector<N + 1>& coefficients) noexcept : m_coefficients{coefficients} {} PUGS_INLINE constexpr Polynomial& operator=(const Polynomial&) = default;
PUGS_INLINE constexpr Polynomial& operator=(Polynomial&&) = default;
PUGS_INLINE
constexpr Polynomial(const TinyVector<N + 1>& coefficients) noexcept : m_coefficients(coefficients) {}
PUGS_INLINE PUGS_INLINE
constexpr Polynomial(TinyVector<N + 1>&& coefficients) noexcept : m_coefficients{coefficients} {} constexpr Polynomial(const Polynomial&) noexcept = default;
PUGS_INLINE
constexpr Polynomial(Polynomial&&) noexcept = default;
template <typename... T>
explicit PUGS_INLINE constexpr Polynomial(T&&... coefficients) noexcept : m_coefficients(coefficients...)
{
// static_assert(sizeof...(T) == N + 1, "invalid number of parameters");
// static_assert((std::is_convertible_v<T, double> and ...), "arguments must be convertible to double");
}
PUGS_INLINE PUGS_INLINE
constexpr Polynomial() noexcept = default; constexpr Polynomial() noexcept = default;
~Polynomial() = default; ~Polynomial() = default;
}; };
// template <size_t N>
// template <>
// PUGS_INLINE constexpr Polynomial(TinyVector<N + 1>&& coefficients) noexcept : m_coefficients{coefficients}
// {}
template <size_t N> template <size_t N>
PUGS_INLINE constexpr Polynomial<N> lagrangePolynomial(const TinyVector<N + 1> zeros, const size_t k); PUGS_INLINE constexpr Polynomial<N> lagrangePolynomial(const TinyVector<N + 1> zeros, const size_t k);
......
...@@ -38,8 +38,8 @@ class PolynomialBasis ...@@ -38,8 +38,8 @@ class PolynomialBasis
{ {
TinyVector<N + 1> coefficients(zero); TinyVector<N + 1> coefficients(zero);
elements()[0] = Polynomial<N>(coefficients); elements()[0] = Polynomial<N>(coefficients);
elements()[0] += Polynomial<0>(TinyVector<1>{1}); elements()[0] += Polynomial<0>(1);
Polynomial<1> unit(TinyVector<2>{-shift, 1}); Polynomial<1> unit(-shift, 1);
for (size_t i = 1; i <= N; i++) { for (size_t i = 1; i <= N; i++) {
elements()[i] = elements()[i - 1] * unit; elements()[i] = elements()[i - 1] * unit;
} }
...@@ -51,7 +51,7 @@ class PolynomialBasis ...@@ -51,7 +51,7 @@ class PolynomialBasis
_buildLagrangeBasis(const TinyVector<N + 1>& zeros) _buildLagrangeBasis(const TinyVector<N + 1>& zeros)
{ {
if constexpr (N == 0) { if constexpr (N == 0) {
elements()[0] = Polynomial<0>(TinyVector<1>{1}); elements()[0] = Polynomial<0>(1);
return *this; return *this;
} else { } else {
for (size_t i = 0; i < N; ++i) { for (size_t i = 0; i < N; ++i) {
...@@ -65,7 +65,7 @@ class PolynomialBasis ...@@ -65,7 +65,7 @@ class PolynomialBasis
if (i == j) if (i == j)
continue; continue;
double adim = 1. / (zeros[i] - zeros[j]); double adim = 1. / (zeros[i] - zeros[j]);
elements()[i] *= Polynomial<1>{TinyVector<2>{-zeros[j] * adim, adim}}; elements()[i] *= Polynomial<1>{-zeros[j] * adim, adim};
} }
} }
return *this; return *this;
...@@ -128,7 +128,7 @@ class PolynomialBasis ...@@ -128,7 +128,7 @@ class PolynomialBasis
PUGS_INLINE PUGS_INLINE
constexpr PolynomialBasis<N>& constexpr PolynomialBasis<N>&
build(BasisType basis_type, const double& shift = 0, const TinyVector<N + 1>& zeros = TinyVector<N + 1>(zero)) build(BasisType basis_type, const double& shift = 0, const TinyVector<N + 1>& zeros = zero)
{ {
type() = basis_type; type() = basis_type;
switch (basis_type) { switch (basis_type) {
......
...@@ -22,75 +22,83 @@ TEST_CASE("Polynomial", "[analysis]") ...@@ -22,75 +22,83 @@ TEST_CASE("Polynomial", "[analysis]")
{ {
SECTION("construction") SECTION("construction")
{ {
REQUIRE_NOTHROW(Polynomial<2>{TinyVector<3>{2, 3, 4}}); REQUIRE_NOTHROW(Polynomial<2>(2, 3, 4));
} }
SECTION("degree") SECTION("degree")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
REQUIRE(P.degree() == 2); REQUIRE(P.degree() == 2);
} }
SECTION("equality") SECTION("equality")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
Polynomial<2> Q(TinyVector<3>{2, 3, 4}); Polynomial<2> Q(2, 3, 4);
Polynomial<2> S(TinyVector<3>{2, 3, 5}); Polynomial<2> S(2, 3, 5);
REQUIRE(P == Q); REQUIRE(P == Q);
REQUIRE(P != S); REQUIRE(P != S);
} }
SECTION("addition") SECTION("addition")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
Polynomial<2> Q(TinyVector<3>{-1, -3, 2}); Polynomial<2> Q(-1, -3, 2);
Polynomial<2> S(TinyVector<3>{1, 0, 6}); Polynomial<2> S(1, 0, 6);
Polynomial<3> T(TinyVector<4>{0, 3, 1, -2}); Polynomial<3> T(0, 3, 1, -2);
Polynomial<3> U(TinyVector<4>{2, 6, 5, -2}); Polynomial<3> U(2, 6, 5, -2);
REQUIRE(S == (P + Q)); REQUIRE(S == (P + Q));
REQUIRE((T + P) == U); REQUIRE((T + P) == U);
} }
SECTION("opposed") SECTION("opposed")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
Polynomial<2> Q = -P; Polynomial<2> Q = -P;
REQUIRE(Q == Polynomial<2>(TinyVector<3>{-2, -3, -4})); REQUIRE(Q == Polynomial<2>(-2, -3, -4));
} }
SECTION("difference") SECTION("difference")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
Polynomial<2> Q(TinyVector<3>{3, 4, 5}); Polynomial<2> Q(3, 4, 5);
Polynomial<2> D(TinyVector<3>{-1, -1, -1}); Polynomial<2> D(-1, -1, -1);
REQUIRE(D == (P - Q)); REQUIRE(D == (P - Q));
Polynomial<3> R(TinyVector<4>{2, 3, 4, 1}); Polynomial<3> R(2, 3, 4, 1);
REQUIRE(D == (P - Q)); REQUIRE(D == (P - Q));
REQUIRE((P - R) == Polynomial<3>(TinyVector<4>{0, 0, 0, -1})); REQUIRE((P - R) == Polynomial<3>{0, 0, 0, -1});
R -= P; R -= P;
REQUIRE(R == Polynomial<3>(TinyVector<4>{0, 0, 0, 1})); REQUIRE(R == Polynomial<3>(0, 0, 0, 1));
} }
SECTION("product_by_scalar") SECTION("product_by_scalar")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
Polynomial<2> M(TinyVector<3>{6, 9, 12}); Polynomial<2> M(6, 9, 12);
REQUIRE(M == (P * 3)); REQUIRE(M == (P * 3));
REQUIRE(M == (3 * P)); REQUIRE(M == (3 * P));
} }
SECTION("product") SECTION("product")
{ {
Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> P(2, 3, 4);
Polynomial<3> Q(TinyVector<4>{1, 2, -1, 1}); Polynomial<3> Q(1, 2, -1, 1);
Polynomial<4> R; Polynomial<4> R;
Polynomial<5> S; Polynomial<5> S;
R = P; R = P;
S = P; S = P;
S *= Q; S *= Q;
REQUIRE(Polynomial<5>(TinyVector<6>{2, 7, 8, 7, -1, 4}) == (P * Q)); REQUIRE(Polynomial<5>(2, 7, 8, 7, -1, 4) == (P * Q));
REQUIRE(Polynomial<5>(TinyVector<6>{2, 7, 8, 7, -1, 4}) == S); REQUIRE(Polynomial<5>(2, 7, 8, 7, -1, 4) == S);
// REQUIRE_THROWS_AS(R *= Q, AssertError); // REQUIRE_THROWS_AS(R *= Q, AssertError);
} }
SECTION("divide") SECTION("divide")
{ {
Polynomial<2> P(TinyVector<3>{1, 0, 1}); Polynomial<2> P(1, 0, 1);
Polynomial<1> Q(TinyVector<2>{0, 1}); Polynomial<1> Q(0, 1);
Polynomial<1> Q1(TinyVector<2>{0, 1}); Polynomial<1> Q1(0, 1);
Polynomial<2> R; Polynomial<2> R;
Polynomial<2> S; Polynomial<2> S;
...@@ -99,29 +107,29 @@ TEST_CASE("Polynomial", "[analysis]") ...@@ -99,29 +107,29 @@ TEST_CASE("Polynomial", "[analysis]")
REQUIRE(Q1.realDegree() == 1); REQUIRE(Q1.realDegree() == 1);
divide(P, Q1, R, S); divide(P, Q1, R, S);
REQUIRE(Polynomial<2>(TinyVector<3>{1, 0, 0}) == S); REQUIRE(Polynomial<2>{1, 0, 0} == S);
REQUIRE(Polynomial<2>(TinyVector<3>{0, 1, 0}) == R); REQUIRE(Polynomial<2>{0, 1, 0} == R);
} }
SECTION("evaluation") SECTION("evaluation")
{ {
Polynomial<2> P(TinyVector<3>{2, -3, 4}); Polynomial<2> P(2, -3, 4);
double result = P.evaluate(3); REQUIRE(P(3) == 29);
REQUIRE(result == 29);
result = P(3);
REQUIRE(result == 29);
} }
SECTION("primitive") SECTION("primitive")
{ {
Polynomial<2> P(TinyVector<3>{2, -3, 4}); Polynomial<2> P(2, -3, 4);
TinyVector<4> coefs = zero; TinyVector<4> coefs = zero;
Polynomial<3> Q(coefs); Polynomial<3> Q(coefs);
Q = primitive(P); Q = primitive(P);
Polynomial<3> R(TinyVector<4>{0, 2, -3. / 2, 4. / 3}); Polynomial<3> R(0, 2, -3. / 2, 4. / 3);
REQUIRE(Q == R); REQUIRE(Q == R);
} }
SECTION("integrate") SECTION("integrate")
{ {
Polynomial<2> P(TinyVector<3>{2, -3, 3}); Polynomial<2> P(2, -3, 3);
double xinf = -1; double xinf = -1;
double xsup = 1; double xsup = 1;
double result = integrate(P, xinf, xsup); double result = integrate(P, xinf, xsup);
...@@ -129,64 +137,65 @@ TEST_CASE("Polynomial", "[analysis]") ...@@ -129,64 +137,65 @@ TEST_CASE("Polynomial", "[analysis]")
result = symmetricIntegrate(P, 2); result = symmetricIntegrate(P, 2);
REQUIRE(result == 24); REQUIRE(result == 24);
} }
SECTION("derivative") SECTION("derivative")
{ {
Polynomial<2> P(TinyVector<3>{2, -3, 3}); Polynomial<2> P(2, -3, 3);
Polynomial<1> Q = derivative(P); Polynomial<1> Q = derivative(P);
REQUIRE(Q == Polynomial<1>(TinyVector<2>{-3, 6})); REQUIRE(Q == Polynomial<1>(-3, 6));
Polynomial<0> P2(TinyVector<1>{3}); Polynomial<0> P2(3);
Polynomial<0> R(TinyVector<1>{0}); Polynomial<0> R(0);
REQUIRE(derivative(P2) == R); REQUIRE(derivative(P2) == R);
} }
SECTION("affectation") SECTION("affectation")
{ {
Polynomial<2> Q(TinyVector<3>{2, -3, 3}); Polynomial<2> Q(2, -3, 3);
Polynomial<4> R(TinyVector<5>{2, -3, 3, 0, 0}); Polynomial<4> R(2, -3, 3, 0, 0);
Polynomial<4> P(TinyVector<5>{0, 1, 2, 3, 3}); Polynomial<4> P(0, 1, 2, 3, 3);
P = Q; P = Q;
REQUIRE(P == R); REQUIRE(P == R);
} }
SECTION("affectation addition") SECTION("affectation addition")
{ {
Polynomial<2> Q(TinyVector<3>{2, -3, 3}); Polynomial<2> Q(2, -3, 3);
Polynomial<4> R(TinyVector<5>{2, -2, 5, 3, 3}); Polynomial<4> R(2, -2, 5, 3, 3);
Polynomial<4> P(TinyVector<5>{0, 1, 2, 3, 3}); Polynomial<4> P(0, 1, 2, 3, 3);
P += Q; P += Q;
REQUIRE(P == R); REQUIRE(P == R);
} }
SECTION("power") SECTION("power")
{ {
Polynomial<2> P(TinyVector<3>{2, -3, 3}); Polynomial<2> P(2, -3, 3);
Polynomial<4> R(TinyVector<5>{4, -12, 21, -18, 9}); Polynomial<4> R(4, -12, 21, -18, 9);
Polynomial<1> Q(TinyVector<2>{0, 2}); Polynomial<1> Q(0, 2);
Polynomial<2> S = Q.pow<2>(2); Polynomial<2> S = Q.pow<2>(2);
REQUIRE(P.pow<2>(2) == R); REQUIRE(P.pow<2>(2) == R);
REQUIRE(S == Polynomial<2>(TinyVector<3>{0, 0, 4})); REQUIRE(S == Polynomial<2>(0, 0, 4));
} }
SECTION("composition") SECTION("composition")
{ {
Polynomial<2> P(TinyVector<3>{2, -3, 3}); Polynomial<2> P(2, -3, 3);
Polynomial<1> Q(TinyVector<2>{0, 2}); Polynomial<1> Q(0, 2);
Polynomial<2> R(TinyVector<3>{2, -1, 3}); Polynomial<2> R(2, -1, 3);
Polynomial<2> S(TinyVector<3>{1, 2, 2}); Polynomial<2> S(1, 2, 2);
REQUIRE(P.compose(Q) == Polynomial<2>(TinyVector<3>{2, -6, 12})); REQUIRE(P.compose(Q) == Polynomial<2>(2, -6, 12));
REQUIRE(P.compose2(Q) == Polynomial<2>(TinyVector<3>{2, -6, 12})); REQUIRE(P.compose2(Q) == Polynomial<2>(2, -6, 12));
REQUIRE(R(S) == Polynomial<4>(TinyVector<5>{4, 10, 22, 24, 12})); REQUIRE(R(S) == Polynomial<4>(4, 10, 22, 24, 12));
} }
SECTION("Lagrange polynomial") SECTION("Lagrange polynomial")
{ {
Polynomial<1> S(TinyVector<2>{0.5, -0.5}); Polynomial<1> S(0.5, -0.5);
Polynomial<1> Q; Polynomial<1> Q;
Q = lagrangePolynomial<1>(TinyVector<2>{-1, 1}, 0); Q = lagrangePolynomial<1>(TinyVector<2>{-1, 1}, 0);
REQUIRE(S == Q); REQUIRE(S == Q);
Polynomial<2> P(TinyVector<3>{0, -0.5, 0.5}); Polynomial<2> P(0, -0.5, 0.5);
Polynomial<2> R; Polynomial<2> R;
R = lagrangePolynomial<2>(TinyVector<3>{-1, 0, 1}, 0); R = lagrangePolynomial<2>(TinyVector<3>{-1, 0, 1}, 0);
REQUIRE(R == P); REQUIRE(R == P);
......
...@@ -34,12 +34,12 @@ TEST_CASE("PolynomialBasis", "[analysis]") ...@@ -34,12 +34,12 @@ TEST_CASE("PolynomialBasis", "[analysis]")
PolynomialBasis<2> B; PolynomialBasis<2> B;
REQUIRE(B.displayType() == "undefined"); REQUIRE(B.displayType() == "undefined");
B.build(BasisType::canonical); B.build(BasisType::canonical);
REQUIRE(B.elements()[1] == Polynomial<2>{TinyVector<3>{0, 1, 0}}); REQUIRE(B.elements()[1] == Polynomial<2>{0, 1, 0});
REQUIRE(B.elements()[2] == Polynomial<2>{TinyVector<3>{0, 0, 1}}); REQUIRE(B.elements()[2] == Polynomial<2>{0, 0, 1});
PolynomialBasis<2> C; PolynomialBasis<2> C;
C.build(BasisType::taylor); C.build(BasisType::taylor);
REQUIRE(B.elements()[1] == C.elements()[1]); REQUIRE(B.elements()[1] == C.elements()[1]);
C.build(BasisType::taylor, 1); C.build(BasisType::taylor, 1);
REQUIRE(C.elements()[2] == Polynomial<2>{TinyVector<3>{1, -2, 1}}); REQUIRE(C.elements()[2] == Polynomial<2>{1, -2, 1});
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment