Berechnung der n-ten Wurzel mit Iterationsverfahren



  • Follfosten schrieb:

    Wie soll ich denn in so kurzer Zeit das Ganze verstehen?? wenn ich die Aufgabe nicht mache darf ich an der prüfung im nächsten jahr nicht teilnehemn und muss das semester wiederholen, ich finde nicht dass das eine option ist...

    na dann los, du hast noch einige stunden. internet durchsuchen, 20 threads mit konkreten fragen hier und in anderen boards aufmachen (aber niemals die leiseste andeutung machen, dass du eine fertige musterlösung willst), im IRC gibts auch online-hilfe zu C, google nach: 'nth root algorithm filetype:c' (oder ähnliches), sollte auch was liefern usw. das müsste machbar sein.

    Follfosten schrieb:

    ich beschäftige mich auch mit anderen fachgebieten und da helfe ich grundsetzlich in den entsprechenden foren

    wird hier ja auch gemacht, nur nicht wenn wir merken, dass man uns als kostenlosen hausaufgaben-erledigungsservice misbrauchen will, um sich arbeit zu sparen oder weil man vorher nix gelernt hat.
    🙂



  • /*
    Zusammenfassung:
    Die 3.Wurzel aus einer Zahl a mit einen
    nährungsverfahren berechnen. Die Iteration
    abbrechen wenn |Xneu - Xalt| >= eps ist.
    Xneu = ist der errechnete Wert
    Xalt = der Wert in der Formel
    eps  = für die Genauigkeit
    Formel:
    Xneu = ( 1/3 (2Xalt + (a/X²alt)) )
    */
    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        double a                = 0;   
        double eps            = 0.00001;
        double xneu            = 1;
        double xalt            = 1;
        double erg[50];
        int i                    = 0;   
        int j                    = 0;   
    
        fflush(stdin);                                   
        printf("Geben Sie eine Zahl ein: ");
        scanf("%lf", &a);    //Zahl einlesen
        fflush(stdin);           
        printf("\nGenauigkeit, z.B. 0.00001: ");   
        //Wenn [ENTER] gedrückt wird, dann soll der Vordefinierte
        //Wert genommen werden. Wenn was eingegeben wird, dann bitte
        //den eingegebenen Wert zur Berechnung nehmen
        if(getchar() == '\n')
            eps = eps;
        else
            scanf("%lf", &eps);
    
        do
        {
            //Xalt auf Xneu setzen
            xalt = xneu;
            //Xneu berechnen
            xneu=( (1.0/3.0) * ( (2*xalt) + (a/(pow(xalt,2)) ) ) );
            //Xneu in Array speichern
            erg[i] = xneu;
            i++;
        }
        //Solange ausführen, bis absolutbetrag >= eps ist
        while( fabs(xneu - xalt) >= eps );
    
        i--;
        printf("\n\n");
        //das Erg ausgeben
        printf("Die 3. Wurzel aus N\x84herung: %lf \n", erg[i]);
        //Erg mit der Pow() Funktion ausgeben
        printf(" Berechnung mit der pow()-Funktion: %f \n", pow(a,(1.0/3.0)) );
        //Anzahl der Iterationsschritte ausgeben
        printf(" Es wurden %d Iterationen ben\x94tigt\n", i+1);
        //Iterationsschritte ausgeben (verlauf)
        printf(" Verlauf der Iteration:\n\n");
    
        for(j=0; j<=i; j++)
            printf("Iterationsschritt %d: %lf\n",j+1 ,erg[j]);
    
        printf("\n\n");
        return 0;
    }
    

    "Stack around the variable n was corrupted"

    heißt was?



  • Quatsch, das hier ist der Code:

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        double a                = 0;   
        double eps            = 0.00000001;
        double xneu            = 1;
        double xalt            = 1;
        double erg[50];
    	int n					= 1;
        int i                    = 0;   
        int j                    = 0;   
    
        fflush(stdin);                                   
        printf("Wert aus dem Wurzel zu ziehen ist: ");
        scanf("%lf", &a);    //Zahl einlesen
    	fflush(stdin);                                   
        printf("Wert fuer n-te Wurzel: ");
        scanf("%lf", &n);    //Zahl einlesen
    
        if(getchar() == '\n')
            eps = eps;
        else
            scanf("%lf", &eps);
    
        do
        {
            //Xalt auf Xneu setzen
            xalt = xneu;
            //Xneu berechnen
            xneu=( (1.0/n) * ( (n-1)*xalt + (a/(pow(xalt,n)) ) ) );
            //Xneu in Array speichern
            erg[i] = xneu;
            i++;
        }
        //Solange ausführen, bis absolutbetrag >= eps ist
        while( fabs(xneu - xalt) >= eps );
    
        i--;
        printf("\n\n");
        //das Erg ausgeben
    
        for(j=0; j<=i; j++)
            printf("Iterationsschritt %d: %lf\n",j+1 ,erg[j]);
    
        printf("\n\n");
        return 0;
    }
    


  • if(getchar() == '\n')
            eps = eps;
    

    ? Was solln das werden ^^

    Und was passiert bei deinem Code, wenn du mehr als 50 Schritte brauchst? (i>=50)
    Dann schreibst du in nicht reservierte Bereiche.



  • Dann eher so?

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        double a                = 0;   
        double eps            = 0.00000001;
        double xneu            = 1;
        double xalt            = 1;
        double erg[50];
    	int n					= 1;
        int i                    = 0;   
        int j                    = 0;   
    
        fflush(stdin);                                   
        printf("Wert aus dem Wurzel zu ziehen ist: ");
        scanf("%lf", &a);    //Zahl einlesen
    	fflush(stdin);                                   
        printf("Wert fuer n-te Wurzel: ");
        scanf("%lf", &n);    //Zahl einlesen
    
    	while( fabs(xneu - xalt) >= eps );
        {
            xalt = xneu;
            xneu=( (1.0/n) * ( (n-1)*xalt + (a/(pow(xalt,n)) ) ) );
            erg[i] = xneu;
            i++;
        }
    
        i--;
        printf("\n\n");
    }
    


  • ^^sieht doch immer besser aus. in zeile 22 ist ein semikolon zuviel und 'scanf("%lf", &n)' geht auch nicht, weil 'n' ein int ist, %lf aber für doubles da ist. aber probier mal so:

    int main(void)
    {
        double a;  
        double eps            = 0.00000001;
        double xneu;
        double xalt            = 1;
        int n;
    
        printf("Wert aus dem Wurzel zu ziehen ist: ");
        scanf("%lf", &a);    //Zahl einlesen
        printf("Wert fuer n-te Wurzel: ");
        scanf("%d", &n);    //Zahl einlesen
    
        for (;;)
        {
            xneu = (n*xalt - xalt + a/pow(xalt, n-1))/n;
            printf ("%f\n", xneu);
            if (fabs(xneu - xalt) < eps)
                break;
            xalt = xneu;
        }
    }
    

    🙂



  • Und was ist jetzt mit dem auszugebenden Ergebnis?



  • Follfosten schrieb:

    Und was ist jetzt mit dem auszugebenden Ergebnis?

    ^^das programm printet doch alle berechneten werte aus. der letzte in der liste ist das endergebnis. *cry*
    🙂



  • Bei mir kommt da nen Fehlerfenster:

    Debug Assertion Failed!

    Program: ...
    File: printf.c
    Line: 54

    Expression: (format != NULL)



  • Hab ich wohl was falsch übernommen...jetzt hab ichs zwar kopiert aber das Programm kommt nich zum abschluss, da gibts nur ne liste mit immer der selben zahl...



  • Also bei mir läuft das Prog. von ;fricky.

    Hat mich glatt ne Minute Zeit gekostet, das auszuprobieren.

    Fehler in Zeile 54 bei nur 22 Zeilen?



  • AndreasBo schrieb:

    Fehler in Zeile 54 bei nur 22 Zeilen?

    Wie gesagt hatte es falsch übernommen (arbeite an 2 rechnern...)

    also auf beiden hab ich das problem wie beschrieben - kann es vielleicht am programm liegen? ich arbeite mit microsoft visual c++ - das benutzen wir auch anner hs...



  • Follfosten schrieb:

    Hab ich wohl was falsch übernommen...jetzt hab ichs zwar kopiert aber das Programm kommt nich zum abschluss, da gibts nur ne liste mit immer der selben zahl...

    gib mal 1024 und 5 ein (also 5te wurzel aus 1024) und dann zeig mal den output.
    🙂



  • Visual C++ benutze ich auch.

    OK, ohne copy & paste haste wahrscheinlich
    Tippfehler drin.

    Am besten mal mit dem Debugger durchgehen.
    Wenn du das nicht kannst, dann kontrolliere jede Zeile
    noch mal genau.



  • Ich habs ja jetzt mit kopieren versucht und trotzdem dieser fehler



  • Follfosten schrieb:

    Ich habs ja jetzt mit kopieren versucht und trotzdem dieser fehler

    sorry, aber du bist irgendwie echt unfähig *heul*
    zeig doch mal deinen aktuellen code und die ausgabe bzw. fehlermeldungen. aber nicht von hand abschreiben, sondern c&p hierhin.
    🙂



  • @;fricky

    Das ist bestimmt ein Test, wie hilfsbereit die User
    dieses Forums sind 😃



  • Ich hab doch geschrieben dass ich den Code jetzt 1:1 kopiert hab - ganz normal Copy and Paste - auf beiden rechnern - trpotzdem gibt der nur ne ewig lange liste aus, die nicht zum abschluss kommt - kein witz



  • AndreasBo schrieb:

    Das ist bestimmt ein Test, wie hilfsbereit die User
    dieses Forums sind

    bestimmt, und dann noch die unregs. pointercrash und supertux hätten vor wut bestimmt schon längst ins keyboard gebissen *fg*
    🙂



  • Ok, wir sind geduldig...

    Ändere

    for (;;)
    

    in
    [cpp] for (int i = 0; i < 20; i++)

    [cpp]

    dann hast du max 20 Schleifendurchläufe
    und kannst sehen ob die Lösung
    gegen 5. Wurzel aus 1024 (z.B.) konvergiert


Anmelden zum Antworten