Thomas Kramer

IT-COW | All posts tagged 'C-Aufgaben'

C-Aufgaben: Berechnung eines einfachen Integrals

By Administrator at April 10, 2011 21:08
Filed Under: C(++), Programmierung allgemein, Studium

Im letzten Semester gab es eine Aufgabe zur Berechnung des Flächeninhalts einer Funktion. Da ich mir vorstellen könnte das Wissen im Berufsleben später zu benötigen, wollte ich es hier einmal aufschreiben. 

 

Diese Aufgabe stand unter dem Stichwort “Steuerung einer for-Schleife”, daher sind drei verschiedene Zähler-Varianten implementiert. Bemerkenswert ist im Nachhinein das das Wort “Integral” in der Aufgabenstellung nicht erwähnt wurde, jedoch ist der Programmcode in der Form auch nicht auf beliebige Integrale anwendbar - nach Aussage des Dozenten handelt es sich einfach um ein Näherungsverfahren. Bezüglich Integralrechnung verweise ich auf auch meinen früheren Blog-Eintrag: Link.

 

Die Funktion die implementiert wurde war f(x)=x^2. Der Wert von x=0…30 innerhalb der Fläche der Funktionskurve und der x-Achse sollte durch eine Annäherung bestimmt werden. Dazu wurde das x-Intervall in 250 Teilintervalle aufgesplittet (Delta(x)) und die Teilergebnisse zusammenaddiert.

 

Eine Teilfläche lässt sich durch die Formel Fi=0,5*(f(xi-1)+(f(xi))*Delta(X) bestimmen. Verwiesen sei an der Stelle auf die Formeln zur Berechnung der Trapezfläche in der Wikipedia: Link.

 

Durch die drei verschiedenen Schleifensteuerungsmethoden sollten die einzelnen Unterschiede der verschiedenen Zähl-Varianten verdeutlicht werden.

 

Nachfolgend mein C-Quellcode:

 

Ergänzung 22.04.2001: Wie ich gerade feststellen muss wird speziell bei diesem Quellcode das Syntax-Highlighting in Chromium nicht korrekt angezeigt, bei Firefox dagegen schon (Ubuntu Netbook Edition). Chromium ist die Open Source-Variante von Googles Chrome-Browser.

 

/*

*=========================================================================
*
*       Filename:
*
*    Description: 
*
*        Version:  1.0
*        Created:

*       Revision:  none
*       Compiler:  gcc
*
*         Author:  Thomas Kramer
*        Company: 
*
*=========================================================================
*/

#include    <stdlib.h>
#include    <stdio.h>

/*
*=== FUNCTION =============================================================
*         Name:  main
*         Description: Steuerung einer for-Schleife
*==========================================================================
*/

int main ( int argc, char *argv[] )
{
    int i=0;
    int GesamtX = 30;
    double Teilintervalle = 250.0;              
    double DeltaX = (GesamtX / Teilintervalle);
    double Fi=0.0;                          
    double Fgesamt = 0.0;
    double y_vorher, y_neuer = 0.0;
    double xi = 0.0;

    /*-----------------------------------------------------------------------------
     *  Schleifensteuerungsmethode 1
     *-----------------------------------------------------------------------------*/

    for (i=1;i<=Teilintervalle;i++) {
        xi = i * DeltaX;
        y_neuer = (xi * xi);       
        Fi=0.5 * (y_vorher + y_neuer) * DeltaX;
        Fgesamt += (Fi);

        /*  printf("Zwischenwerte: Durchlauf %d, y_vorher=%9.8lf, y_neuer=%9.8lf,  x=%9.8lf, Fi=%30.15lf,  Fges=%30.15lf  \n", i, y_vorher, y_neuer, x, Fi, Fgesamt); */
        y_vorher=y_neuer;   
    }
    printf("Letzter x-Wert: %30.15lf, Gesamtfläche: %30.15lf\n", xi, Fgesamt);

 

    /* Daten zurücksetzen */
    Fi=0.0;
    Fgesamt=0.0;
    y_vorher=0.0;
    y_neuer=0.0;
    xi=0.0;

    /*-----------------------------------------------------------------------------
     *  Schleifensteuerungsmethode 2
     *-----------------------------------------------------------------------------*/


    for (i=1;i<=Teilintervalle;i++){
        xi += DeltaX;
        y_neuer = (xi * xi);       
        Fi=0.5 * (y_vorher + y_neuer) * DeltaX;
        Fgesamt += (Fi);

        /*  printf("Zwischenwerte: Durchlauf %d, y_vorher=%9.8lf, y_neuer=%9.8lf,  x=%9.8lf, Fi=%30.15lf,  Fges=%30.15lf  \n", i, y_vorher, y_neuer, xi, Fi, Fgesamt); */
        y_vorher=y_neuer;
    }
    printf("Letzter x-Wert: %30.15lf, Gesamtfläche: %30.15lf\n", xi, Fgesamt);

 

    /* Daten zurücksetzen */
    Fi=0.0;
    Fgesamt=0.0;
    y_vorher=0.0;
    y_neuer=0.0;
    xi=0.0;

     /*-----------------------------------------------------------------------------
      *  Schleifensteuerungsmethode 3
      *-----------------------------------------------------------------------------*/

    xi = DeltaX;
    for (xi=DeltaX;xi<=GesamtX;){
        y_neuer = (xi * xi);       
        Fi=0.5 * (y_vorher + y_neuer) * DeltaX;
        Fgesamt += (Fi);

        /*  printf("Zwischenwerte: Durchlauf %d, y_vorher=%9.8lf, y_neuer=%9.8lf,  x=%9.8lf, Fi=%30.15lf,  Fges=%30.15lf  \n", i, y_vorher, y_neuer, xi, Fi, Fgesamt); */
        y_vorher=y_neuer;
        xi+= DeltaX;
    }


    printf("Letzter x-Wert: %30.15lf, Gesamtfläche: %30.15lf\n", xi-DeltaX, Fgesamt);

    return EXIT_SUCCESS;
}               

/* ----------  end of function main  ---------- */

 

Tag-Wolke

Monats-Liste