STIR 6.4.0
integrate_discrete_function.inl
1//
2//
3/*
4 Copyright (C) 2004 - 2009, Hammersmith Imanet Ltd
5 This file is part of STIR.
6
7 SPDX-License-Identifier: Apache-2.0
8
9 See STIR/LICENSE.txt for details
10
11 \file
12 \ingroup numerics
13
14 \brief Implementations of inline function stir::integrate_discrete_function
15
16 \author Charalampos Tsoumpas
17
18*/
19
20#include "stir/error.h"
21
22START_NAMESPACE_STIR
23
24template <typename elemT>
25elemT
26integrate_discrete_function(const std::vector<elemT>& t, const std::vector<elemT>& f, const int interpolation_order)
27{
28 const std::size_t num_samples = f.size();
29 elemT integral_result = 0;
30 assert(num_samples > 1);
31 if (num_samples != t.size())
32 error("integrate_discrete_function requires equal size of the two input vectors!!!");
33
34 switch (interpolation_order)
35 {
36 case 0:
37 // Rectangular Formula:
38 // If not at the borders apply: (t_next-t_previous)*0.5*f
39 // If at the borders apply: (t2-t1)*0.5*f, (tN-TN_previous)*0.5*f
40 {
41 integral_result = f[0] * (t[1] - t[0]) * 0.5F;
42 for (std::size_t i = 1; i < num_samples - 1; ++i)
43 integral_result += f[i] * (t[i + 1] - t[i - 1]) * 0.5F;
44 integral_result += f[num_samples - 1] * (t[num_samples - 1] - t[num_samples - 2]) * 0.5F;
45 }
46 break;
47 case 1:
48 // trapezoidal
49 // Simply apply the formula: (f_next+f)*(t_next-t)*0.5
50 {
51 for (std::size_t i = 0; i < num_samples - 1; ++i)
52 integral_result += (f[i] + f[i + 1]) * (t[i + 1] - t[i]) * 0.5F;
53 }
54 break;
55 default:
56 error("integrate_discrete_function need interpolation order 0 or 1");
57 }
58 return integral_result;
59}
60
61END_NAMESPACE_STIR
Declaration of stir::error()
void error(const char *const s,...)
Print error with format string a la printf and throw exception.
Definition error.cxx:42
elemT integrate_discrete_function(const std::vector< elemT > &coordinates, const std::vector< elemT > &values, const int interpolation_order=1)
numerical integration of a 1D function
Definition integrate_discrete_function.inl:26