Wurzel nach Iterationsverfahren...



  • Hi,

    ich bin noch ein ziemlicher Anfänger in C, deshalb bitte ich um Verzeihung für eventuelle peinliche Fehler 😉

    Ich soll ein Programm schreiben das die Wurzel aus einer bestimmten Zahl mit hilfe des Iterationsverfahren bestimmt.
    Näheres dazu hier:
    http://www.inf.hs-anhalt.de/~Breitschuh/html/msprog/Prak3/Prak3.htm

    Soweit bin ich gekommen, leider habe ich aber das Problem das mir für die Wurzel am Ende 0 ausgegeben wird. Wieso nur?

    #include<stdio.h>
    #include<math.h>
    
    main()
    {
      int i,j, n;
      float xi,xd,save,test,x, a;
      printf("Dies ist ein Programm zur Berechnung der n-ten Wurzel aus a \n");
      printf("Eingabe von n ");
      scanf("%i", &n);
      printf("Eingabe von a ");
      scanf("%f", &a);
      xi=1;
      i=0;
      test=0.0000001;
      xd=1;
      j=0;
        do
        {
        i=i+1;
        x=xi;
        save=xi;
        for(j=1;j<=i;j++)
         {
         x=xi*x;
         }
        xi=1/n*((n-1)*xi+(a/x));
        xd=xi/save;
        } while(xd>test);
       printf("\n\n");
       printf("Wurzel: %10.2f\n",xi);
    }
    

    Ich weiß, ist sehr unübersichtlich...ich wäre euch aber unglaublich dankbar wenn ihr mir bei meinem Problem helfen könntet!

    Gruß
    Salax



  • Erstmal ist deine Berechnung von xin-1 falsch - der Exponent wächst mit jedem Schleifendurchlauf. Und zweitens sollte sich das Verhältnis xi/xi-1 nach Möglichkeit 1 nähern, wenn du dich dem Grenzwert näherst - du prüfst auf 0.



  • Ok danke für deine Antwort. Hatte wirklich ein paar dumme Fehler drin. Nach einer Nachtschicht hab ichs allerdings zum laufen bekommen!

    #include<stdio.h>
    #include<math.h>
    
    main()
    {
      int i,j,n;
      float a1,a,b,c,xi,xd,save,test,x;
      printf("Programm zur Berechnung der n-ten Wurzel aus a mit Hilfe des Iterafionsverfahren");
      printf("********************************************************************************");
      printf("********************************************************************************\n\n");
      printf("Eingabe von n \n");
      scanf("%i", &n);
      printf("Eingabe von a \n");
      scanf("%f", &a);
      xi=1;
      i=0;
      test=0.00000001;
      xd=1;
      j=0;
      if(a>0&n>0)
      {
        do
        {
        i=i+1;
        x=xi;
        save=xi;
        x=pow(xi,n-1);
        a1=(float)1/n;
        b=(n-1)*xi;
        c=a/x;
        xi=a1*(b+c);
        xd=xi-save;
        printf(" x%i = %f \n",i,xi);
        } while(fabs(xd)>test);
    
       printf("\n\n");
       printf("Die %i.Wurzel aus %8.2f ist: %10.6f\n\n",n,a,xi);
       }
       else
       printf("Werte von a und n müssen größer 0 sein!\n\n");
    
    }
    

    Das einzige was ich jetzt noch bräuchte wäre eine Überprüfung ob der Nutzer eine Ganze Zahl für n eingibt. Was wäre dafür die beste Möglichkeit? Da n als Integer deklariert ist, bricht das Programm ab wenn man ne gebrochene Zahl eingibt. Eine Prüfung wäre mir jedoch lieber.
    Danke im Vorraus!!



  • Wieso wird "V o r a u s" denn durch **** ersetzt?!
    Naja egal 😉



  • Entweder du pumpst nach dem Einlesen von n den Lesepuffer aus ("while(getc()!='\n');" oder du liest n als Gleitkommazahl ein und kappst hinterher die Nachkomma-Stellen:

    float nf;int n;
    scanf("%f",&nf);
    n=nf;
    

Anmelden zum Antworten