Romberg-Verfahren



  • Hallo,
    weiß jemand wo ich den Quellcode für das Romberg-Verfahren finde?

    Vielen dank, Jack



  • über google oder Wikipedia 😉



  • Danke, aber hab bisher keinen gescheiten Quellcode für C++ entdeckt.
    Vielleicht könntest du mir einen genauen Link geben...danke!



  • Im Wikipedia-Artikel gibt es doch eine (ich glaube) C#- oder Java-Version des Algorithmus - da dürfte es für einen halbwegs gebildeten Programmierer nicht so schwer sein, das auf C++ zu übersetzen 😉



  • Hmm...vielleicht kann mir jemand sagen, wo die Fehler in meiner Umsetzung liegen:

    double Trapez(double l, int w)
    {
    	double x = 0,I,h;
    	int s=0;
    	h = (b-a) / l;
    	for (int i=1; i <= n-1; i++)
    	{
    		x = a + i * h;
    		s = s + f(x);
    	}
    	I = (h/2) * ( f(a) + 2*s + f(b));
    	return I;
    }
    
    void Romberg()
    
    {
    	double T[4] [4];
    	for (int i = 0; i <= m; i++)
    	{
    		T[i][0] = Trapez( (i+n), int(pow(2.,n+i)) );
    	}
    
    	cout << endl;
    	for (int k = 1; k <= m; k++)
    	{
    		for (int i = k; i <= m; i++)
    		{
    			T[i][k] = (( T[i][k-1]-T[i-1][k-1] ) /(pow(2.,2.*k)-1));
    		}
    	}
    	//Ausgabe der Iterationen
    	for (int i = 0; i <= m; i++) 
    	{
    		cout <<"T["<<i<<"]["<<i<<"]="<<T[i][i];
    			cout <<"\n";
    	}
    	return;
    }
    

    PS: Ich habe nie behauptet, dass ich nur halbwegs programmieren kann 😉



  • Erstens: Woher kommen 'm', 'a', 'b', 'n'? Du solltest alle verwendeten Variablen (a) deklariert und (b) vernünftig initialisiert haben.

    Zweitens: Das Array T könnte möglicherweise etwas zu klein gewählt sein.



  • So, nochmal:

    int m=3;
    double a=-10, b=10, n=3; //Intervall -10 bis 10, Parameter n=m=3
    
    double f(double x)
    {
    	double pi=3.141592654;
        return (1/sqrt(2*pi)*exp((-x*x)/2));
    }
    
    double Trapez(double h, int w)
    {
    	double temp = 0.;
    	for (int v = 0.; v < w; v++)
    	{
    		temp += h * ( f(a+v*h) + f(a+(v+1)*h)) / 2;
    	}
    	return temp;
    }
    
    void Romberg()
    
    {
    	double T[10] [10];
    	for (int i = 0; i <= m; i++)
    	{
    		T[i][0] = Trapez( (b-a)/(pow(2.,i)), int(pow(2.,i))  );
    	}
    
    	cout << endl;
    	for (int k = 1; k <= m; k++)
    	{
    		for (int i = k; i <= m; i++)
    		{
    			T[i][k] = (( T[i][k-1]-T[i-1][k-1] ) /(pow(2.,2.*k)-1));
    		}
    	}
    	//Ausgabe der Iterationen
    	for (int i = 0; i <= m; i++) 
    	{
    		cout <<"T["<<i<<"]["<<i<<"]="<<T[i][i];
    			cout <<"\n";
    	}
    	return;
    }
    

    Ich weiss nur, dass das korrekte Ergebnis 1.0096446526939107 lauten müsste.
    Wäre schön, wenn du den Fehler finden würdest.



  • Sag mir mal, woher der Compiler die Variable m kennen soll.


Anmelden zum Antworten