Problem mit while Schleife



  • Hallo allerseits,
    ich schreibe in 2 Wochen meine Uni Klausur in C++ und bin grad dabei eine Altklausur Aufgabe zu programmiere, jedoch erreich ich das gewünschte Ergebnis nicht so ganz.

    Ich soll zunächst eine double Funktion erstellen, die sin(x)-x+1 returnen soll (Parameter der Funktion ist x). Anschließend soll ich eine Funktion programmieren, die die Ableitung der ersten Funktion returnt, also cos(x)-1 (Parameter der Funktion ist ebenfalls x). Anschließend soll ich eine 3 Funktion erstellen, die iterativ die Reihe : x(i+1) = x(i)-f(x(i))/f'(x(i)) berechnet. Die Parameter sollen hierbei ein Startwert x0, die Genauigkeit e , ein Zeiger auf die erste Funktion und ein Zeiger auf die Ableitung sein und die Reihe soll so lange berechnet werden, bis fabs(x(i+1)-x(i))<e erfüllt ist.Anschließend soll im Hauptprogramm eine double Variable x0 eingelesen werden, eine double Variable e eingelesen werden und diese and die Funktion, die die Reihe berechnet, übergeben werden. Ich habe das Programm soweit programmiert jedoch wird das gewünschte Ergebnis von (fabs(x(i+1)-x(i))<e) nicht erreicht. Kann mir wer eventuell weiter helfen?

    Liebe Grüße.

    #include <stdio.h>
    #include <math.h>
    
    
    double funktion(double);
    double ableitung(double);
    double reihenberechnung(double,double,double (*)(double), double (*)(double));
    
    main(){
       double x0,e;
       double ergebnis;
       
       printf("Geben Sie den Startwert x0 ein:\n");
       scanf("%lf",&x0);
       printf("Geben Sie die Genauigkeit e ein:\n");
       scanf("%lf",&e);
       
       reihenberechnung(x0,e,funktion,ableitung);
       
       printf("Das Ergebnis der Reihenberechnung lautet : %lf",reihenberechnung(x0,e,funktion,ableitung));
       
    }
    
    
    double funktion(double x){
    	
    	return(sin(x)-x+1);
    }
    
    double ableitung(double x){
    	
    	return(cos(x)-1);
    }
    
    double reihenberechnung(double x0,double e,double (*f)(double),double (*a)(double)){
    	double xi,xi1;
    	
    	xi = x0;
    	
    	do{
    	x0 = xi;
    
    	xi = x0 - ((*f)(x0))/((*a)(x0));
    
    	}
    	while(fabs(xi-x0)<e);
    	
    	return(fabs(xi-x0));
    }
    


  • Ich habe grad gesehen, dass die * der Funktionen im Prototyp reihenberechnung fehlen. Die hatte ich in meinem Programm natürlich berücksichtigt.



  • @djinn erstmal wäre es schön, wenn du deinen Ursprungspost bearbeiten würdest unde Code Tags um deinen Code setzen würdest, das macht den Code einfacher zu lesen.

    Dann, dass sieht sehr nach C (ohne ++) aus, aber dafür kannst du wahrscheinlich nix.

    Jetzt zu deinem Problem: Deine Bedingung in der Schleife ist falsch. Die Schleife läuft so lange, wie die Bedienung wahr ist. Du überprüfst aber, ob der Zielzustand eingetreten ist.



  • Oh, ja habe grad gesehen, dass das nicht sehr schön aussieht, tut mir leid ! Achso verstehe, heißt die Bedingung müsste sein while(fabs(xi-xo)>e) oder habe ich das falsch verstanden ?



  • @djinn sagte in Problem mit while Schleife:

    Oh, ja habe grad gesehen, dass das nicht sehr schön aussieht, tut mir leid !

    Dann änder doch was dran 😉 Man kann den Post bearbeiten. Das ist auch jetzt nocht sehr hilfreich.



  • @Leon0402 hab den Code jetzt bearbeitet damit er anschaulicher ist. 🙂



  • @djinn probier es aus. Am besten schreibt man noch Unit Tests, die einem bestätigen, das bei einer bestimmten Eingabe das erwartete Ergebnis raus kommt.



  • @djinn Du hast keine while-Schleife (kopfgesteuert) sondern eine do-while-Schleife (fußgesteuert)

    Das kann man auch wörtlich übersetzen „tue-solange“.

    Tue etwas, solange die Bedingung erfüllt ist.

    In anderen Programmiersprachen gibt es noch „repeat-until“-Schleifen. (auch fußgesteuert) Das ist dann: Wiederhole etwas, bis die Bedingung erfüllt ist.



  • @DirkB Ja genau, dabei handelt es sich ja um eine nicht-abweisende Schleife, heißt die Schleife wird zunächst durchlaufen und erst anschließend wird die Bedingung geprüft, was man per se hier auch anwenden dürfte oder versteh ich das falsch ? Ich glaube die Bedingung an sich habe ich falsch definiert, da die Schleife in meinem Programm durchlaufen wird solange bis der Betrag der Rechnung (x1-x0) kleiner ist als die Genauigkeit. Dies ist allerdings das Ziel der Schleife, dh. diese soll solange durchlaufen werden, bis der Betrag der Rechnung (x1-x0) kleiner ist als die Genauigkeit e und anschließend das Ergebnis ausgegeben wird.



  • @djinn sagte in Problem mit while Schleife:

    Oh, ja habe grad gesehen, dass das nicht sehr schön aussieht, tut mir leid ! Achso verstehe, heißt die Bedingung müsste sein while(fabs(xi-xo)>e) oder habe ich das falsch verstanden ?

    Um genau zu sein ist die Umkehrung von a < b eigentlich a >= b.


Anmelden zum Antworten