diff --git a/include/differentiators.h b/include/differentiators.h index 7649549..a0ae300 100644 --- a/include/differentiators.h +++ b/include/differentiators.h @@ -38,7 +38,7 @@ namespace details { // T: type // N: Number of points -// Central differentiators: http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/central-differences/ +// Centered differentiators: http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/central-differences/ template struct GetCDCoeffs { vectN_t operator()() const; }; @@ -304,12 +304,12 @@ public: }; template -class CentralDifferentiator : public GenericFilter { +class CenteredDifferentiator : public GenericFilter { public: - CentralDifferentiator() + CenteredDifferentiator() : GenericFilter(vectX_t::Constant(1, T(1)), CoeffGetter{}(), FilterType::Centered) {} - CentralDifferentiator(T timestep) + CenteredDifferentiator(T timestep) : GenericFilter(vectX_t::Constant(1, T(1)), CoeffGetter{}() / std::pow(timestep, Order)) {} void setTimestep(T timestep) { setCoeffs(vectX_t::Constant(1, T(1)), CoeffGetter{}() / std::pow(timestep, Order)); } @@ -327,11 +327,11 @@ public: }; template -class TVCentralDifferentiator : public TVGenericFilter { +class TVCenteredDifferentiator : public TVGenericFilter { static_assert(Order >= 1, "Order must be greater or equal to 1"); public: - TVCentralDifferentiator() + TVCenteredDifferentiator() : TVGenericFilter(Order, vectX_t::Constant(1, T(1)), CoeffGetter{}(), FilterType::Centered) {} }; @@ -339,30 +339,30 @@ public: } // namespace details // Backward differentiators -template using BackwardNoiseRobustDiff = details::BackwardDifferentiator>; -template using BackwardHybridNoiseRobustDiff = details::BackwardDifferentiator>; +template using BackwardDiffNoiseRobust = details::BackwardDifferentiator>; +template using BackwardDiffHybridNoiseRobust = details::BackwardDifferentiator>; // Time-Varying backward differentiators -template using TVBackwardNoiseRobustDiff = details::TVBackwardDifferentiator>; -template using TVBackwardHybridNoiseRobustDiff = details::TVBackwardDifferentiator>; +template using TVBackwardDiffNoiseRobust = details::TVBackwardDifferentiator>; +template using TVBackwardDiffHybridNoiseRobust = details::TVBackwardDifferentiator>; -// Central differentiators -template using CentralDiff = details::CentralDifferentiator>; -template using LowNoiseLanczosDiff = details::CentralDifferentiator>; -template using SuperLowNoiseLanczosDiff = details::CentralDifferentiator>; -template using CenteredNoiseRobust2Diff = details::CentralDifferentiator>; -template using CenteredNoiseRobust4Diff = details::CentralDifferentiator>; -// Time-Varying central differentiators -template using TVCenteredNoiseRobust2Diff = details::TVCentralDifferentiator>; -template using TVCenteredNoiseRobust4Diff = details::TVCentralDifferentiator>; +// Centered differentiators +template using CenteredDiffBasic = details::CenteredDifferentiator>; +template using CenteredDiffLowNoiseLanczos = details::CenteredDifferentiator>; +template using CenteredDiffSuperLowNoiseLanczos = details::CenteredDifferentiator>; +template using CenteredDiffNoiseRobust2 = details::CenteredDifferentiator>; +template using CenteredDiffNoiseRobust4 = details::CenteredDifferentiator>; +// Time-Varying centered differentiators +template using TVCenteredDiffNoiseRobust2 = details::TVCenteredDifferentiator>; +template using TVCenteredDiffNoiseRobust4 = details::TVCenteredDifferentiator>; // Second-order backward differentiators -template using BackwardSecondOrderDiff = details::BackwardDifferentiator>; +template using BackwardDiffSecondOrder = details::BackwardDifferentiator>; // Second-order Time-Varying backward differentiators -template using TVBackwardSecondOrderDiff = details::TVBackwardDifferentiator>; +template using TVBackwardDiffSecondOrder = details::TVBackwardDifferentiator>; -// Second-order central differentiators -template using CenteredSecondOrderDiff = details::CentralDifferentiator>; -// Second-order Time-Varying central differentiators -template using TVCenteredSecondOrderDiff = details::TVCentralDifferentiator>; +// Second-order centered differentiators +template using CenteredDiffSecondOrder = details::CenteredDifferentiator>; +// Second-order Time-Varying centered differentiators +template using TVCenteredDiffSecondOrder = details::TVCenteredDifferentiator>; } // namespace difi \ No newline at end of file diff --git a/include/difi b/include/difi index 909ebaa..2e7679a 100644 --- a/include/difi +++ b/include/difi @@ -60,4 +60,42 @@ using BilinearTransformd = BilinearTransform; using BilinearTransformcf = BilinearTransform>; using BilinearTransformcd = BilinearTransform>; +// 1st order centered differentiators +template using CenteredDiffBasicf = CenteredDiffBasic; +template using CenteredDiffBasicd = CenteredDiffBasic; +template using CenteredDiffLowNoiseLanczosf = CenteredDiffLowNoiseLanczos; +template using CenteredDiffLowNoiseLanczosd = CenteredDiffLowNoiseLanczos; +template using CenteredDiffSuperLowNoiseLanczosf = CenteredDiffSuperLowNoiseLanczos; +template using CenteredDiffSuperLowNoiseLanczosd = CenteredDiffSuperLowNoiseLanczos; +template using CenteredDiffNoiseRobust2f = CenteredDiffNoiseRobust2; +template using CenteredDiffNoiseRobust2d = CenteredDiffNoiseRobust2; +template using CenteredDiffNoiseRobust4f = CenteredDiffNoiseRobust4; +template using CenteredDiffNoiseRobust4d = CenteredDiffNoiseRobust4; +template using TVCenteredDiffNoiseRobust2f = TVCenteredDiffNoiseRobust2; +template using TVCenteredDiffNoiseRobust2d = TVCenteredDiffNoiseRobust2; +template using TVCenteredDiffNoiseRobust4f = TVCenteredDiffNoiseRobust4; +template using TVCenteredDiffNoiseRobust4d = TVCenteredDiffNoiseRobust4; + +// 2nd order centered differentiators +template using CenteredDiffSecondOrderf = CenteredDiffSecondOrder; +template using CenteredDiffSecondOrderd = CenteredDiffSecondOrder; +template using TVCenteredDiffSecondOrderf = TVCenteredDiffSecondOrder; +template using TVCenteredDiffSecondOrderd = TVCenteredDiffSecondOrder; + +// 1st order backward differentiators +template using BackwardDiffNoiseRobustf = BackwardDiffNoiseRobust; +template using BackwardDiffNoiseRobustd = BackwardDiffNoiseRobust; +template using BackwardDiffHybridNoiseRobustf = BackwardDiffHybridNoiseRobust; +template using BackwardDiffHybridNoiseRobustd = BackwardDiffHybridNoiseRobust; +template using TVBackwardDiffNoiseRobustf = TVBackwardDiffNoiseRobust; +template using TVBackwardDiffNoiseRobustd = TVBackwardDiffNoiseRobust; +template using TVBackwardDiffHybridNoiseRobustf = TVBackwardDiffHybridNoiseRobust; +template using TVBackwardDiffHybridNoiseRobustd = TVBackwardDiffHybridNoiseRobust; + +// 2nd order backward differentiators +template using BackwardDiffSecondOrderf = BackwardDiffSecondOrder; +template using BackwardDiffSecondOrderd = BackwardDiffSecondOrder; +template using TVBackwardDiffSecondOrderf = TVBackwardDiffSecondOrder; +template using TVBackwardDiffSecondOrderd = TVBackwardDiffSecondOrder; + } // namespace difi \ No newline at end of file diff --git a/tests/diffTesters.h b/tests/diffTesters.h index 0a65fb0..125df6b 100644 --- a/tests/diffTesters.h +++ b/tests/diffTesters.h @@ -136,32 +136,32 @@ private: vectX_t m_time; }; -template -using central_list = std::tuple, LowNoiseLanczosDiff, SuperLowNoiseLanczosDiff, CenteredNoiseRobust2Diff, CenteredNoiseRobust4Diff>; +template +using central_list = std::tuple, CenteredDiffLowNoiseLanczosd, CenteredDiffSuperLowNoiseLanczosd, CenteredDiffNoiseRobust2d, CenteredDiffNoiseRobust4d>; -template -TFDiffTester> generateCTester(const vectX_t& f, const vectX_t& df) +template +TFDiffTester> generateCTester(const vectX_t& f, const vectX_t& df) { - return { central_list{}, f, df }; + return { central_list{}, f, df }; } -template -TFDiffTester>> generateC2OTester(const vectX_t& f, const vectX_t& df) +template +TFDiffTester>> generateC2OTester(const vectX_t& f, const vectX_t& df) { - return { std::tuple>{}, f, df }; + return { std::tuple>{}, f, df }; } -template -using tv_central_list = std::tuple, TVCenteredNoiseRobust4Diff>; +template +using tv_central_list = std::tuple, TVCenteredDiffNoiseRobust4d>; -template -TVDiffTester> generateTVCTester(const vectX_t& t, const vectX_t& f, const vectX_t& df) +template +TVDiffTester> generateTVCTester(const vectX_t& t, const vectX_t& f, const vectX_t& df) { - return { tv_central_list{}, t, f, df }; + return { tv_central_list{}, t, f, df }; } -template -TVDiffTester>> generateTVC2OTester(const vectX_t& t, const vectX_t& f, const vectX_t& df) +template +TVDiffTester>> generateTVC2OTester(const vectX_t& t, const vectX_t& f, const vectX_t& df) { - return { std::tuple>{}, t, f, df }; + return { std::tuple>{}, t, f, df }; } \ No newline at end of file diff --git a/tests/differentiator_tests.cpp b/tests/differentiator_tests.cpp index 478c91f..b718715 100644 --- a/tests/differentiator_tests.cpp +++ b/tests/differentiator_tests.cpp @@ -83,8 +83,8 @@ TEST_CASE("Sinus time-fixed central derivative", "[sin][central][1st]") { double dt = 0.001; auto sg = sinGenerator(STEPS, SIN_AMPLITUDE, SIN_FREQUENCY, dt); - auto ct7 = generateCTester(std::get<0>(sg), std::get<1>(sg)); - auto ct9 = generateCTester(std::get<0>(sg), std::get<1>(sg)); + auto ct7 = generateCTester<7>(std::get<0>(sg), std::get<1>(sg)); + auto ct9 = generateCTester<9>(std::get<0>(sg), std::get<1>(sg)); ct7.setFilterTimestep(dt); ct9.setFilterTimestep(dt); @@ -99,8 +99,8 @@ TEST_CASE("Polynome time-fixed central derivative", "[poly][central][1st]") double dt = 0.001; { auto pg = polyGenerator(STEPS, POLY_4, dt); - auto ct7 = generateCTester(std::get<0>(pg), std::get<1>(pg)); - auto ct9 = generateCTester(std::get<0>(pg), std::get<1>(pg)); + auto ct7 = generateCTester<7>(std::get<0>(pg), std::get<1>(pg)); + auto ct9 = generateCTester<9>(std::get<0>(pg), std::get<1>(pg)); ct7.setFilterTimestep(dt); ct9.setFilterTimestep(dt); @@ -111,8 +111,8 @@ TEST_CASE("Polynome time-fixed central derivative", "[poly][central][1st]") } { auto pg = polyGenerator(STEPS, POLY_7, dt); - auto ct7 = generateCTester(std::get<0>(pg), std::get<1>(pg)); - auto ct9 = generateCTester(std::get<0>(pg), std::get<1>(pg)); + auto ct7 = generateCTester<7>(std::get<0>(pg), std::get<1>(pg)); + auto ct9 = generateCTester<9>(std::get<0>(pg), std::get<1>(pg)); ct7.setFilterTimestep(dt); ct9.setFilterTimestep(dt); @@ -127,9 +127,9 @@ TEST_CASE("2nd order sinus time-fixed center derivative", "[sin][center][2nd]") { double dt = 0.001; auto sg = sinGenerator(STEPS, SIN_AMPLITUDE, SIN_FREQUENCY, dt); - auto ct7 = generateC2OTester(std::get<0>(sg), std::get<2>(sg)); - auto ct9 = generateC2OTester(std::get<0>(sg), std::get<2>(sg)); - auto ct11 = generateC2OTester(std::get<0>(sg), std::get<2>(sg)); + auto ct7 = generateC2OTester<7>(std::get<0>(sg), std::get<2>(sg)); + auto ct9 = generateC2OTester<9>(std::get<0>(sg), std::get<2>(sg)); + auto ct11 = generateC2OTester<11>(std::get<0>(sg), std::get<2>(sg)); ct7.setFilterTimestep(dt); ct9.setFilterTimestep(dt); @@ -145,8 +145,8 @@ TEST_CASE("Sinus time-varying central derivative", "[tv][sin][central][1st]") { double dt = 0.001; auto sg = tvSinGenerator(STEPS, SIN_AMPLITUDE, SIN_FREQUENCY, dt); - auto ct7 = generateTVCTester(std::get<0>(sg), std::get<1>(sg), std::get<2>(sg)); - auto ct9 = generateTVCTester(std::get<0>(sg), std::get<1>(sg), std::get<2>(sg)); + auto ct7 = generateTVCTester<7>(std::get<0>(sg), std::get<1>(sg), std::get<2>(sg)); + auto ct9 = generateTVCTester<9>(std::get<0>(sg), std::get<1>(sg), std::get<2>(sg)); std::array eps = { 1., 1. }; ct7.run(eps); @@ -158,8 +158,8 @@ TEST_CASE("Polynome time-varying central derivative", "[tv][poly][central][1st]" double dt = 0.001; { auto pg = tvPolyGenerator(STEPS, POLY_4, dt); - auto ct7 = generateTVCTester(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); - auto ct9 = generateTVCTester(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); + auto ct7 = generateTVCTester<7>(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); + auto ct9 = generateTVCTester<9>(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); std::array eps = { 1e-3, 1e-3 }; ct7.run(eps); @@ -167,8 +167,8 @@ TEST_CASE("Polynome time-varying central derivative", "[tv][poly][central][1st]" } { auto pg = tvPolyGenerator(STEPS, POLY_4, dt); - auto ct7 = generateTVCTester(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); - auto ct9 = generateTVCTester(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); + auto ct7 = generateTVCTester<7>(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); + auto ct9 = generateTVCTester<9>(std::get<0>(pg), std::get<1>(pg), std::get<2>(pg)); std::array eps = { 1e-3, 1e-3 }; ct7.run(eps);