integralfunktion modifizieren



  • hallo!
    ich soll folgende aufgabe modifizieren, bin mir aber leider ned ganz sicher wie ich das am besten anstelle

    Modifizieren Sie das Integrations-Programm (aus Aufgabe 1) so, dass die zu integrierende Funktion f(x) der Funktion integral als Pointer übergeben wird.
    Testen Sie Ihre Lösung mit einem geeigneten Programm an mindestens drei verschiedenen Funktionen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double funktion (double x)
     {  
     	return exp(-x*x);
     }
     
     double integral (double a, double b, int n)
     {
     	int i;
     	double h;
     	double int_summe=0;
     	
      	h = (b - a) / n; 	 //Gesamtbreite (b-a)
     	
     	for (i = 0; i <= n-1; i++)     
       { 
      	double xi;       	 /* Argument im Schritt i h=dx */       
        double teilfl;   	 /* Teilflaeche */
            
        xi = i * h + a;       
    	teilfl = funktion(xi) * h;       
    	int_summe += teilfl;      
    	}
     	
     	return (int_summe);
     }
     
     int main()
     {  int n;          /* Anzahl Teilintervalle (Teilflaechen, Zerlegung) */   
     	double a,b;        /* Integrationsgrenzen */   
    
     	//printf("Integration nach der Rechteckmethode\n");   
     	printf("Eingabe der Integrationsgrenzen a  b: ");   
     	scanf("%lf %lf",&a,&b);   
     	printf("Eingabe der Anzahl Teilintervalle n: ");   
     	scanf("%d",&n);
     
     	printf("Integral: %.4f",integral (a, b ,n));    
     
     return 0; 
     }
    


  • @razor sagte in integralfunktion modifizieren:

    bin mir aber leider ned ganz sicher wie ich das am besten anstelle

    Was hindert dich, es zu versuchen?



  • @manni66 brauch ich da einen funktionspointer für die uebergabe an die integralfunktion ?



  • ja



  • ich habs mal so gemacht

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
     double funktion (double x)
     {
     	return exp(-x*x);
     }
    
      double funktion1 (double x)
     {
     	return exp(x);
     }
     
       double funktion2 (double x)
     {
     	return exp(-x);
     }
    
    
     double integral (double(*fkt)(double), double a, double b, int n)
     {
     	int i;
     	double h;
     	double int_summe=0;
    
      	h = (b - a) / n; 	 //Gesamtbreite (b-a)
    
     	for (i = 0; i <= n-1; i++)
       {
      	double xi;       	 /* Argument im Schritt i h=dx */
        double teilfl;   	 /* Teilflaeche */
    
        xi = i * h + a;
    	teilfl = fkt(xi) * h;
    	int_summe += teilfl;
    	}
    
     	return (int_summe);
     }
    
     int main()
     {
     	int n;          /* Anzahl Teilintervalle (Teilflaechen, Zerlegung) */
     	double a,b;        /* Integrationsgrenzen */
    
     	//printf("Integration nach der Rechteckmethode\n");
     	printf("Eingabe der Integrationsgrenzen a  b: ");
     	scanf("%lf %lf",&a,&b);
     	printf("Eingabe der Anzahl Teilintervalle n: ");
     	scanf("%d",&n);
    
     	double ergebniss = integral(funktion,a,b,n);
     	printf("Integral Funktion: %.4f\n",ergebniss);
     	double ergebniss1 = integral(funktion1,a,b,n);
     	printf("Integral Funktion 1: %.4f\n",ergebniss);
        double ergebniss3 = integral(funktion2,a,b,n);
     	printf("Integral Funktion 1: %.4f\n",ergebniss);
    
    
     //	printf("Integral: %.4f",integral (a, b, n));
    
     return 0;
     }
    


  • @razor
    In Zeile 59 hast du nen Copy-Paste Fehler: da steht "Integral Funktion 1:", sollte aber "Integral Funktion 2:" sein.
    Davon abgesehen sieht das OK aus.

    Ich würde aber tendenzielle eher Funktionen nehmen wo das Integral einfacher zu berechnen ist. Sonst wird das fummelig zu testen ob die Funktion das Integral korrekt berechnet.





  • Ich habe noch kurze Anmerkungen:

    1. Ergebnis hat nur ein s.
    2. Rücke ordentlich ein (insbesondere Zeilen 30 bis 40 sehen nach Kraut+Rüben aus) und spendiere den Kommas in Argumenten auch mal ein Leerzeichen dahinter. Es gibt auch automatische Formatierungstools.
    3. Wenn du eine Variable mit dem Namen teilfl hast und dazu den Kommentar /* Teilflaeche */ brauchst, dann nenne doch deine Variable gleich teilflaeche und lass den Kommentar weg.
    4. Kommentiere stattdessen deine Funktionen. Also zu integral könntest du sowas schreiben wie "Berechnet ein (Riemann-)Integral über Rechtecksummen. ..." Beschreibe auch, ob es sich hier um Ober- oder Untersummen handelt und was all die Parameter bedeuten.
    5. Bei return brauchst du keine Klammern. Lass sie weg. (Zeile 40)
    6. Schleifen wie for (i = 0; i <= n-1; i++) (Zeile 30) schreibt man normalweise mit < statt <=. Also: for (i = 0; i < n; i++). Ich würde noch das int i in die Schleife ziehen (Variablen da definieren, wo man sie braucht und nicht vorher) und ++i schreiben. Also: for (int i = 0; i < n; ++i).
    7. Generell: bevorzuge englische Namen im Programm / englische Kommentare.


  • @razor sagte in integralfunktion modifizieren:

    teilfl = fkt(xi) * h;

    Ich glaube hier müsste teilfl = fabs(fkt(xi)) * h; stehen, da ansonsten Teilflächen negativ werden.

    Wenn du beispielsweise das Integral von sin(x) über das Intervall 0 6 berechnest, wird ansonsten deine Fläche fast 0.



  • @Quiche-Lorraine sagte in integralfunktion modifizieren:

    @razor sagte in integralfunktion modifizieren:

    teilfl = fkt(xi) * h;

    Ich glaube hier müsste teilfl = fabs(fkt(xi)) * h; stehen, da ansonsten Teilflächen negativ werden.

    Nein und die sollen negativ werden.

    Wenn du beispielsweise das Integral von sin(x) über das Intervall 0 6 berechnest, wird ansonsten deine Fläche fast 0.

    Integral ist nicht die absolute Fläche von Kurve und x-Achse. Das Integral 02πsinxdx=0\int_0^{2 \pi}\sin x \,\text{d}x = 0. Flächen "unten" werden negativ gezählt. Was du berechnen willst, ist 02πsinxdx=4\int_0^{2 \pi}\left|\sin x \right| \,\text{d}x = 4



  • @wob
    Danke für die Info.

    Ich habe den Hauptsatz der Integralrechnung nachgelesen. Irgentwas habe ich da verwechselt.


Anmelden zum Antworten