Anel Geschrieben 8. Dezember 2010 Teilen Geschrieben 8. Dezember 2010 (bearbeitet) Hallo! jetzt hab ich schon wieder ein Problem. und zwar sollen wir jetzt mit Hilfe des Mittelwertsatzes die Nullstellen einer Funktion berechnen. der Mittelwertsatz besagt im Grunde: wenn zwei Funktionswerte unterschiedliche Vorzeichen haben, muss dazwischen eine Nullstelle sein. das sollen wir wie folgt machen: - Eingegeben wird: die Funktionsnummer fn, die Intervallgrenzen a und b und die Genauigkeit g - eine Funktion fct berechnet den Funktionswert - die Prozedur nullstelle bestimmt unter Ausnutzung des Mittelwertsatzes durch fortgesetzte Bisektion (k.a. was das bedeutet) des Intervalls bis zur Größe g eine Näherung der Nullstelle von f - die Prozedur gibt folgende Informationen an den Aufrufer zurück: Eine Erfolgsanzeige ok mit dem Wert 1, bzw. 0, wenn eine, bzw. keine Nullstelle gefunden wurde Den Näherungswert x0 der Nullstelle Die Anzahl der Iterationsschritte anzit - das Ergebnis soll mit 15 Nachkommastellen ausgegeben werden Wenn ich mein Programm ablaufen lasse, kommt immer eine falsche Nullstelle heraus. Sieht da jemand den (oder die) Fehler? :confused: Also ich hab das folgendermaßen geschrieben (wahrscheinlich viel zu kompliziert, aber vielleicht könntet ihr mir sagen, wie ichs einfacher schreiben kann): #include <stdio.h> #include <stdlib.h> #include <math.h> float fct(float x,int fn); void nullstelle(int fn, int a, int b, double g); int vz(float wert); int main() { int fn; //Funktionsart int a; //Intervallgrenze a int b; //Intervallgrenze b double g; //Genauigkeit while(fn != 0) { //Funktionsarten: printf("(1) f(x) = sin(x)\n"); printf("(2) f(x) = exp(x) - 5x + 1\n"); printf("(3) f(x) = (x * x) -2\n"); printf("(4) f(x) = 1.0/7 + 1/x\n"); printf("(5) f(x) = 2x - 2\n"); printf("(0) Beenden\n"); printf("Geben Sie die Funktion an: "); scanf("%d",&fn); if(fn != 0) { printf("a < b\n"); printf("Grenze a: "); scanf("%d",&a); printf("Grenze b: "); scanf("%d",&; printf("Genauigkeit: "); scanf("%lf",&g); if(a < { nullstelle(fn,a,b,g); } else { printf("A muss kleiner als B sein\n"); } } } return 0; } void nullstelle(int fn, int a, int b, double g) { int ok, anzit; float vorne; //entspricht dem a bzw. dem neuen a float mitte; //entspricht der Mitte von a und b float hinten; //entspricht dem b bzw. dem neuen b float x0; //Nullstelle x0 = 0.0; ok = 0; //Erfolgsanzeige anzit = 1; //Anzahl der Iterationsschritte vorne = a; if (fct(a,fn) == 0) //Falls a der Nullstelle entspricht { x0 = a; ok = 1; } else if (fct(b,fn) == 0) //Falls b der Nullstelle entspricht { x0 = b; ok = 1; } else if (vz(fct(a,fn)) != vz(fct(b,fn))) //Falls die Vorzeichen der Funktionswerte unterschiedlich sind { printf("Nullstelle Gefunden!\n"); ok = 1; vorne = a; hinten = b; mitte = (a+b)/2.0; while ((mitte - vorne) > g) //Solange die Genauigkeit nicht erreicht ist { anzit++; printf("Suche zwischen %.15f und %.15f\n",vorne,mitte); if (fct(vorne,fn) == 0) //Falls das neue a der Nullstelle entspricht { x0 = vorne; } else if (fct(hinten,fn) == 0) //Falls das neue b der Nullstelle entspricht { x0 = hinten; } else if (fct(mitte,fn) == 0) //Falls die Mitte von a und b der Nullstelle entspricht { x0 = mitte; } else if (vz(fct(vorne,fn)) != vz(fct(mitte,fn))) //Falls die Vorzeichen der neuen Funktionswerte ungleich sind { vorne = vorne; hinten = mitte; mitte = vorne + (( hinten-vorne)/2.0); } else { vorne = mitte; hinten = hinten; mitte = vorne + (( hinten-vorne)/2.0); } } } else { printf("Keine Nullstelle im Intervall %d bis %d gefunden\n",a,; ok = 0; } if ((x0 != vorne || x0 != mitte || x0 != hinten || x0 != a || x0 != && ok == 1) //Falls keine Intervallgrenze der Nullstelle entspricht { x0 = vorne + (mitte-vorne)/2.0; } else { x0 = x0; } printf("Nullstelle bei: %.15f\n",x0); printf("f(%.15f) = %.15f\n",x0,fct(x0,fn)); printf("Anzahl der Iterationsschritte: %d\n",anzit); } int vz(float wert) //Überprüfung des Vorzeichens { int vz; if(wert < 0) { vz = 0; } else { vz = 1; } return vz; } float fct(float x, int fn) //Berechnung des Funktionswertes { float ergebnis; switch (fn) { case 1: ergebnis = sin(x); break; case 2: ergebnis = exp(x)-(5.0*x)+1.0; break; case 3: ergebnis = pow(x,2)-2.0; break; case 4: ergebnis = (1.0/7.0)+(1.0/x); break; case 5: ergebnis = 2.0 * x - 2.0; break; default: ergebnis = 0.0; break; } return ergebnis; } Hoffe, es war nicht zu verwirrend MfG Anel Bearbeitet 8. Dezember 2010 von Anel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Dezember 2010 Teilen Geschrieben 10. Dezember 2010 Bitte überleg dir aussagekräftige Titel für deine Threads. "Schon wieder ein Problem" ist keiner.Benutz Code-Tags, damit die Einrückung deines Codes nicht verlorengehtLiefere eine ordentliche Fehlerbeschreibung. Bei welcher Eingabe wird welches falsche Ergebnis angezeigt? Wie ist das erwartete Ergebnis? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Anel Geschrieben 10. Dezember 2010 Autor Teilen Geschrieben 10. Dezember 2010 Jetzt hab ich, während ich diese Antwort schreiben wollte, meine Fehler selbst gefunden! Aber trotzdem danke für die Mühen! Lg Anel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.