Exponential-Reihe



  • hi, ich hab eine aufgabe und sowohl eine musterlösung als auch meine lösung. ich würde nun gerne euere meinung dazu wissen, welche dieser beiden lösungen die aufgabe besser löst.
    hier erstmal die aufgabe:

    Es soll eine Funktion mit Namen exponent entwickelt werden, der ex mit einer definierten Genauigkeit e (epsilon) bestimmt. ex soll dabei aus den (übernommenen) reellwertigen Parametern x und e entsprechend der angegebenen Reihe bestimmt werden.

    ex=Σxk/k!

    Bestimmen Sie Zähler und Nenner der Summanden einzeln.
    Hinweis zur Prüfung der Abbruchbedingung:
    Die Reihenentwicklung soll dann abgebrochen werden, wenn die Addition eines
    weiteren Terms keine Änderung von ex bewirkt, die größer ist als die vorgegebene Genauigkeit epsilon.

    hier die musterlösung:

    double exponent2(double x, double epsilon)
    {
    double k, k_fakultaet, summe, summe_alt, x_hoch_k;
    k = 0;
    x_hoch_k = 1;
    k_fakultaet = 1;
    summe = 1;
    do {
    k = k + 1;
    summe_alt = summe;
    x_hoch_k = x_hoch_k * x;
    k_fakultaet = k_fakultaet * k;
    summe = summe + x_hoch_k / k_fakultaet;
    } while (fabs(summe_alt - summe) >= epsilon);
    return summe;
    }
    

    und hier meine lösung:

    double exponent1(double x,double epsilon)
    {
           double Z=1,N=1,summe=0;
           int i=0;
           while(Z/N>epsilon)
                             {
                                  i++;
                                  summe+=Z/N;
                                  Z=Z*x;
                                  N=N*i;
                                  }
           return summe;
    }
    

    meiner meinung nach ist meine lösung nicht nur einfacher sondern löst die aufgabe besser. in der aufgabe steht, dass die reihe abgebrochen wird wenn der nächste term keine änderung bewirkt die größer ist als epsilon. durch die wahl der do-while schleife ist dies nicht gewährleistet, denn obwohl es praktisch keinen sinn macht ist es nicht verboten epsilon 10 zu wählen. dann dürfte nicht mal der 1. term (k=0) hinzuaddiert werden. in der musterlösung ist dieser jedoch immer dabei. aber auch wenn epsilon sehr klein gewählt wird, wird in der musterlösung der letzte term der dazu kommt kleiner sein als epsilon und somit erfüllt dies die aufgabenstellung nicht.
    ich würde gerne von euch wissen, ob ich ihr das auch so seht oder ob ich die aufgabe falsch verstanden habe.
    danke



  • Hi,

    wenn ich die Effizienz der beiden Algorithmen betrachte, sind sie gleichwertig. Wenn es um die Genauigkeit geht, sind beide im Sinne der Verfikationsnuermik schlecht.
    Das Epsilon im mathematischen Sinne ist def. als eine sehr kleine Zahl. Du kannst also 10 nicht als mathematisch klein def., wenn klein z.B. als <<1 def. ist (z.B. 1E-250).
    Eine Summe über einen großen Wertebereich hat in den meisten Fällen immer einen großen Fehlerfaktor. Beispiele lassen sich genug nenne.

    Gruß
    Boris



  • dein algorithmus funktioniert nicht, wenn x negativ ist. du mußt while(fabs(Z/N)>=epsilon) schreiben.

    außerdem hat die musterlösung gegenüber deinen verfahren den vorteil, daß sie die begrenzte genauigkeit von double-zahlen berücksichtigt. (summe_alt - summe) ist deshalb nicht unbedingt gleich (x_hoch_k / k_fakultaet). kurz: die musterlösung benötigt weniger schleifendurchläufe.



  • stimmt da muss fabs(..) noch rein;
    ok das epsilon ist wie aus mathe bekannt etwas kleines; ich wußte jedoch nicht wie klein dieses klein ist (bsp: wenn x=10000000 ist dann hätte ich nix dagegen epsilon auf 10 zu setzen) und ob man davon in der aufgabe ausgehen kann; ich habe noch nie eine offizielle definition für epsilon gesehen; natürlich macht das was du sagst sinn;
    außerdem ist die klausur vorbei und die aufgabe kam gar nicht vor; heißt nicht dass man sich damit nicht mehr beschäftigen sollte
    danke für euere antworten


Anmelden zum Antworten