Problem mit C++ Programm für die Uni...



  • Hallo,

    hab hier ein Problem mit nem C++ Programm für die Uni. Es kommt immer ein Segmentation Fault.

    Zum Programm: Es soll ein Romberg-Tableau erstellt werden und damit zusammen mit der Trapezregel eine Nährungsweise Bestimmung des Integrals einer vorgegebenen Funktion berechnet werden.

    Hab schon ein bisschen Fehlersuche gemacht und festgestellt, dass auch etwas am Aufruf der Funktion f bzw. an deren Ausführung nicht stimmen kann.

    Der Segmentation Fault kommt am Ende vom Programm, während die T[i][k] ausgegeben werden.

    Vielleicht findet ihr ja was...

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    
    using namespace std;
    
    //Funktion für Integration
    double f(double x)
      {
        double ergebnis;
        ergebnis = (log(1.0+x))/(x*x*+1.0);//hier beliebige Funktion
        return ergebnis;
    }
    
    //Trapezregel, nährungsweise Integration von a bis b an n Auswertungspunkten
    double trapez(double a, double b, double n)
      {
        double erg;
        double h;
        double x;
        int i;
    
        //Stück für Stück die Trapezregel umsetzen...
    
        erg = 0.5*f(a);//Schritt 1
        h = (b-a)/n;//Schrittweite errechnen
    
        x=a;
    
        for(i=0; i<n; i++)//Schritt 2
          {
            x=x+h;
            erg+=f(x);
        }
    
        erg = erg + 0.5*f(b);//Schritt 3
        erg = erg*h;//Schritt 4
    
        return erg;
    }
    
    int main()
      {
        double a,b;
        double faktor;
        int k,i,n;
        const int imax=7;
        double T[imax+1][imax+1]; //Zweidimensionales Feld für Romberg-Tableaus
    
        //Einlesen der Integrationsgrenzen
        cout << "Gearbeitet wird mit der Funktion f(x)=(log(1+x))/(x^2+1)" << endl << endl;
        cout << "Bitte geben Sie die linke Integrationsgrenze(=a) ein: ";
        cin >> a;
        cout << "Bitte geben Sie die rechte Integrationsgrenze (=b) ein: ";
        cin >> b;
        cin.get();
    
        n=1;
        //Aufsummieren der Trapeze 
        for(i=0; i<=imax; i++)
          {
            T[i][0] = trapez(a,b,n);
            n*=2;
        }
    
        faktor=1;
        //Spaltenweise Berechnung der Nährungswerte
        for(k=0; k<=imax; k++)
          {
            faktor*=4;
    
              for(i=k; i<=imax; i++)
                {
                  T[i][k] = T[i][k-1]+(T[i][k-1]-T[i-1][k-1])/(faktor-1);
              }
        }
    
        //Ausgabe
    
        for(i=0; i<=imax; i++)
          {
            for(k=0; k<=i; k++)
            {
              cout << setw(11) << setiosflags(ios::fixed|ios::right) << T[i][k];
            }
            cout << endl;
        }
    
        getchar();
        return 0;
    }
    

    Danke schonmal fürs anschaun 🙂



  • for(k=0; k<=imax; k++)
    {
        faktor*=4;
    
        for(i=k; i<=imax; i++)
        {
            T[i][k] = T[i][k-1]+(T[i][k-1]-T[i-1][k-1])/(faktor-1);
        }
    }
    

    Beim ersten Schleifendurchgang ist i und k = 0. Damit greifst du auf das Element T[0][-1] bzw. T[-1][-1] zu. Die existieren aber nicht.



  • ok, das wars... 🙂 ansonsten war noch nen Syntaxfehler bei der Funktion. Sowas kann man doch normal garnicht übersehen 😡


Anmelden zum Antworten