From a729def9374fd54831e93f7c9fd052c61e850b2c Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 31 Jan 2022 12:10:38 +0000 Subject: [PATCH] feat: backward derivative implemented, additional tests for deriv --- pyerrors/correlators.py | 12 +++++++++++- tests/correlators_test.py | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 1594b14d..49388330 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -467,7 +467,7 @@ class Corr: ---------- variant : str decides which definition of the finite differences derivative is used. - Available choice: symmetric, forward, improved, default: symmetric + Available choice: symmetric, forward, backward, improved, default: symmetric """ if variant == "symmetric": newcontent = [] @@ -489,6 +489,16 @@ class Corr: if(all([x is None for x in newcontent])): raise Exception("Derivative is undefined at all timeslices") return Corr(newcontent, padding=[0, 1]) + elif variant == "backward": + newcontent = [] + for t in range(1, self.T): + if (self.content[t - 1] is None) or (self.content[t] is None): + newcontent.append(None) + else: + newcontent.append(self.content[t] - self.content[t - 1]) + if(all([x is None for x in newcontent])): + raise Exception("Derivative is undefined at all timeslices") + return Corr(newcontent, padding=[1, 0]) elif variant == "improved": newcontent = [] for t in range(2, self.T - 2): diff --git a/tests/correlators_test.py b/tests/correlators_test.py index ce58e370..f83dc3f4 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -72,6 +72,20 @@ def test_modify_correlator(): func(corr, variant=variant) +def test_deriv(): + corr_content = [] + for t in range(24): + exponent = 1.2 + corr_content.append(pe.pseudo_Obs(2 + t ** exponent, 0.2, 't')) + + corr = pe.Corr(corr_content) + + forward = corr.deriv(variant="forward") + backward = corr.deriv(variant="backward") + sym = corr.deriv(variant="symmetric") + assert np.all([o == 0 for o in (0.5 * (forward + backward) - sym)[1:-1]]) + assert np.all([o == 0 for o in (corr.deriv('forward').deriv('backward') - corr.second_deriv())[1:-1]]) + assert np.all([o == 0 for o in (corr.deriv('backward').deriv('forward') - corr.second_deriv())[1:-1]]) def test_m_eff():