Ausgabewerte stimmen nicht
-
Problem dank DirkB gelöst.
Hallo zusammen, schreibe seit kurzem C++ Code in Qt. Seit ca. 3h hänge ich an einem Problem und komm einfach nicht drauf:
Die ausgegeben Werte für x und xT bleiben die Startwerte. Ich kann leider nicht nachvollziehen warum. Beim nachrechnen mittels Taschenrechner verändert sich v im ersten Durchlauf um -13/6250 was sich ja im x des zweiten Durchlaufs widerspiegeln sollte...aber leider keine Änderung.
Bei ähnlichen Aufgaben hatte ich noch nie solche Probleme.
Über jegliche Hinweise oder Tipps bin ich sehr dankbar.#include <iostream> #include <fstream> double dv (double vT, double v, double xT, double x); // Funktionsdeklaration: Beschleunigung Hauptmasse double dvT (double vT, double v, double xT, double x); // Funktionsdeklaration: Beschleunigung Tilger-Masse int main() { // Implementierung Aufgabe 1-3: double t = 0, h = 0.01; // Zeit und Zeitschrittweite double v = 0, vT = 0; // Geschwindigkeiten double v_old = 0, vT_old = 0; // alte Geschwindigkeiten um "Zurückzurechnen" double x = 0.1, xT = 0; // Orte // Speichern der Werte in Arrays double t_vals [10001]; double x_vals [10001], xT_vals [10001]; double v_vals [10001], vT_vals [10001]; for (int i = 0; i<10001; i++) { t_vals[i] = t; // Speichern von ti x_vals[i] = x , xT_vals[i] = xT; // Speichern von x unt xT v_vals[i] = v , vT_vals[i] = vT; // Speichern von v und vT v_old = v , vT_old = vT; // alte Geschwindigkeiten um "Zurückzurechnen" // Berechnungen v = v + h * dv(vT, v_old, xT, x); vT = vT + h * dvT(vT, v_old, xT, x); x = x + h * v_old; xT = xT + h * vT_old; t = t + h; // Erhöhen der Laufzeit um die Zeitschrittweite } // Werte von Arrays in Datei schreiben std::ofstream Datei; Datei.open("C:\\Users\\lenzf\\Downloads\\Sommersemester 2023\\I-Inf Praktikum\\Praktikum\\Aufgabe_1.txt"); if (!Datei.is_open()) // Kontrolle ob Datei geöffnet werden konnte std::cout << "Fehler beim Oeffnen der Datei" << std::endl; for(int i = 0; i < 10001; i++) { Datei << "t"<<i<<" : "<<t_vals[i]<<" x"<<i<<" : "<<x_vals[i]<<" xT"<<i<<": "<<xT_vals[i]<<std::endl; } Datei.close(); return 0; } double dvT (double vT, double v, double xT, double x) //Fuktionsdefinition { // alle Werte in SI-Einheiten !!! int mT = 20; // Tilger-Masse int dT = 11; // Dämpfungskonstante des Tilgers int kT = 40; // Federsteifigkeit der Tilgerankopplung return (1/mT) * (-dT*(vT-v) - kT*(xT-x)); //Berechnung und Rückgabe Beschleunigung der Tilger-Masse } double dv (double vT, double v, double xT, double x) // Funktionsdefinition { // alle Werte in SI-Einheiten !!! int F = 0; int m=500; // Hauptmasse int k=1000; // Federsteifigkeit int kT=40; // Federsteifigkeit der Tilgerankopplung int dT=11; // Dämpfungskonstante des Tilgers return (1/m) * (dT*(vT-v) + kT*(xT-x) - k*x + F); //Berechnung und Rückgabe Beschleunigung der Hauptmasse }
-
@Florian99
1/int
ist 0, wenn abs(int) > 1, da die Berechnung als Ganzzahldivision ausgeführt wird.Mach aus den Variablen m bzw. mt ein
double
oder schreibe (1.0/m)Oder berechne erst den Zähler (der ist dann ein
double
) und Teile dann durch m bzw mt
-
@DirkB Vielen lieben Dank :). Gerade ausprobiert, jetzt läuft alles so wie es sollte. Mein Freitag ist gerettet. Jetzt kann ich mal an den Feinschliff.
-
@Florian99 Beim
t = t+h;
kann es auch zu Rundungsfehlern kommen.Gerade 0,01 ist binär nicht genau Darstellbar.
Mag bei dir noch nicht auffallen, bei mehr Schleifendurchläufen schon.
-
Als weiterer Hinweis:
Anstatt jeweilsvariable = variable + wert
kannst du auch einfachvariable += wert
schreiben.Und für die Anzahl
10001
solltest du eine Konstante anlegen, so daß dieser Wert einfacher verändert werden könnte und der Code übersichtlicher ist (Stichwort: Magische Zahlen in Code):const int MaxValues = 10001;