x008.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xdefs.h"
4 #include "xmath.h"
5 #include <algorithm>
6 #include <array>
7 #include <cmath>
8 #include <iomanip>
9 #include <iostream>
10 #include <numeric>
11 #include <optional>
12 #include <vector>
13 
14 namespace nmx::apps::x008 {
15 
20 inline void ex1() {
21  //Synonym für std::vector
22  using Array = std::vector<double>;
23  //Winkelgeschwindigkeit und Radius
24  const double omega = 0.5;
25  const double R = 1.0;
26  //Felder speichern
27  //Radius, Bahngeschwindigkeit, Zentripetalbeschleunigung
28  Array radii, velocities, accelerations;
29  //Berechnung der Werte
30  for (double r = 0.1; r < R; r += 0.2) {
31  //Radius wird hinzugefügt
32  radii.push_back(r);
33  //berechne Bahngeschwindigkeit
34  const double v = omega * r;
35  //Wert wird hinzugefügt
36  velocities.push_back(v);
37  //berechne Zentripetalbeschleunigung
38  const double a = pow(v, 2) / r;
39  //Wert wird hinzugefügt
40  accelerations.push_back(a);
41  }
42  // Ausgabe der Daten Trennzeichen ,
43  for (size_t idx = 0; idx < radii.size(); idx++) {
44  std::cout << radii[idx] << "," //
45  << velocities[idx] << "," //
46  << accelerations[idx] << std::endl; //
47  }
48  std::cout << "-------------------------------" << std::endl;
49  // Ausgabe der Daten Trennzeichen ;
50  for (size_t idx = 0; idx < radii.size(); idx++) {
51  std::cout << radii[idx] << ";" //
52  << velocities[idx] << ";" //
53  << accelerations[idx] << std::endl; //
54  }
55 }
56 
61 inline void ex2() {
62  using Array = std::vector<double>;
63  const double omega = 0.5;
64  const double R = 1.0;
65 
66  //Radius, Bahngeschwindigkeit, Zentripetalbeschleunigung
67  Array radii, velocities, accelerations;
68 
69  //Rotationsgeschwindigkeit wird den lambda-Funktionen übergeben
70  auto v = [omega](double r) { return omega * r; };
71  auto a = [omega](double r) { return pow(omega, 2) * r; };
72 
73  //Funktion zur Ausgabe der drei Felder als Tabelle,
74  //wenn nichts anderes angegeben, wird ein Komma als
75  //Trennzeichen benutzt
76  auto print = [](const auto &v1,
77  const auto &v2, //
78  const auto &v3,
79  char sep = ',') {
80  for (size_t idx = 0; idx < v1.size(); idx++) {
81  std::cout << v1[idx] << sep //
82  << v2[idx] << sep //
83  << v3[idx] << std::endl;
84  }
85  };
86 
87  //Berechnung der Werte
88  for (double r = 0.1; r < R; r += 0.2) {
89  radii.push_back(r);
90  velocities.push_back(v(r));
91  accelerations.push_back(a(r));
92  }
93 
94  //Ausgabe der berechneten Werte
95  print(radii, velocities, accelerations);
96  print(radii, velocities, accelerations, ';');
97 }
98 
103 inline void ex3() {
104  using Array = std::vector<double>;
105  const double omega = 0.5;
106 
107  //Radius, Bahngeschwindigkeit, Zentripetalbeschleunigung
108  Array radii, velocities, accelerations;
109  //Startwert für anonyme lambda-Funktion
110  double startval = -0.1;
111  //generiere ein Feld mit fünf Werten beginnend mit 0.1
112  std::generate_n(std::back_inserter(radii), 5, [&startval]() { //
113  return startval += 0.2;
114  });
115 
116  //Rotationsgeschwindigkeit wird den lambda-Funktionen übergeben
117  auto v = [omega](double r) { return omega * r; };
118  auto a = [omega](double r) { return pow(omega, 2) * r; };
119 
120  //fülle Feld mit den Werten für die Bahngeschwindigkeit
121  std::transform(radii.begin(), radii.end(), std::back_inserter(velocities), v);
122 
123  //fülle Feld mit den Werten für die Zentripetalbeschleunigung
124  std::transform(radii.begin(), radii.end(), std::back_inserter(accelerations), a);
125 
126  // variadische Funktion zur Ausgabe von beliebig vielen Feldern
127  // als Tabelle, erstes Argument ist das Trennzeichen,
128  //es folgen beliebig viele Felder
129  auto print = [](char sep, const auto &v1, const auto &... v) {
130  for (size_t idx = 0; idx < v1.size(); idx++) {
131  std::cout << v1[idx];
132  ((std::cout << sep << v[idx]), ...);
133  std::cout << std::endl;
134  }
135  };
136 
137  //Ausgabe der berechneten Werte
138  print(',', radii, velocities, accelerations);
139  print(';', radii, velocities, accelerations);
140 }
141 
145 inline void ex4() {
146  //Tabelle als Feld von Feldern mit vier Spalten
147  using Table = std::vector<std::array<double, 4>>;
148  Table table;
149 
150  //Umlaufzeiten
151  const double T1 = 20;
152  const double T2 = 15;
153  //Winkelgeschwindigkeiten
154  const auto omega1 = 2 * Math::PI / T1;
155  const auto omega2 = 2 * Math::PI / T2;
156 
157  //Erzeuge Daten
158  for (double t = 0; t < T1; t += 0.001) {
159  const double phi1 = omega1 * t;
160  const double phi2 = omega2 * t;
161  //Compiler ermittelt die Länge des Arrays
162  //und den Datentypen der Elemente
163  std::array vals = { t, phi1, phi2, phi2 - phi1 };
164  table.push_back(vals);
165  }
166 
167  //Formel für den exakten Wert (lambda-Funktion)
168  auto exactfn = [omega1, omega2](double deltaphi) {
169  return deltaphi / (omega2 - omega1); //
170  };
171 
172  std::cout << std::fixed << std::setprecision(3);
173 
174  //starte Suche für Winkeldifferenzen
175  for (auto n : { 10, 30, 60, 90 }) {
176  //Umwandlung in rad
177  const auto angle = Math::to_radians(n);
178  double epsilon = 1e-6;
179  Table::iterator fidx;
180  do {
181  // Vergleiche ob der Eintrag mit Index 3 (Winkeldifferenz)
182  // in der Tabellenreihe mit der gesuchten Winkeldifferenz
183  // übereinstimmt
184  auto pfn = [angle, &epsilon](const auto &a) { //
185  return std::abs(a[3] - angle) <= epsilon;
186  };
187 
188  fidx = std::find_if(table.begin(), table.end(), pfn);
189  if (fidx != table.end()) {
190  //Suche war erfolgreich!
191  break;
192  }
193  } while ((epsilon *= 10) < 1e-2);
194 
195  if (fidx != table.end()) { //prüfe ob der Wert gültig ist
196  // Index, Zeit (Suche), Winkeldifferenz, Zeit (exakt)
197  auto row = (*fidx);
198  std::cout << std::distance(table.begin(), fidx) //
199  << std::setw(8) << row[0] //
200  << std::setw(8) << Math::to_degrees(row[3]) //
201  << std::setw(8) << exactfn(angle) << std::endl;
202  } else {
203  //Wert wurde nicht gefunden
204  std::cout << "time not found for angle:" //
205  << Math::to_degrees(angle) << std::endl;
206  }
207  }
208 }
212 inline void ex5() {
213  //reserviere Speicher für 20 double Zahlen
214  std::vector<double> v1(20);
215 
216  //fülle Vektor mit Zahlen 0,1,2,.... (insgesamt 20 Elemente)
217  std::iota(std::begin(v1), std::end(v1), 0);
218 
219  //initialisiere zweiten Vektor
220  std::vector<double> v2;
221 
222  //kopiere alle Elemente aus v1 mit x > 6
223  //in den Zielvektor v2
224  //lambda-Funktion wird direkt übergeben
225  std::copy_if(std::begin(v1), //
226  std::end(v1),
227  std::back_inserter(v2),
228  [](double x) { return x > 6; });
229 
230  //lambda Hilfsfunktion, wird in Variable gespeichert
231  auto print = [](double x) { std::cout << x << ","; };
232 
233  //schreibe jedes Element von v1 in die Standardausgabe
234  std::for_each(std::begin(v1), std::end(v1), print);
235  std::cout << std::endl;
236  //schreibe jedes Element von v1 in die Standardausgabe
237  std::for_each(std::begin(v2), std::end(v2), print);
238  std::cout << std::endl;
239 
240  const double xmin = 10, xmax = 16;
241  //finde Position des ersten Elements aus v1, das > xmin ist
242  //lambda-Funktion wird direkt übergeben
243  auto itr1 = std::find_if(std::begin(v1),
244  std::end(v1), //
245  [xmin](auto x) { return x > xmin; });
246  //finde Position des ersten Elements aus v1, das > xmax ist
247  //lambda-Funktion wird direkt übergeben
248  auto itr2 = std::find_if(std::begin(v1),
249  std::end(v1), //
250  [xmax](auto x) { return x > xmax; });
251  //gebe Zahlen zwischen itr1 (zeigt auf 11) und itr2 (zeigt auf 17)
252  std::for_each(itr1, itr2, print);
253 }
254 } // namespace nmx::apps::x008
static double to_degrees(double x)
Definition: xmath.h:17
void ex5()
ex5 lambda-Funktionen und Container
Definition: x008.h:212
void ex2()
ex7 Die Bahngeschwindigkeit als Funktion des Abstands von der Rotationsachse, Version 2...
Definition: x008.h:61
void ex4()
ex4 Gleichförmige Kreisbewegung von zwei Teilchen
Definition: x008.h:145
void ex1()
ex1 Die Bahngeschwindigkeit als Funktion des Abstands von der Rotationsachse, Version 1...
Definition: x008.h:20
static double to_radians(double x)
Definition: xmath.h:15
static constexpr double PI
Definition: xmath.h:11
void ex3()
ex8 Die Bahngeschwindigkeit als Funktion des Abstands von der Rotationsachse, Version 3...
Definition: x008.h:103