ein mathematische Funktion in C/C++ programmieren



  • Hallo

    ich habe eine alte Klausur-Aufgabe mir angeschaut und verstehe da fast garnichts:

    Die Exponentialfunktion lässt sich über die Reihe
    ex=0xkk!e^x=\sum_{0}^{\propto }\frac{x^k}{k!} berechnen.
    Aufgabe:
    Erstellen Sie die Funktion
    double exp(double x);
    zur Berechnung der Exponentialfunktion.
    Die Reihe soll dann abgebrochen werden, wenn der neu hinzukommende Term der Summe betragsmäßig um den Faktor 10-20 kleiner ist als der Betrag der aktuellen Summe.
    Hinweis:
    Es steht die Funktion
    double fabs(double x);
    zur Absolutwertbildung zur Verfügung.

    Wie ich das verstanden habe, darf man die math-Funktion exp() nicht benutzen, sonst wäre das ja zu doof.
    Also ohne Ansatz oder Ideen habe ich mir die Lösung angeschaut und war erstaunt! Wie kommt er da drauf?

    Lösung:

    double exp(double x)

    {
        double term = x, sum = 1.0 + x;
        unsigned long loop = 2;
        do // loop until required accuracy reached 
           sum += (term *= x/loop++);
        while (fabs(term) > 1.0e-20 * fabs(sum));
        return sum; // return result
    }
    

    was eine do-while-Schleife ist, weiß ich. Aber wie ist er (der Prof) von der Summenformel zu *sum += (term = x/loop++) gekommen? Also Frage an die Mathematiker-Programmierer.

    Danke im v0rr@us!



  • Er wird es zuerst ein bisschen direkter aufgeschrieben und dann zusammengekürzt haben. Was soll da dabei sein? Wie würdest du es denn machen hätt ich jetzt gefragt, aber du hattest ja keinen Ansatz.



  • wie gesagt Frage an Mathe-Programmierer. Wie will er eine Funktion die bis unendlich läuft, zusammenfassen??? 😕



  • GnuMan2000 schrieb:

    wie gesagt Frage an Mathe-Programmierer. Wie will er eine Funktion die bis unendlich läuft, zusammenfassen??? 😕

    die Reihe läuft doch gar nicht bis unendlich, es gibt doch das Abbruchkriterium.

    Der Prof macht das in drei Schritten:

    1. nächsten Term berechnen
    2. Summe bilden
    3. prüfen, ob Abbruchkriterium erreicht

    vielleicht verwirrt dich, dass die Schritte 1 und 2 in einer Zeile zusammengefasst sind?



  • GnuMan2000 schrieb:

    wie gesagt Frage an Mathe-Programmierer.

    Was soll das sein?

    Wie will er eine Funktion die bis unendlich läuft, zusammenfassen??? 😕

    In der Aufgabe steht doch "Die Reihe soll dann abgebrochen werden[...]". Du berechnest also nur eine endliche Summe und hoffst, dass das Ergebnis ausreichend genau ist.



  • naja die Schreibweise ist ja eigentlich auch ein bisschen doof: sum += (term *= x/loop++)
    In C/C++ kann man viele Dinge sehr kompakt schreiben, meist auf Kosten der Lesbarkeit.

    Mach eine Schleife, dann tippe den (textmäßig angegebenen) Algorithmus ganz einfach ab. Die Summe läuft bis zum Abbruchkriterium (das war das mit dem Faktor 10^⁻20), danach springst du aus der Schleife mit break raus.
    Definiere soviele Variablen wie du brauchst, dann wird das ganze übersichtlicher. Zusammenkürzen kannst du es später immer noch.



  • also in nachhinein habe ich die Lösung verstanden. Aber ich würde nie selber da drauf kommen! In der Klausur versucht man sich mit C und C++ zu beschäftigen und nicht mit mathematischen Formeln! OK, die Formel ist gegeben und man muss die "nur" in C realisieren. Aber seid mal ehrlich: Wer in Mathe kein As ist, würde doch nie in der Zeit, die in der Klausur gegeben ist, das lösen können. Denn das ist eine von 9 Aufgaben!!!



  • GnuMan2000 schrieb:

    Aber seid mal ehrlich: Wer in Mathe kein As ist, würde doch nie in der Zeit, die in der Klausur gegeben ist, das lösen können. Denn das ist eine von 9 Aufgaben!!!

    Die Formel ist doch gegeben. Einfach abtippen - das wurde doch schon mehrfach gesagt.

    Dass dein Prof den Code extrem unleserlich verkürzt hat, ist eine andere Sache. Mit Mathematik hat das nichts zu tun, nur mit Sprachfeatures von C++.

    Auf der Arbeit habe ich viel mit komplizierten physikalischen Formeln zu tun, die ich teilweise beim besten Willen nicht verstehe. Aber wenn die Physiker in unserer Forschungsabteilung sagen, dass die Formel so stimmt, dann glaube ich ihnen das und setze sie um - natürlich ohne (mathematische) Vereinfachungen.


Anmelden zum Antworten