numerische Integration?



  • Hi Leute! Ich soll mithilfe der Simpson-Formel eine numerische Integration über die Funktion x3+3x2 machen. Laut einem Graphenprogramm lautet der Flächeninhalt im Intervall [-3; 0] 6,75 FE. Ich bekomme aber 666 🙂 raus. Da kann was nicht stimmen. Ich weiß aber leider auch nicht so genau was...

    #include<stdio.h>
    
    double funktion_gerade(double *gerade, double breite_intervalle, double anzahl_intervalle)
    {
    	int i, j = 2;
    	double x = 0, summe_2 = 0;
    
    	for(i=0; i<anzahl_intervalle; i=i+1)
    	{
    		gerade[i] = j*j*j - 3*j*j;
    		j = j + 2;
    		summe_2 = summe_2 + gerade[i];
    	}
    	return summe_2;
    }
    
    double funktion_ungerade(double *ungerade, double breite_intervalle, double anzahl_intervalle)
    {
    	int i, j = 1;
    	double x = 0, summe_1 = 0;
    
    	for(i=0; i<anzahl_intervalle; i=i+1)
    	{
    		ungerade[i] = j*j*j - 3*j*j;
    		j = j + 2;
    		summe_1 = summe_1 + ungerade[i];
    	}
    	return summe_1;
    }
    
    int main ()
    {
    	double breite_intervalle, anzahl_intervalle;
    	double ungerade[1000], gerade[1000], summe_1, summe_2, yn, flaeche;
    
    	printf("------Numerische Integration nach Simpson------\n\n");
    	printf("Funktion y = f(x) = x^3+3x^2\n\n\n");
    
    	printf("Breite h eingeben (nur gerade Zahlen!): h = "); scanf("%lf", &breite_intervalle);
    	printf("Stützstelle n eingeben (nur gerade Zahlen!): n = "); scanf("%lf", &anzahl_intervalle);
    
    	summe_2 = funktion_gerade(gerade, breite_intervalle, anzahl_intervalle);
    	summe_1 = funktion_ungerade(ungerade, breite_intervalle, anzahl_intervalle);
    	yn = anzahl_intervalle*anzahl_intervalle*anzahl_intervalle + 3*anzahl_intervalle*anzahl_intervalle;
    
    	flaeche = (breite_intervalle / 3) * (yn + 4*summe_1 + 2*summe_2);
    
    return 0;
    }
    


  • Damit man das nachvollziehen kann, sollten wir die Werte wissen die du eingibst.

    Und deine Funktionen unterscheiden sich an nur einer Stelle. Daraus kann man eine Funktion machen.



  • Die Werte für die ich im Graphenprogramm mir die Fläche hab berechnen lassen waren von [-3;0]. In meinem Programm hab ich h=1 und n=20.



  • Ich hab dann mal aus den beiden Funktionen eine gemacht:

    #include<stdio.h>
    
    double funktion(double *array, double breite_intervalle, double anzahl_intervalle, int var)
    {
    	int i;
    	float summe = 0;
    	for(i=0; i<anzahl_intervalle; i=i+1)
    	{
    		array[i] = var*var*var + 3*var*var;
    		var = var + 2;
    		summe = summe + array[i];
    	}
    	return summe;
    }
    
    int main ()
    {
    	double breite_intervalle, anzahl_intervalle;
    	double ungerade[1000], gerade[1000], summe_ungerade, summe_gerade, yn, flaeche;
    	int j, k;
    
    	printf("------Numerische Integration nach Simpson------\n\n");
    	printf("Funktion y = f(x) = x^3+3x^2\n\n\n");
    	printf("Breite h eingeben (nur gerade Zahlen!): h = "); scanf("%lf", &breite_intervalle);
    	printf("Stützstelle n eingeben (nur gerade Zahlen!): n = "); scanf("%lf", &anzahl_intervalle);
    
    	j = 1;
    	summe_ungerade = funktion(ungerade, breite_intervalle, anzahl_intervalle, j);
    	k = 2;
    	summe_gerade = funktion(gerade, breite_intervalle, anzahl_intervalle, k);
    
    	yn = anzahl_intervalle*anzahl_intervalle*anzahl_intervalle + 3*anzahl_intervalle*anzahl_intervalle;
    	flaeche = (breite_intervalle / 3) * (yn + 4*summe_ungerade + 2*summe_gerade);
    
    return 0;
    }
    

    Beim ersten Beitrag diesen Thread von mir hat sich auch noch ein Fehler eingschlichen. Am besten guckt ihr euch den Code oben durch... Aufgabe ist immer noch durch die Simpson-Formel den Flächeninhalt unterhalb des Graphen der Funktion x3+3x2 berechnen zu lassen.



  • Hi!

    Ich hab jetzt noch weiter an meinem Programm gearbeitet. Ich hab allerdings die Funktion zu (x-4)3+3(x-4)2 geändert. Das Intervall soll sein [1;4].

    #include<stdio.h>
    
    double funktion(double *array, double n, int var, int a, double h)
    {
    	int i, x;
    	double summe = 0;
    	for(i=0; i<n; i=i+1)
    	{
    		x = a + var*h;
    		array[i] = (x-4)*(x-4)*(x-4) + 3*(x-4)*(x-4);
    		var = var + 2;
    		summe = summe + array[i];
    	}
    	return summe;
    }
    
    double funktionswert(double var)
    {
    	double y;
    	y = (var-4)*(var-4)*(var-4) + 3*(var-4)*(var-4);
    	return y;
    }
    
    int main ()
    {
    	double a, b, n;
    	double ungerade[1000], gerade[1000], h, summe_ungerade, summe_gerade, y0, yn, flaeche;
    	int j, k;
    
    	printf("------Numerische Integration nach Simpson------\n\n");
    	printf("Funktion y = f(x) = x^3+3x^2\n\n\n");
    	printf("Intervall eingeben:\n\n");
    	printf("a = "); scanf("%lf", &a);
    	printf("b = "); scanf("%lf", &b);
    	printf("angegebenes Intervall: [%lf ; %lf]\n\n", a, b);
    	printf("Anzahl der Teilintervalle n eingeben (nur gerade Zahlen!): n = "); scanf("%lf", &n);
    
    	h = (b-a) / n;
    
    	j = 1;
    	summe_ungerade = funktion(ungerade, n, j, a, h);
    	k = 2;
    	summe_gerade = funktion(gerade, n, k, a, h);
    
    	flaeche = (h/3) * (funktionswert(0) + funktionswert(n) + 4*summe_ungerade + 2*summe_gerade);
    
    	printf("A = %lf", flaeche);
    
    return 0;
    }
    


  • Hallo,
    kann man die Funktion funktion auch rekursiv realisieren?
    Wie würde das gehen? Ich hab jetzt eine Stunde überlegt weiß aber nicht wie...
    Danke


Anmelden zum Antworten