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 jeweils variable = variable + wert kannst du auch einfach variable += wertschreiben.

    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;
    

Anmelden zum Antworten