xinterpolation.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xerror.h"
4 #include "xvector.h"
5 #include <algorithm>
6 #include <gsl/gsl_errno.h>
7 #include <gsl/gsl_spline.h>
8 
9 namespace nmx::gsl {
10 
15 {
16 private:
17  gsl_spline *_workspace = nullptr; //gsl-interne Datenstruktur
18  gsl_interp_accel *_accel = nullptr; //effiziente Suche im Datensatz
19 
20 public:
25  Interpolation() = delete;
26 
33  template<class X, class Y>
34  inline Interpolation(const gsl_interp_type *type, const X &x, const Y &y) {
35  size_t _dim = x.size();
36  _workspace = gsl_spline_alloc(type, _dim);
37  _accel = gsl_interp_accel_alloc();
38  gsl_spline_init(_workspace, &x[0], &y[0], _dim);
39  }
40 
47  inline Interpolation(const gsl_interp_type *type, const gsl::Vector &x, const gsl::Vector &y) {
48  size_t _dim = x.size();
49  _workspace = gsl_spline_alloc(type, _dim);
50  _accel = gsl_interp_accel_alloc();
51  gsl_spline_init(_workspace, x.begin(), y.begin(), _dim);
52  }
53 
59  Interpolation(const Interpolation &obj) = delete;
60 
65  inline ~Interpolation() {
66  if (_accel != nullptr) {
67  gsl_interp_accel_free(_accel);
68  }
69 
70  if (_workspace != nullptr) {
71  gsl_spline_free(_workspace);
72  }
73  }
74 
80  Interpolation &operator=(const Interpolation &obj) = delete;
81 
87  inline double eval(double val) {
88  double result; //y-Wert wird hier gespeichert
89  //Rückgabewert enthält Fehlermeldung
90  const int errorcode = gsl_spline_eval_e(_workspace,
91  val, // x-Wert
92  _accel,
93  &result);
94  //wenn der Wert val sich außerhalb der vorgegebenen Werte
95  //befindet meldet die gsl einen Fehler
96  Check::error_if(nmx_msg, errorcode == GSL_EDOM);
97  return result;
98  }
99 
105  inline double deriv(double val) {
106  double result; //y-Wert
107  const int errorcode = gsl_spline_eval_deriv_e(_workspace, //
108  val,
109  _accel,
110  &result);
111  Check::error_if(nmx_msg, errorcode == GSL_EDOM);
112  return result;
113  }
114 
120  inline double deriv2(double val) {
121  double result; //y-Wert
122  const int errorcode = gsl_spline_eval_deriv2_e(_workspace, //
123  val,
124  _accel,
125  &result);
126  Check::error_if(nmx_msg, errorcode == GSL_EDOM);
127  return result;
128  }
129 
136  inline double integral(double xmin, double xmax) {
137  double result;
138  const int errorcode = gsl_spline_eval_integ_e(_workspace, //
139  xmin,
140  xmax,
141  _accel,
142  &result);
143  Check::error_if(nmx_msg, errorcode == GSL_EDOM);
144  return result;
145  }
146 
151  inline size_t size() const { return _workspace->size; }
152 };
153 
154 } // namespace nmx::gsl
Interpolation()=delete
InterpolationX Einsatz des Standardkonstruktors nicht erlaubt.
size_t size() const
size
Definition: xvector1.h:25
static void error_if(const std::string &s, bool arg)
error_if Fehler wenn Bedingung erfüllt ist
Definition: xerror.h:51
Interpolation(const gsl_interp_type *type, const gsl::Vector &x, const gsl::Vector &y)
Interpolation.
~Interpolation()
~Interpolation Destruktor gsl- Strukturen werden freigegeben
Interpolation(const gsl_interp_type *type, const X &x, const Y &y)
Interpolation.
size_t size() const
size
Interpolation & operator=(const Interpolation &obj)=delete
operator = Zuweisungsoperator nicht erlaubt
#define nmx_msg
Definition: xerror.h:113
double integral(double xmin, double xmax)
integral numerische Integration
double * begin()
Definition: xvector4.h:17
The Vector class Klasse für gsl-Vektoren zussamengesetzt aus Komponenten.
Definition: xvector.h:76
double deriv(double val)
deriv erste Ableitung der Funktion ...
double deriv2(double val)
deriv2 zweite Ableitung der Funktion ...
The Spline class Interpolation von diskreten Daten.
double eval(double val)
eval Funktionswert...