From 934a0ed17f1d4fcb77c2a586cbd3f4304d87d216 Mon Sep 17 00:00:00 2001 From: vincent samy Date: Wed, 6 Nov 2019 09:16:00 +0900 Subject: [PATCH] Updates... --- include/differentiators.h | 6 +-- tests/differentiator_tests.cpp | 63 +++++++++++++++++++++++++++++++- tests/noisy_function_generator.h | 10 ++--- 3 files changed, 70 insertions(+), 9 deletions(-) diff --git a/include/differentiators.h b/include/differentiators.h index 7f5fee4..90999ac 100644 --- a/include/differentiators.h +++ b/include/differentiators.h @@ -134,9 +134,9 @@ vectN_t operator()() const // Centered Noise-Robust differentiators (tangency at 4th order): http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/ template struct GetCNR4Coeffs { vectN_t operator()() const; }; -template struct GetCNR4Coeffs { vectN_t operator()() const { return vectN_t{ T(-5), T(12), T(39), T(0), T(-39), T(-12), T(5) } / T(96); } }; -template struct GetCNR4Coeffs { vectN_t operator()() const { return vectN_t{ T(-2), T(-1), T(16), T(27) } / T(96); } }; -template struct GetCNR4Coeffs { vectN_t operator()() const { return vectN_t{ T(-11), T(-32), T(39), T(256), T(322) } / T(1536); } }; +template struct GetCNR4Coeffs { vectN_t operator()() const { return vectN_t{ T(-5), T(12), T(39), T(0), T(-39), T(-12), T(5) } / T(96); } }; +template struct GetCNR4Coeffs { vectN_t operator()() const { return vectN_t{ T(-2), T(-1), T(16), T(27), T(0), T(-27), T(-16), T(1), T(2) } / T(96); } }; +template struct GetCNR4Coeffs { vectN_t operator()() const { return vectN_t{ T(-11), T(-32), T(39), T(256), T(322), T(0), T(-322), T(-256), T(-39), T(32), T(11) } / T(1536); } }; // Centered Noise-Robust differentiators for irregular space data: http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/ template vectN_t GetCNRISDCoeffs() diff --git a/tests/differentiator_tests.cpp b/tests/differentiator_tests.cpp index 182327c..d19007c 100644 --- a/tests/differentiator_tests.cpp +++ b/tests/differentiator_tests.cpp @@ -27,9 +27,70 @@ #pragma once #include "differentiators.h" +#include "noisy_function_generator.h" #include +#include -TEMPLATE_TEST_CASE("Sinus central derivative", "[sin][dentral]", float, double) +constexpr const int STEPS = 200; +constexpr const int SIN_FREQUENCY = 60; + +using namespace difi; + +template +struct TestFun { + vectX_t f; + vectX_t d; + int center; + double eps; +}; + +template +struct TestRunner { + void operator()(const TestFun& tf, Filter& f) + { + for (int i = 0; i < 50; ++i) + f.step(tf.f(i)); // First initialize, some steps + + for (int i = 20; i < STEPS; ++i) + REQUIRE_SMALL(std::abs(f.step(tf.f(i)) - tf.d(i - tf.center)), tf.eps); + } +}; + +template +struct Tester { + void operator()(const TestFun& tf, std::tuple f) + { + TestRunner(tf, std::get(f)); + Tester(tf, f); + } +}; + +template +struct Tester { + void operator()(const TestFun& tf, std::tuple f) + { + TestRunner(tf, std::get<0>(f)); + } +}; + +template +using centralList = std::tuple, LowNoiseLanczosDiff, SuperLowNoiseLanczosDiff, CenteredNoiseRobust2Diff, CenteredNoiseRobust4Diff>; + +TEMPLATE_TEST_CASE("Sinus time-fixed central derivative", "[sin][central]", float, double) { + + FunctionGenerator fg = sinGenerator(STEPS, SIN_FREQUENCY); + + auto list7 = centralList{}; + TestFun list7Param = {std::get<0>(fg), std::get<2>(fg), 3, std::numeric_limits::epsilon() * 100}; + TestFun list7NoisyParam = {std::get<1>(fg), std::get<2>(fg), 3, std::numeric_limits::epsilon() * 100}; + auto list9 = centralList{}; + TestFun list9Param = {std::get<0>(fg), std::get<2>(fg), 4, std::numeric_limits::epsilon() * 100}; + TestFun list9NoisyParam = {std::get<1>(fg), std::get<2>(fg), 4, std::numeric_limits::epsilon() * 100}; + + // Check no noisy function + + // Check for noisy function + } diff --git a/tests/noisy_function_generator.h b/tests/noisy_function_generator.h index adbb823..5f9458c 100644 --- a/tests/noisy_function_generator.h +++ b/tests/noisy_function_generator.h @@ -36,7 +36,7 @@ template using FunctionGenerator = std::tuple, difi::vectX_t, difi::vectX_t>; template -FunctionGenerator sinGenerator(int nrSteps, T omega, T dt = 0.001) +FunctionGenerator sinGenerator(int nrSteps, T frequency, T dt = 0.001) { using namespace difi; @@ -49,21 +49,21 @@ FunctionGenerator sinGenerator(int nrSteps, T omega, T dt = 0.001) for (int i = 0; i < nrSteps; ++i) { // truth - truth(i) = std::sin(2 * pi * omega * i * dt); + truth(i) = std::sin(2 * pi * frequency * i * dt); // noisy std::normal_distribution d{truth(i), T(0.01)}; noisy(i) = truth(i) + d(gen); // derivative - derivative(i) = 2 * pi * omega * i * std::cos(2 * pi * omega * i * dt); + derivative(i) = 2 * pi * frequency * i * std::cos(2 * pi * frequency * i * dt); } return { truth, noisy, derivative }; } -template -FunctionGenerator polyGenerator(int nrSteps, difi::VectX_t coeffs, T dt = 0.001) +template +FunctionGenerator polyGenerator(int nrSteps, difi::vectX_t coeffs, T dt = 0.001) { using namespace difi; Expects(coeffs.size() >=2);