x410.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xlu.h"
4 #include "xode.h"
5 #include "xmodel.h"
6 #include "xphysics.h"
7 
8 namespace nmx::apps::x410 {
9 
10 using namespace gravitation;
11 
15 enum class Idx { x1ddot, x2ddot, N1, N2 };
16 
23 class X410 : public XModel, public CResult<4, Idx>
24 {
25 public:
26  // Eingabeparameter
27  const double m1, m2;
28  const double theta;
29  const double mu;
30 
38  X410(double m1, double m2, double theta, double mu)
39  : XModel(__func__)
40  , m1{ m1 }
41  , m2{ m2 }
42  , theta{ theta }
43  , mu{ mu } {
44  //sind alle Eingaben gültig?
45  Check::all(nmx_msg, { m1 > 0, m2 > 0, theta > 0, mu > 0 });
46  }
47 }; //X410
48 
53 class CModel1 : public X410
54 {
55 private:
56  double _cTheta, _sTheta;
57  double _m12, _trm1, _den;
58 
63  double N1() const { //
64  return m1 * Earth::g * _cTheta / (1 - _m12 * _sTheta * _trm1);
65  }
66 
71  double N2() const { //
72  return m2 * Earth::g - N1() * (mu * _sTheta + _cTheta);
73  }
74 
79  double x1_ddot() const {
80  double num = Earth::g * _cTheta * (_m12 * _cTheta * _trm1 + mu);
81  double den = (1 - _m12 * _sTheta * _trm1);
82  return -Earth::g * _sTheta + (num / den);
83  }
84 
90  double x2_ddot() const {
91  return -_m12 * Earth::g * _cTheta * _trm1 / (1 - _m12 * _sTheta * _trm1);
92  }
93 
94 public:
95  //erbe Konstruktoren von der Basisklasse
96  using X410::X410;
97 
103  inline void apply() {
104  _cTheta = cos(theta);
105  _sTheta = sin(theta);
106  _trm1 = mu * _cTheta - _sTheta;
107  _den = 1 - _m12 * _sTheta * _trm1;
108  _m12 = m1 / m2;
109  //speichere Ergebnisse
110  set_result({ x1_ddot(), x2_ddot(), N1(), N2() });
111  }
112 }; //CModel1
113 
118 struct CModel2 : public X410 {
119  //erbe Konstruktoren von der Basisklasse
120  using X410::X410;
121 
122  //Berechnung und Speicherung der Normalkräfte und
123  //der Beschleunigungen durch direktes Lösen des
124  //Gleichungssystems
125  inline void apply() {
126  using LU = gsl::LU_Decomposition;
127  const double cosTheta = cos(theta);
128  const double sinTheta = sin(theta);
129  LU::Matrix _left({
130  { cosTheta, 1.0, (sinTheta - mu * cosTheta) / (m1), 0 },
131  { sinTheta, 0, -(cosTheta + mu * sinTheta) / (m1), 0 },
132  { 0, 1, -(sinTheta - mu * cosTheta) / (m2), 0 },
133  { 0, 0, (cosTheta + mu * sinTheta), 1 } //
134  });
135  LU::Vector _right({ 0.0, -Earth::g, 0, m2 * Earth::g });
136  LU lusolver{ _left, _right };
137  lusolver.solve();
138  //speichere Ergebnisse
139  set_result(lusolver.solution());
140  }
141 }; //CModel2
142 
147 inline void run() {
148  //Masse gleitet auf schiefe Ebene
149  const double m1 = 1.0;
150  //Neigungswinkel der schiefen Ebene
151  const double theta = 30._deg;
152  //Datenobjekt speichert berechnete Daten
153  Data<8> data;
154  //variiere lambda und Gleitreibungskoeffizienten
155  for (double lambda : { 10, 100, 1000 }) {
156  for (double mu : { 0., 0.1, 0.2 }) {
157  const double m2 = lambda * m1;
158  //Modellklasse und Rechenmodelle
159  CModel1 cobj1{ m1, m2, theta, mu };
160  CModel2 cobj2{ m1, m2, theta, mu };
161  cobj1.apply();
162  cobj2.apply();
163  data += { lambda,
164  mu,
165  cobj1(Idx::x1ddot),
166  cobj1(Idx::x2ddot),
167  cobj1(Idx::N1),
168  cobj1(Idx::N2),
169  cobj2(Idx::x1ddot),
170  cobj2(Idx::x2ddot) };
171  }
172  }
173  //Daten werden in Dateien geschrieben
175  ofs1 << std::setprecision(2);
176  data.save(ofs1, Output::latex);
177 }
178 } // namespace nmx::apps::x410
The CModel2 struct Rechenmodell Berechnet Daten durch direktes Lösen des Gleichungssystems.
Definition: x410.h:118
The CModel1 class Rechenmodell Berechnet Daten durch Anwendung der hergeleiteten Formeln.
Definition: x410.h:53
void save(std::ostream &ofs, Format fmt) const
save Schreibe Tabelle in Datei
Definition: xdata.h:160
const double mu
Definition: x410.h:29
The XModel class Basisklasse speichert eine ID in Form einer Zeichenkette enthält Hilfsfunktionen zur...
Definition: xmodel.h:22
#define nmx_msg
Definition: xerror.h:113
The X410 class Masse gleitet auf bewegliche schiefe Ebene (Modellklasse)
Definition: x410.h:23
LU::Vector Vector
Definition: x038.h:10
void solve()
solve Berechnung des Lösungsvektors
Definition: xlu.h:116
const double theta
Definition: x410.h:28
void apply()
exec Berechnung und Speicherung der Normalkräfte und der Beschleunigungen
Definition: x410.h:103
X410(double m1, double m2, double theta, double mu)
X410 Konstruktor.
Definition: x410.h:38
void run()
run Beschleunigte schiefe Ebene Erstellung von Beispieldaten
Definition: x410.h:147
gsl::LU_Decomposition LU
Definition: x038.h:8
LU::Matrix Matrix
Definition: x038.h:9
static std::ofstream get_output_stream(Format fmt)
get_output_stream
Definition: xmodel.h:49
The LU_Decomposition class Lösung eines linearen Gleichungssystems mittels der LU-Zerlegung.
Definition: xlu.h:11
Idx
The Idx enum Zugriff auf die einzelnen Elemente.
Definition: x410.h:15
The CResult class Speicherung von Rechenergebnissen.
Definition: xmodel.h:106
static const Format latex
Definition: xoutput.h:17
static constexpr double g
Definition: xphysics.h:20
static void all(const std::string &s, std::initializer_list< bool > lst)
input teste mehrere Bedingungen auf einmal
Definition: xerror.h:76
const double m2
Definition: x410.h:27