x900.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xode.h"
4 #include "xmath.h"
5 #include "xmodel.h"
6 #include "xphysics.h"
7 
8 namespace nmx::apps::x900 {
9 
14 class X900 : public XModel
15 {
16 private:
17  double _omega0, _phi0, _amplitude;
18 
19 public:
20  //Eingabeparameter
21  const double mass;
22  const double k;
23  //Anfangsbedingungen
24  const double x0, v0;
25 
33  inline X900(double m, double k, double x0, double v0)
34  : XModel(__func__)
35  , mass{ m }
36  , k{ k }
37  , x0{ x0 }
38  , v0{ v0 } {
39  Check::all(nmx_msg, { m > 0, k > 0 });
40 
41  _omega0 = sqrt(k / mass);
42  _amplitude = sqrt(pow(x0, 2) + pow(v0 / _omega0, 2));
43  _phi0 = atan2(_omega0 * x0, v0);
44  }
45 
50  inline double omega0() const { return _omega0; }
51 
56  inline double phi0() const { return _phi0; }
57 
62  inline double amplitude() const { return _amplitude; }
63 
69  inline double phase(double t) const { return omega0() * t + _phi0; }
70 
76  inline double x(double t) const { return _amplitude * sin(phase(t)); }
77 
83  inline double v(double t) const { //
84  return _amplitude * omega0() * cos(phase(t));
85  }
86 
92  inline double a(double t) const { //
93  return -_amplitude * pow(omega0(), 2) * sin(phase(t));
94  }
95 
101  inline double force(double x) const { return -k * x; }
102 }; //X900
103 
108 class C900 : public X900
109 {
110 public:
112  friend Ode;
113  using Data = Data<7>;
114 
115  using X900::X900; //erbe Konstruktor von der Basisklasse
116 
117 private:
118  Data _data;
119 
120 public:
129  int odefn(double t, const double yin[], double yout[]) {
130  (void) t; // compiler warning vermeiden
131  yout[0] = yin[1];
132  yout[1] = force(yin[0]) / mass;
133  return GSL_SUCCESS;
134  }
135 
139  inline void exec() {
140  Ode ode{ *this, 1e-2, 1e-9, 0 };
141  ode.set_init_conditions(0, { x0, v0 });
142  const double _period = 2 * Math::PI / omega0();
143 
144  //löse Bewegungsgleichung
145  double t = 0.0, dt = 0.01;
146  while (t <= 1.5 * _period) {
147  _data += { t, ode[0], ode[1], force(ode[0]) };
148  t += dt;
149  ode.solve(t);
150  }
151 
152  //füge Energien hinzu
153  for (auto &crow : _data.data()) {
154  const auto x = crow[1];
155  const auto v = crow[2];
156  crow[4] = Mechanics::kinetic_energy(mass, v);
157  crow[5] = 0.5 * k * pow(x, 2);
158  crow[6] = crow[4] + crow[5];
159  }
160  }
161 
165  inline void save_data() {
166  //erzeuge id damit jede Datei einen eindeutigen Namen hat
167  std::stringstream id;
168  id << std::setprecision(3) << omega0() << "-" << phi0();
169 
170  //speichere Daten
171  save(_data, Output::plot, id.str());
172  save(_data.select_total_rows(10), Output::latex, id.str());
173  }
174 }; //C900
175 
180 inline void run() {
181  //Modellparameter
182  const double mass = 1.0, k = 100.0;
183  //Anfangsbedingungen
184  const double x0 = 1.0, v0 = 0.0;
185  //Rechenmodell
186  C900 cobj{ mass, k, x0, v0 };
187  cobj.exec();
188  cobj.save_data();
189 }
190 
191 } // namespace nmx::apps::x900
static double kinetic_energy(double mass, double velocity)
kinetic_energy Hilfsfunktion
Definition: xphysics.h:38
double amplitude() const
amplitude
Definition: x900.h:62
The X900 class Harmonische Schwingung eines Feder-Massen-Systems (Modellklasse)
Definition: x900.h:14
double phase(double t) const
phase
Definition: x900.h:69
void set_init_conditions(double t, const Array &y)
set_init_conditions lege Anfangsbedingungen fest
Definition: xode.h:133
double force(double x) const
force Kraft
Definition: x900.h:101
double v(double t) const
v Geschwindigkeit
Definition: x900.h:83
The Odeiv2 class numerische Lösung eines Systems von N Differenzialgleichungen Schnittstelle zur gsl...
Definition: xode.h:20
The XModel class Basisklasse speichert eine ID in Form einer Zeichenkette enthält Hilfsfunktionen zur...
Definition: xmodel.h:22
const double x0
Definition: x900.h:24
#define nmx_msg
Definition: xerror.h:113
double omega0() const
omega0
Definition: x900.h:50
void run()
run Harmonische Schwingung eines Feder-Massen-Systems Berechnung von Beispieldaten ...
Definition: x900.h:180
The X900 class Harmonische Schwingung eines Feder-Massen-Systems (Rechenmodell)
Definition: x900.h:108
const auto & data() const
data lesender Zugriff auf die interne Struktur
Definition: xdata.h:43
double x(double t) const
x Auslenkung
Definition: x900.h:76
int odefn(double t, const double yin[], double yout[])
odefn Bewegungsgleichung als System von Differenzialgleichungen erster Ordnung
Definition: x900.h:129
double phi0() const
phi0
Definition: x900.h:56
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
const double mass
Definition: x900.h:21
static void save(const T &data, Format fmt)
save Speicherung von Daten in eine Datei
Definition: xmodel.h:70
void exec()
solve_ode numerische Lösung der Bewegungsgleichungen
Definition: x900.h:139
static constexpr double PI
Definition: xmath.h:11
double a(double t) const
a Beschleunigung
Definition: x900.h:92
const double k
Definition: x900.h:22
const double v0
Definition: x900.h:24
static const Format latex
Definition: xoutput.h:17
static void all(const std::string &s, std::initializer_list< bool > lst)
input teste mehrere Bedingungen auf einmal
Definition: xerror.h:76
static const Format plot
Definition: xoutput.h:18
void save_data()
save_data schreibe Daten in Dateien (LaTeX und CSV)
Definition: x900.h:165
X900(double m, double k, double x0, double v0)
X900.
Definition: x900.h:33