x029.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xdata.h"
4 #include "xfmt.h"
5 #include "xmath.h"
6 #include "xoutput.h"
7 #include "xtools.h"
8 #include "xvector.h"
9 #include <forward_list>
10 #include <fstream>
11 #include <gsl/gsl_sf_trig.h>
12 #include <iostream>
13 
14 namespace nmx::apps::x029 {
15 
19 inline void ex0() {
20  const size_t n = 5;
21  // reserviere Speicher für Vektor
22  gsl_vector *v = gsl_vector_alloc(n);
23  //initialisiere Elemente
24  for (size_t idx = 0; idx < n; idx++) {
25  gsl_vector_set(v, idx, idx);
26  }
27  //schreibe Elemente auf dem Bildschirm
28  for (size_t idx = 0; idx < n; idx++) {
29  std::cout << gsl_vector_get(v, idx) << " ";
30  }
31  std::cout << " -> ";
32  //vertausche Elemente mit Index 2 und 3
33  gsl_vector_swap_elements(v, 2, 3);
34  //schreibe Elemente auf dem Bildschirm
35  for (size_t idx = 0; idx < n; idx++) {
36  std::cout << gsl_vector_get(v, idx) << " ";
37  }
38  //Speicherfreigabe
39  gsl_vector_free(v);
40 }
41 
45 inline void ex00() {
46  const size_t n = 5;
47  // erzeuge C-Feld
48  double data[] = { 0, 1, 2, 3, 4 };
49 
50  //erzeuge Sicht auf C-Feld
51  gsl_vector_view v = gsl_vector_view_array(data, n);
52 
53  //schreibe Elemente auf dem Bildschirm
54  for (size_t idx = 0; idx < n; idx++) {
55  std::cout << gsl_vector_get(&v.vector, idx) << "\t";
56  }
57  std::cout << std::endl;
58  //vertausche Elemente mit Index 2 und 3
59  gsl_vector_swap_elements(&v.vector, 2, 3);
60 
61  //schreibe Elemente auf dem Bildschirm
62  for (size_t idx = 0; idx < n; idx++) {
63  std::cout << gsl_vector_get(&v.vector, idx) << "\t";
64  }
65  std::cout << std::endl;
66 }
67 
71 inline void ex1() {
72  const size_t n = 3;
73  //erzeuge Vektor mit 3 Elementen
74  gsl_vector *v = gsl_vector_alloc(n);
75 
76  //Elemente werden initialisiert
77  for (size_t idx = 0; idx < n; idx++) {
78  gsl_vector_set(v, idx, idx);
79  }
80 
81  //Vektor wird auf dem Bildschirm geschrieben
82  for (size_t idx = 0; idx < n; idx++) {
83  std::cout << gsl_vector_get(v, idx) << "\t";
84  }
85  std::cout << std::endl;
86 
87  //zu allen Elementen wird eine Zahl addiert
88  gsl_vector_add_constant(v, 10);
89  //alle Elemente werden mit einer Zahl multipliziert
90  gsl_vector_scale(v, 10);
91 
92  //der Vektor wird auf dem Bildschirm geschrieben
93  for (size_t idx = 0; idx < n; idx++) {
94  std::cout << gsl_vector_get(v, idx) << "\t";
95  }
96  std::cout << std::endl;
97 
98  //erzeuge C-Feld
99  double f[] = { -10, -20, -30 };
100 
101  gsl_vector_view view = gsl_vector_view_array(f, n);
102 
103  //zu den Elemente des Vektors werden die Elemente
104  // des C-Feldes addiert
105  gsl_vector_add(v, &view.vector);
106 
107  //der Vektor wird auf dem Bildschirm geschrieben
108  for (size_t idx = 0; idx < n; idx++) {
109  std::cout << gsl_vector_get(v, idx) << "\t";
110  }
111 
112  std::cout << std::endl;
113  //Freigabe des Speichers
114  gsl_vector_free(v);
115 }
116 
123 static inline std::ofstream get_output_stream(const std::string &name,
124  const Format &fmt = Output::csv) {
125  return Output::get_stream("x029", fmt, name);
126 }
127 
131 inline void vec0() {
132  using Vector = gsl::Vector;
133  std::ofstream ofs = get_output_stream(__func__);
134  ofs << std::fixed;
135  //erzeuge Vektor aus einer Liste von Zahlen
136  Vector v1{ 1.0, 2.0, 3.0 };
137  ofs << v1;
138  //erzeuge zweiten Vektor aus einer Liste von Zahlen
139  Vector v2{ 2, 3, 4 };
140  ofs << v2;
141  //Kopierkonstruktor v3 = v1
142  gsl::Vector v3{ v1 };
143  ofs << v3;
144  v3 = v2;
145  ofs << v3;
146  //erzeuge Vektor mit C-Array
147  double f[] = { 10, 20, 30 };
148  Vector::View v4(3, f);
149  ofs << v4;
150 }
151 
156 inline void vec11() {
157  using namespace gsl;
158  //öffne Ausgabestrom
159  std::ofstream ofs = get_output_stream(__func__);
160  ofs << std::fixed;
161  //erzeuge Vektor und schreibe ihn in die Datei
162  Vector v1{ 1, 2, 3, 4 };
163  ofs << v1;
164  //übertrage Inhalt
165  Vector v2 = std::move(v1);
166 
167  if (v1.empty()) {
168  ofs << "v1 is empty" << std::endl;
169  } else {
170  ofs << v1;
171  }
172  ofs << v2;
173 }
174 
178 inline void vec1() {
179  using Vector = gsl::Vector;
180  std::ofstream ofs = get_output_stream(__func__);
181  ofs << std::fixed;
182 
183  //erzeuge Vektor aus einer Liste von Zahlen
184  Vector v1(10);
185  for (size_t idx = 0; idx < v1.size(); idx++) {
186  v1[idx] = idx;
187  }
188  ofs << v1;
189  //view auf Vektor beginnend ab der Stelle 3 und
190  //insgesamt 4 Elementen
191  auto view = v1.view(3, 4);
192  ofs << view;
193  //view auf Vektor beginnend ab der Stelle 3 und
194  //insgesamt 4 Elementen und Schrittweite 2
195  auto view1 = v1.view(3, 2, 4);
196  ofs << view1;
197 }
198 
202 inline void vec2() {
203  using Vector = gsl::Vector;
204  std::ofstream ofs = get_output_stream(__func__);
205  ofs << std::fixed << std::setprecision(2);
206  //erzeuge Nullvektor
207  Vector v1(4);
208  ofs << v1;
209 
210  //die Elemente erhalten die Werte 0,1,2,3
211  v1.transform([](double x) {
212  (void) x;
213  double static val = 0;
214  return val++;
215  });
216  ofs << v1;
217 
218  //berechne den sin der Elemente von v1 und speichere diese in v2
219  Vector v2 = apply([](double x) { return sin(x); }, v1);
220  ofs << v2;
221  Vector v3 = apply([](double x) { return cos(x); }, v1);
222  ofs << v3;
223 
224  auto fn = [](double x, double y) { //
225  return std::pow(x, 2) + std::pow(y, 2);
226  };
227  Vector v4 = apply(fn, v2, v3);
228  ofs << v4;
229 
230  auto fn1 = [](double x, double y) { //
231  return std::pow(cos(x), 2) + std::pow(sin(y), 2);
232  };
233  Vector v5 = apply(fn1, v1, v1);
234  ofs << v5;
235 }
236 
240 inline void vec5() {
241  using gsl::Vector;
242  std::ofstream ofs = get_output_stream(__func__);
243  constexpr size_t dim = 6;
244  gsl::Vector v(dim);
245  //Vektor wird gefüllt
246  for (size_t idx = 0; idx < dim; idx++) {
247  v[idx] = sin(idx + 1) / (idx + 1);
248  }
249  //Suche nach Minimum Maximum mit Schleife
250  double maxelement = v[0], minelement = v[0];
251  for (size_t jdx = 0; jdx < dim; jdx++) {
252  const double jelement = v[jdx];
253  maxelement = std::max(maxelement, jelement);
254  minelement = std::min(minelement, jelement);
255  }
256  //Suche nach Minimum Maximum mit stl
257  auto imaxlement = std::max_element(std::begin(v), //
258  std::end(v));
259  auto iminlement = std::min_element(std::begin(v), //
260  std::end(v));
261  //Ergebnisse
262  ofs << v;
263  ofs << "max loop:" << maxelement << std::endl;
264  ofs << "min loop:" << minelement << std::endl;
265  ofs << "max method:" << v.max() << std::endl;
266  ofs << "min method:" << v.min() << std::endl;
267  ofs << "max stl:" << *imaxlement << std::endl;
268  ofs << "min stl:" << *iminlement << std::endl;
269 }
270 
274 inline void vec6() {
275  using gsl::Vector;
276  std::ofstream ofs = get_output_stream(__func__);
277  const gsl::Vector r0{ 3, 1 };
278  const gsl::Vector r1{ -1, 6 };
279 
280  //Funktion Parameterform
281  auto paramForm = [r0, r1](double l) { return r0 + l * (r1 - r0); };
282 
283  const double l1 = 1, l2 = 2;
284  const auto v1 = paramForm(l1);
285  const auto v2 = paramForm(l2);
286 
287  //Ausgabe
288  ofs << r0 << r1;
289  ofs << "lambda 1=" << l1 << std::endl;
290  ofs << v1;
291  ofs << "lambda 2=" << l2 << std::endl;
292  ofs << v2;
293 }
294 
298 inline void vec3() {
299  using Vector = gsl::Vector;
300  std::ofstream ofs = get_output_stream(__func__);
301  Format fmt{ ",", "\t" };
302  ofs << fmt << std::fixed;
303 
304  const Vector a{ 3, 5 };
305  const Vector b{ 4, -2 };
306  auto v1 = a + b, v2 = a - b, v3 = 2 * a, v4 = -a;
307  ofs << a << b << v1 << std::endl << v2 << v3 << v4 << std::endl;
308 
309  //teste Dreiecksungleichungen
310  if (nrm2(v1) <= abs(nrm2(v1)) + abs(nrm2(v2))) {
311  ofs << "true, ";
312  } else {
313  ofs << "false, ";
314  }
315  if (nrm2(v2) >= abs(abs(nrm2(v1)) - abs(nrm2(v2)))) {
316  ofs << "true" << std::endl;
317  } else {
318  ofs << "false" << std::endl;
319  }
320 }
321 
325 inline void vec4() {
326  using Vector = gsl::Vector;
327 
328  std::ofstream ofs = get_output_stream(__func__);
329  const Vector c{ 5, 2 };
330  const Vector d{ -1, 6 };
331 
332  const double n1 = pow(nrm2(c), 2);
333  const double n2 = pow(nrm2(d), 2);
334  const double cdotd = dot(c, d);
335  const double cosphi = cdotd / (nrm2(c) * nrm2(d));
336 
337  ofs << c << d;
338  ofs << "n1=" << n1 << ","
339  << "n2=" << n2 << ","
340  << "cdotd=" << cdotd << ","
341  << "cos(phi)=" << cosphi << std::endl;
342 }
343 
351  gsl::Vector vout(3);
352  vout[0] = v1[1] * v2[2] - v1[2] * v2[1];
353  vout[1] = v1[0] * v2[2] - v1[2] * v2[0];
354  vout[2] = v1[0] * v2[1] - v1[1] * v2[0];
355  return vout;
356 }
357 
361 inline void vec7() {
362  using gsl::Vector;
363  std::ofstream ofs = get_output_stream(__func__);
364 
365  const gsl::Vector a{ 3, -1, 2 }, b{ 2, 3, -1 };
366 
367  //berechne Kreuzprodukt
368  const auto c = cross_product(a, b);
369 
370  //Ausgabe
371  ofs << a << b;
372  ofs << "c = a x b=" << c;
373 }
374 
379 inline void vec8() {
380  using Vector = gsl::Vector;
381  std::ofstream ofs = get_output_stream(__func__);
382  const Vector r{ 5, -5, 0 }, f{ 2, 3, 0 };
383  const auto tau = cross_product(r, f);
384  ofs << r << f;
385  ofs << "tau = r x f=" << tau;
386 }
387 
391 inline void vec9() {
392  using gsl::Vector;
393  std::ofstream ofs = get_output_stream(__func__);
394  const double mass = 100.0_g;
395  const double t = 1.0;
396 
397  //Geschwindigkeits- und Ortsvektor
398  const gsl::Vector v{ 0, 0, -9.81 * t };
399  const gsl::Vector r{ 0, 10.0, 30.0 - 4.905 * pow(t, 2) };
400 
401  const auto p = mass * v;
402  const auto L = cross_product(r, p);
403  ofs << r << p << L;
404 }
405 
409 inline void vec10() {
410  using gsl::Vector;
411  std::ofstream ofs = get_output_stream(__func__);
412 
413  //erzeuge Nullvektor
414  gsl::Vector v1{ 1.0, 2.0, 3.0, 4.0 };
415  ofs << v1;
416  Vector v2 = apply([](double x) { return sin(x); }, v1);
417  ofs << v2;
418  Vector v3 = apply([](double x) { return cos(x); }, v1);
419  ofs << v3;
420  Vector v4 = apply([](double x, double y) { return pow(x, 2) + pow(y, 2); }, v2, v3);
421  ofs << v4;
422 
423  //gebe die Elemente von v4 mit einem range-based loop aus
424  for (const auto &x : v4) {
425  ofs << x << ",";
426  }
427  ofs << std::endl;
428 
429  //berechne die Summe der Elemente von v4
430  auto sum = std::accumulate(std::begin(v4), std::end(v4), 0);
431  ofs << "sum =" << sum << std::endl;
432 }
433 
438 inline void vec12() {
439  //alle Kräfte werden in einem std::array gespeichert
440  std::array<gsl::Vector, 7> forces;
441  forces[0] = { 0, -3 };
442  forces[1] = { 20, -10 };
443  forces[2] = { 1, 20 };
444  forces[3] = { 10, 0 };
445  forces[4] = { 5, 5 };
446  forces[5] = { -10, -10 };
447  forces[6] = { 0, 0 };
448 
449  //die Summe der Kräfte wird berechnet
450  for (size_t idx = 0; idx < 6; idx++) {
451  forces[6] += forces[idx];
452  }
453 
454  //Darstellung der Daten im LaTeX-Format
455  const auto [sep, lend] = Output::latex();
456  std::ofstream ofs = get_output_stream(__func__, Output::latex);
457  ofs << std::fixed << std::setprecision(2);
458  for (size_t idx = 0; idx < 2; idx++) {
459  idx == 0 ? ofs << "$x$" : ofs << "$y$";
460  for (size_t jdx = 0; jdx < 7; jdx++) {
461  ofs << " " << sep << forces[jdx][idx];
462  }
463  ofs << lend;
464  }
465 }
466 
470 inline void vec13() {
471  //Umrechnung von Polarkoordinaten in kartesischen Koordinaten
472  auto polar_to_rect = [](double r, double phi) {
473  gsl_sf_result x, y;
474  gsl_sf_polar_to_rect(r, phi, &x, &y);
475  return gsl::Vector({ x.val, y.val });
476  };
477 
478  //Umrechnung von kartesischen Koordinaten in Polarkoordinaten
479  auto rect_to_polar = [](double x, double y) {
480  gsl_sf_result r, phi;
481  gsl_sf_rect_to_polar(x, y, &r, &phi);
482  return gsl::Vector({ r.val, phi.val });
483  };
484 
485  //die Kräfte werden in einem std::array gespeichert
486  std::array<gsl::Vector, 4> forces;
487  forces[0] = polar_to_rect(80.0, 40.0_deg);
488  forces[1] = polar_to_rect(120.0, 70.0_deg);
489  forces[2] = polar_to_rect(150.0, 145.0_deg);
490  forces[3] = forces[0] + forces[1] + forces[2]; //die Gesamtkraft
491 
492  //die Daten werden im LaTeX-Format gespeichert
493  std::ofstream ofs = get_output_stream(__func__, Output::latex);
494  ofs << std::setprecision(2) << std::fixed;
495  const auto [sep, lend] = Output::latex();
496  for (size_t idx = 0; idx < 4; idx++) {
497  const auto x = forces[idx][0], y = forces[idx][1];
498  const auto polar = rect_to_polar(x, y);
499  ofs << idx << sep << x << sep << y << sep //
500  << polar[0] << sep << Math::to_degrees(polar[1]) << lend;
501  }
502 }
503 
504 } // namespace nmx::apps::x029
static double to_degrees(double x)
Definition: xmath.h:17
void vec11()
vec11 Daten werden von einem Vektor auf einen anderen übertragen
Definition: x029.h:156
void ex00()
ex00 Beispiel (gsl-Programm)
Definition: x029.h:45
static const Format csv
Definition: xoutput.h:20
void ex0()
ex0 Beispiel mit Vektoren (gsl-Programm)
Definition: x029.h:19
void vec4()
vec4 Skalarprodukt cos
Definition: x029.h:325
void vec10()
vec10
Definition: x029.h:409
void vec9()
vec9 Drehimpuls eines Teilchens bezüglich des Ursprungs
Definition: x029.h:391
void vec8()
vec8 Drehmoment durch Kraft auf Teilchen bezüglich des Ursprungs
Definition: x029.h:379
void vec5()
vec5 minimales maximales Element
Definition: x029.h:240
void ex1()
ex1 Rechnen mit gsl-Vektoren
Definition: x029.h:71
LU::Vector Vector
Definition: x038.h:10
void vec3()
vec3 algebraische Operationen
Definition: x029.h:298
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
void vec2()
vec2 mathematische Operationen mit Vektoren
Definition: x029.h:202
void vec1()
vec1 Konstruktoren Vektor-Klasse und Views
Definition: x029.h:178
gsl::Vector cross_product(const gsl::Vector &v1, const gsl::Vector &v2)
cross_product Kreuzprodukt von dreidimensionalen Vektoren
Definition: x029.h:350
void vec0()
vec1 Konstruktoren Vektor-Klasse
Definition: x029.h:131
double max() const
Definition: xvector5.h:17
The Vector class Klasse für gsl-Vektoren zussamengesetzt aus Komponenten.
Definition: xvector.h:76
The Format class Formatierte Ausgabe von Arrays.
Definition: xfmt.h:10
void vec7()
vec7 Kreuzprodukt zweier Vektoren
Definition: x029.h:361
void vec13()
vec13 Kräfte wirken auf Massenpunkt (in Polarkoordinaten)
Definition: x029.h:470
static const Format latex
Definition: xoutput.h:17
double f(double x, void *params)
f
Definition: x035.h:15
void vec12()
vec12 Kräfte wirken auf Massenpunkt (kartesischen Koordinaten)
Definition: x029.h:438
void vec6()
vec6 Parameterdarstellung einer Gerade
Definition: x029.h:274