diff --git a/src/analysis/Polynomial.hpp b/src/analysis/Polynomial.hpp index 3d534dbff3a140872a89e2c73ff5ff26c379de72..e43c4535221682d6b2e5c96b5492ad6d96f780c7 100644 --- a/src/analysis/Polynomial.hpp +++ b/src/analysis/Polynomial.hpp @@ -308,13 +308,13 @@ class Polynomial const size_t Mr = P2.realDegree(); R.coefficients() = P1.coefficients(); Q.coefficients() = zero; - for (ssize_t k = Nr - Mr; k >= 0; --k) { - Q.coefficients()[k] = R.coefficients()[Mr + k] / P2.coefficients()[Mr]; - for (ssize_t j = Mr + k; j >= k; --j) { - R.coefficients()[j] -= Q.coefficients()[k] * P2.coefficients()[j - k]; + for (size_t k = Nr - Mr + 1; k > 0; --k) { + Q.coefficients()[k - 1] = R.coefficients()[Mr + k - 1] / P2.coefficients()[Mr]; + for (size_t j = Mr + k - 1; j > (k - 1); --j) { + R.coefficients()[j] -= Q.coefficients()[k - 1] * P2.coefficients()[j - k]; } } - for (size_t j = Mr; j <= Nr; ++j) { + for (size_t j = Mr; j < Nr + 1; ++j) { R.coefficients()[j] = 0; } } @@ -402,7 +402,7 @@ class Polynomial PUGS_INLINE constexpr friend Polynomial<N> - lagrangeToCanonical(const TinyVector<N + 1> lagrange_coefs, const TinyVector<N + 1, Polynomial<N>>& basis) + lagrangeToCanonical(const TinyVector<N + 1> lagrange_coefs, const std::array<Polynomial<N>, N + 1>& basis) { Polynomial<N> P(zero); // lagrangeBasis({0, 0, 0}, basis); @@ -426,12 +426,11 @@ template <size_t N> PUGS_INLINE constexpr Polynomial<N> lagrangePolynomial(const TinyVector<N + 1> zeros, const size_t k); template <size_t N> -PUGS_INLINE constexpr TinyVector<N, Polynomial<N - 1>> +PUGS_INLINE constexpr std::array<Polynomial<N - 1>, N> lagrangeBasis(const TinyVector<N>& zeros) { static_assert(N >= 1, "invalid degree"); - TinyVector<N, Polynomial<N - 1>> basis; - Polynomial<N - 1> lj; + std::array<Polynomial<N - 1>, N> basis; for (size_t j = 0; j < N; ++j) { basis[j] = lagrangePolynomial<N - 1>(zeros, j); } @@ -464,7 +463,7 @@ PUGS_INLINE constexpr auto derivative(const Polynomial<N>& P) { if constexpr (N == 0) { - return Polynomial<0>(0); + return Polynomial<0>(zero); } else { TinyVector<N> coefs; for (size_t i = 0; i < N; ++i) { @@ -488,7 +487,7 @@ lagrangePolynomial(const TinyVector<N + 1> zeros, const size_t k) if (k == i) continue; double factor = 1. / (zeros[k] - zeros[i]); - Polynomial<1> P({-zeros[i] * factor, factor}); + Polynomial<1> P(TinyVector<2>{-zeros[i] * factor, factor}); lk *= P; } return lk; diff --git a/src/analysis/PolynomialBasis.hpp b/src/analysis/PolynomialBasis.hpp index 5bcd8af5ce7b5a062af6fd37ace63beadf8b418e..cf64978b11c21252dfa6b6e98382806e71703306 100644 --- a/src/analysis/PolynomialBasis.hpp +++ b/src/analysis/PolynomialBasis.hpp @@ -18,7 +18,7 @@ class PolynomialBasis { private: static_assert((N >= 0), "Number of elements in the basis must be non-negative"); - TinyVector<N + 1, Polynomial<N>> m_elements; + std::array<Polynomial<N>, N + 1> m_elements; BasisType m_basis_type; PUGS_INLINE constexpr PolynomialBasis<N>& @@ -65,7 +65,7 @@ class PolynomialBasis if (i == j) continue; double adim = 1. / (zeros[i] - zeros[j]); - elements()[i] *= Polynomial<1>{{-zeros[j] * adim, adim}}; + elements()[i] *= Polynomial<1>{TinyVector<2>{-zeros[j] * adim, adim}}; } } return *this; @@ -113,14 +113,14 @@ class PolynomialBasis } PUGS_INLINE - constexpr const TinyVector<N + 1, Polynomial<N>>& + constexpr const std::array<Polynomial<N>, N + 1>& elements() const { return m_elements; } PUGS_INLINE - constexpr TinyVector<N + 1, Polynomial<N>>& + constexpr std::array<Polynomial<N>, N + 1>& elements() { return m_elements; diff --git a/tests/test_Polynomial.cpp b/tests/test_Polynomial.cpp index 74f8e295e0b14b5d77c141b3d7d00fed28b8dfc4..232ffcca02f445314d14b3418bc14924c5d19db8 100644 --- a/tests/test_Polynomial.cpp +++ b/tests/test_Polynomial.cpp @@ -22,75 +22,75 @@ TEST_CASE("Polynomial", "[analysis]") { SECTION("construction") { - REQUIRE_NOTHROW(Polynomial<2>({2, 3, 4})); + REQUIRE_NOTHROW(Polynomial<2>{TinyVector<3>{2, 3, 4}}); } SECTION("degree") { - Polynomial<2> P({2, 3, 4}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); REQUIRE(P.degree() == 2); } SECTION("equality") { - Polynomial<2> P({2, 3, 4}); - Polynomial<2> Q({2, 3, 4}); - Polynomial<2> S({2, 3, 5}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); + Polynomial<2> Q(TinyVector<3>{2, 3, 4}); + Polynomial<2> S(TinyVector<3>{2, 3, 5}); REQUIRE(P == Q); REQUIRE(P != S); } SECTION("addition") { - Polynomial<2> P({2, 3, 4}); - Polynomial<2> Q({-1, -3, 2}); - Polynomial<2> S({1, 0, 6}); - Polynomial<3> T({0, 3, 1, -2}); - Polynomial<3> U({2, 6, 5, -2}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); + Polynomial<2> Q(TinyVector<3>{-1, -3, 2}); + Polynomial<2> S(TinyVector<3>{1, 0, 6}); + Polynomial<3> T(TinyVector<4>{0, 3, 1, -2}); + Polynomial<3> U(TinyVector<4>{2, 6, 5, -2}); REQUIRE(S == (P + Q)); REQUIRE((T + P) == U); } SECTION("opposed") { - Polynomial<2> P({2, 3, 4}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); Polynomial<2> Q = -P; - REQUIRE(Q == Polynomial<2>({-2, -3, -4})); + REQUIRE(Q == Polynomial<2>(TinyVector<3>{-2, -3, -4})); } SECTION("difference") { - Polynomial<2> P({2, 3, 4}); - Polynomial<2> Q({3, 4, 5}); - Polynomial<2> D({-1, -1, -1}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); + Polynomial<2> Q(TinyVector<3>{3, 4, 5}); + Polynomial<2> D(TinyVector<3>{-1, -1, -1}); REQUIRE(D == (P - Q)); - Polynomial<3> R({2, 3, 4, 1}); + Polynomial<3> R(TinyVector<4>{2, 3, 4, 1}); REQUIRE(D == (P - Q)); - REQUIRE((P - R) == Polynomial<3>({0, 0, 0, -1})); + REQUIRE((P - R) == Polynomial<3>(TinyVector<4>{0, 0, 0, -1})); R -= P; - REQUIRE(R == Polynomial<3>({0, 0, 0, 1})); + REQUIRE(R == Polynomial<3>(TinyVector<4>{0, 0, 0, 1})); } SECTION("product_by_scalar") { - Polynomial<2> P({2, 3, 4}); - Polynomial<2> M({6, 9, 12}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); + Polynomial<2> M(TinyVector<3>{6, 9, 12}); REQUIRE(M == (P * 3)); REQUIRE(M == (3 * P)); } SECTION("product") { - Polynomial<2> P({2, 3, 4}); - Polynomial<3> Q({1, 2, -1, 1}); + Polynomial<2> P(TinyVector<3>{2, 3, 4}); + Polynomial<3> Q(TinyVector<4>{1, 2, -1, 1}); Polynomial<4> R; Polynomial<5> S; R = P; S = P; S *= Q; - REQUIRE(Polynomial<5>({2, 7, 8, 7, -1, 4}) == (P * Q)); - REQUIRE(Polynomial<5>({2, 7, 8, 7, -1, 4}) == S); + REQUIRE(Polynomial<5>(TinyVector<6>{2, 7, 8, 7, -1, 4}) == (P * Q)); + REQUIRE(Polynomial<5>(TinyVector<6>{2, 7, 8, 7, -1, 4}) == S); // REQUIRE_THROWS_AS(R *= Q, AssertError); } SECTION("divide") { - Polynomial<2> P({1, 0, 1}); - Polynomial<1> Q({0, 1}); - Polynomial<1> Q1({0, 1}); + Polynomial<2> P(TinyVector<3>{1, 0, 1}); + Polynomial<1> Q(TinyVector<2>{0, 1}); + Polynomial<1> Q1(TinyVector<2>{0, 1}); Polynomial<2> R; Polynomial<2> S; @@ -99,26 +99,12 @@ TEST_CASE("Polynomial", "[analysis]") REQUIRE(Q1.realDegree() == 1); divide(P, Q1, R, S); - REQUIRE(Polynomial<2>({1, 0, 0}) == S); - REQUIRE(Polynomial<2>({0, 1, 0}) == R); - } - SECTION("divide2") - { - Polynomial<7> P({1, -3, 0.6, -2.6, 7, 1.8, 4, -2}); - Polynomial<3> Q({-1, 1, 0, 2}); - - Polynomial<7> R; - Polynomial<7> S; - REQUIRE(P.realDegree() == 7); - REQUIRE(Q.realDegree() == 3); - - divide(P, Q, R, S); - REQUIRE(Polynomial<7>({-1, 2, 1.4, 2, -1, 0, 0, 0}) == R); - REQUIRE(Polynomial<7>({0, 0, 0, 0, 0, 0, 0, 0}) == S); + REQUIRE(Polynomial<2>(TinyVector<3>{1, 0, 0}) == S); + REQUIRE(Polynomial<2>(TinyVector<3>{0, 1, 0}) == R); } SECTION("evaluation") { - Polynomial<2> P({2, -3, 4}); + Polynomial<2> P(TinyVector<3>{2, -3, 4}); double result = P.evaluate(3); REQUIRE(result == 29); result = P(3); @@ -126,16 +112,16 @@ TEST_CASE("Polynomial", "[analysis]") } SECTION("primitive") { - Polynomial<2> P({2, -3, 4}); + Polynomial<2> P(TinyVector<3>{2, -3, 4}); TinyVector<4> coefs = zero; Polynomial<3> Q(coefs); Q = primitive(P); - Polynomial<3> R({0, 2, -3. / 2, 4. / 3}); + Polynomial<3> R(TinyVector<4>{0, 2, -3. / 2, 4. / 3}); REQUIRE(Q == R); } SECTION("integrate") { - Polynomial<2> P({2, -3, 3}); + Polynomial<2> P(TinyVector<3>{2, -3, 3}); double xinf = -1; double xsup = 1; double result = integrate(P, xinf, xsup); @@ -145,66 +131,66 @@ TEST_CASE("Polynomial", "[analysis]") } SECTION("derivative") { - Polynomial<2> P({2, -3, 3}); + Polynomial<2> P(TinyVector<3>{2, -3, 3}); Polynomial<1> Q = derivative(P); - REQUIRE(Q == Polynomial<1>({-3, 6})); + REQUIRE(Q == Polynomial<1>(TinyVector<2>{-3, 6})); - Polynomial<0> P2(3); + Polynomial<0> P2(TinyVector<1>{3}); - Polynomial<0> R(0); + Polynomial<0> R(TinyVector<1>{0}); REQUIRE(derivative(P2) == R); } SECTION("affectation") { - Polynomial<2> Q({2, -3, 3}); - Polynomial<4> R({2, -3, 3, 0, 0}); - Polynomial<4> P({0, 1, 2, 3, 3}); + Polynomial<2> Q(TinyVector<3>{2, -3, 3}); + Polynomial<4> R(TinyVector<5>{2, -3, 3, 0, 0}); + Polynomial<4> P(TinyVector<5>{0, 1, 2, 3, 3}); P = Q; REQUIRE(P == R); } SECTION("affectation addition") { - Polynomial<2> Q({2, -3, 3}); - Polynomial<4> R({2, -2, 5, 3, 3}); - Polynomial<4> P({0, 1, 2, 3, 3}); + Polynomial<2> Q(TinyVector<3>{2, -3, 3}); + Polynomial<4> R(TinyVector<5>{2, -2, 5, 3, 3}); + Polynomial<4> P(TinyVector<5>{0, 1, 2, 3, 3}); P += Q; REQUIRE(P == R); } SECTION("power") { - Polynomial<2> P({2, -3, 3}); - Polynomial<4> R({4, -12, 21, -18, 9}); - Polynomial<1> Q({0, 2}); + Polynomial<2> P(TinyVector<3>{2, -3, 3}); + Polynomial<4> R(TinyVector<5>{4, -12, 21, -18, 9}); + Polynomial<1> Q(TinyVector<2>{0, 2}); Polynomial<2> S = Q.pow<2>(2); REQUIRE(P.pow<2>(2) == R); - REQUIRE(S == Polynomial<2>({0, 0, 4})); + REQUIRE(S == Polynomial<2>(TinyVector<3>{0, 0, 4})); } SECTION("composition") { - Polynomial<2> P({2, -3, 3}); - Polynomial<1> Q({0, 2}); - Polynomial<2> R({2, -1, 3}); - Polynomial<2> S({1, 2, 2}); - REQUIRE(P.compose(Q) == Polynomial<2>({2, -6, 12})); - REQUIRE(P.compose2(Q) == Polynomial<2>({2, -6, 12})); - REQUIRE(R(S) == Polynomial<4>({4, 10, 22, 24, 12})); + Polynomial<2> P(TinyVector<3>{2, -3, 3}); + Polynomial<1> Q(TinyVector<2>{0, 2}); + Polynomial<2> R(TinyVector<3>{2, -1, 3}); + Polynomial<2> S(TinyVector<3>{1, 2, 2}); + REQUIRE(P.compose(Q) == Polynomial<2>(TinyVector<3>{2, -6, 12})); + REQUIRE(P.compose2(Q) == Polynomial<2>(TinyVector<3>{2, -6, 12})); + REQUIRE(R(S) == Polynomial<4>(TinyVector<5>{4, 10, 22, 24, 12})); } SECTION("Lagrange polynomial") { - Polynomial<1> S({0.5, -0.5}); + Polynomial<1> S(TinyVector<2>{0.5, -0.5}); Polynomial<1> Q; - Q = lagrangePolynomial<1>({-1, 1}, 0); + Q = lagrangePolynomial<1>(TinyVector<2>{-1, 1}, 0); REQUIRE(S == Q); - Polynomial<2> P({0, -0.5, 0.5}); + Polynomial<2> P(TinyVector<3>{0, -0.5, 0.5}); Polynomial<2> R; - R = lagrangePolynomial<2>({-1, 0, 1}, 0); + R = lagrangePolynomial<2>(TinyVector<3>{-1, 0, 1}, 0); REQUIRE(R == P); - const TinyVector<3, Polynomial<2>> basis = lagrangeBasis(TinyVector<3>{-1, 0, 1}); - REQUIRE(lagrangeToCanonical({1, 0, 1}, basis) == Polynomial<2>({0, 0, 1})); + const std::array<Polynomial<2>, 3> basis = lagrangeBasis(TinyVector<3>{-1, 0, 1}); + REQUIRE(lagrangeToCanonical(TinyVector<3>{1, 0, 1}, basis) == Polynomial<2>(TinyVector<3>{0, 0, 1})); } } diff --git a/tests/test_PolynomialBasis.cpp b/tests/test_PolynomialBasis.cpp index b2c072e331e2e9bef939bf058bcc90550d5660f7..3490498fdff4f108e518664254bf432c4df8e7d1 100644 --- a/tests/test_PolynomialBasis.cpp +++ b/tests/test_PolynomialBasis.cpp @@ -34,12 +34,12 @@ TEST_CASE("PolynomialBasis", "[analysis]") PolynomialBasis<2> B; REQUIRE(B.displayType() == "undefined"); B.build(BasisType::canonical); - REQUIRE(B.elements()[1] == Polynomial<2>{{0, 1, 0}}); - REQUIRE(B.elements()[2] == Polynomial<2>{{0, 0, 1}}); + REQUIRE(B.elements()[1] == Polynomial<2>{TinyVector<3>{0, 1, 0}}); + REQUIRE(B.elements()[2] == Polynomial<2>{TinyVector<3>{0, 0, 1}}); PolynomialBasis<2> C; C.build(BasisType::taylor); REQUIRE(B.elements()[1] == C.elements()[1]); C.build(BasisType::taylor, 1); - REQUIRE(C.elements()[2] == Polynomial<2>{{1, -2, 1}}); + REQUIRE(C.elements()[2] == Polynomial<2>{TinyVector<3>{1, -2, 1}}); } } diff --git a/tests/test_TinyMatrix.cpp b/tests/test_TinyMatrix.cpp index 4d5667dbff133ca432e115c8af2dad1b7665caf5..39bb8a9c1353b8336d60db9b4f77afb4a04c4710 100644 --- a/tests/test_TinyMatrix.cpp +++ b/tests/test_TinyMatrix.cpp @@ -225,8 +225,8 @@ TEST_CASE("TinyMatrix", "[algebra]") REQUIRE(I(2, 2) == Catch::Approx(1).epsilon(1E-14)); } { - const TinyMatrix<4, double> A4(2, 3, 1, 4, -1, 5, -2, 3, 4, 1, 2, 3, 4, -1, -1, 0); - const TinyMatrix<4, double> I = inverse(A4) * A4; + const TinyMatrix<4> A4(2, 3, 1, 4, -1, 5, -2, 3, 4, 1, 2, 3, 4, -1, -1, 0); + const TinyMatrix<4> I = inverse(A4) * A4; REQUIRE(I(0, 0) == Catch::Approx(1).epsilon(1E-14)); REQUIRE(I(0, 1) == Catch::Approx(0).margin(1E-14));