exponentialfunktion darstellen



  • das mit k=0 steht in der aufgabenstellung.. ...

    Schreiben Sie ein C Programm, das die Exponentialfunktion mit Hilfe einer
    Reihenentwicklung berechnet, und zwar mit folgender Summen-Formel:

    Ihr Programm soll einen Wert für x als Benutzereingabe einlesen (Datentyp double). Danach
    soll mit einer for–Schleife die Reihe der Exponentialfunktion von k=0 bis
    k=(Ihre_Matrikel_Nummer%100) (mindestens jedoch bis k=10) berechnet werden. Die
    Reihe soll also abgebrochen werden, wenn k den Wert erreicht, der sich als Rest der Integer-
    Division Ihrer Matrikelnummer durch 100 ergibt. Wenn dieser Wert kleiner als 10 ist, soll bis
    k=10 gelaufen werden (if Anweisung verwenden!). Bei jedem Schleifendurchlauf sollen der
    Wert für k und der aktuelle Summenwert der Reihe mit printf ausgegeben werden.
    Nach der for–Schleife soll die Reihe noch einmal berechnet werden. Dieses Mal soll dazu
    eine while–Schleife verwendet werden. Diese Schleife soll nicht eine feste Anzahl von
    Durchläufen ausführen, sondern sie soll die Reihe solange fortsetzen, bis eine vorgegebene
    Absolut-Differenz zum Wert der Exponentialfunktion aus der C Mathematik-Bibliothek
    (Funktion exp(), math.h mit #include einfügen!) erreicht wird. Die Mathematik-Funktion
    exp liefert den Wert der Exponentialfunktion mit der Genauigkeit des Datentyps double. Für
    die Berechnung der Laufbedingung der while–Schleife müssen Sie das Ergebnis von exp(x)
    von dem aktuellen Summenwert Ihrer Reihe abziehen und von der Differenz den
    Absolutbetrag bilden (mit Funktion fabs, siehe Übung 2). Die Schleife soll nur solange
    laufen wie diese Absolut-Differenz größer als der Wert (100.0/Ihre_Matrikelnummer),
    Quotient aus 100.0 und Ihrer Matrikelnummer, ist.
    Bei jedem Schleifendurchlauf sollen die Absolut-Differenz und der aktuelle
    Summenwert der Reihe ausgegeben werden.



  • nu fang mal langsam an meen jung



  • wonmit anfangen???



  • mit programmieren vielleicht? 😕



  • wie du siehst habe ich angefangen aber kann dem aufgebentext nicht ganz gerecht werden.

    und den 2ten teil mit der while schleife bekomme ich noch weniger hin


  • Mod

    Wo ist eigentlich groß das Problem?
    http://ideone.com/DxNhuT
    Alles wie gewollt.



  • nicht ganz .. aber vllt kann ich da ewtwas für meine zwecke gebrauchen, danke



  • @ SeppJ

    der link, den du gepostet hast ist gut aber nicht meine aufgabe.. leider. scheint wohl doch nicht so leicht zu sein



  • Jan1989 schrieb:

    @ SeppJ

    der link, den du gepostet hast ist gut aber nicht meine aufgabe.. leider. scheint wohl doch nicht so leicht zu sein

    Das brauchst du doch nur noch auszubauen.



  • wenn ich das ausbaue, bin ich genauso weit, wie ich es oben gepostet habe.. kommt es dann zur rechnung mit k, stört wieder die null. weil 0 mal irgendwas ja bekanntlich 0 ist



  • Nö, das siehst du verkehrt.
    Was du gepostet hast ist schon vom Ansatz her falsch, jetzt hast du ne vernünftige Basis, nämlich die Berechnung der Fakultät.



  • vom ansatz stimmt meins, das kann ich ja im compiler prüfen.

    dann verstehst du die aufgabe nicht ganz.. schade. habe gehofft, dass mir im forum einer helfen kann.

    oder was stimmt denn deiner meinung nach bei meinem ansatz nicht.



  • Das würdest du schon sehen, wenn du wenigstens den Ansatz lauffähig machen und dir dann die Werte anschauen würdest.
    Tipp: nicht initialisierte Variable ergeben nicht vorhersehbare, nicht berechenbare Ergebnisse.
    Vielleicht kommst du dann auch darauf, dass du gar nichts mit 0 multiplizieren brauchst.



  • sprich doch in klaren worten. was kann ich bei meinem programm verändern, dass es läuft.? in der forschleife muss K=0 stehen, das ist aufgabenstellung


  • Mod

    Tipp: Mein Programm ist in der Tat ein guter Ansatz und mit Bedacht so gewählt, dass du darauf aufbauen kannst. Ein bisschen Eigeninitiative musst du schon zeigen. Schau dir die wenigen Zeilen an und verstehe, was ich warum anders mache und wieso ich zu jedem k die passende Fakultät erhalte und du nicht.



  • sollte das stimmen, was du sagst und du meine aufgebe verstehst, komme ich nicht auf den springenden punkt, wo sich deins von meinem im grundaufbau unterscheidet.

    ps: eingeninitiative zeige ich seit 3 wochen und weiter als nun bin ich nicht.. also sitze nun insgesamt vllt 20 h dran. montag ist abgabe ..



  • Das mag ja alles sein, das sieht hier bloß niemand.
    Hier ist nur eine for-Schleife zu sehen, die wilde Zufallswerte 'berechnet' und allenfalls eine Fakultät von 0 = const liefert.
    Naja - das Geschenk von SeppJ hast du ja frei Haus geliefert bekommen.
    Hier ist die zugehörige Exponentialfunktion:

    int main ( void ) 
    {
    	double zaehler;
    	double x = 2;
    	int n = 11, k;
    
    	for ( k = 0; k < n; k++ )
        {
    		zaehler = pow ( x, k );
    		printf ( "%lf\n", zaehler );
        }
        return 0;
    }
    

    Falls du pow nicht benutzen darfst, musst du ein bischen tricksen, gucke dir mal den Post von rkhb dazu an.



  • Hallo,

    noch einen Tip: Es ist nicht gut die Fakultät und pow getrennt zu berechnen, weil die Werte schnell sehr groß werden.

    exp_n(x)=_k=0nxkk!exp\_n(x) = \sum\_{k=0}^{n} \frac{x^k}{k!}
    schreib lieber als
    exp_n(x)=_k=0nl=1kxlexp\_n(x) = \sum\_{k=0}^{n} \prod_{l=1}^k \frac{x}{l}



  • Jan1989 schrieb:

    was kann ich bei meinem programm verändern, dass es läuft.? in der forschleife muss K=0 stehen, das ist aufgabenstellung

    1. Wenn in der FOR-Schleife k==0 ist, dann soll die eigentliche Berechnung von xhochk und kfakultaet nicht stattfinden wg. falscher Ergebnisse - sondern etwas anderes. Klingelt es bei Dir beim Wörtchen "wenn"?

    2. Eine For-Schleife ist nur ein spezieller Fall der While-Schleife. Eine Schleife

    for (A; B; C;) { D; }

    kannst Du immer aufdröseln in:

    A; while (B) {D; C;}

    Beispiel:

    for (i=0; i<10; ++i)
    {
        x *= x;
    }
    
    kann man umwandeln zu:
    
    i=0;
    while (i<10)
    {
        x *= x;
        ++i;
    }
    

    Für den zweiten Teil, empfehle ich, die For-Schleife aufzudröseln und die entstandene While-Schleife nach den neuen Abbruchbedingungen zu verändern.

    viele grüße
    ralph



  • #include <stdio.h>
    
    double my_exp_n (double x, int degree)
    {
        int i;
        double exp_val=1.0;
        double x_div_l = x;
    
        for (i=0;i<degree;++i)
        {
            exp_val += x_div_l;
            x_div_l *= x / (i+2);
        }
    
        return exp_val;
    }
    
    #define my_exp(x) my_exp_n((x), 100)
    
    int main()
    {
        int i;
    
        for (i=0;i<=10;++i)
        {
            int x = 3*i;
            printf("exp(%d) = %e\n", x, my_exp(x));
        }
        return 0;
    }
    

    http://ideone.com/A7QIpb


Anmelden zum Antworten