x033.h
Go to the documentation of this file.
1 #pragma once
2 #include "xdata.h"
3 #include "xinterpolation.h"
4 #include "xmath.h"
5 #include <cmath>
6 #include <gsl/gsl_errno.h>
7 #include <gsl/gsl_spline.h>
8 #include <iostream>
9 
10 namespace nmx::apps::x033 {
11 
15 inline void ex1() {
16  //Anzahl der Daten
17  constexpr size_t N = 10;
18  // Felder mit diskreten Daten
19  double xi, yi, x[N], y[N];
20 
21  for (size_t i = 0; i < N; i++) {
22  x[i] = i + 0.5 * sin(i);
23  y[i] = i + cos(i * i);
24  }
25 
26  //gsl Objekte Initialisierung
27  gsl_interp_accel *acc = gsl_interp_accel_alloc();
28  const gsl_interp_type *t = gsl_interp_cspline;
29  gsl_spline *spline = gsl_spline_alloc(t, N);
30 
31  //Verbindung gsl-Objekte mit diskreten Daten
32  gsl_spline_init(spline, x, y, N);
33 
34  //berechne Werte
35  for (xi = x[0]; xi < x[9]; xi += 0.01) {
36  yi = gsl_spline_eval(spline, xi, acc);
37  std::cout << xi << "," << yi << std::endl;
38  }
39 
40  //Speicherfreigabe
41  gsl_spline_free(spline);
42  gsl_interp_accel_free(acc);
43 }
44 
48 inline void ex2() {
49  //Anzahl der Daten
50  size_t N = 4;
51 
52  // es muss y[0]=y[3] gelten damit
53  // gsl_interp_cspline_periodic eingesetzt werden kann
54  double x[4] = { 0.00, 0.10, 0.27, 0.30 };
55  double y[4] = { 0.15, 0.70, -0.10, 0.15 };
56 
57  //Initialisierung von gsl Objekten
58  gsl_interp_accel *acc = gsl_interp_accel_alloc();
59  const gsl_interp_type *t = gsl_interp_cspline_periodic;
60  gsl_spline *spline = gsl_spline_alloc(t, N);
61 
62  //Verbindung gsl-Objekte mit diskreten Daten
63  gsl_spline_init(spline, x, y, N);
64 
65  //berechne Werte
66  for (size_t i = 0; i <= 100; i++) {
67  double xi = (1 - i / 100.0) * x[0] + (i / 100.0) * x[N - 1];
68  double yi = gsl_spline_eval(spline, xi, acc);
69  std::cout << xi << "," << yi << std::endl;
70  }
71 
72  //Speicherfreigabe
73  gsl_spline_free(spline);
74  gsl_interp_accel_free(acc);
75 }
76 
82 inline auto get_output_stream(const char *name, Format fmt = Output::csv) {
83  auto ofs = Output::get_stream("x033", fmt, name);
84  ofs << std::fixed << std::setprecision(2);
85  return ofs;
86 }
87 
92 inline void interp1() {
93  using Data = Data<4>;
94  //Datenobjekt
95  Data data;
96 
97  //Datenreihe
98  std::vector<double> xvalues, yvalues;
99 
100  //erstelle diskrete Daten
101  auto fn = [](double x) { return sin(x); };
102 
103  //berechne diskrete Werte
104  double dx = 0.4 * Math::PI;
105  for (double x = 0; x <= 2 * Math::PI; x += dx) {
106  xvalues.push_back(x);
107  yvalues.push_back(fn(x));
108  std::cout << x << "," << fn(x) << std::endl;
109  }
110 
111  //lineare Interpolation
112  gsl::Interpolation linear(gsl_interp_linear, xvalues, yvalues);
113 
114  //spline Interpolation
115  gsl::Interpolation spline(gsl_interp_cspline, xvalues, yvalues);
116 
117  //berechne interpolierte Werte
118  dx = 0.3 * Math::PI;
119  for (double x = dx; x < 2 * Math::PI; x += dx) {
120  data += { x, linear.eval(x), spline.eval(x), fn(x) };
121  }
122 
123  //Ausgabe
124  std::ofstream ofsplot = get_output_stream(__func__, Output::plot);
125  data.save(ofsplot, Output::plot);
126  std::ofstream ofstable = get_output_stream(__func__, Output::latex);
127  ofstable << std::setprecision(4);
128 
129  //LaTeX-Tabelle enthält eine Auswahl der berechneten Werte
130  const auto view = data.select_total_rows(4);
131  view.save(ofstable, Output::latex);
132 }
133 
138 inline void interp2() {
139  using Data = Data<7>;
140  Data data; // Datenobjekt
141  //Ort
142  auto x = [](double t) { return -0.75 * pow(t, 2) + 3 * t + 1; };
143  //Geschwindigkeit
144  auto xdot = [](double t) { return -1.5 * t + 3; };
145  //Beschleunigung
146  auto xddot = [](double t) {
147  (void) t;
148  return -1.5;
149  };
150  //diskrete Werte werden erzeugt
151  std::vector<double> tvalues, xvalues;
152  for (double t = 0; t < 4; t += 0.1) {
153  tvalues.push_back(t);
154  xvalues.push_back(x(t));
155  }
156 
157  gsl::Interpolation interpfn{ gsl_interp_cspline, tvalues, xvalues };
158  //fülle Datenobjekt mit interpolierten und exakten Daten
159  for (auto t : { 0.32, 1.75, 2.22, 3.18 }) {
160  data += { t,
161  x(t),
162  xdot(t),
163  xddot(t),
164  interpfn.eval(t),
165  interpfn.deriv(t),
166  interpfn.deriv2(t) };
167  }
168  //Ausgabe
169  std::ofstream ofs = get_output_stream(__func__, Output::latex);
170  ofs << std::setprecision(4);
171  data.save(ofs, Output::latex);
172 }
173 
174 } // namespace nmx::apps::x033
void ex1()
ex1 Interpolation mit gsl-Routinen
Definition: x033.h:15
static const Format csv
Definition: xoutput.h:20
void interp2()
interp2 Beschreibung einer geradlinigen Bewegung durch Interpolation
Definition: x033.h:138
void save(std::ostream &ofs, Format fmt) const
save Schreibe Tabelle in Datei
Definition: xdata.h:160
The Data class Eine Klasse für Zahlentabellen mit fester Anzahl von Spalten. Die Anzahl der Reihen wä...
Definition: xdata.h:22
void ex2()
ex2 Interpolation periodischer Daten
Definition: x033.h:48
static std::ofstream get_stream(const std::string &fname)
get_output_stream Öffnen einer Ausgabedatei falls die Datei nicht geöffnet werden kann wird ein Fehle...
Definition: xoutput.h:29
auto select_total_rows(size_t n, size_t start=0, bool l=true) const
get_total_rows generiere View mit eine Instanz vom Typ View bestimmter Anzahl von Spalten ...
Definition: xdata.h:338
auto get_output_stream(const char *name, Format fmt=Output::csv)
get_output_stream
Definition: x033.h:82
The Format class Formatierte Ausgabe von Arrays.
Definition: xfmt.h:10
static constexpr double PI
Definition: xmath.h:11
The Spline class Interpolation von diskreten Daten.
void interp1()
interp1 lineare und spline Interpolation eines diskreten Datensatzes
Definition: x033.h:92
static const Format latex
Definition: xoutput.h:17
static const Format plot
Definition: xoutput.h:18
double eval(double val)
eval Funktionswert...